Use typed campaign errors instead of string matching

Introduce sentinel and structured errors for access review campaign
validation failures, and map them to INVALID in GraphQL resolvers via
errors.Is rather than matching error message prefixes.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
This commit is contained in:
Cursor Agent
2026-07-20 15:39:39 +00:00
parent ffaf637397
commit a2b29b3d80
4 changed files with 223 additions and 14 deletions

View File

@@ -9,7 +9,6 @@ import (
"context"
"errors"
"fmt"
"strings"
"github.com/vikstrous/dataloadgen"
"go.gearno.de/kit/log"
@@ -725,6 +724,10 @@ func (r *mutationResolver) CreateAccessReviewCampaign(ctx context.Context, input
},
)
if err != nil {
if accessreview.IsCampaignClientError(err) {
return nil, gqlutils.Invalid(ctx, err)
}
r.logger.ErrorCtx(ctx, "cannot create access review campaign", log.Error(err))
return nil, gqlutils.Internal(ctx)
@@ -757,7 +760,7 @@ func (r *mutationResolver) UpdateAccessReviewCampaign(ctx context.Context, input
return nil, gqlutils.NotFound(ctx, err)
}
if strings.HasPrefix(err.Error(), "cannot update campaign:") {
if accessreview.IsCampaignClientError(err) {
return nil, gqlutils.Invalid(ctx, err)
}
@@ -802,7 +805,7 @@ func (r *mutationResolver) StartAccessReviewCampaign(ctx context.Context, input
campaign, err := r.accessReview.StartCampaign(ctx, scope, input.AccessReviewCampaignID)
if err != nil {
if strings.HasPrefix(err.Error(), "cannot start campaign:") {
if accessreview.IsCampaignClientError(err) {
return nil, gqlutils.Invalid(ctx, err)
}