22using System . Threading ;
33using System . Threading . Tasks ;
44using MangoAPI . BusinessLogic . HubConfig ;
5- using MangoAPI . BusinessLogic . Models ;
5+ using MangoAPI . BusinessLogic . Notifications ;
66using MangoAPI . BusinessLogic . Responses ;
77using MangoAPI . Domain . Constants ;
8+ using MangoAPI . Domain . Entities ;
89using MangoAPI . Infrastructure . Database ;
910using MediatR ;
1011using Microsoft . AspNetCore . SignalR ;
1112using Microsoft . EntityFrameworkCore ;
13+ using System ;
1214
1315namespace MangoAPI . BusinessLogic . ApiCommands . Messages ;
1416
@@ -35,7 +37,8 @@ public async Task<Result<DeleteMessageResponse>> Handle(
3537 {
3638 var checkMessage = await dbContext . Messages
3739 . Include ( x => x . User )
38- . FirstOrDefaultAsync ( t => t . Id == request . MessageId , cancellationToken ) ;
40+ . Select ( x => new { MessageId = x . Id , UserId = x . User . Id } )
41+ . FirstOrDefaultAsync ( t => t . MessageId == request . MessageId , cancellationToken ) ;
3942
4043 if ( checkMessage == null )
4144 {
@@ -45,7 +48,7 @@ public async Task<Result<DeleteMessageResponse>> Handle(
4548 return responseFactory . ConflictResponse ( errorMessage , errorDescription ) ;
4649 }
4750
48- if ( checkMessage . User . Id != request . UserId )
51+ if ( checkMessage . UserId != request . UserId )
4952 {
5053 const string errorMessage = ResponseMessageCodes . Unauthorized ;
5154 var errorDescription = ResponseMessageCodes . ErrorDictionary [ errorMessage ] ;
@@ -70,42 +73,67 @@ public async Task<Result<DeleteMessageResponse>> Handle(
7073 return responseFactory . ConflictResponse ( errorMessage , errorDescription ) ;
7174 }
7275
73- var message = chat . Messages . First ( x => x . Id == request . MessageId ) ;
76+ var deletedMessage = chat . Messages . First ( x => x . Id == request . MessageId ) ;
7477
75- dbContext . Entry ( message . User ) . State = EntityState . Detached ;
78+ dbContext . Entry ( deletedMessage . User ) . State = EntityState . Detached ;
7679
77- var deleteNotification = new MessageDeleteNotification
78- {
79- ChatId = request . ChatId , DeletedMessageId = request . MessageId , IsLastMessage = false ,
80- } ;
80+ var isMessageLast = chat . LastMessageId . HasValue && chat . LastMessageId == request . MessageId ;
8181
82- var messageIsLast = chat . LastMessageId . HasValue && chat . LastMessageId == request . MessageId ;
82+ var deleteNotification = isMessageLast
83+ ? UpdateChatLastMessageAndReturnNotification ( chat , deletedMessage )
84+ : CreateNotLastMessageNotification ( chat . Id , deletedMessage . Id , deletedMessage . UserId ) ;
8385
84- if ( messageIsLast )
85- {
86- var newLastMessage = chat . Messages
87- . Where ( x => x != message ) . MaxBy ( x => x . CreatedAt ) ;
88-
89- deleteNotification . NewLastMessageAuthor = newLastMessage ? . User ? . DisplayName ;
90- deleteNotification . NewLastMessageId = newLastMessage ? . Id ;
91- deleteNotification . NewLastMessageText = newLastMessage ? . Text ;
92- deleteNotification . NewLastMessageTime = newLastMessage ? . CreatedAt ;
93- deleteNotification . IsLastMessage = true ;
94-
95- chat . UpdateLastMessage (
96- lastMessageAuthor : newLastMessage ? . User ? . DisplayName ,
97- lastMessageText : newLastMessage ? . Text ,
98- newLastMessage ? . CreatedAt ,
99- newLastMessage ? . Id ) ;
100- }
101-
102- dbContext . Messages . Remove ( message ) ;
86+ dbContext . Messages . Remove ( deletedMessage ) ;
10387 dbContext . Chats . Update ( chat ) ;
10488
10589 await dbContext . SaveChangesAsync ( cancellationToken ) ;
10690
107- await hubContext . Clients . Group ( message . ChatId . ToString ( ) ) . NotifyOnMessageDeleteAsync ( deleteNotification ) ;
91+ await hubContext . Clients . Group ( deletedMessage . ChatId . ToString ( ) ) . MessageDeletedAsync ( deleteNotification ) ;
92+
93+ return responseFactory . SuccessResponse ( DeleteMessageResponse . FromSuccess ( deletedMessage ) ) ;
94+ }
10895
109- return responseFactory . SuccessResponse ( DeleteMessageResponse . FromSuccess ( message ) ) ;
96+ private static DeleteMessageNotification UpdateChatLastMessageAndReturnNotification (
97+ ChatEntity chat ,
98+ MessageEntity deletedMessage )
99+ {
100+ var newLastMessage = chat . Messages
101+ . Where ( x => x . Id != deletedMessage . Id ) . MaxBy ( x => x . CreatedAt ) ;
102+
103+ chat . UpdateLastMessage (
104+ lastMessageAuthor : newLastMessage ? . User ? . DisplayName ,
105+ lastMessageText : newLastMessage ? . Text ,
106+ newLastMessage ? . CreatedAt ,
107+ newLastMessage ? . Id ) ;
108+
109+ var deleteNotification = new DeleteMessageNotification (
110+ deletedMessage . UserId ,
111+ chat . Id ,
112+ deletedMessage . Id ,
113+ newLastMessage ? . Text ,
114+ newLastMessage ? . CreatedAt ,
115+ newLastMessage ? . Id ,
116+ newLastMessage ? . User ? . DisplayName ,
117+ IsLastMessage : true ) ;
118+
119+ return deleteNotification ;
120+ }
121+
122+ private static DeleteMessageNotification CreateNotLastMessageNotification (
123+ Guid chatId ,
124+ Guid deletedMessageId ,
125+ Guid userId )
126+ {
127+ var deleteNotification = new DeleteMessageNotification (
128+ userId ,
129+ chatId ,
130+ deletedMessageId ,
131+ NewLastMessageText : string . Empty ,
132+ NewLastMessageTime : null ,
133+ NewLastMessageId : null ,
134+ NewLastMessageDisplayName : null ,
135+ IsLastMessage : false ) ;
136+
137+ return deleteNotification ;
110138 }
111139}
0 commit comments