diff --git a/pkg/service/submissions.go b/pkg/service/submissions.go index be67fdc..f8de940 100644 --- a/pkg/service/submissions.go +++ b/pkg/service/submissions.go @@ -124,6 +124,82 @@ func (svc *Service) CreateSubmission(ctx context.Context, request *api.Submissio OperationID: operation.ID, }, nil } +// POST /submissions-admin +func (svc *Service) CreateSubmissionAdmin(ctx context.Context, request *api.SubmissionTriggerCreate) (*api.OperationID, error) { + // sanitization + if request.AssetID<0{ + return nil, ErrNegativeID + } + var ModelID=uint64(request.AssetID); + + userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) + if !ok { + return nil, ErrUserInfo + } + + userId, err := userInfo.GetUserID() + if err != nil { + return nil, err + } + + roles, err := userInfo.GetRoles() + if err != nil { + return nil, err + } + + // check if caller has required role + has_role := roles & RolesSubmissionReview == RolesSubmissionReview + if !has_role { + return nil, ErrPermissionDeniedNeedRoleSubmissionReview + } + + // Check if too many operations have been created recently + { + count, err := svc.DB.Operations().CountSince(ctx, + int64(userId), + time.Now().Add(-CreateSubmissionRecencyWindow), + ) + if err != nil { + return nil, err + } + + if CreateSubmissionRateLimit < count { + return nil, ErrCreateSubmissionRateLimit + } + } + + operation, err := svc.DB.Operations().Create(ctx, model.Operation{ + Owner: userId, + StatusID: model.OperationStatusCreated, + }) + if err != nil { + return nil, err + } + + create_request := model.CreateSubmissionRequest{ + OperationID: operation.ID, + ModelID: ModelID, + DisplayName: request.DisplayName, + Creator: request.Creator, + GameID: uint32(request.GameID), + Status: uint32(model.SubmissionStatusChangesRequested), + Roles: uint32(roles), + } + + j, err := json.Marshal(create_request) + if err != nil { + return nil, err + } + + _, err = svc.Nats.Publish("maptest.submissions.create", []byte(j)) + if err != nil { + return nil, err + } + + return &api.OperationID{ + OperationID: operation.ID, + }, nil +} // GetSubmission implements getSubmission operation. //