aboutsummaryrefslogtreecommitdiff
path: root/roomserver/internal/query
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2022-08-11 18:23:35 +0200
committerGitHub <noreply@github.com>2022-08-11 18:23:35 +0200
commit05cafbd197c99c0e116c9b61447e70ba5af992a3 (patch)
treef96dbf70e30b2a255f2b19574188115dda8e6145 /roomserver/internal/query
parent371336c6b5ffd510802d06b193a48b01a5e78d0c (diff)
Implement history visibility on `/messages`, `/context`, `/sync` (#2511)
* Add possibility to set history_visibility and user AccountType * Add new DB queries * Add actual history_visibility changes for /messages * Add passing tests * Extract check function * Cleanup * Cleanup * Fix build on 386 * Move ApplyHistoryVisibilityFilter to internal * Move queries to topology table * Add filtering to /sync and /context Some cleanup * Add passing tests; Remove failing tests :( * Re-add passing tests * Move filtering to own function to avoid duplication * Re-add passing test * Use newly added GMSL HistoryVisibility * Update gomatrixserverlib * Set the visibility when creating events * Default to shared history visibility * Remove unused query * Update history visibility checks to use gmsl Update tests * Remove unused statement * Update migrations to set "correct" history visibility * Add method to fetch the membership at a given event * Tweaks and logging * Use actual internal rsAPI, default to shared visibility in tests * Revert "Move queries to topology table" This reverts commit 4f0d41be9c194a46379796435ce73e79203edbd6. * Remove noise/unneeded code * More cleanup * Try to optimize database requests * Fix imports * PR peview fixes/changes * Move setting history visibility to own migration, be more restrictive * Fix unit tests * Lint * Fix missing entries * Tweaks for incremental syncs * Adapt generic changes Co-authored-by: Neil Alexander <neilalexander@users.noreply.github.com> Co-authored-by: kegsay <kegan@matrix.org>
Diffstat (limited to 'roomserver/internal/query')
-rw-r--r--roomserver/internal/query/query.go48
1 files changed, 48 insertions, 0 deletions
diff --git a/roomserver/internal/query/query.go b/roomserver/internal/query/query.go
index 5ba59b8f..c41e1ea6 100644
--- a/roomserver/internal/query/query.go
+++ b/roomserver/internal/query/query.go
@@ -204,6 +204,54 @@ func (r *Queryer) QueryMembershipForUser(
return err
}
+func (r *Queryer) QueryMembershipAtEvent(
+ ctx context.Context,
+ request *api.QueryMembershipAtEventRequest,
+ response *api.QueryMembershipAtEventResponse,
+) error {
+ response.Memberships = make(map[string][]*gomatrixserverlib.HeaderedEvent)
+ info, err := r.DB.RoomInfo(ctx, request.RoomID)
+ if err != nil {
+ return fmt.Errorf("unable to get roomInfo: %w", err)
+ }
+ if info == nil {
+ return fmt.Errorf("no roomInfo found")
+ }
+
+ // get the users stateKeyNID
+ stateKeyNIDs, err := r.DB.EventStateKeyNIDs(ctx, []string{request.UserID})
+ if err != nil {
+ return fmt.Errorf("unable to get stateKeyNIDs for %s: %w", request.UserID, err)
+ }
+ if _, ok := stateKeyNIDs[request.UserID]; !ok {
+ return fmt.Errorf("requested stateKeyNID for %s was not found", request.UserID)
+ }
+
+ stateEntries, err := helpers.MembershipAtEvent(ctx, r.DB, info, request.EventIDs, stateKeyNIDs[request.UserID])
+ if err != nil {
+ return fmt.Errorf("unable to get state before event: %w", err)
+ }
+
+ for _, eventID := range request.EventIDs {
+ stateEntry := stateEntries[eventID]
+ memberships, err := helpers.GetMembershipsAtState(ctx, r.DB, stateEntry, false)
+ if err != nil {
+ return fmt.Errorf("unable to get memberships at state: %w", err)
+ }
+ res := make([]*gomatrixserverlib.HeaderedEvent, 0, len(memberships))
+
+ for i := range memberships {
+ ev := memberships[i]
+ if ev.Type() == gomatrixserverlib.MRoomMember && ev.StateKeyEquals(request.UserID) {
+ res = append(res, ev.Headered(info.RoomVersion))
+ }
+ }
+ response.Memberships[eventID] = res
+ }
+
+ return nil
+}
+
// QueryMembershipsForRoom implements api.RoomserverInternalAPI
func (r *Queryer) QueryMembershipsForRoom(
ctx context.Context,