@@ -65,6 +65,15 @@ class UpdateGroupInput {
6565
6666}
6767
68+ @InputType ( )
69+ class RemoveMembersInput {
70+ @Field ( ( ) => [ Number ] , { nullable : true } )
71+ userIds ?: number [ ] ;
72+
73+ @Field ( ( ) => [ String ] , { nullable : true } )
74+ userEmails ?: string [ ] ;
75+ }
76+
6877@ObjectType ( )
6978export class MyGroupsResponse {
7079 @Field ( ( ) => [ Group ] )
@@ -88,7 +97,9 @@ export default class GroupResolver {
8897 user : { id : ctx . user ?. id } ,
8998 } ,
9099 } ,
91- relations : { groupMember : true , user_admin : true , user_beneficiary : true } ,
100+ relations : { groupMember : {
101+ user : true , // 👈 THIS is the key
102+ } , user_admin : true , user_beneficiary : true } ,
92103 order : { id : "DESC" } ,
93104 } ) ;
94105
@@ -103,7 +114,13 @@ export default class GroupResolver {
103114 async getGroupById ( @Arg ( "id" ) id : number ) {
104115 const group = await Group . findOne ( {
105116 where : { id : id } ,
106- relations : { user_admin : true , user_beneficiary : true , groupMember : true } ,
117+ relations : {
118+ user_admin : true ,
119+ user_beneficiary : true ,
120+ groupMember : {
121+ user : true ,
122+ } ,
123+ } ,
107124 } ) ;
108125 if ( ! group ) throw new Error ( "Groupe non trouvé" ) ;
109126 return group ;
@@ -113,6 +130,7 @@ export default class GroupResolver {
113130 async groupMember ( @Root ( ) group : Group ) {
114131 const groupMembers = await GroupMember . find ( {
115132 where : { groupId : group . id } ,
133+ relations : { user : true } ,
116134 } ) ;
117135
118136 return groupMembers || [ ] ; // >>> not null
@@ -252,12 +270,20 @@ export default class GroupResolver {
252270
253271 @UseMiddleware ( RoleMiddleware ( ) )
254272 @Mutation ( ( ) => String )
255- async removeMembersFromGroup ( @Arg ( "groupId" , ( ) => Number ) groupId : number ,
256- @Arg ( "userIds" , ( ) => [ Number ] ) userIds : number [ ] , @Ctx ( ) ctx : ContextType ) : Promise < string > {
273+ async removeMembersFromGroup (
274+ @Arg ( "groupId" , ( ) => Number ) groupId : number ,
275+ @Arg ( "data" ) data : RemoveMembersInput ,
276+ @Ctx ( ) ctx : ContextType
277+ ) : Promise < string > {
257278 if ( ! ctx . user ) {
258279 throw new Error ( "Utilisateur non connecté" ) ;
259280 }
260281
282+ // Ensure at least one input is provided
283+ if ( ( ! data . userIds || data . userIds . length === 0 ) && ( ! data . userEmails || data . userEmails . length === 0 ) ) {
284+ throw new Error ( "Vous devez fournir au moins un identifiant utilisateur ou un email" ) ;
285+ }
286+
261287 const group = await Group . findOne ( {
262288 where : {
263289 id : groupId
@@ -268,55 +294,69 @@ export default class GroupResolver {
268294 if ( ! group ) {
269295 throw new Error ( "Groupe introuvable ou accès refusé" ) ;
270296 }
271- const currentUserId = ctx . user . id
272- const isAdmin = ctx . user . id === group . user_admin . id
297+
298+ const currentUserId = ctx . user . id ;
299+ const isAdmin = ctx . user . id === group . user_admin . id ;
300+
301+ // Convert emails to user IDs if provided
302+ let userIdsToRemove : number [ ] = [ ] ;
273303
274-
275- //Admin cannot remove itself from a group
276- if ( isAdmin && userIds . length > 0 && userIds . includes ( group ?. user_admin . id ) ) {
277- throw new Error ( "L'administrateur du groupe ne peut pas être supprimer. Supprimer plutôt le groupe" )
304+ if ( data . userEmails && data . userEmails . length > 0 ) {
305+ await Promise . all (
306+ data . userEmails . map ( async ( email ) => {
307+ const user = await User . findOne ( { where : { email } } ) ;
308+ if ( user ) {
309+ userIdsToRemove . push ( user . id ) ;
310+ }
311+ } )
312+ ) ;
313+ }
314+
315+ // Add direct user IDs if provided
316+ if ( data . userIds && data . userIds . length > 0 ) {
317+ userIdsToRemove . push ( ...data . userIds ) ;
318+ }
319+
320+ // Remove duplicates
321+ userIdsToRemove = [ ...new Set ( userIdsToRemove ) ] ;
322+
323+ if ( userIdsToRemove . length === 0 ) {
324+ throw new Error ( "Aucun utilisateur valide trouvé" ) ;
325+ }
326+
327+ // Admin cannot remove itself from a group
328+ if ( isAdmin && userIdsToRemove . includes ( group . user_admin . id ) ) {
329+ throw new Error ( "L'administrateur du groupe ne peut pas être supprimé. Supprimez plutôt le groupe" ) ;
278330 }
279331
280- // Remove myself from a group
281- if ( ! isAdmin && userIds . length > 0 && userIds . every ( ( id ) => ( id === currentUserId ) ) ) {
332+ // Remove myself from a group
333+ if ( ! isAdmin && userIdsToRemove . length === 1 && userIdsToRemove [ 0 ] === currentUserId ) {
282334 try {
283- removeMembersFromGroup ( {
335+ await removeMembersFromGroup ( {
284336 userIds : [ currentUserId ] ,
285337 groupId,
286- } )
287-
288- return "Succès! Vous ne faites plus partie du groupe!"
289-
338+ } ) ;
339+ return "Succès! Vous ne faites plus partie du groupe!" ;
290340 } catch ( err ) {
291- console . error ( "deleteGroup error:" , err ) ;
341+ console . error ( "removeMembersFromGroup error:" , err ) ;
292342 throw new Error ( "Une erreur est survenue, nous n'avons pas pu vous supprimer du groupe" ) ;
293343 }
294-
295344 }
296-
297- //Admin removes users from a group
298- if ( isAdmin && userIds . length > 0 && ! userIds . includes ( group ? .user_admin . id ) ) {
345+
346+ // Admin removes users from a group
347+ if ( isAdmin && userIdsToRemove . length > 0 && ! userIdsToRemove . includes ( group . user_admin . id ) ) {
299348 try {
300- removeMembersFromGroup ( {
301- userIds,
349+ await removeMembersFromGroup ( {
350+ userIds : userIdsToRemove ,
302351 groupId,
303- } )
304-
305- return "Succès! Les utilisateurs ont été supprimé du groupe!"
306-
352+ } ) ;
353+ return "Succès! Les utilisateurs ont été supprimés du groupe!" ;
307354 } catch ( err ) {
308- console . error ( "deleteGroup error:" , err ) ;
355+ console . error ( "removeMembersFromGroup error:" , err ) ;
309356 throw new Error ( "Une erreur est survenue, nous n'avons pas pu supprimer les utilisateurs du groupe" ) ;
310357 }
311-
312358 }
313359
314- return "Un problème est survenu"
315-
316-
317-
318-
360+ throw new Error ( "Vous n'avez pas les permissions nécessaires pour effectuer cette action" ) ;
319361 }
320-
321-
322362}
0 commit comments