fix channel caches, add hub functions to api endpoints
This commit is contained in:
@@ -98,7 +98,7 @@ func HandleUserGetConnectionsUnreadMessages(response http.ResponseWriter, reques
|
||||
return
|
||||
}
|
||||
|
||||
connectionIds, err := convertions.StringToUuidSlice(request.URL.Query().Get("connections"))
|
||||
connectionIds, err := convertions.StringToUuids(request.URL.Query().Get("connections"))
|
||||
if err != nil {
|
||||
http.Error(response, "invalid uuid format", http.StatusBadRequest)
|
||||
return
|
||||
|
||||
@@ -54,31 +54,55 @@ func hubUserHighestRoleId(u *types.HubUser, h *types.Hub) (id uint8) {
|
||||
return id
|
||||
}
|
||||
|
||||
func updateUserChannelCache(u *types.HubUser, c *types.HubChannel) {
|
||||
func updateChannelCacheForSpecUserAndChannel(u *types.HubUser, c *types.HubChannel) {
|
||||
c.Mu.Lock()
|
||||
defer c.Mu.Unlock()
|
||||
if u.Roles.DoesIntersect(c.RolesCanView) {
|
||||
c.UsersCachedPermissions[u.OriginalId] |= types.CachedUserCanView
|
||||
|
||||
if u == nil {
|
||||
delete(c.UsersCachedPermissions, c.Id)
|
||||
} else {
|
||||
c.UsersCachedPermissions[u.OriginalId] &^= types.CachedUserCanView
|
||||
}
|
||||
if u.Roles.DoesIntersect(c.RolesCanReadHistory) {
|
||||
c.UsersCachedPermissions[u.OriginalId] |= types.CachedUserCanReadHistory
|
||||
} else {
|
||||
c.UsersCachedPermissions[u.OriginalId] &^= types.CachedUserCanReadHistory
|
||||
}
|
||||
if u.Roles.DoesIntersect(c.RolesCanMessage) {
|
||||
c.UsersCachedPermissions[u.OriginalId] |= types.CachedUserCanMessage
|
||||
} else {
|
||||
c.UsersCachedPermissions[u.OriginalId] &^= types.CachedUserCanMessage
|
||||
if u.Roles.DoesIntersect(c.RolesCanView) {
|
||||
c.UsersCachedPermissions[u.OriginalId] |= types.CachedUserCanView
|
||||
} else {
|
||||
c.UsersCachedPermissions[u.OriginalId] &^= types.CachedUserCanView
|
||||
}
|
||||
if u.Roles.DoesIntersect(c.RolesCanReadHistory) {
|
||||
c.UsersCachedPermissions[u.OriginalId] |= types.CachedUserCanReadHistory
|
||||
} else {
|
||||
c.UsersCachedPermissions[u.OriginalId] &^= types.CachedUserCanReadHistory
|
||||
}
|
||||
if u.Roles.DoesIntersect(c.RolesCanMessage) {
|
||||
c.UsersCachedPermissions[u.OriginalId] |= types.CachedUserCanMessage
|
||||
} else {
|
||||
c.UsersCachedPermissions[u.OriginalId] &^= types.CachedUserCanMessage
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func updateChannelCache(c *types.HubChannel, h *types.Hub) {
|
||||
func updateChannelCacheForSpecChannel(c *types.HubChannel, h *types.Hub) {
|
||||
h.Mu.RLock()
|
||||
defer h.Mu.RUnlock()
|
||||
for _, u := range h.Users {
|
||||
updateUserChannelCache(u, c)
|
||||
updateChannelCacheForSpecUserAndChannel(u, c)
|
||||
}
|
||||
}
|
||||
|
||||
func updateChannelCacheForSpecUser(u *types.HubUser, h *types.Hub) {
|
||||
h.Mu.RLock()
|
||||
defer h.Mu.RUnlock()
|
||||
for _, c := range h.Channels {
|
||||
updateChannelCacheForSpecUserAndChannel(u, c)
|
||||
}
|
||||
}
|
||||
|
||||
func updateChannelCacheForSpecRole(r *types.HubRole, h *types.Hub) {
|
||||
h.Mu.Lock()
|
||||
defer h.Mu.Unlock()
|
||||
for _, u := range h.Users {
|
||||
if !u.Roles.ContainsRoleId(r.Id) {
|
||||
continue
|
||||
}
|
||||
updateChannelCacheForSpecUser(u, h)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,9 +202,12 @@ func HandleHubJoin(response http.ResponseWriter, request *http.Request) {
|
||||
|
||||
hubUser := types.NewHubUser()
|
||||
hubUser.OriginalId = user.Id
|
||||
hubUser.Roles.Add(hub.JoinRole.Id)
|
||||
if hub.JoinRole != nil {
|
||||
hubUser.Roles.Add(hub.JoinRole.Id)
|
||||
}
|
||||
hubUser.CreatedAt = time.Now()
|
||||
hub.Users[hubUser.OriginalId] = hubUser
|
||||
updateChannelCacheForSpecUser(hubUser, hub)
|
||||
}
|
||||
|
||||
func HandleHubMessage(response http.ResponseWriter, request *http.Request) {
|
||||
@@ -307,7 +334,7 @@ func HandleGetHubUsers(response http.ResponseWriter, request *http.Request) {
|
||||
}
|
||||
ctx := request.Context()
|
||||
_, requestor, hub, err := getHubUserIfValidWithResponseOnFail(ctx, response, request)
|
||||
if {
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
users := make([]*types.HubUser, 0)
|
||||
@@ -423,6 +450,7 @@ func HandleHubUserRemove(response http.ResponseWriter, request *http.Request) {
|
||||
}
|
||||
hub.Mu.Lock()
|
||||
delete(hub.Users, targetId)
|
||||
updateChannelCacheForSpecUser(target, hub)
|
||||
hub.Mu.Unlock()
|
||||
response.WriteHeader(http.StatusAccepted)
|
||||
}
|
||||
@@ -526,6 +554,7 @@ func HandleHubUserAddRole(response http.ResponseWriter, request *http.Request) {
|
||||
return
|
||||
}
|
||||
target.Roles.Add(roleId)
|
||||
updateChannelCacheForSpecUser(target, hub)
|
||||
response.WriteHeader(http.StatusAccepted)
|
||||
}
|
||||
|
||||
@@ -557,6 +586,7 @@ func HandleHubUserRemoveRole(response http.ResponseWriter, request *http.Request
|
||||
return
|
||||
}
|
||||
target.Roles.Remove(roleId)
|
||||
updateChannelCacheForSpecUser(target, hub)
|
||||
response.WriteHeader(http.StatusAccepted)
|
||||
}
|
||||
|
||||
@@ -709,6 +739,7 @@ func HandleRoleSetPermissions(response http.ResponseWriter, request *http.Reques
|
||||
return
|
||||
}
|
||||
|
||||
madeChange := false
|
||||
query := request.URL.Query()
|
||||
for key, values := range query {
|
||||
permission, ok := types.PermissionLookup(key)
|
||||
@@ -725,20 +756,35 @@ func HandleRoleSetPermissions(response http.ResponseWriter, request *http.Reques
|
||||
}
|
||||
|
||||
if convertions.StringToBool(values[0]) {
|
||||
targetRole.Permissions.Grant(permission)
|
||||
if !targetRole.Permissions.Has(permission) {
|
||||
madeChange = true
|
||||
targetRole.Permissions.Grant(permission)
|
||||
}
|
||||
} else {
|
||||
targetRole.Permissions.Revoke(permission)
|
||||
if targetRole.Permissions.Has(permission) {
|
||||
madeChange = true
|
||||
targetRole.Permissions.Revoke(permission)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !madeChange {
|
||||
response.WriteHeader(http.StatusNoContent)
|
||||
response.Write([]byte("no changes made"))
|
||||
return
|
||||
}
|
||||
|
||||
updateChannelCacheForSpecRole(targetRole, hub)
|
||||
response.WriteHeader(http.StatusAccepted)
|
||||
}
|
||||
|
||||
func HandleRoleSelfRemove(response http.ResponseWriter, request *http.Request) {
|
||||
requestor, _, _, usedRoleId, ok := hubPermissionContext(response, request, normal, types.PermissionUserSelfRoleRemove)
|
||||
requestor, hub, _, usedRoleId, ok := hubPermissionContext(response, request, normal, types.PermissionUserSelfRoleRemove)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
requestor.Roles.Remove(usedRoleId)
|
||||
updateChannelCacheForSpecUser(requestor, hub)
|
||||
response.WriteHeader(http.StatusAccepted)
|
||||
}
|
||||
|
||||
@@ -777,7 +823,7 @@ func HandleChannelCreate(response http.ResponseWriter, request *http.Request) {
|
||||
}
|
||||
hub.Mu.Unlock()
|
||||
|
||||
updateChannelCache(newHubChannel, hub)
|
||||
updateChannelCacheForSpecChannel(newHubChannel, hub)
|
||||
response.WriteHeader(http.StatusAccepted)
|
||||
}
|
||||
|
||||
|
||||
@@ -252,3 +252,37 @@ func HandleUserGetUser(response http.ResponseWriter, request *http.Request) {
|
||||
response.WriteHeader(http.StatusAccepted)
|
||||
response.Write(userData)
|
||||
}
|
||||
|
||||
func HandleUserGetUsers(response http.ResponseWriter, request *http.Request) {
|
||||
if !validCheckWithResponseOnFail(response, request, normal) {
|
||||
return
|
||||
}
|
||||
ctx := request.Context()
|
||||
|
||||
_, err := getUserByToken(ctx, request.Header.Get("token"))
|
||||
if err != nil {
|
||||
http.Error(response, "invalid token", http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
targetIds, err := convertions.StringToUuids(request.URL.Query().Get("targetids"))
|
||||
if err != nil {
|
||||
http.Error(response, "invalid targetids", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
users, err := cache.GetUsersByIds(targetIds)
|
||||
if err != nil {
|
||||
http.Error(response, err.Error(), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
userData, err := json.Marshal(users)
|
||||
if err != nil {
|
||||
http.Error(response, "json parse error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
response.WriteHeader(http.StatusAccepted)
|
||||
response.Write(userData)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user