hicli/init: send room account data in initial payload

This commit is contained in:
Tulir Asokan 2024-11-16 23:19:50 +02:00
parent 1cef899e5c
commit b3cd8cc57e
2 changed files with 20 additions and 4 deletions

View file

@ -30,6 +30,9 @@ const (
getGlobalAccountDataQuery = ` getGlobalAccountDataQuery = `
SELECT user_id, '', type, content FROM account_data WHERE user_id = $1 SELECT user_id, '', type, content FROM account_data WHERE user_id = $1
` `
getRoomAccountDataQuery = `
SELECT user_id, room_id, type, content FROM room_account_data WHERE user_id = $1 AND room_id = $2
`
) )
type AccountDataQuery struct { type AccountDataQuery struct {
@ -67,6 +70,10 @@ func (adq *AccountDataQuery) GetAllGlobal(ctx context.Context, userID id.UserID)
return adq.QueryMany(ctx, getGlobalAccountDataQuery, userID) return adq.QueryMany(ctx, getGlobalAccountDataQuery, userID)
} }
func (adq *AccountDataQuery) GetAllRoom(ctx context.Context, userID id.UserID, roomID id.RoomID) ([]*AccountData, error) {
return adq.QueryMany(ctx, getRoomAccountDataQuery, userID, roomID)
}
type AccountData struct { type AccountData struct {
UserID id.UserID `json:"user_id"` UserID id.UserID `json:"user_id"`
RoomID id.RoomID `json:"room_id,omitempty"` RoomID id.RoomID `json:"room_id,omitempty"`

View file

@ -19,17 +19,26 @@ func (h *HiClient) getInitialSyncRoom(ctx context.Context, room *database.Room)
Timeline: make([]database.TimelineRowTuple, 0), Timeline: make([]database.TimelineRowTuple, 0),
State: map[event.Type]map[string]database.EventRowID{}, State: map[event.Type]map[string]database.EventRowID{},
Notifications: make([]SyncNotification, 0), Notifications: make([]SyncNotification, 0),
AccountData: make(map[event.Type]*database.AccountData), }
ad, err := h.DB.AccountData.GetAllRoom(ctx, h.Account.UserID, room.ID)
if err != nil {
zerolog.Ctx(ctx).Err(err).Stringer("room_id", room.ID).Msg("Failed to get room account data")
syncRoom.AccountData = make(map[event.Type]*database.AccountData)
} else {
syncRoom.AccountData = make(map[event.Type]*database.AccountData, len(ad))
for _, data := range ad {
syncRoom.AccountData[event.Type{Type: data.Type, Class: event.AccountDataEventType}] = data
}
} }
if room.PreviewEventRowID != 0 { if room.PreviewEventRowID != 0 {
previewEvent, err := h.DB.Event.GetByRowID(ctx, room.PreviewEventRowID) previewEvent, err := h.DB.Event.GetByRowID(ctx, room.PreviewEventRowID)
if err != nil { if err != nil {
zerolog.Ctx(ctx).Err(err).Msg("Failed to get preview event for room") zerolog.Ctx(ctx).Err(err).Stringer("room_id", room.ID).Msg("Failed to get preview event for room")
} else if previewEvent != nil { } else if previewEvent != nil {
h.ReprocessExistingEvent(ctx, previewEvent) h.ReprocessExistingEvent(ctx, previewEvent)
previewMember, err := h.DB.CurrentState.Get(ctx, room.ID, event.StateMember, previewEvent.Sender.String()) previewMember, err := h.DB.CurrentState.Get(ctx, room.ID, event.StateMember, previewEvent.Sender.String())
if err != nil { if err != nil {
zerolog.Ctx(ctx).Err(err).Msg("Failed to get preview member event for room") zerolog.Ctx(ctx).Err(err).Stringer("room_id", room.ID).Msg("Failed to get preview member event for room")
} else if previewMember != nil { } else if previewMember != nil {
syncRoom.Events = append(syncRoom.Events, previewMember) syncRoom.Events = append(syncRoom.Events, previewMember)
syncRoom.State[event.StateMember] = map[string]database.EventRowID{ syncRoom.State[event.StateMember] = map[string]database.EventRowID{
@ -39,7 +48,7 @@ func (h *HiClient) getInitialSyncRoom(ctx context.Context, room *database.Room)
if previewEvent.LastEditRowID != nil { if previewEvent.LastEditRowID != nil {
lastEdit, err := h.DB.Event.GetByRowID(ctx, *previewEvent.LastEditRowID) lastEdit, err := h.DB.Event.GetByRowID(ctx, *previewEvent.LastEditRowID)
if err != nil { if err != nil {
zerolog.Ctx(ctx).Err(err).Msg("Failed to get last edit for preview event") zerolog.Ctx(ctx).Err(err).Stringer("room_id", room.ID).Msg("Failed to get last edit for preview event")
} else if lastEdit != nil { } else if lastEdit != nil {
h.ReprocessExistingEvent(ctx, lastEdit) h.ReprocessExistingEvent(ctx, lastEdit)
syncRoom.Events = append(syncRoom.Events, lastEdit) syncRoom.Events = append(syncRoom.Events, lastEdit)