From 032ad5b052675572524b3fc53a67d3dec3e4ac96 Mon Sep 17 00:00:00 2001 From: alexfca <75228224+alexfca@users.noreply.github.com> Date: Mon, 13 Sep 2021 09:52:55 +1000 Subject: [PATCH] Fix Forget Room bug that prevented Room Deletion (#16) - Fix membership Insert to ensure the OnConflict performs an Update if exists - Fix type in the rooms bulkSelectRoomNIDsSQL Co-authored-by: alexf@example.com --- roomserver/storage/cosmosdb/membership_table.go | 12 +++++++++++- roomserver/storage/cosmosdb/rooms_table.go | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/roomserver/storage/cosmosdb/membership_table.go b/roomserver/storage/cosmosdb/membership_table.go index 04a964ad5..d07eb8da3 100644 --- a/roomserver/storage/cosmosdb/membership_table.go +++ b/roomserver/storage/cosmosdb/membership_table.go @@ -297,13 +297,23 @@ func (s *membershipStatements) InsertMembership( cosmosDocId := cosmosdbapi.GetDocumentId(s.db.cosmosConfig.TenantName, dbCollectionName, docId) pk := cosmosdbapi.GetPartitionKey(s.db.cosmosConfig.TenantName, dbCollectionName) + // " ON CONFLICT DO NOTHING" + exists, _ := getMembership(s, ctx, pk, cosmosDocId) + if exists != nil { + exists.Membership.RoomNID = int64(roomNID) + exists.Membership.TargetNID = int64(targetUserNID) + exists.Membership.TargetLocal = localTarget + _, errSet := setMembership(s, ctx, *exists) + return errSet + } + data := MembershipCosmos{ EventNID: 0, Forgotten: false, MembershipNID: 1, RoomNID: int64(roomNID), SenderNID: 0, - TargetLocal: false, + TargetLocal: localTarget, TargetNID: int64(targetUserNID), } diff --git a/roomserver/storage/cosmosdb/rooms_table.go b/roomserver/storage/cosmosdb/rooms_table.go index bfb672561..e641b761a 100644 --- a/roomserver/storage/cosmosdb/rooms_table.go +++ b/roomserver/storage/cosmosdb/rooms_table.go @@ -104,7 +104,7 @@ const bulkSelectRoomIDsSQL = "" + // "SELECT room_nid FROM roomserver_rooms WHERE room_id IN ($1)" const bulkSelectRoomNIDsSQL = "" + "select * from c where c._cn = @x1 " + - "and ARRAY_CONTAINS(@x2, c.mx_roomserver_room.room_nid)" + "and ARRAY_CONTAINS(@x2, c.mx_roomserver_room.room_id)" type roomStatements struct { db *Database