1
0
Fork 0
forked from Mirrors/gomuks

hicli/sync: fix processing space events

This commit is contained in:
Tulir Asokan 2024-12-30 22:26:27 +02:00
parent e0f107f028
commit 572ef41b80
2 changed files with 24 additions and 7 deletions

View file

@ -69,13 +69,15 @@ const (
revalidateAllParentsOfRoomQuery = revalidateAllParents + ` AND child_id=$1` revalidateAllParentsOfRoomQuery = revalidateAllParents + ` AND child_id=$1`
revalidateSpecificParentQuery = revalidateAllParents + ` AND space_id=$1 AND child_id=$2` revalidateSpecificParentQuery = revalidateAllParents + ` AND space_id=$1 AND child_id=$2`
clearSpaceChildrenQuery = ` clearSpaceChildrenQuery = `
UPDATE space_edge SET child_event_rowid=NULL, "order"=NULL, suggested=false UPDATE space_edge SET child_event_rowid=NULL, "order"='', suggested=false
WHERE space_id=$1 WHERE space_id=$1
` `
clearSpaceParentsQuery = ` clearSpaceParentsQuery = `
UPDATE space_edge SET parent_event_rowid=NULL, canonical=false, parent_validated=false UPDATE space_edge SET parent_event_rowid=NULL, canonical=false, parent_validated=false
WHERE child_id=$1 WHERE child_id=$1
` `
removeSpaceChildQuery = clearSpaceChildrenQuery + ` AND child_id=$2`
removeSpaceParentQuery = clearSpaceParentsQuery + ` AND space_id=$2`
deleteEmptySpaceEdgeRowsQuery = ` deleteEmptySpaceEdgeRowsQuery = `
DELETE FROM space_edge WHERE child_event_rowid IS NULL AND parent_event_rowid IS NULL DELETE FROM space_edge WHERE child_event_rowid IS NULL AND parent_event_rowid IS NULL
` `
@ -139,8 +141,13 @@ func (seq *SpaceEdgeQuery) SetChildren(ctx context.Context, spaceID id.RoomID, c
if err != nil { if err != nil {
return err return err
} }
} else { } else if len(removedChildren) > 0 {
for _, child := range removedChildren {
err := seq.Exec(ctx, removeSpaceChildQuery, spaceID, child)
if err != nil {
return err
}
}
} }
if len(removedChildren) > 0 { if len(removedChildren) > 0 {
err := seq.Exec(ctx, deleteEmptySpaceEdgeRowsQuery, spaceID) err := seq.Exec(ctx, deleteEmptySpaceEdgeRowsQuery, spaceID)
@ -152,7 +159,7 @@ func (seq *SpaceEdgeQuery) SetChildren(ctx context.Context, spaceID id.RoomID, c
return nil return nil
} }
query, params := massInsertSpaceChildBuilder.Build([1]any{spaceID}, children) query, params := massInsertSpaceChildBuilder.Build([1]any{spaceID}, children)
return seq.Exec(ctx, query, params) return seq.Exec(ctx, query, params...)
} }
func (seq *SpaceEdgeQuery) SetParents(ctx context.Context, childID id.RoomID, parents []SpaceParentEntry, removedParents []id.RoomID, clear bool) error { func (seq *SpaceEdgeQuery) SetParents(ctx context.Context, childID id.RoomID, parents []SpaceParentEntry, removedParents []id.RoomID, clear bool) error {
@ -161,6 +168,13 @@ func (seq *SpaceEdgeQuery) SetParents(ctx context.Context, childID id.RoomID, pa
if err != nil { if err != nil {
return err return err
} }
} else if len(removedParents) > 0 {
for _, parent := range removedParents {
err := seq.Exec(ctx, removeSpaceParentQuery, childID, parent)
if err != nil {
return err
}
}
} }
if len(removedParents) > 0 { if len(removedParents) > 0 {
err := seq.Exec(ctx, deleteEmptySpaceEdgeRowsQuery) err := seq.Exec(ctx, deleteEmptySpaceEdgeRowsQuery)
@ -172,7 +186,7 @@ func (seq *SpaceEdgeQuery) SetParents(ctx context.Context, childID id.RoomID, pa
return nil return nil
} }
query, params := massInsertSpaceParentBuilder.Build([1]any{childID}, parents) query, params := massInsertSpaceParentBuilder.Build([1]any{childID}, parents)
return seq.Exec(ctx, query, params) return seq.Exec(ctx, query, params...)
} }
func (seq *SpaceEdgeQuery) RevalidateAllChildrenOfParentValidity(ctx context.Context, spaceID id.RoomID) error { func (seq *SpaceEdgeQuery) RevalidateAllChildrenOfParentValidity(ctx context.Context, spaceID id.RoomID) error {

View file

@ -1131,11 +1131,14 @@ func processImportantEvent(
} }
switch evt.Type { switch evt.Type {
case event.StateCreate, event.StateTombstone, event.StateRoomName, event.StateCanonicalAlias, case event.StateCreate, event.StateTombstone, event.StateRoomName, event.StateCanonicalAlias,
event.StateRoomAvatar, event.StateTopic, event.StateEncryption, event.StateRoomAvatar, event.StateTopic, event.StateEncryption, event.StatePowerLevels:
event.StateSpaceChild, event.StateSpaceParent, event.StatePowerLevels:
if *evt.StateKey != "" { if *evt.StateKey != "" {
return return
} }
case event.StateSpaceChild, event.StateSpaceParent:
if !strings.HasPrefix(*evt.StateKey, "!") {
return
}
default: default:
return return
} }