RemoveMemberFromGroup removes a user from a group.
(ctx context.Context, orgID uuid.UUID, groupID uuid.UUID, userID uuid.UUID)
| 530 | |
| 531 | // RemoveMemberFromGroup removes a user from a group. |
| 532 | func (g GroupRepo) RemoveMemberFromGroup(ctx context.Context, orgID uuid.UUID, groupID uuid.UUID, userID uuid.UUID) error { |
| 533 | ctx, span := otelx.Start(ctx, groupRepoTracer, "GroupRepo.RemoveMemberFromGroup") |
| 534 | defer span.End() |
| 535 | |
| 536 | err := WithTx(ctx, g.data.DB, func(tx *ent.Tx) error { |
| 537 | // Check if the user is a member of this group |
| 538 | existingMembership, err := tx.GroupMembership.Query(). |
| 539 | Where(groupmembership.UserIDEQ(userID), groupmembership.GroupIDEQ(groupID), groupmembership.DeletedAtIsNil()). |
| 540 | Only(ctx) |
| 541 | if err != nil { |
| 542 | if ent.IsNotFound(err) { |
| 543 | return biz.NewErrNotFound("group membership") |
| 544 | } |
| 545 | return fmt.Errorf("failed to check existing group membership: %w", err) |
| 546 | } |
| 547 | |
| 548 | now := time.Now() |
| 549 | |
| 550 | // Mark the membership as deleted |
| 551 | _, err = tx.GroupMembership.UpdateOne(existingMembership). |
| 552 | SetDeletedAt(now). |
| 553 | SetUpdatedAt(now). |
| 554 | Save(ctx) |
| 555 | if err != nil { |
| 556 | return fmt.Errorf("failed to remove user from group: %w", err) |
| 557 | } |
| 558 | |
| 559 | // Update the group's updated_at timestamp |
| 560 | if _, err := tx.Group.UpdateOneID(groupID). |
| 561 | SetUpdatedAt(now). |
| 562 | Save(ctx); err != nil { |
| 563 | return fmt.Errorf("failed to update group timestamp: %w", err) |
| 564 | } |
| 565 | |
| 566 | if existingMembership.Maintainer { |
| 567 | // Also remove the user membership if it exists |
| 568 | if _, err := tx.Membership.Delete().Where( |
| 569 | membership.MemberID(userID), |
| 570 | membership.ResourceID(groupID), |
| 571 | membership.ResourceTypeEQ(authz.ResourceTypeGroup), |
| 572 | membership.HasOrganizationWith( |
| 573 | organization.ID(orgID), |
| 574 | ), |
| 575 | ).Exec(ctx); err != nil { |
| 576 | return fmt.Errorf("failed to remove user from group: %w", err) |
| 577 | } |
| 578 | } |
| 579 | |
| 580 | return nil |
| 581 | }) |
| 582 | |
| 583 | if err != nil { |
| 584 | return err |
| 585 | } |
| 586 | |
| 587 | // Update the member count based on actual query after transaction |
| 588 | if err := g.UpdateGroupMemberCount(ctx, groupID); err != nil { |
| 589 | g.log.Warnf("failed to update member count after removing member from group %s: %v", groupID, err) |
nothing calls this directly
no test coverage detected