@@ -148,6 +148,28 @@ func insertUnreadItem(tx *gorm.DB, item entities.MessageThreadUnreadItem) (bool,
148148 return result .RowsAffected == 1 , nil
149149}
150150
151+ func insertDeletedItem (tx * gorm.DB , messageID uuid.UUID ) error {
152+ if err := tx .
153+ Clauses (clause.OnConflict {DoNothing : true }).
154+ Create (& entities.MessageThreadDeletedItem {MessageID : messageID }).
155+ Error ; err != nil {
156+ return stacktrace .Propagatef (err , "cannot insert deleted message marker for message [%s]" , messageID )
157+ }
158+ return nil
159+ }
160+
161+ func isDeletedItem (tx * gorm.DB , messageID uuid.UUID ) (bool , error ) {
162+ item := new (entities.MessageThreadDeletedItem )
163+ result := tx .
164+ Where ("message_id = ?" , messageID ).
165+ Limit (1 ).
166+ Find (item )
167+ if result .Error != nil {
168+ return false , stacktrace .Propagatef (result .Error , "cannot load deleted message marker for message [%s]" , messageID )
169+ }
170+ return result .RowsAffected != 0 , nil
171+ }
172+
151173func markUnreadItemDeleted (tx * gorm.DB , messageID uuid.UUID , threadID uuid.UUID ) (bool , error ) {
152174 result := tx .
153175 Model (& entities.MessageThreadUnreadItem {}).
@@ -251,26 +273,33 @@ func (repository *gormMessageThreadRepository) UpdateAfterDeletedMessage(ctx con
251273
252274 err := crdbgorm .ExecuteTx (ctx , repository .db , nil , func (tx * gorm.DB ) error {
253275 tx = tx .WithContext (ctx )
254- thread , err := lockMessageThread (tx , params .UserID , params .MessageThreadID )
276+ if err := insertDeletedItem (tx , params .DeletedMessageID ); err != nil {
277+ return err
278+ }
279+
280+ thread , err := lockMessageThreadByConversation (tx , params .UserID , params .Owner , params .Contact )
281+ if stacktrace .GetCode (err ) == ErrCodeNotFound {
282+ return nil
283+ }
255284 if err != nil {
256285 return err
257286 }
258287
259- deleted , err := markUnreadItemDeleted (tx , params .DeletedMessageID , params . MessageThreadID )
288+ deleted , err := markUnreadItemDeleted (tx , params .DeletedMessageID , thread . ID )
260289 if err != nil {
261290 return err
262291 }
263292 if deleted {
264293 if err := tx .
265294 Model (thread ).
266295 Where ("user_id = ?" , params .UserID ).
267- Where ("id = ?" , params . MessageThreadID ).
296+ Where ("id = ?" , thread . ID ).
268297 UpdateColumn ("unread_count" , gorm .Expr ("GREATEST(unread_count - 1, 0)" )).
269298 Error ; err != nil {
270299 return stacktrace .Propagatef (
271300 err ,
272301 "cannot decrement unread count for thread [%s] and user [%s]" ,
273- params . MessageThreadID ,
302+ thread . ID ,
274303 params .UserID ,
275304 )
276305 }
@@ -285,13 +314,13 @@ func (repository *gormMessageThreadRepository) UpdateAfterDeletedMessage(ctx con
285314 if params .LastMessageID == nil {
286315 if err := tx .
287316 Where ("user_id = ?" , params .UserID ).
288- Where ("id = ?" , params . MessageThreadID ).
317+ Where ("id = ?" , thread . ID ).
289318 Delete (& entities.MessageThread {}).
290319 Error ; err != nil {
291320 return stacktrace .Propagatef (
292321 err ,
293322 "cannot delete message thread [%s] for user [%s] after deleting final message [%s]" ,
294- params . MessageThreadID ,
323+ thread . ID ,
295324 params .UserID ,
296325 params .DeletedMessageID ,
297326 )
@@ -306,13 +335,13 @@ func (repository *gormMessageThreadRepository) UpdateAfterDeletedMessage(ctx con
306335 if err := tx .
307336 Model (thread ).
308337 Where ("user_id = ?" , params .UserID ).
309- Where ("id = ?" , params . MessageThreadID ).
338+ Where ("id = ?" , thread . ID ).
310339 Updates (updates ).
311340 Error ; err != nil {
312341 return stacktrace .Propagatef (
313342 err ,
314343 "cannot update deleted-message metadata for thread [%s] and user [%s]" ,
315- params . MessageThreadID ,
344+ thread . ID ,
316345 params .UserID ,
317346 )
318347 }
@@ -323,9 +352,10 @@ func (repository *gormMessageThreadRepository) UpdateAfterDeletedMessage(ctx con
323352 span ,
324353 stacktrace .Propagatef (
325354 err ,
326- "cannot apply deleted message [%s] to thread [ %s] for user [%s]" ,
355+ "cannot apply deleted message [%s] to conversation [%s/ %s] for user [%s]" ,
327356 params .DeletedMessageID ,
328- params .MessageThreadID ,
357+ params .Owner ,
358+ params .Contact ,
329359 params .UserID ,
330360 ),
331361 )
@@ -341,6 +371,13 @@ func (repository *gormMessageThreadRepository) Store(ctx context.Context, params
341371
342372 err := crdbgorm .ExecuteTx (ctx , repository .db , nil , func (tx * gorm.DB ) error {
343373 tx = tx .WithContext (ctx )
374+ if params .Thread .LastMessageID != nil {
375+ deleted , err := isDeletedItem (tx , * params .Thread .LastMessageID )
376+ if err != nil || deleted {
377+ return err
378+ }
379+ }
380+
344381 candidate := * params .Thread
345382 result := tx .Clauses (clause.OnConflict {DoNothing : true }).Create (& candidate )
346383 if result .Error != nil {
@@ -417,6 +454,11 @@ func (repository *gormMessageThreadRepository) UpdateActivity(ctx context.Contex
417454
418455 err := crdbgorm .ExecuteTx (ctx , repository .db , nil , func (tx * gorm.DB ) error {
419456 tx = tx .WithContext (ctx )
457+ deleted , err := isDeletedItem (tx , params .MessageID )
458+ if err != nil || deleted {
459+ return err
460+ }
461+
420462 thread , err := lockMessageThread (tx , params .UserID , params .MessageThreadID )
421463 if err != nil {
422464 return err
0 commit comments