diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index 1712afd..4e69b52 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -539,6 +539,76 @@ func (svc *Service) ActionMapfixTriggerSubmit(ctx context.Context, params api.Ac return nil } +// ActionMapfixBypassSubmit invokes actionMapfixBypassSubmit operation. +// +// Role Reviewer changes status from ChangesRequested -> Submitted. +// +// POST /mapfixes/{MapfixID}/status/bypass-submit +func (svc *Service) ActionMapfixBypassSubmit(ctx context.Context, params api.ActionMapfixBypassSubmitParams) error { + userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) + if !ok { + return ErrUserInfo + } + + // read mapfix (this could be done with a transaction WHERE clause) + mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + if err != nil { + return err + } + + userId, err := userInfo.GetUserID() + if err != nil { + return err + } + + // check if caller is the submitter + is_submitter := userId == mapfix.Submitter + if is_submitter { + return ErrAcceptOwnMapfix + } + + has_mapfix_review, err := userInfo.HasRoleMapfixReview() + if err != nil { + return err + } + + if !has_mapfix_review { + return ErrPermissionDeniedNeedRoleMapfixReview + } + + // transaction + target_status := model.MapfixStatusSubmitted + smap := datastore.Optional() + smap.Add("status_id", target_status) + err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusChangesRequested}, smap) + if err != nil { + return err + } + + event_data := model.AuditEventDataAction{ + TargetStatus: uint32(target_status), + } + + EventData, err := json.Marshal(event_data) + if err != nil { + return err + } + + _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + ID: 0, + User: userId, + ResourceType: model.ResourceMapfix, + ResourceID: params.MapfixID, + EventType: model.AuditEventTypeAction, + EventData: EventData, + }) + if err != nil { + return err + } + + return nil +} + // ActionMapfixResetSubmitting implements actionMapfixResetSubmitting operation. // // Role MapfixReview changes status from Submitting -> UnderConstruction. diff --git a/pkg/service/submissions.go b/pkg/service/submissions.go index 142053e..bfc60fb 100644 --- a/pkg/service/submissions.go +++ b/pkg/service/submissions.go @@ -646,6 +646,76 @@ func (svc *Service) ActionSubmissionTriggerSubmit(ctx context.Context, params ap return nil } +// ActionSubmissionBypassSubmit invokes actionSubmissionBypassSubmit operation. +// +// Role Reviewer changes status from ChangesRequested -> Submitted. +// +// POST /submissions/{SubmissionID}/status/bypass-submit +func (svc *Service) ActionSubmissionBypassSubmit(ctx context.Context, params api.ActionSubmissionBypassSubmitParams) error { + userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) + if !ok { + return ErrUserInfo + } + + // read submission (this could be done with a transaction WHERE clause) + submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + if err != nil { + return err + } + + userId, err := userInfo.GetUserID() + if err != nil { + return err + } + + // check if caller is the submitter + is_submitter := userId == submission.Submitter + if is_submitter { + return ErrAcceptOwnSubmission + } + + has_submission_review, err := userInfo.HasRoleSubmissionReview() + if err != nil { + return err + } + + if !has_submission_review { + return ErrPermissionDeniedNeedRoleSubmissionReview + } + + // transaction + target_status := model.SubmissionStatusSubmitted + smap := datastore.Optional() + smap.Add("status_id", target_status) + err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusChangesRequested}, smap) + if err != nil { + return err + } + + event_data := model.AuditEventDataAction{ + TargetStatus: uint32(target_status), + } + + EventData, err := json.Marshal(event_data) + if err != nil { + return err + } + + _, err = svc.DB.AuditEvents().Create(ctx, model.AuditEvent{ + ID: 0, + User: userId, + ResourceType: model.ResourceSubmission, + ResourceID: params.SubmissionID, + EventType: model.AuditEventTypeAction, + EventData: EventData, + }) + if err != nil { + return err + } + + return nil +} + // ActionSubmissionResetSubmitting implements actionSubmissionResetSubmitting operation. // // Role SubmissionReview changes status from Submitting -> UnderConstruction.