Simplify SCIM types/error management

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2026-01-05 11:14:35 +01:00
parent 3e9df307b8
commit eb4024d878
4 changed files with 105 additions and 436 deletions

View File

@@ -131,24 +131,17 @@ func (h *scimResourceHandler) Create(r *http.Request, attributes scim.ResourceAt
ctx := r.Context()
config := scimConfigFromContext(ctx)
membership, err := h.handler.iam.SCIMService.CreateUser(ctx, config, attributes, getIPAddress(r))
resource, err := h.handler.iam.SCIMService.CreateUser(ctx, config, attributes, getIPAddress(r))
if err != nil {
var invalidReq *scimservice.ErrSCIMInvalidRequest
var alreadyExists *scimservice.ErrSCIMUserAlreadyExists
if errors.As(err, &invalidReq) {
return scim.Resource{}, scimerrors.ScimErrorBadRequest(invalidReq.Detail)
var scimErr scimerrors.ScimError
if errors.As(err, &scimErr) {
return scim.Resource{}, err
}
if errors.As(err, &alreadyExists) {
return scim.Resource{}, scimerrors.ScimErrorUniqueness
}
h.handler.logger.ErrorCtx(ctx, "cannot create user", log.Error(err))
return scim.Resource{}, scimerrors.ScimErrorInternal
}
return scimservice.MembershipToResource(membership), nil
return resource, nil
}
func (h *scimResourceHandler) Get(r *http.Request, id string) (scim.Resource, error) {
@@ -160,18 +153,17 @@ func (h *scimResourceHandler) Get(r *http.Request, id string) (scim.Resource, er
return scim.Resource{}, scimerrors.ScimErrorResourceNotFound(id)
}
membership, identity, profile, err := h.handler.iam.SCIMService.GetUser(ctx, config, membershipID, getIPAddress(r))
resource, err := h.handler.iam.SCIMService.GetUser(ctx, config, membershipID, getIPAddress(r))
if err != nil {
var notFound *scimservice.ErrSCIMUserNotFound
if errors.As(err, &notFound) {
return scim.Resource{}, scimerrors.ScimErrorResourceNotFound(id)
var scimErr scimerrors.ScimError
if errors.As(err, &scimErr) {
return scim.Resource{}, err
}
h.handler.logger.ErrorCtx(ctx, "cannot get user", log.Error(err))
return scim.Resource{}, scimerrors.ScimErrorInternal
}
return scimservice.MembershipToResourceFull(membership, identity, profile), nil
return resource, nil
}
func (h *scimResourceHandler) GetAll(r *http.Request, params scim.ListRequestParams) (scim.Page, error) {
@@ -185,25 +177,24 @@ func (h *scimResourceHandler) GetAll(r *http.Request, params scim.ListRequestPar
// Parse SCIM filter AST into our filter type
filter, err := scimservice.ParseUserFilter(params.FilterValidator.GetFilter())
if err != nil {
var unsupportedFilter *scimservice.ErrUnsupportedFilter
if errors.As(err, &unsupportedFilter) {
return scim.Page{}, scimerrors.ScimErrorBadRequest(err.Error())
var scimErr scimerrors.ScimError
if errors.As(err, &scimErr) {
return scim.Page{}, err
}
h.handler.logger.ErrorCtx(ctx, "cannot parse filter", log.Error(err))
return scim.Page{}, scimerrors.ScimErrorInternal
}
memberships, totalCount, err := h.handler.iam.SCIMService.ListUsers(ctx, config, filter, params.StartIndex, params.Count, getIPAddress(r))
resources, totalCount, err := h.handler.iam.SCIMService.ListUsers(ctx, config, filter, params.StartIndex, params.Count, getIPAddress(r))
if err != nil {
var scimErr scimerrors.ScimError
if errors.As(err, &scimErr) {
return scim.Page{}, err
}
h.handler.logger.ErrorCtx(ctx, "cannot list users", log.Error(err))
return scim.Page{}, scimerrors.ScimErrorInternal
}
resources := make([]scim.Resource, 0, len(memberships))
for _, m := range memberships {
resources = append(resources, scimservice.MembershipToResource(m))
}
return scim.Page{
TotalResults: totalCount,
Resources: resources,
@@ -219,22 +210,17 @@ func (h *scimResourceHandler) Replace(r *http.Request, id string, attributes sci
return scim.Resource{}, scimerrors.ScimErrorResourceNotFound(id)
}
membership, deactivated, err := h.handler.iam.SCIMService.ReplaceUser(ctx, config, membershipID, attributes, getIPAddress(r))
resource, err := h.handler.iam.SCIMService.ReplaceUser(ctx, config, membershipID, attributes, getIPAddress(r))
if err != nil {
var notFound *scimservice.ErrSCIMUserNotFound
if errors.As(err, &notFound) {
return scim.Resource{}, scimerrors.ScimErrorResourceNotFound(id)
var scimErr scimerrors.ScimError
if errors.As(err, &scimErr) {
return scim.Resource{}, err
}
h.handler.logger.ErrorCtx(ctx, "cannot update user", log.Error(err))
return scim.Resource{}, scimerrors.ScimErrorInternal
}
if deactivated {
return scimservice.MembershipToResourceWithActive(membership, false), nil
}
return scimservice.MembershipToResource(membership), nil
return resource, nil
}
func (h *scimResourceHandler) Patch(r *http.Request, id string, operations []scim.PatchOperation) (scim.Resource, error) {
@@ -246,22 +232,17 @@ func (h *scimResourceHandler) Patch(r *http.Request, id string, operations []sci
return scim.Resource{}, scimerrors.ScimErrorResourceNotFound(id)
}
membership, deactivated, err := h.handler.iam.SCIMService.PatchUser(ctx, config, membershipID, operations, getIPAddress(r))
resource, err := h.handler.iam.SCIMService.PatchUser(ctx, config, membershipID, operations, getIPAddress(r))
if err != nil {
var notFound *scimservice.ErrSCIMUserNotFound
if errors.As(err, &notFound) {
return scim.Resource{}, scimerrors.ScimErrorResourceNotFound(id)
var scimErr scimerrors.ScimError
if errors.As(err, &scimErr) {
return scim.Resource{}, err
}
h.handler.logger.ErrorCtx(ctx, "cannot patch user", log.Error(err))
return scim.Resource{}, scimerrors.ScimErrorInternal
}
if deactivated {
return scimservice.MembershipToResourceWithActive(membership, false), nil
}
return scimservice.MembershipToResource(membership), nil
return resource, nil
}
func (h *scimResourceHandler) Delete(r *http.Request, id string) error {
@@ -275,11 +256,10 @@ func (h *scimResourceHandler) Delete(r *http.Request, id string) error {
err = h.handler.iam.SCIMService.DeleteUser(ctx, config, membershipID, getIPAddress(r))
if err != nil {
var notFound *scimservice.ErrSCIMUserNotFound
if errors.As(err, &notFound) {
return scimerrors.ScimErrorResourceNotFound(id)
var scimErr scimerrors.ScimError
if errors.As(err, &scimErr) {
return err
}
h.handler.logger.ErrorCtx(ctx, "cannot delete user", log.Error(err))
return scimerrors.ScimErrorInternal
}