diff --git a/pkg/service/mapfixes.go b/pkg/service/mapfixes.go index 1f4d25f..b9ff7d7 100644 --- a/pkg/service/mapfixes.go +++ b/pkg/service/mapfixes.go @@ -522,6 +522,72 @@ func (svc *Service) ActionMapfixTriggerSubmit(ctx context.Context, params api.Ac return nil } +// ActionMapfixResetSubmitting implements actionMapfixResetSubmitting operation. +// +// Role MapfixReview changes status from Submitting -> UnderConstruction. +// +// POST /mapfixes/{MapfixID}/status/reset-submitting +func (svc *Service) ActionMapfixResetSubmitting(ctx context.Context, params api.ActionMapfixResetSubmittingParams) error { + userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) + if !ok { + return ErrUserInfo + } + + userId, err := userInfo.GetUserID() + if err != nil { + return err + } + + // check when mapfix was updated + mapfix, err := svc.DB.Mapfixes().Get(ctx, params.MapfixID) + if err != nil { + return err + } + if time.Now().Before(mapfix.UpdatedAt.Add(time.Second*10)) { + // the last time the mapfix was updated must be longer than 10 seconds ago + return ErrDelayReset + } + + // check if caller has required role + has_role := userId == mapfix.Submitter + if !has_role { + return ErrPermissionDeniedNotSubmitter + } + + // transaction + target_status := model.MapfixStatusUnderConstruction + smap := datastore.Optional() + smap.Add("status_id", target_status) + smap.Add("status_message", "Manually forced reset") + err = svc.DB.Mapfixes().IfStatusThenUpdate(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusSubmitting}, 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 +} + // ActionMapfixTriggerUpload invokes actionMapfixTriggerUpload operation. // // Role Admin changes status from Validated -> Uploading. diff --git a/pkg/service/submissions.go b/pkg/service/submissions.go index 8e3abd6..c81c24a 100644 --- a/pkg/service/submissions.go +++ b/pkg/service/submissions.go @@ -543,6 +543,72 @@ func (svc *Service) ActionSubmissionTriggerSubmit(ctx context.Context, params ap return nil } +// ActionSubmissionResetSubmitting implements actionSubmissionResetSubmitting operation. +// +// Role SubmissionReview changes status from Submitting -> UnderConstruction. +// +// POST /submissions/{SubmissionID}/status/reset-submitting +func (svc *Service) ActionSubmissionResetSubmitting(ctx context.Context, params api.ActionSubmissionResetSubmittingParams) error { + userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) + if !ok { + return ErrUserInfo + } + + userId, err := userInfo.GetUserID() + if err != nil { + return err + } + + // check when submission was updated + submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID) + if err != nil { + return err + } + if time.Now().Before(submission.UpdatedAt.Add(time.Second*10)) { + // the last time the submission was updated must be longer than 10 seconds ago + return ErrDelayReset + } + + // check if caller has required role + has_role := userId == submission.Submitter + if !has_role { + return ErrPermissionDeniedNotSubmitter + } + + // transaction + target_status := model.SubmissionStatusUnderConstruction + smap := datastore.Optional() + smap.Add("status_id", target_status) + smap.Add("status_message", "Manually forced reset") + err = svc.DB.Submissions().IfStatusThenUpdate(ctx, params.SubmissionID, []model.SubmissionStatus{model.SubmissionStatusSubmitting}, 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 +} + // ActionSubmissionTriggerUpload invokes actionSubmissionTriggerUpload operation. // // Role Admin changes status from Validated -> Uploading.