@@ -34,16 +34,14 @@ import (
3434)
3535
3636type MembershipRepo struct {
37- data * Data
38- log * log.Helper
39- groupRepo biz.GroupRepo
37+ data * Data
38+ log * log.Helper
4039}
4140
42- func NewMembershipRepo (data * Data , groupRepo biz. GroupRepo , logger log.Logger ) biz.MembershipRepo {
41+ func NewMembershipRepo (data * Data , logger log.Logger ) biz.MembershipRepo {
4342 return & MembershipRepo {
44- data : data ,
45- groupRepo : groupRepo ,
46- log : log .NewHelper (logger ),
43+ data : data ,
44+ log : log .NewHelper (logger ),
4745 }
4846}
4947
@@ -255,10 +253,7 @@ func (r *MembershipRepo) Delete(ctx context.Context, id uuid.UUID) error {
255253 return fmt .Errorf ("failed to get membership: %w" , err )
256254 }
257255
258- // Prepare a slice to hold group IDs that need to be updated
259- var groupIDs []uuid.UUID
260-
261- if trErr := WithTx (ctx , r .data .DB , func (tx * ent.Tx ) error {
256+ return WithTx (ctx , r .data .DB , func (tx * ent.Tx ) error {
262257 // Delete the specific membership
263258 if err := tx .Membership .DeleteOneID (id ).Exec (ctx ); err != nil {
264259 return fmt .Errorf ("failed to delete membership: %w" , err )
@@ -284,21 +279,6 @@ func (r *MembershipRepo) Delete(ctx context.Context, id uuid.UUID) error {
284279 // Remove the user from all groups in the organization by soft-deleting group memberships
285280 now := time .Now ()
286281
287- // Find all group IDs where this user is a member in this organization
288- groupMemberships , grpMemErr := tx .GroupMembership .Query ().Where (
289- groupmembership .UserID (userID ),
290- groupmembership .DeletedAtIsNil (),
291- groupmembership .HasGroupWith (group .OrganizationID (orgID )),
292- ).Select (groupmembership .FieldGroupID ).All (ctx )
293- if grpMemErr != nil {
294- return fmt .Errorf ("failed to fetch group IDs for user %s in organization %s: %w" , userID , orgID , err )
295- }
296-
297- // Collect group IDs to update member counts later
298- for _ , gm := range groupMemberships {
299- groupIDs = append (groupIDs , gm .GroupID )
300- }
301-
302282 // Soft delete all group memberships for this user in this organization
303283 if _ , err := tx .GroupMembership .Update ().Where (
304284 groupmembership .UserID (userID ),
@@ -307,27 +287,22 @@ func (r *MembershipRepo) Delete(ctx context.Context, id uuid.UUID) error {
307287 ).SetDeletedAt (now ).SetUpdatedAt (now ).Save (ctx ); err != nil {
308288 return fmt .Errorf ("failed to delete group memberships for user %s in organization %s: %w" , userID , orgID , err )
309289 }
310- }
311290
312- return nil
313- }); trErr != nil {
314- return trErr
315- }
316-
317- // For each affected group, update the member count based on actual query
318- updated := map [uuid.UUID ]struct {}{}
319- for _ , gid := range groupIDs {
320- if _ , seen := updated [gid ]; seen {
321- // deduplicate group IDs
322- continue
323- }
324- updated [gid ] = struct {}{}
325- if err := r .groupRepo .UpdateGroupMemberCount (ctx , gid ); err != nil {
326- return fmt .Errorf ("failed to update group member count for group %s: %w" , gid , err )
291+ // Decrement the member count of each group this user was a member of
292+ // Only decrement if member_count > 0 to avoid negative values
293+ if _ , err := tx .Group .Update ().
294+ Where (
295+ group .HasGroupUsersWith (groupmembership .UserID (userID ), groupmembership .DeletedAtIsNil ()),
296+ group .HasOrganizationWith (organization .ID (orgID )),
297+ group .MemberCountGT (0 ),
298+ ).
299+ AddMemberCount (- 1 ).Save (ctx ); err != nil {
300+ return fmt .Errorf ("failed to decrement group member count: %w" , err )
301+ }
327302 }
328- }
329303
330- return nil
304+ return nil
305+ })
331306}
332307
333308// RBAC methods
0 commit comments