|
6 | 6 | "connectrpc.com/connect" |
7 | 7 | grpczap "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap" |
8 | 8 | "github.com/raystack/frontier/core/audit" |
| 9 | + "github.com/raystack/frontier/core/membership" |
9 | 10 | "github.com/raystack/frontier/core/organization" |
10 | 11 | "github.com/raystack/frontier/core/policy" |
11 | 12 | "github.com/raystack/frontier/core/project" |
@@ -569,6 +570,65 @@ func (h *ConnectHandler) SetOrganizationMemberRole(ctx context.Context, request |
569 | 570 | return connect.NewResponse(&frontierv1beta1.SetOrganizationMemberRoleResponse{}), nil |
570 | 571 | } |
571 | 572 |
|
| 573 | +func (h *ConnectHandler) AddOrganizationMembers(ctx context.Context, request *connect.Request[frontierv1beta1.AddOrganizationMembersRequest]) (*connect.Response[frontierv1beta1.AddOrganizationMembersResponse], error) { |
| 574 | + errorLogger := NewErrorLogger() |
| 575 | + orgID := request.Msg.GetOrgId() |
| 576 | + |
| 577 | + var results []*frontierv1beta1.OrgMemberResult |
| 578 | + for _, member := range request.Msg.GetMembers() { |
| 579 | + result := &frontierv1beta1.OrgMemberResult{ |
| 580 | + UserId: member.GetUserId(), |
| 581 | + } |
| 582 | + |
| 583 | + if err := h.membershipService.AddOrganizationMember(ctx, orgID, member.GetUserId(), schema.UserPrincipal, member.GetRoleId()); err != nil { |
| 584 | + result.Success = false |
| 585 | + result.Error = toClientError(err) |
| 586 | + if !isDomainError(err) { |
| 587 | + errorLogger.LogServiceError(ctx, request, "AddOrganizationMembers", err, |
| 588 | + zap.String("org_id", orgID), |
| 589 | + zap.String("user_id", member.GetUserId()), |
| 590 | + zap.String("role_id", member.GetRoleId())) |
| 591 | + } |
| 592 | + } else { |
| 593 | + result.Success = true |
| 594 | + } |
| 595 | + |
| 596 | + results = append(results, result) |
| 597 | + } |
| 598 | + |
| 599 | + return connect.NewResponse(&frontierv1beta1.AddOrganizationMembersResponse{ |
| 600 | + Results: results, |
| 601 | + }), nil |
| 602 | +} |
| 603 | + |
| 604 | +// isDomainError returns true if the error is a known domain error safe to expose to clients. |
| 605 | +func isDomainError(err error) bool { |
| 606 | + knownErrors := []error{ |
| 607 | + membership.ErrAlreadyMember, |
| 608 | + membership.ErrInvalidOrgRole, |
| 609 | + organization.ErrNotExist, |
| 610 | + organization.ErrDisabled, |
| 611 | + user.ErrNotExist, |
| 612 | + user.ErrDisabled, |
| 613 | + role.ErrNotExist, |
| 614 | + role.ErrInvalidID, |
| 615 | + } |
| 616 | + for _, known := range knownErrors { |
| 617 | + if errors.Is(err, known) { |
| 618 | + return true |
| 619 | + } |
| 620 | + } |
| 621 | + return false |
| 622 | +} |
| 623 | + |
| 624 | +// toClientError returns a client-safe error message. |
| 625 | +func toClientError(err error) string { |
| 626 | + if isDomainError(err) { |
| 627 | + return err.Error() |
| 628 | + } |
| 629 | + return ErrInternalServerError.Error() |
| 630 | +} |
| 631 | + |
572 | 632 | func (h *ConnectHandler) EnableOrganization(ctx context.Context, request *connect.Request[frontierv1beta1.EnableOrganizationRequest]) (*connect.Response[frontierv1beta1.EnableOrganizationResponse], error) { |
573 | 633 | errorLogger := NewErrorLogger() |
574 | 634 |
|
|
0 commit comments