aboutsummaryrefslogtreecommitdiff
path: root/syncapi/storage/postgres/invites_table.go
diff options
context:
space:
mode:
Diffstat (limited to 'syncapi/storage/postgres/invites_table.go')
-rw-r--r--syncapi/storage/postgres/invites_table.go37
1 files changed, 22 insertions, 15 deletions
diff --git a/syncapi/storage/postgres/invites_table.go b/syncapi/storage/postgres/invites_table.go
index 5031d64e..530dc645 100644
--- a/syncapi/storage/postgres/invites_table.go
+++ b/syncapi/storage/postgres/invites_table.go
@@ -33,7 +33,8 @@ CREATE TABLE IF NOT EXISTS syncapi_invite_events (
event_id TEXT NOT NULL,
room_id TEXT NOT NULL,
target_user_id TEXT NOT NULL,
- headered_event_json TEXT NOT NULL
+ headered_event_json TEXT NOT NULL,
+ deleted BOOL NOT NULL
);
-- For looking up the invites for a given user.
@@ -47,14 +48,14 @@ CREATE INDEX IF NOT EXISTS syncapi_invites_event_id_idx
const insertInviteEventSQL = "" +
"INSERT INTO syncapi_invite_events (" +
- " room_id, event_id, target_user_id, headered_event_json" +
- ") VALUES ($1, $2, $3, $4) RETURNING id"
+ " room_id, event_id, target_user_id, headered_event_json, deleted" +
+ ") VALUES ($1, $2, $3, $4, FALSE) RETURNING id"
const deleteInviteEventSQL = "" +
- "DELETE FROM syncapi_invite_events WHERE event_id = $1"
+ "UPDATE syncapi_invite_events SET deleted=TRUE, id=nextval('syncapi_stream_id') WHERE event_id = $1 RETURNING id"
const selectInviteEventsInRangeSQL = "" +
- "SELECT room_id, headered_event_json FROM syncapi_invite_events" +
+ "SELECT room_id, headered_event_json, deleted FROM syncapi_invite_events" +
" WHERE target_user_id = $1 AND id > $2 AND id <= $3" +
" ORDER BY id DESC"
@@ -110,40 +111,46 @@ func (s *inviteEventsStatements) InsertInviteEvent(
func (s *inviteEventsStatements) DeleteInviteEvent(
ctx context.Context, inviteEventID string,
-) error {
- _, err := s.deleteInviteEventStmt.ExecContext(ctx, inviteEventID)
- return err
+) (sp types.StreamPosition, err error) {
+ err = s.deleteInviteEventStmt.QueryRowContext(ctx, inviteEventID).Scan(&sp)
+ return
}
// selectInviteEventsInRange returns a map of room ID to invite event for the
// active invites for the target user ID in the supplied range.
func (s *inviteEventsStatements) SelectInviteEventsInRange(
ctx context.Context, txn *sql.Tx, targetUserID string, r types.Range,
-) (map[string]gomatrixserverlib.HeaderedEvent, error) {
+) (map[string]gomatrixserverlib.HeaderedEvent, map[string]gomatrixserverlib.HeaderedEvent, error) {
stmt := sqlutil.TxStmt(txn, s.selectInviteEventsInRangeStmt)
rows, err := stmt.QueryContext(ctx, targetUserID, r.Low(), r.High())
if err != nil {
- return nil, err
+ return nil, nil, err
}
defer internal.CloseAndLogIfError(ctx, rows, "selectInviteEventsInRange: rows.close() failed")
result := map[string]gomatrixserverlib.HeaderedEvent{}
+ retired := map[string]gomatrixserverlib.HeaderedEvent{}
for rows.Next() {
var (
roomID string
eventJSON []byte
+ deleted bool
)
- if err = rows.Scan(&roomID, &eventJSON); err != nil {
- return nil, err
+ if err = rows.Scan(&roomID, &eventJSON, &deleted); err != nil {
+ return nil, nil, err
}
var event gomatrixserverlib.HeaderedEvent
if err := json.Unmarshal(eventJSON, &event); err != nil {
- return nil, err
+ return nil, nil, err
}
- result[roomID] = event
+ if deleted {
+ retired[roomID] = event
+ } else {
+ result[roomID] = event
+ }
}
- return result, rows.Err()
+ return result, retired, rows.Err()
}
func (s *inviteEventsStatements) SelectMaxInviteID(