AddMemberToGroup adds a user to a group, creating a new membership if they are not already a member.
(ctx context.Context, orgID uuid.UUID, groupID uuid.UUID, userID uuid.UUID, maintainer bool)
| 465 | |
| 466 | // AddMemberToGroup adds a user to a group, creating a new membership if they are not already a member. |
| 467 | func (g GroupRepo) AddMemberToGroup(ctx context.Context, orgID uuid.UUID, groupID uuid.UUID, userID uuid.UUID, maintainer bool) (*biz.GroupMembership, error) { |
| 468 | ctx, span := otelx.Start(ctx, groupRepoTracer, "GroupRepo.AddMemberToGroup") |
| 469 | defer span.End() |
| 470 | |
| 471 | if err := WithTx(ctx, g.data.DB, func(tx *ent.Tx) error { |
| 472 | // Check if the user is already a member of this group |
| 473 | existingMember, err := tx.GroupMembership.Query(). |
| 474 | Where(groupmembership.UserIDEQ(userID), groupmembership.GroupIDEQ(groupID), groupmembership.DeletedAtIsNil()). |
| 475 | Exist(ctx) |
| 476 | if err != nil && !ent.IsNotFound(err) { |
| 477 | return fmt.Errorf("failed to check existing group membership: %w", err) |
| 478 | } |
| 479 | |
| 480 | // If the user is already a member, return an error |
| 481 | if existingMember { |
| 482 | return biz.NewErrAlreadyExistsStr("user is already a member of this group") |
| 483 | } |
| 484 | |
| 485 | // Create a new group-user relationship |
| 486 | if _, err := tx.GroupMembership.Create(). |
| 487 | SetGroupID(groupID). |
| 488 | SetUserID(userID). |
| 489 | SetMaintainer(maintainer). |
| 490 | Save(ctx); err != nil { |
| 491 | return fmt.Errorf("failed to add user to group: %w", err) |
| 492 | } |
| 493 | |
| 494 | // Update the group's updated_at timestamp |
| 495 | if _, err := tx.Group.UpdateOneID(groupID). |
| 496 | SetUpdatedAt(time.Now()). |
| 497 | Save(ctx); err != nil { |
| 498 | return fmt.Errorf("failed to update group timestamp: %w", err) |
| 499 | } |
| 500 | |
| 501 | // Update the user membership with the role of maintainer |
| 502 | if maintainer { |
| 503 | _, err = tx.Membership.Create(). |
| 504 | SetUserID(userID). |
| 505 | SetOrganizationID(orgID). |
| 506 | SetRole(authz.RoleGroupMaintainer). |
| 507 | SetMembershipType(authz.MembershipTypeUser). |
| 508 | SetMemberID(userID). |
| 509 | SetResourceType(authz.ResourceTypeGroup). |
| 510 | SetResourceID(groupID). |
| 511 | Save(ctx) |
| 512 | if err != nil { |
| 513 | return fmt.Errorf("failed to create membership for user %s in group %s: %w", userID, groupID, err) |
| 514 | } |
| 515 | } |
| 516 | |
| 517 | return nil |
| 518 | }); err != nil { |
| 519 | return nil, fmt.Errorf("failed to add member to group: %w", err) |
| 520 | } |
| 521 | |
| 522 | // Update the member count based on actual query after transaction |
| 523 | if err := g.UpdateGroupMemberCount(ctx, groupID); err != nil { |
| 524 | g.log.Warnf("failed to update member count after adding member to group %s: %v", groupID, err) |
nothing calls this directly
no test coverage detected