MCPcopy Create free account
hub / github.com/chainloop-dev/chainloop / AddMemberToGroup

Method AddMemberToGroup

app/controlplane/pkg/data/group.go:467–529  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

465
466// AddMemberToGroup adds a user to a group, creating a new membership if they are not already a member.
467func (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)

Callers

nothing calls this directly

Implementers 1

GroupRepoapp/controlplane/pkg/data/group.go

Calls 15

StartFunction · 0.92
UserIDEQFunction · 0.92
GroupIDEQFunction · 0.92
DeletedAtIsNilFunction · 0.92
IsNotFoundFunction · 0.92
NewErrAlreadyExistsStrFunction · 0.92
WithTxFunction · 0.85
ExistMethod · 0.65
SaveMethod · 0.65
CreateMethod · 0.65

Tested by

no test coverage detected