Use status-specific errors for non-draft campaigns

Replace ErrCampaignCannotStart and ErrCampaignCannotUpdate with
sentinels per campaign status, mapped through CampaignStatusError
and wrapped with operation-specific fmt.Errorf 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 16:05:22 +00:00
parent 3d606dd0e8
commit b3e60da4d5
4 changed files with 96 additions and 13 deletions

View File

@@ -159,7 +159,7 @@ func (s *Service) UpdateCampaign(
}
if campaign.Status != coredata.AccessReviewCampaignStatusDraft {
return ErrCampaignCannotUpdate
return fmt.Errorf("cannot update campaign: %w", CampaignStatusError(campaign.Status))
}
if req.Name != nil && *req.Name != nil {
@@ -242,10 +242,8 @@ func (s *Service) AddCampaignSource(
}
if campaign.Status != coredata.AccessReviewCampaignStatusDraft {
return ErrCampaignCannotUpdate
return fmt.Errorf("cannot add scope source: %w", CampaignStatusError(campaign.Status))
}
source := &coredata.AccessReviewSource{}
if err := source.LoadByID(ctx, conn, scope, req.AccessReviewSourceID); err != nil {
if errors.Is(err, coredata.ErrResourceNotFound) {
return coredata.ErrResourceNotFound
@@ -291,10 +289,8 @@ func (s *Service) RemoveCampaignSource(
}
if campaign.Status != coredata.AccessReviewCampaignStatusDraft {
return ErrCampaignCannotUpdate
return fmt.Errorf("cannot remove scope source: %w", CampaignStatusError(campaign.Status))
}
campaignSource := &coredata.AccessReviewCampaignSource{}
if err := campaignSource.DeleteByCampaignIDAndAccessReviewSourceID(ctx, conn, scope, campaign.ID, req.AccessReviewSourceID); err != nil {
return fmt.Errorf("cannot delete campaign source: %w", err)
}
@@ -400,7 +396,7 @@ func (s *Service) StartCampaign(
}
if campaign.Status != coredata.AccessReviewCampaignStatusDraft {
return ErrCampaignCannotStart
return fmt.Errorf("cannot start campaign: %w", CampaignStatusError(campaign.Status))
}
var campaignSources coredata.AccessReviewCampaignSources