Compare commits

...

5 Commits

17 changed files with 315 additions and 530 deletions

@ -400,6 +400,58 @@ components:
ID: ID:
type: integer type: integer
format: int64 format: int64
MapfixCreate:
required:
- DisplayName
- Creator
- GameID
- AssetID
- AssetVersion
- TargetAssetID
type: object
properties:
DisplayName:
type: string
maxLength: 128
Creator:
type: string
maxLength: 128
GameID:
type: integer
format: int32
AssetID:
type: integer
format: int64
AssetVersion:
type: integer
format: int64
TargetAssetID:
type: integer
format: int64
SubmissionCreate:
required:
- DisplayName
- Creator
- GameID
- AssetID
- AssetVersion
type: object
properties:
DisplayName:
type: string
maxLength: 128
Creator:
type: string
maxLength: 128
GameID:
type: integer
format: int32
AssetID:
type: integer
format: int64
AssetVersion:
type: integer
format: int64
Script: Script:
required: required:
- ID - ID

@ -193,7 +193,7 @@ paths:
schema: schema:
$ref: "#/components/schemas/Error" $ref: "#/components/schemas/Error"
post: post:
summary: Create new mapfix summary: Trigger the validator to create a mapfix
operationId: createMapfix operationId: createMapfix
tags: tags:
- Mapfixes - Mapfixes
@ -202,14 +202,14 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/MapfixCreate' $ref: '#/components/schemas/MapfixTriggerCreate'
responses: responses:
"201": "201":
description: Successful response description: Successful response
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/Id" $ref: "#/components/schemas/OperationID"
default: default:
description: General Error description: General Error
content: content:
@ -504,7 +504,7 @@ paths:
schema: schema:
$ref: "#/components/schemas/Error" $ref: "#/components/schemas/Error"
post: post:
summary: Create new submission summary: Trigger the validator to create a new submission
operationId: createSubmission operationId: createSubmission
tags: tags:
- Submissions - Submissions
@ -513,14 +513,14 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/SubmissionCreate' $ref: '#/components/schemas/SubmissionTriggerCreate'
responses: responses:
"201": "201":
description: Successful response description: Successful response
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/Id" $ref: "#/components/schemas/OperationID"
default: default:
description: General Error description: General Error
content: content:
@ -1114,6 +1114,14 @@ components:
ID: ID:
type: integer type: integer
format: int64 format: int64
OperationID:
required:
- OperationID
type: object
properties:
OperationID:
type: integer
format: int32
Roles: Roles:
required: required:
- Roles - Roles
@ -1217,31 +1225,15 @@ components:
StatusMessage: StatusMessage:
type: string type: string
maxLength: 256 maxLength: 256
MapfixCreate: MapfixTriggerCreate:
required: required:
- DisplayName
- Creator
- GameID
- AssetID - AssetID
- AssetVersion
- TargetAssetID - TargetAssetID
type: object type: object
properties: properties:
DisplayName:
type: string
maxLength: 128
Creator:
type: string
maxLength: 128
GameID:
type: integer
format: int32
AssetID: AssetID:
type: integer type: integer
format: int64 format: int64
AssetVersion:
type: integer
format: int64
TargetAssetID: TargetAssetID:
type: integer type: integer
format: int64 format: int64
@ -1336,30 +1328,14 @@ components:
StatusMessage: StatusMessage:
type: string type: string
maxLength: 256 maxLength: 256
SubmissionCreate: SubmissionTriggerCreate:
required: required:
- DisplayName
- Creator
- GameID
- AssetID - AssetID
- AssetVersion
type: object type: object
properties: properties:
DisplayName:
type: string
maxLength: 128
Creator:
type: string
maxLength: 128
GameID:
type: integer
format: int32
AssetID: AssetID:
type: integer type: integer
format: int64 format: int64
AssetVersion:
type: integer
format: int64
ReleaseInfo: ReleaseInfo:
required: required:
- SubmissionID - SubmissionID

@ -139,10 +139,10 @@ type Invoker interface {
ActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) error ActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) error
// CreateMapfix invokes createMapfix operation. // CreateMapfix invokes createMapfix operation.
// //
// Create new mapfix. // Trigger the validator to create a mapfix.
// //
// POST /mapfixes // POST /mapfixes
CreateMapfix(ctx context.Context, request *MapfixCreate) (*ID, error) CreateMapfix(ctx context.Context, request *MapfixTriggerCreate) (*OperationID, error)
// CreateScript invokes createScript operation. // CreateScript invokes createScript operation.
// //
// Create a new script. // Create a new script.
@ -157,10 +157,10 @@ type Invoker interface {
CreateScriptPolicy(ctx context.Context, request *ScriptPolicyCreate) (*ID, error) CreateScriptPolicy(ctx context.Context, request *ScriptPolicyCreate) (*ID, error)
// CreateSubmission invokes createSubmission operation. // CreateSubmission invokes createSubmission operation.
// //
// Create new submission. // Trigger the validator to create a new submission.
// //
// POST /submissions // POST /submissions
CreateSubmission(ctx context.Context, request *SubmissionCreate) (*ID, error) CreateSubmission(ctx context.Context, request *SubmissionTriggerCreate) (*OperationID, error)
// DeleteScript invokes deleteScript operation. // DeleteScript invokes deleteScript operation.
// //
// Delete the specified script by ID. // Delete the specified script by ID.
@ -2584,15 +2584,15 @@ func (c *Client) sendActionSubmissionValidated(ctx context.Context, params Actio
// CreateMapfix invokes createMapfix operation. // CreateMapfix invokes createMapfix operation.
// //
// Create new mapfix. // Trigger the validator to create a mapfix.
// //
// POST /mapfixes // POST /mapfixes
func (c *Client) CreateMapfix(ctx context.Context, request *MapfixCreate) (*ID, error) { func (c *Client) CreateMapfix(ctx context.Context, request *MapfixTriggerCreate) (*OperationID, error) {
res, err := c.sendCreateMapfix(ctx, request) res, err := c.sendCreateMapfix(ctx, request)
return res, err return res, err
} }
func (c *Client) sendCreateMapfix(ctx context.Context, request *MapfixCreate) (res *ID, err error) { func (c *Client) sendCreateMapfix(ctx context.Context, request *MapfixTriggerCreate) (res *OperationID, err error) {
otelAttrs := []attribute.KeyValue{ otelAttrs := []attribute.KeyValue{
otelogen.OperationID("createMapfix"), otelogen.OperationID("createMapfix"),
semconv.HTTPRequestMethodKey.String("POST"), semconv.HTTPRequestMethodKey.String("POST"),
@ -2908,15 +2908,15 @@ func (c *Client) sendCreateScriptPolicy(ctx context.Context, request *ScriptPoli
// CreateSubmission invokes createSubmission operation. // CreateSubmission invokes createSubmission operation.
// //
// Create new submission. // Trigger the validator to create a new submission.
// //
// POST /submissions // POST /submissions
func (c *Client) CreateSubmission(ctx context.Context, request *SubmissionCreate) (*ID, error) { func (c *Client) CreateSubmission(ctx context.Context, request *SubmissionTriggerCreate) (*OperationID, error) {
res, err := c.sendCreateSubmission(ctx, request) res, err := c.sendCreateSubmission(ctx, request)
return res, err return res, err
} }
func (c *Client) sendCreateSubmission(ctx context.Context, request *SubmissionCreate) (res *ID, err error) { func (c *Client) sendCreateSubmission(ctx context.Context, request *SubmissionTriggerCreate) (res *OperationID, err error) {
otelAttrs := []attribute.KeyValue{ otelAttrs := []attribute.KeyValue{
otelogen.OperationID("createSubmission"), otelogen.OperationID("createSubmission"),
semconv.HTTPRequestMethodKey.String("POST"), semconv.HTTPRequestMethodKey.String("POST"),

@ -3542,7 +3542,7 @@ func (s *Server) handleActionSubmissionValidatedRequest(args [1]string, argsEsca
// handleCreateMapfixRequest handles createMapfix operation. // handleCreateMapfixRequest handles createMapfix operation.
// //
// Create new mapfix. // Trigger the validator to create a mapfix.
// //
// POST /mapfixes // POST /mapfixes
func (s *Server) handleCreateMapfixRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { func (s *Server) handleCreateMapfixRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) {
@ -3676,12 +3676,12 @@ func (s *Server) handleCreateMapfixRequest(args [0]string, argsEscaped bool, w h
} }
}() }()
var response *ID var response *OperationID
if m := s.cfg.Middleware; m != nil { if m := s.cfg.Middleware; m != nil {
mreq := middleware.Request{ mreq := middleware.Request{
Context: ctx, Context: ctx,
OperationName: CreateMapfixOperation, OperationName: CreateMapfixOperation,
OperationSummary: "Create new mapfix", OperationSummary: "Trigger the validator to create a mapfix",
OperationID: "createMapfix", OperationID: "createMapfix",
Body: request, Body: request,
Params: middleware.Parameters{}, Params: middleware.Parameters{},
@ -3689,9 +3689,9 @@ func (s *Server) handleCreateMapfixRequest(args [0]string, argsEscaped bool, w h
} }
type ( type (
Request = *MapfixCreate Request = *MapfixTriggerCreate
Params = struct{} Params = struct{}
Response = *ID Response = *OperationID
) )
response, err = middleware.HookMiddleware[ response, err = middleware.HookMiddleware[
Request, Request,
@ -4127,7 +4127,7 @@ func (s *Server) handleCreateScriptPolicyRequest(args [0]string, argsEscaped boo
// handleCreateSubmissionRequest handles createSubmission operation. // handleCreateSubmissionRequest handles createSubmission operation.
// //
// Create new submission. // Trigger the validator to create a new submission.
// //
// POST /submissions // POST /submissions
func (s *Server) handleCreateSubmissionRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { func (s *Server) handleCreateSubmissionRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) {
@ -4261,12 +4261,12 @@ func (s *Server) handleCreateSubmissionRequest(args [0]string, argsEscaped bool,
} }
}() }()
var response *ID var response *OperationID
if m := s.cfg.Middleware; m != nil { if m := s.cfg.Middleware; m != nil {
mreq := middleware.Request{ mreq := middleware.Request{
Context: ctx, Context: ctx,
OperationName: CreateSubmissionOperation, OperationName: CreateSubmissionOperation,
OperationSummary: "Create new submission", OperationSummary: "Trigger the validator to create a new submission",
OperationID: "createSubmission", OperationID: "createSubmission",
Body: request, Body: request,
Params: middleware.Parameters{}, Params: middleware.Parameters{},
@ -4274,9 +4274,9 @@ func (s *Server) handleCreateSubmissionRequest(args [0]string, argsEscaped bool,
} }
type ( type (
Request = *SubmissionCreate Request = *SubmissionTriggerCreate
Params = struct{} Params = struct{}
Response = *ID Response = *OperationID
) )
response, err = middleware.HookMiddleware[ response, err = middleware.HookMiddleware[
Request, Request,

@ -688,96 +688,40 @@ func (s *Mapfix) UnmarshalJSON(data []byte) error {
} }
// Encode implements json.Marshaler. // Encode implements json.Marshaler.
func (s *MapfixCreate) Encode(e *jx.Encoder) { func (s *MapfixTriggerCreate) Encode(e *jx.Encoder) {
e.ObjStart() e.ObjStart()
s.encodeFields(e) s.encodeFields(e)
e.ObjEnd() e.ObjEnd()
} }
// encodeFields encodes fields. // encodeFields encodes fields.
func (s *MapfixCreate) encodeFields(e *jx.Encoder) { func (s *MapfixTriggerCreate) encodeFields(e *jx.Encoder) {
{
e.FieldStart("DisplayName")
e.Str(s.DisplayName)
}
{
e.FieldStart("Creator")
e.Str(s.Creator)
}
{
e.FieldStart("GameID")
e.Int32(s.GameID)
}
{ {
e.FieldStart("AssetID") e.FieldStart("AssetID")
e.Int64(s.AssetID) e.Int64(s.AssetID)
} }
{
e.FieldStart("AssetVersion")
e.Int64(s.AssetVersion)
}
{ {
e.FieldStart("TargetAssetID") e.FieldStart("TargetAssetID")
e.Int64(s.TargetAssetID) e.Int64(s.TargetAssetID)
} }
} }
var jsonFieldsNameOfMapfixCreate = [6]string{ var jsonFieldsNameOfMapfixTriggerCreate = [2]string{
0: "DisplayName", 0: "AssetID",
1: "Creator", 1: "TargetAssetID",
2: "GameID",
3: "AssetID",
4: "AssetVersion",
5: "TargetAssetID",
} }
// Decode decodes MapfixCreate from json. // Decode decodes MapfixTriggerCreate from json.
func (s *MapfixCreate) Decode(d *jx.Decoder) error { func (s *MapfixTriggerCreate) Decode(d *jx.Decoder) error {
if s == nil { if s == nil {
return errors.New("invalid: unable to decode MapfixCreate to nil") return errors.New("invalid: unable to decode MapfixTriggerCreate to nil")
} }
var requiredBitSet [1]uint8 var requiredBitSet [1]uint8
if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error {
switch string(k) { switch string(k) {
case "DisplayName":
requiredBitSet[0] |= 1 << 0
if err := func() error {
v, err := d.Str()
s.DisplayName = string(v)
if err != nil {
return err
}
return nil
}(); err != nil {
return errors.Wrap(err, "decode field \"DisplayName\"")
}
case "Creator":
requiredBitSet[0] |= 1 << 1
if err := func() error {
v, err := d.Str()
s.Creator = string(v)
if err != nil {
return err
}
return nil
}(); err != nil {
return errors.Wrap(err, "decode field \"Creator\"")
}
case "GameID":
requiredBitSet[0] |= 1 << 2
if err := func() error {
v, err := d.Int32()
s.GameID = int32(v)
if err != nil {
return err
}
return nil
}(); err != nil {
return errors.Wrap(err, "decode field \"GameID\"")
}
case "AssetID": case "AssetID":
requiredBitSet[0] |= 1 << 3 requiredBitSet[0] |= 1 << 0
if err := func() error { if err := func() error {
v, err := d.Int64() v, err := d.Int64()
s.AssetID = int64(v) s.AssetID = int64(v)
@ -788,20 +732,8 @@ func (s *MapfixCreate) Decode(d *jx.Decoder) error {
}(); err != nil { }(); err != nil {
return errors.Wrap(err, "decode field \"AssetID\"") return errors.Wrap(err, "decode field \"AssetID\"")
} }
case "AssetVersion":
requiredBitSet[0] |= 1 << 4
if err := func() error {
v, err := d.Int64()
s.AssetVersion = int64(v)
if err != nil {
return err
}
return nil
}(); err != nil {
return errors.Wrap(err, "decode field \"AssetVersion\"")
}
case "TargetAssetID": case "TargetAssetID":
requiredBitSet[0] |= 1 << 5 requiredBitSet[0] |= 1 << 1
if err := func() error { if err := func() error {
v, err := d.Int64() v, err := d.Int64()
s.TargetAssetID = int64(v) s.TargetAssetID = int64(v)
@ -817,12 +749,12 @@ func (s *MapfixCreate) Decode(d *jx.Decoder) error {
} }
return nil return nil
}); err != nil { }); err != nil {
return errors.Wrap(err, "decode MapfixCreate") return errors.Wrap(err, "decode MapfixTriggerCreate")
} }
// Validate required fields. // Validate required fields.
var failures []validate.FieldError var failures []validate.FieldError
for i, mask := range [1]uint8{ for i, mask := range [1]uint8{
0b00111111, 0b00000011,
} { } {
if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { if result := (requiredBitSet[i] & mask) ^ mask; result != 0 {
// Mask only required fields and check equality to mask using XOR. // Mask only required fields and check equality to mask using XOR.
@ -834,8 +766,8 @@ func (s *MapfixCreate) Decode(d *jx.Decoder) error {
bitIdx := bits.TrailingZeros8(result) bitIdx := bits.TrailingZeros8(result)
fieldIdx := i*8 + bitIdx fieldIdx := i*8 + bitIdx
var name string var name string
if fieldIdx < len(jsonFieldsNameOfMapfixCreate) { if fieldIdx < len(jsonFieldsNameOfMapfixTriggerCreate) {
name = jsonFieldsNameOfMapfixCreate[fieldIdx] name = jsonFieldsNameOfMapfixTriggerCreate[fieldIdx]
} else { } else {
name = strconv.Itoa(fieldIdx) name = strconv.Itoa(fieldIdx)
} }
@ -856,14 +788,14 @@ func (s *MapfixCreate) Decode(d *jx.Decoder) error {
} }
// MarshalJSON implements stdjson.Marshaler. // MarshalJSON implements stdjson.Marshaler.
func (s *MapfixCreate) MarshalJSON() ([]byte, error) { func (s *MapfixTriggerCreate) MarshalJSON() ([]byte, error) {
e := jx.Encoder{} e := jx.Encoder{}
s.Encode(&e) s.Encode(&e)
return e.Bytes(), nil return e.Bytes(), nil
} }
// UnmarshalJSON implements stdjson.Unmarshaler. // UnmarshalJSON implements stdjson.Unmarshaler.
func (s *MapfixCreate) UnmarshalJSON(data []byte) error { func (s *MapfixTriggerCreate) UnmarshalJSON(data []byte) error {
d := jx.DecodeBytes(data) d := jx.DecodeBytes(data)
return s.Decode(d) return s.Decode(d)
} }
@ -1049,6 +981,102 @@ func (s *Operation) UnmarshalJSON(data []byte) error {
return s.Decode(d) return s.Decode(d)
} }
// Encode implements json.Marshaler.
func (s *OperationID) Encode(e *jx.Encoder) {
e.ObjStart()
s.encodeFields(e)
e.ObjEnd()
}
// encodeFields encodes fields.
func (s *OperationID) encodeFields(e *jx.Encoder) {
{
e.FieldStart("OperationID")
e.Int32(s.OperationID)
}
}
var jsonFieldsNameOfOperationID = [1]string{
0: "OperationID",
}
// Decode decodes OperationID from json.
func (s *OperationID) Decode(d *jx.Decoder) error {
if s == nil {
return errors.New("invalid: unable to decode OperationID to nil")
}
var requiredBitSet [1]uint8
if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error {
switch string(k) {
case "OperationID":
requiredBitSet[0] |= 1 << 0
if err := func() error {
v, err := d.Int32()
s.OperationID = int32(v)
if err != nil {
return err
}
return nil
}(); err != nil {
return errors.Wrap(err, "decode field \"OperationID\"")
}
default:
return d.Skip()
}
return nil
}); err != nil {
return errors.Wrap(err, "decode OperationID")
}
// Validate required fields.
var failures []validate.FieldError
for i, mask := range [1]uint8{
0b00000001,
} {
if result := (requiredBitSet[i] & mask) ^ mask; result != 0 {
// Mask only required fields and check equality to mask using XOR.
//
// If XOR result is not zero, result is not equal to expected, so some fields are missed.
// Bits of fields which would be set are actually bits of missed fields.
missed := bits.OnesCount8(result)
for bitN := 0; bitN < missed; bitN++ {
bitIdx := bits.TrailingZeros8(result)
fieldIdx := i*8 + bitIdx
var name string
if fieldIdx < len(jsonFieldsNameOfOperationID) {
name = jsonFieldsNameOfOperationID[fieldIdx]
} else {
name = strconv.Itoa(fieldIdx)
}
failures = append(failures, validate.FieldError{
Name: name,
Error: validate.ErrFieldRequired,
})
// Reset bit.
result &^= 1 << bitIdx
}
}
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}
// MarshalJSON implements stdjson.Marshaler.
func (s *OperationID) MarshalJSON() ([]byte, error) {
e := jx.Encoder{}
s.Encode(&e)
return e.Bytes(), nil
}
// UnmarshalJSON implements stdjson.Unmarshaler.
func (s *OperationID) UnmarshalJSON(data []byte) error {
d := jx.DecodeBytes(data)
return s.Decode(d)
}
// Encode encodes int32 as json. // Encode encodes int32 as json.
func (o OptInt32) Encode(e *jx.Encoder) { func (o OptInt32) Encode(e *jx.Encoder) {
if !o.Set { if !o.Set {
@ -2615,91 +2643,35 @@ func (s *Submission) UnmarshalJSON(data []byte) error {
} }
// Encode implements json.Marshaler. // Encode implements json.Marshaler.
func (s *SubmissionCreate) Encode(e *jx.Encoder) { func (s *SubmissionTriggerCreate) Encode(e *jx.Encoder) {
e.ObjStart() e.ObjStart()
s.encodeFields(e) s.encodeFields(e)
e.ObjEnd() e.ObjEnd()
} }
// encodeFields encodes fields. // encodeFields encodes fields.
func (s *SubmissionCreate) encodeFields(e *jx.Encoder) { func (s *SubmissionTriggerCreate) encodeFields(e *jx.Encoder) {
{
e.FieldStart("DisplayName")
e.Str(s.DisplayName)
}
{
e.FieldStart("Creator")
e.Str(s.Creator)
}
{
e.FieldStart("GameID")
e.Int32(s.GameID)
}
{ {
e.FieldStart("AssetID") e.FieldStart("AssetID")
e.Int64(s.AssetID) e.Int64(s.AssetID)
} }
{
e.FieldStart("AssetVersion")
e.Int64(s.AssetVersion)
}
} }
var jsonFieldsNameOfSubmissionCreate = [5]string{ var jsonFieldsNameOfSubmissionTriggerCreate = [1]string{
0: "DisplayName", 0: "AssetID",
1: "Creator",
2: "GameID",
3: "AssetID",
4: "AssetVersion",
} }
// Decode decodes SubmissionCreate from json. // Decode decodes SubmissionTriggerCreate from json.
func (s *SubmissionCreate) Decode(d *jx.Decoder) error { func (s *SubmissionTriggerCreate) Decode(d *jx.Decoder) error {
if s == nil { if s == nil {
return errors.New("invalid: unable to decode SubmissionCreate to nil") return errors.New("invalid: unable to decode SubmissionTriggerCreate to nil")
} }
var requiredBitSet [1]uint8 var requiredBitSet [1]uint8
if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error {
switch string(k) { switch string(k) {
case "DisplayName":
requiredBitSet[0] |= 1 << 0
if err := func() error {
v, err := d.Str()
s.DisplayName = string(v)
if err != nil {
return err
}
return nil
}(); err != nil {
return errors.Wrap(err, "decode field \"DisplayName\"")
}
case "Creator":
requiredBitSet[0] |= 1 << 1
if err := func() error {
v, err := d.Str()
s.Creator = string(v)
if err != nil {
return err
}
return nil
}(); err != nil {
return errors.Wrap(err, "decode field \"Creator\"")
}
case "GameID":
requiredBitSet[0] |= 1 << 2
if err := func() error {
v, err := d.Int32()
s.GameID = int32(v)
if err != nil {
return err
}
return nil
}(); err != nil {
return errors.Wrap(err, "decode field \"GameID\"")
}
case "AssetID": case "AssetID":
requiredBitSet[0] |= 1 << 3 requiredBitSet[0] |= 1 << 0
if err := func() error { if err := func() error {
v, err := d.Int64() v, err := d.Int64()
s.AssetID = int64(v) s.AssetID = int64(v)
@ -2710,29 +2682,17 @@ func (s *SubmissionCreate) Decode(d *jx.Decoder) error {
}(); err != nil { }(); err != nil {
return errors.Wrap(err, "decode field \"AssetID\"") return errors.Wrap(err, "decode field \"AssetID\"")
} }
case "AssetVersion":
requiredBitSet[0] |= 1 << 4
if err := func() error {
v, err := d.Int64()
s.AssetVersion = int64(v)
if err != nil {
return err
}
return nil
}(); err != nil {
return errors.Wrap(err, "decode field \"AssetVersion\"")
}
default: default:
return d.Skip() return d.Skip()
} }
return nil return nil
}); err != nil { }); err != nil {
return errors.Wrap(err, "decode SubmissionCreate") return errors.Wrap(err, "decode SubmissionTriggerCreate")
} }
// Validate required fields. // Validate required fields.
var failures []validate.FieldError var failures []validate.FieldError
for i, mask := range [1]uint8{ for i, mask := range [1]uint8{
0b00011111, 0b00000001,
} { } {
if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { if result := (requiredBitSet[i] & mask) ^ mask; result != 0 {
// Mask only required fields and check equality to mask using XOR. // Mask only required fields and check equality to mask using XOR.
@ -2744,8 +2704,8 @@ func (s *SubmissionCreate) Decode(d *jx.Decoder) error {
bitIdx := bits.TrailingZeros8(result) bitIdx := bits.TrailingZeros8(result)
fieldIdx := i*8 + bitIdx fieldIdx := i*8 + bitIdx
var name string var name string
if fieldIdx < len(jsonFieldsNameOfSubmissionCreate) { if fieldIdx < len(jsonFieldsNameOfSubmissionTriggerCreate) {
name = jsonFieldsNameOfSubmissionCreate[fieldIdx] name = jsonFieldsNameOfSubmissionTriggerCreate[fieldIdx]
} else { } else {
name = strconv.Itoa(fieldIdx) name = strconv.Itoa(fieldIdx)
} }
@ -2766,14 +2726,14 @@ func (s *SubmissionCreate) Decode(d *jx.Decoder) error {
} }
// MarshalJSON implements stdjson.Marshaler. // MarshalJSON implements stdjson.Marshaler.
func (s *SubmissionCreate) MarshalJSON() ([]byte, error) { func (s *SubmissionTriggerCreate) MarshalJSON() ([]byte, error) {
e := jx.Encoder{} e := jx.Encoder{}
s.Encode(&e) s.Encode(&e)
return e.Bytes(), nil return e.Bytes(), nil
} }
// UnmarshalJSON implements stdjson.Unmarshaler. // UnmarshalJSON implements stdjson.Unmarshaler.
func (s *SubmissionCreate) UnmarshalJSON(data []byte) error { func (s *SubmissionTriggerCreate) UnmarshalJSON(data []byte) error {
d := jx.DecodeBytes(data) d := jx.DecodeBytes(data)
return s.Decode(d) return s.Decode(d)
} }

@ -16,7 +16,7 @@ import (
) )
func (s *Server) decodeCreateMapfixRequest(r *http.Request) ( func (s *Server) decodeCreateMapfixRequest(r *http.Request) (
req *MapfixCreate, req *MapfixTriggerCreate,
close func() error, close func() error,
rerr error, rerr error,
) { ) {
@ -55,7 +55,7 @@ func (s *Server) decodeCreateMapfixRequest(r *http.Request) (
d := jx.DecodeBytes(buf) d := jx.DecodeBytes(buf)
var request MapfixCreate var request MapfixTriggerCreate
if err := func() error { if err := func() error {
if err := request.Decode(d); err != nil { if err := request.Decode(d); err != nil {
return err return err
@ -72,14 +72,6 @@ func (s *Server) decodeCreateMapfixRequest(r *http.Request) (
} }
return req, close, err return req, close, err
} }
if err := func() error {
if err := request.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return req, close, errors.Wrap(err, "validate")
}
return &request, close, nil return &request, close, nil
default: default:
return req, close, validate.InvalidContentType(ct) return req, close, validate.InvalidContentType(ct)
@ -221,7 +213,7 @@ func (s *Server) decodeCreateScriptPolicyRequest(r *http.Request) (
} }
func (s *Server) decodeCreateSubmissionRequest(r *http.Request) ( func (s *Server) decodeCreateSubmissionRequest(r *http.Request) (
req *SubmissionCreate, req *SubmissionTriggerCreate,
close func() error, close func() error,
rerr error, rerr error,
) { ) {
@ -260,7 +252,7 @@ func (s *Server) decodeCreateSubmissionRequest(r *http.Request) (
d := jx.DecodeBytes(buf) d := jx.DecodeBytes(buf)
var request SubmissionCreate var request SubmissionTriggerCreate
if err := func() error { if err := func() error {
if err := request.Decode(d); err != nil { if err := request.Decode(d); err != nil {
return err return err
@ -277,14 +269,6 @@ func (s *Server) decodeCreateSubmissionRequest(r *http.Request) (
} }
return req, close, err return req, close, err
} }
if err := func() error {
if err := request.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return req, close, errors.Wrap(err, "validate")
}
return &request, close, nil return &request, close, nil
default: default:
return req, close, validate.InvalidContentType(ct) return req, close, validate.InvalidContentType(ct)

@ -12,7 +12,7 @@ import (
) )
func encodeCreateMapfixRequest( func encodeCreateMapfixRequest(
req *MapfixCreate, req *MapfixTriggerCreate,
r *http.Request, r *http.Request,
) error { ) error {
const contentType = "application/json" const contentType = "application/json"
@ -54,7 +54,7 @@ func encodeCreateScriptPolicyRequest(
} }
func encodeCreateSubmissionRequest( func encodeCreateSubmissionRequest(
req *SubmissionCreate, req *SubmissionTriggerCreate,
r *http.Request, r *http.Request,
) error { ) error {
const contentType = "application/json" const contentType = "application/json"

@ -933,7 +933,7 @@ func decodeActionSubmissionValidatedResponse(resp *http.Response) (res *ActionSu
return res, errors.Wrap(defRes, "error") return res, errors.Wrap(defRes, "error")
} }
func decodeCreateMapfixResponse(resp *http.Response) (res *ID, _ error) { func decodeCreateMapfixResponse(resp *http.Response) (res *OperationID, _ error) {
switch resp.StatusCode { switch resp.StatusCode {
case 201: case 201:
// Code 201. // Code 201.
@ -949,7 +949,7 @@ func decodeCreateMapfixResponse(resp *http.Response) (res *ID, _ error) {
} }
d := jx.DecodeBytes(buf) d := jx.DecodeBytes(buf)
var response ID var response OperationID
if err := func() error { if err := func() error {
if err := response.Decode(d); err != nil { if err := response.Decode(d); err != nil {
return err return err
@ -1182,7 +1182,7 @@ func decodeCreateScriptPolicyResponse(resp *http.Response) (res *ID, _ error) {
return res, errors.Wrap(defRes, "error") return res, errors.Wrap(defRes, "error")
} }
func decodeCreateSubmissionResponse(resp *http.Response) (res *ID, _ error) { func decodeCreateSubmissionResponse(resp *http.Response) (res *OperationID, _ error) {
switch resp.StatusCode { switch resp.StatusCode {
case 201: case 201:
// Code 201. // Code 201.
@ -1198,7 +1198,7 @@ func decodeCreateSubmissionResponse(resp *http.Response) (res *ID, _ error) {
} }
d := jx.DecodeBytes(buf) d := jx.DecodeBytes(buf)
var response ID var response OperationID
if err := func() error { if err := func() error {
if err := response.Decode(d); err != nil { if err := response.Decode(d); err != nil {
return err return err

@ -139,7 +139,7 @@ func encodeActionSubmissionValidatedResponse(response *ActionSubmissionValidated
return nil return nil
} }
func encodeCreateMapfixResponse(response *ID, w http.ResponseWriter, span trace.Span) error { func encodeCreateMapfixResponse(response *OperationID, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(201) w.WriteHeader(201)
span.SetStatus(codes.Ok, http.StatusText(201)) span.SetStatus(codes.Ok, http.StatusText(201))
@ -181,7 +181,7 @@ func encodeCreateScriptPolicyResponse(response *ID, w http.ResponseWriter, span
return nil return nil
} }
func encodeCreateSubmissionResponse(response *ID, w http.ResponseWriter, span trace.Span) error { func encodeCreateSubmissionResponse(response *OperationID, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(201) w.WriteHeader(201)
span.SetStatus(codes.Ok, http.StatusText(201)) span.SetStatus(codes.Ok, http.StatusText(201))

@ -1264,7 +1264,7 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) {
return r, true return r, true
case "POST": case "POST":
r.name = CreateMapfixOperation r.name = CreateMapfixOperation
r.summary = "Create new mapfix" r.summary = "Trigger the validator to create a mapfix"
r.operationID = "createMapfix" r.operationID = "createMapfix"
r.pathPattern = "/mapfixes" r.pathPattern = "/mapfixes"
r.args = args r.args = args
@ -2058,7 +2058,7 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) {
return r, true return r, true
case "POST": case "POST":
r.name = CreateSubmissionOperation r.name = CreateSubmissionOperation
r.summary = "Create new submission" r.summary = "Trigger the validator to create a new submission"
r.operationID = "createSubmission" r.operationID = "createSubmission"
r.pathPattern = "/submissions" r.pathPattern = "/submissions"
r.args = args r.args = args

@ -359,73 +359,29 @@ func (s *Mapfix) SetStatusMessage(val string) {
s.StatusMessage = val s.StatusMessage = val
} }
// Ref: #/components/schemas/MapfixCreate // Ref: #/components/schemas/MapfixTriggerCreate
type MapfixCreate struct { type MapfixTriggerCreate struct {
DisplayName string `json:"DisplayName"` AssetID int64 `json:"AssetID"`
Creator string `json:"Creator"` TargetAssetID int64 `json:"TargetAssetID"`
GameID int32 `json:"GameID"`
AssetID int64 `json:"AssetID"`
AssetVersion int64 `json:"AssetVersion"`
TargetAssetID int64 `json:"TargetAssetID"`
}
// GetDisplayName returns the value of DisplayName.
func (s *MapfixCreate) GetDisplayName() string {
return s.DisplayName
}
// GetCreator returns the value of Creator.
func (s *MapfixCreate) GetCreator() string {
return s.Creator
}
// GetGameID returns the value of GameID.
func (s *MapfixCreate) GetGameID() int32 {
return s.GameID
} }
// GetAssetID returns the value of AssetID. // GetAssetID returns the value of AssetID.
func (s *MapfixCreate) GetAssetID() int64 { func (s *MapfixTriggerCreate) GetAssetID() int64 {
return s.AssetID return s.AssetID
} }
// GetAssetVersion returns the value of AssetVersion.
func (s *MapfixCreate) GetAssetVersion() int64 {
return s.AssetVersion
}
// GetTargetAssetID returns the value of TargetAssetID. // GetTargetAssetID returns the value of TargetAssetID.
func (s *MapfixCreate) GetTargetAssetID() int64 { func (s *MapfixTriggerCreate) GetTargetAssetID() int64 {
return s.TargetAssetID return s.TargetAssetID
} }
// SetDisplayName sets the value of DisplayName.
func (s *MapfixCreate) SetDisplayName(val string) {
s.DisplayName = val
}
// SetCreator sets the value of Creator.
func (s *MapfixCreate) SetCreator(val string) {
s.Creator = val
}
// SetGameID sets the value of GameID.
func (s *MapfixCreate) SetGameID(val int32) {
s.GameID = val
}
// SetAssetID sets the value of AssetID. // SetAssetID sets the value of AssetID.
func (s *MapfixCreate) SetAssetID(val int64) { func (s *MapfixTriggerCreate) SetAssetID(val int64) {
s.AssetID = val s.AssetID = val
} }
// SetAssetVersion sets the value of AssetVersion.
func (s *MapfixCreate) SetAssetVersion(val int64) {
s.AssetVersion = val
}
// SetTargetAssetID sets the value of TargetAssetID. // SetTargetAssetID sets the value of TargetAssetID.
func (s *MapfixCreate) SetTargetAssetID(val int64) { func (s *MapfixTriggerCreate) SetTargetAssetID(val int64) {
s.TargetAssetID = val s.TargetAssetID = val
} }
@ -499,6 +455,21 @@ func (s *Operation) SetPath(val string) {
s.Path = val s.Path = val
} }
// Ref: #/components/schemas/OperationID
type OperationID struct {
OperationID int32 `json:"OperationID"`
}
// GetOperationID returns the value of OperationID.
func (s *OperationID) GetOperationID() int32 {
return s.OperationID
}
// SetOperationID sets the value of OperationID.
func (s *OperationID) SetOperationID(val int32) {
s.OperationID = val
}
// NewOptInt32 returns new OptInt32 with value set to v. // NewOptInt32 returns new OptInt32 with value set to v.
func NewOptInt32(v int32) OptInt32 { func NewOptInt32(v int32) OptInt32 {
return OptInt32{ return OptInt32{
@ -1166,65 +1137,21 @@ func (s *Submission) SetStatusMessage(val string) {
s.StatusMessage = val s.StatusMessage = val
} }
// Ref: #/components/schemas/SubmissionCreate // Ref: #/components/schemas/SubmissionTriggerCreate
type SubmissionCreate struct { type SubmissionTriggerCreate struct {
DisplayName string `json:"DisplayName"` AssetID int64 `json:"AssetID"`
Creator string `json:"Creator"`
GameID int32 `json:"GameID"`
AssetID int64 `json:"AssetID"`
AssetVersion int64 `json:"AssetVersion"`
}
// GetDisplayName returns the value of DisplayName.
func (s *SubmissionCreate) GetDisplayName() string {
return s.DisplayName
}
// GetCreator returns the value of Creator.
func (s *SubmissionCreate) GetCreator() string {
return s.Creator
}
// GetGameID returns the value of GameID.
func (s *SubmissionCreate) GetGameID() int32 {
return s.GameID
} }
// GetAssetID returns the value of AssetID. // GetAssetID returns the value of AssetID.
func (s *SubmissionCreate) GetAssetID() int64 { func (s *SubmissionTriggerCreate) GetAssetID() int64 {
return s.AssetID return s.AssetID
} }
// GetAssetVersion returns the value of AssetVersion.
func (s *SubmissionCreate) GetAssetVersion() int64 {
return s.AssetVersion
}
// SetDisplayName sets the value of DisplayName.
func (s *SubmissionCreate) SetDisplayName(val string) {
s.DisplayName = val
}
// SetCreator sets the value of Creator.
func (s *SubmissionCreate) SetCreator(val string) {
s.Creator = val
}
// SetGameID sets the value of GameID.
func (s *SubmissionCreate) SetGameID(val int32) {
s.GameID = val
}
// SetAssetID sets the value of AssetID. // SetAssetID sets the value of AssetID.
func (s *SubmissionCreate) SetAssetID(val int64) { func (s *SubmissionTriggerCreate) SetAssetID(val int64) {
s.AssetID = val s.AssetID = val
} }
// SetAssetVersion sets the value of AssetVersion.
func (s *SubmissionCreate) SetAssetVersion(val int64) {
s.AssetVersion = val
}
// UpdateMapfixModelNoContent is response for UpdateMapfixModel operation. // UpdateMapfixModelNoContent is response for UpdateMapfixModel operation.
type UpdateMapfixModelNoContent struct{} type UpdateMapfixModelNoContent struct{}

@ -118,10 +118,10 @@ type Handler interface {
ActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) error ActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) error
// CreateMapfix implements createMapfix operation. // CreateMapfix implements createMapfix operation.
// //
// Create new mapfix. // Trigger the validator to create a mapfix.
// //
// POST /mapfixes // POST /mapfixes
CreateMapfix(ctx context.Context, req *MapfixCreate) (*ID, error) CreateMapfix(ctx context.Context, req *MapfixTriggerCreate) (*OperationID, error)
// CreateScript implements createScript operation. // CreateScript implements createScript operation.
// //
// Create a new script. // Create a new script.
@ -136,10 +136,10 @@ type Handler interface {
CreateScriptPolicy(ctx context.Context, req *ScriptPolicyCreate) (*ID, error) CreateScriptPolicy(ctx context.Context, req *ScriptPolicyCreate) (*ID, error)
// CreateSubmission implements createSubmission operation. // CreateSubmission implements createSubmission operation.
// //
// Create new submission. // Trigger the validator to create a new submission.
// //
// POST /submissions // POST /submissions
CreateSubmission(ctx context.Context, req *SubmissionCreate) (*ID, error) CreateSubmission(ctx context.Context, req *SubmissionTriggerCreate) (*OperationID, error)
// DeleteScript implements deleteScript operation. // DeleteScript implements deleteScript operation.
// //
// Delete the specified script by ID. // Delete the specified script by ID.

@ -177,10 +177,10 @@ func (UnimplementedHandler) ActionSubmissionValidated(ctx context.Context, param
// CreateMapfix implements createMapfix operation. // CreateMapfix implements createMapfix operation.
// //
// Create new mapfix. // Trigger the validator to create a mapfix.
// //
// POST /mapfixes // POST /mapfixes
func (UnimplementedHandler) CreateMapfix(ctx context.Context, req *MapfixCreate) (r *ID, _ error) { func (UnimplementedHandler) CreateMapfix(ctx context.Context, req *MapfixTriggerCreate) (r *OperationID, _ error) {
return r, ht.ErrNotImplemented return r, ht.ErrNotImplemented
} }
@ -204,10 +204,10 @@ func (UnimplementedHandler) CreateScriptPolicy(ctx context.Context, req *ScriptP
// CreateSubmission implements createSubmission operation. // CreateSubmission implements createSubmission operation.
// //
// Create new submission. // Trigger the validator to create a new submission.
// //
// POST /submissions // POST /submissions
func (UnimplementedHandler) CreateSubmission(ctx context.Context, req *SubmissionCreate) (r *ID, _ error) { func (UnimplementedHandler) CreateSubmission(ctx context.Context, req *SubmissionTriggerCreate) (r *OperationID, _ error) {
return r, ht.ErrNotImplemented return r, ht.ErrNotImplemented
} }

@ -127,56 +127,6 @@ func (s *Mapfix) Validate() error {
return nil return nil
} }
func (s *MapfixCreate) Validate() error {
if s == nil {
return validate.ErrNilPointer
}
var failures []validate.FieldError
if err := func() error {
if err := (validate.String{
MinLength: 0,
MinLengthSet: false,
MaxLength: 128,
MaxLengthSet: true,
Email: false,
Hostname: false,
Regex: nil,
}).Validate(string(s.DisplayName)); err != nil {
return errors.Wrap(err, "string")
}
return nil
}(); err != nil {
failures = append(failures, validate.FieldError{
Name: "DisplayName",
Error: err,
})
}
if err := func() error {
if err := (validate.String{
MinLength: 0,
MinLengthSet: false,
MaxLength: 128,
MaxLengthSet: true,
Email: false,
Hostname: false,
Regex: nil,
}).Validate(string(s.Creator)); err != nil {
return errors.Wrap(err, "string")
}
return nil
}(); err != nil {
failures = append(failures, validate.FieldError{
Name: "Creator",
Error: err,
})
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}
func (s *Operation) Validate() error { func (s *Operation) Validate() error {
if s == nil { if s == nil {
return validate.ErrNilPointer return validate.ErrNilPointer
@ -510,56 +460,6 @@ func (s *Submission) Validate() error {
return nil return nil
} }
func (s *SubmissionCreate) Validate() error {
if s == nil {
return validate.ErrNilPointer
}
var failures []validate.FieldError
if err := func() error {
if err := (validate.String{
MinLength: 0,
MinLengthSet: false,
MaxLength: 128,
MaxLengthSet: true,
Email: false,
Hostname: false,
Regex: nil,
}).Validate(string(s.DisplayName)); err != nil {
return errors.Wrap(err, "string")
}
return nil
}(); err != nil {
failures = append(failures, validate.FieldError{
Name: "DisplayName",
Error: err,
})
}
if err := func() error {
if err := (validate.String{
MinLength: 0,
MinLengthSet: false,
MaxLength: 128,
MaxLengthSet: true,
Email: false,
Hostname: false,
Regex: nil,
}).Validate(string(s.Creator)); err != nil {
return errors.Wrap(err, "string")
}
return nil
}(); err != nil {
failures = append(failures, validate.FieldError{
Name: "Creator",
Error: err,
})
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}
func (s *User) Validate() error { func (s *User) Validate() error {
if s == nil { if s == nil {
return validate.ErrNilPointer return validate.ErrNilPointer

@ -5,6 +5,18 @@ package model
// Requests are sent from maps-service to validator // Requests are sent from maps-service to validator
type CreateSubmissionRequest struct {
// operation_id is passed back in the response message
OperationID int32
ModelID int64
}
type CreateMapfixRequest struct {
OperationID int32
ModelID int64
TargetAssetID int64
}
type ValidateSubmissionRequest struct { type ValidateSubmissionRequest struct {
// submission_id is passed back in the response message // submission_id is passed back in the response message
SubmissionID int64 SubmissionID int64

@ -46,7 +46,7 @@ var (
) )
// POST /mapfixes // POST /mapfixes
func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixCreate) (*api.ID, error) { func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixTriggerCreate) (*api.OperationID, error) {
userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle)
if !ok { if !ok {
return nil, ErrUserInfo return nil, ErrUserInfo
@ -74,42 +74,29 @@ func (svc *Service) CreateMapfix(ctx context.Context, request *api.MapfixCreate)
return nil, ErrCreationPhaseMapfixesLimit return nil, ErrCreationPhaseMapfixesLimit
} }
} }
operation, err := svc.DB.Operations().Create(ctx, model.Operation{
// Check if an active mapfix with the same asset id exists Owner: int64(userId),
{ StatusID: model.OperationStatusCreated,
filter := datastore.Optional()
filter.Add("asset_id", request.AssetID)
filter.Add("asset_version", request.AssetVersion)
filter.Add("status_id", ActiveMapfixStatuses)
active_mapfixes, err := svc.DB.Mapfixes().List(ctx, filter, model.Page{
Number: 1,
Size: 1,
},datastore.ListSortDisabled)
if err != nil {
return nil, err
}
if len(active_mapfixes) != 0{
return nil, ErrActiveMapfixSameAssetID
}
}
mapfix, err := svc.DB.Mapfixes().Create(ctx, model.Mapfix{
ID: 0,
DisplayName: request.DisplayName,
Creator: request.Creator,
GameID: request.GameID,
Submitter: int64(userId),
AssetID: request.AssetID,
AssetVersion: request.AssetVersion,
Completed: false,
TargetAssetID: request.TargetAssetID,
StatusID: model.MapfixStatusUnderConstruction,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &api.ID{
ID: mapfix.ID, create_request := model.CreateMapfixRequest{
OperationID: operation.ID,
ModelID: request.AssetID,
TargetAssetID: request.TargetAssetID,
}
j, err := json.Marshal(create_request)
if err != nil {
return nil, err
}
svc.Nats.Publish("maptest.mapfixes.create", []byte(j))
return &api.OperationID{
OperationID: operation.ID,
}, nil }, nil
} }

@ -49,7 +49,7 @@ var (
) )
// POST /submissions // POST /submissions
func (svc *Service) CreateSubmission(ctx context.Context, request *api.SubmissionCreate) (*api.ID, error) { func (svc *Service) CreateSubmission(ctx context.Context, request *api.SubmissionTriggerCreate) (*api.OperationID, error) {
userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle) userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle)
if !ok { if !ok {
return nil, ErrUserInfo return nil, ErrUserInfo
@ -77,41 +77,28 @@ func (svc *Service) CreateSubmission(ctx context.Context, request *api.Submissio
return nil, ErrCreationPhaseSubmissionsLimit return nil, ErrCreationPhaseSubmissionsLimit
} }
} }
operation, err := svc.DB.Operations().Create(ctx, model.Operation{
// Check if an active submission with the same asset id exists Owner: int64(userId),
{ StatusID: model.OperationStatusCreated,
filter := datastore.Optional()
filter.Add("asset_id", request.AssetID)
filter.Add("asset_version", request.AssetVersion)
filter.Add("status_id", ActiveSubmissionStatuses)
active_submissions, err := svc.DB.Submissions().List(ctx, filter, model.Page{
Number: 1,
Size: 1,
},datastore.ListSortDisabled)
if err != nil {
return nil, err
}
if len(active_submissions) != 0{
return nil, ErrActiveSubmissionSameAssetID
}
}
submission, err := svc.DB.Submissions().Create(ctx, model.Submission{
ID: 0,
DisplayName: request.DisplayName,
Creator: request.Creator,
GameID: request.GameID,
Submitter: int64(userId),
AssetID: request.AssetID,
AssetVersion: request.AssetVersion,
Completed: false,
StatusID: model.SubmissionStatusUnderConstruction,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &api.ID{
ID: submission.ID, create_request := model.CreateSubmissionRequest{
OperationID: operation.ID,
ModelID: request.AssetID,
}
j, err := json.Marshal(create_request)
if err != nil {
return nil, err
}
svc.Nats.Publish("maptest.submissions.create", []byte(j))
return &api.OperationID{
OperationID: operation.ID,
}, nil }, nil
} }