22
33namespace App \Console \Commands \Chat ;
44
5- use App \Models \User ;
6- use App \Models \Message ;
75use App \Events \Chat \Broadcasts \BroadcastMessageDeletionIdsEvent ;
6+ use App \Models \Message ;
7+ use App \Models \User ;
88use Carbon \Carbon ;
99use Illuminate \Support \Facades \Log ;
1010
1111class DeleteCommand extends AbstractChatCommand
1212{
1313 protected string $ name = 'delete ' ;
14+
1415 protected array $ aliases = ['del ' , 'remove ' , 'purge ' ];
16+
1517 protected string $ description = 'Delete all messages from a user within a time period ' ;
18+
1619 protected string $ signature = '/delete <username> <duration> ' ;
1720
1821 protected array $ parameters = [
@@ -30,7 +33,7 @@ class DeleteCommand extends AbstractChatCommand
3033
3134 public function authorize (User $ user ): bool
3235 {
33- return $ user ->hasPermission ('chat.moderate ' ) ||
36+ return $ user ->hasPermission ('chat.moderate ' ) ||
3437 $ user ->hasRole ('admin ' ) ||
3538 $ user ->hasRole ('moderator ' );
3639 }
@@ -42,16 +45,18 @@ protected function execute(User $user, array $parameters): void
4245
4346 // Find the target user
4447 $ targetUser = User::where ('name ' , $ username )->first ();
45-
46- if (!$ targetUser ) {
48+
49+ if (! $ targetUser ) {
4750 $ this ->feedback ($ user , "User ' {$ username }' not found. " , 'error ' );
51+
4852 return ;
4953 }
5054
5155 // Parse duration to get the time range
5256 $ cutoffTime = $ this ->parseDurationToTime ($ duration );
53- if (!$ cutoffTime ) {
57+ if (! $ cutoffTime ) {
5458 $ this ->feedback ($ user , "Invalid duration format. Use formats like '5m', '1h', '1d'. " , 'error ' );
59+
5560 return ;
5661 }
5762
@@ -63,28 +68,34 @@ protected function execute(User $user, array $parameters): void
6368
6469 if ($ messages ->isEmpty ()) {
6570 $ this ->feedback ($ user , "No messages found from ' {$ username }' in the last {$ duration }. " , 'info ' );
71+
6672 return ;
6773 }
6874
69- // Collect message IDs for broadcasting
70- $ messageIds = $ messages ->pluck ( ' id ' )-> toArray ( );
71- $ messageCount = count ($ messageIds );
75+ // Group messages by source_id for broadcasting
76+ $ messagesBySource = $ messages ->groupBy ( ' source_id ' );
77+ $ messageCount = $ messages -> count ();
7278
7379 // Log the IDs being deleted for debugging
7480 Log::info ('Deleting messages with IDs ' , [
75- 'message_ids ' => $ messageIds ,
81+ 'message_ids ' => $ messages -> pluck ( ' id ' )-> toArray () ,
7682 'count ' => $ messageCount ,
7783 'target_user ' => $ username ,
7884 ]);
7985
8086 // Soft delete all messages
81- Message::whereIn ('id ' , $ messageIds )->update ([
87+ Message::whereIn ('id ' , $ messages -> pluck ( ' id ' ) )->update ([
8288 'deleted_at ' => now (),
8389 'deleted_by_user_id ' => $ user ->id ,
8490 ]);
8591
86- // Broadcast deletion event with message IDs to ALL users (including the moderator)
87- broadcast (new BroadcastMessageDeletionIdsEvent ($ messageIds ));
92+ // Broadcast deletion event to each source channel
93+ foreach ($ messagesBySource as $ sourceId => $ sourceMessages ) {
94+ broadcast (new BroadcastMessageDeletionIdsEvent (
95+ $ sourceMessages ->pluck ('id ' )->toArray (),
96+ $ sourceId
97+ ));
98+ }
8899
89100 // Calculate human-readable duration
90101 $ durationText = $ this ->humanizeDuration ($ duration );
@@ -114,16 +125,16 @@ protected function execute(User $user, array $parameters): void
114125 private function parseDurationToTime (string $ duration ): ?Carbon
115126 {
116127 $ matches = [];
117- if (!preg_match ('/^(\d+)([smhd])$/i ' , $ duration , $ matches )) {
128+ if (! preg_match ('/^(\d+)([smhd])$/i ' , $ duration , $ matches )) {
118129 return null ;
119130 }
120131
121132 $ value = (int ) $ matches [1 ];
122133 $ unit = strtolower ($ matches [2 ]);
123134
124135 $ now = now ();
125-
126- return match ($ unit ) {
136+
137+ return match ($ unit ) {
127138 's ' => $ now ->subSeconds ($ value ),
128139 'm ' => $ now ->subMinutes ($ value ),
129140 'h ' => $ now ->subHours ($ value ),
@@ -135,18 +146,18 @@ private function parseDurationToTime(string $duration): ?Carbon
135146 private function humanizeDuration (string $ duration ): string
136147 {
137148 $ matches = [];
138- if (!preg_match ('/^(\d+)([smhd])$/i ' , $ duration , $ matches )) {
149+ if (! preg_match ('/^(\d+)([smhd])$/i ' , $ duration , $ matches )) {
139150 return $ duration ;
140151 }
141152
142153 $ value = (int ) $ matches [1 ];
143154 $ unit = strtolower ($ matches [2 ]);
144155
145- return match ($ unit ) {
146- 's ' => $ value . ' second ' . ($ value > 1 ? 's ' : '' ),
147- 'm ' => $ value . ' minute ' . ($ value > 1 ? 's ' : '' ),
148- 'h ' => $ value . ' hour ' . ($ value > 1 ? 's ' : '' ),
149- 'd ' => $ value . ' day ' . ($ value > 1 ? 's ' : '' ),
156+ return match ($ unit ) {
157+ 's ' => $ value. ' second ' . ($ value > 1 ? 's ' : '' ),
158+ 'm ' => $ value. ' minute ' . ($ value > 1 ? 's ' : '' ),
159+ 'h ' => $ value. ' hour ' . ($ value > 1 ? 's ' : '' ),
160+ 'd ' => $ value. ' day ' . ($ value > 1 ? 's ' : '' ),
150161 default => $ duration ,
151162 };
152163 }
@@ -160,4 +171,4 @@ public function examples(): array
160171 '/purge SpamUser 30m ' => 'Using alias to purge messages from last 30 minutes ' ,
161172 ];
162173 }
163- }
174+ }
0 commit comments