From 4e8c1eddd0c2d785860241fb4f7b726f9fe4ef35 Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Wed, 2 Apr 2025 13:51:35 -0700 Subject: [PATCH] openapi: generate --- pkg/api/oas_client_gen.go | 20 +- pkg/api/oas_handlers_gen.go | 20 +- pkg/api/oas_json_gen.go | 292 ++++---- pkg/api/oas_request_decoders_gen.go | 24 +- pkg/api/oas_request_encoders_gen.go | 4 +- pkg/api/oas_response_decoders_gen.go | 8 +- pkg/api/oas_response_encoders_gen.go | 4 +- pkg/api/oas_router_gen.go | 4 +- pkg/api/oas_schemas_gen.go | 129 +--- pkg/api/oas_server_gen.go | 8 +- pkg/api/oas_unimplemented_gen.go | 8 +- pkg/api/oas_validators_gen.go | 100 --- pkg/internal/oas_client_gen.go | 162 +++++ pkg/internal/oas_handlers_gen.go | 298 ++++++++ pkg/internal/oas_json_gen.go | 413 +++++++++++ pkg/internal/oas_operations_gen.go | 2 + pkg/internal/oas_request_decoders_gen.go | 142 ++++ pkg/internal/oas_request_encoders_gen.go | 28 + pkg/internal/oas_response_decoders_gen.go | 166 +++++ pkg/internal/oas_response_encoders_gen.go | 28 + pkg/internal/oas_router_gen.go | 792 ++++++++++++---------- pkg/internal/oas_schemas_gen.go | 173 +++++ pkg/internal/oas_server_gen.go | 12 + pkg/internal/oas_unimplemented_gen.go | 18 + pkg/internal/oas_validators_gen.go | 100 +++ 25 files changed, 2180 insertions(+), 775 deletions(-) diff --git a/pkg/api/oas_client_gen.go b/pkg/api/oas_client_gen.go index 3ed6249..3fac351 100644 --- a/pkg/api/oas_client_gen.go +++ b/pkg/api/oas_client_gen.go @@ -139,10 +139,10 @@ type Invoker interface { ActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) error // CreateMapfix invokes createMapfix operation. // - // Create new mapfix. + // Trigger the validator to create a mapfix. // // POST /mapfixes - CreateMapfix(ctx context.Context, request *MapfixCreate) (*ID, error) + CreateMapfix(ctx context.Context, request *MapfixTriggerCreate) (*OperationID, error) // CreateScript invokes createScript operation. // // Create a new script. @@ -157,10 +157,10 @@ type Invoker interface { CreateScriptPolicy(ctx context.Context, request *ScriptPolicyCreate) (*ID, error) // CreateSubmission invokes createSubmission operation. // - // Create new submission. + // Trigger the validator to create a new submission. // // POST /submissions - CreateSubmission(ctx context.Context, request *SubmissionCreate) (*ID, error) + CreateSubmission(ctx context.Context, request *SubmissionTriggerCreate) (*OperationID, error) // DeleteScript invokes deleteScript operation. // // Delete the specified script by ID. @@ -2584,15 +2584,15 @@ func (c *Client) sendActionSubmissionValidated(ctx context.Context, params Actio // CreateMapfix invokes createMapfix operation. // -// Create new mapfix. +// Trigger the validator to create a mapfix. // // 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) 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{ otelogen.OperationID("createMapfix"), semconv.HTTPRequestMethodKey.String("POST"), @@ -2908,15 +2908,15 @@ func (c *Client) sendCreateScriptPolicy(ctx context.Context, request *ScriptPoli // CreateSubmission invokes createSubmission operation. // -// Create new submission. +// Trigger the validator to create a new submission. // // 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) 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{ otelogen.OperationID("createSubmission"), semconv.HTTPRequestMethodKey.String("POST"), diff --git a/pkg/api/oas_handlers_gen.go b/pkg/api/oas_handlers_gen.go index 6b2c786..d667263 100644 --- a/pkg/api/oas_handlers_gen.go +++ b/pkg/api/oas_handlers_gen.go @@ -3542,7 +3542,7 @@ func (s *Server) handleActionSubmissionValidatedRequest(args [1]string, argsEsca // handleCreateMapfixRequest handles createMapfix operation. // -// Create new mapfix. +// Trigger the validator to create a mapfix. // // POST /mapfixes 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 { mreq := middleware.Request{ Context: ctx, OperationName: CreateMapfixOperation, - OperationSummary: "Create new mapfix", + OperationSummary: "Trigger the validator to create a mapfix", OperationID: "createMapfix", Body: request, Params: middleware.Parameters{}, @@ -3689,9 +3689,9 @@ func (s *Server) handleCreateMapfixRequest(args [0]string, argsEscaped bool, w h } type ( - Request = *MapfixCreate + Request = *MapfixTriggerCreate Params = struct{} - Response = *ID + Response = *OperationID ) response, err = middleware.HookMiddleware[ Request, @@ -4127,7 +4127,7 @@ func (s *Server) handleCreateScriptPolicyRequest(args [0]string, argsEscaped boo // handleCreateSubmissionRequest handles createSubmission operation. // -// Create new submission. +// Trigger the validator to create a new submission. // // POST /submissions 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 { mreq := middleware.Request{ Context: ctx, OperationName: CreateSubmissionOperation, - OperationSummary: "Create new submission", + OperationSummary: "Trigger the validator to create a new submission", OperationID: "createSubmission", Body: request, Params: middleware.Parameters{}, @@ -4274,9 +4274,9 @@ func (s *Server) handleCreateSubmissionRequest(args [0]string, argsEscaped bool, } type ( - Request = *SubmissionCreate + Request = *SubmissionTriggerCreate Params = struct{} - Response = *ID + Response = *OperationID ) response, err = middleware.HookMiddleware[ Request, diff --git a/pkg/api/oas_json_gen.go b/pkg/api/oas_json_gen.go index 4e0109b..6833f15 100644 --- a/pkg/api/oas_json_gen.go +++ b/pkg/api/oas_json_gen.go @@ -688,96 +688,40 @@ func (s *Mapfix) UnmarshalJSON(data []byte) error { } // Encode implements json.Marshaler. -func (s *MapfixCreate) Encode(e *jx.Encoder) { +func (s *MapfixTriggerCreate) Encode(e *jx.Encoder) { e.ObjStart() s.encodeFields(e) e.ObjEnd() } // encodeFields encodes fields. -func (s *MapfixCreate) 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) - } +func (s *MapfixTriggerCreate) encodeFields(e *jx.Encoder) { { e.FieldStart("AssetID") e.Int64(s.AssetID) } - { - e.FieldStart("AssetVersion") - e.Int64(s.AssetVersion) - } { e.FieldStart("TargetAssetID") e.Int64(s.TargetAssetID) } } -var jsonFieldsNameOfMapfixCreate = [6]string{ - 0: "DisplayName", - 1: "Creator", - 2: "GameID", - 3: "AssetID", - 4: "AssetVersion", - 5: "TargetAssetID", +var jsonFieldsNameOfMapfixTriggerCreate = [2]string{ + 0: "AssetID", + 1: "TargetAssetID", } -// Decode decodes MapfixCreate from json. -func (s *MapfixCreate) Decode(d *jx.Decoder) error { +// Decode decodes MapfixTriggerCreate from json. +func (s *MapfixTriggerCreate) Decode(d *jx.Decoder) error { 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 if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { 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": - requiredBitSet[0] |= 1 << 3 + requiredBitSet[0] |= 1 << 0 if err := func() error { v, err := d.Int64() s.AssetID = int64(v) @@ -788,20 +732,8 @@ func (s *MapfixCreate) Decode(d *jx.Decoder) error { }(); err != nil { 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": - requiredBitSet[0] |= 1 << 5 + requiredBitSet[0] |= 1 << 1 if err := func() error { v, err := d.Int64() s.TargetAssetID = int64(v) @@ -817,12 +749,12 @@ func (s *MapfixCreate) Decode(d *jx.Decoder) error { } return nil }); err != nil { - return errors.Wrap(err, "decode MapfixCreate") + return errors.Wrap(err, "decode MapfixTriggerCreate") } // Validate required fields. var failures []validate.FieldError for i, mask := range [1]uint8{ - 0b00111111, + 0b00000011, } { if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { // 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) fieldIdx := i*8 + bitIdx var name string - if fieldIdx < len(jsonFieldsNameOfMapfixCreate) { - name = jsonFieldsNameOfMapfixCreate[fieldIdx] + if fieldIdx < len(jsonFieldsNameOfMapfixTriggerCreate) { + name = jsonFieldsNameOfMapfixTriggerCreate[fieldIdx] } else { name = strconv.Itoa(fieldIdx) } @@ -856,14 +788,14 @@ func (s *MapfixCreate) Decode(d *jx.Decoder) error { } // MarshalJSON implements stdjson.Marshaler. -func (s *MapfixCreate) MarshalJSON() ([]byte, error) { +func (s *MapfixTriggerCreate) MarshalJSON() ([]byte, error) { e := jx.Encoder{} s.Encode(&e) return e.Bytes(), nil } // UnmarshalJSON implements stdjson.Unmarshaler. -func (s *MapfixCreate) UnmarshalJSON(data []byte) error { +func (s *MapfixTriggerCreate) UnmarshalJSON(data []byte) error { d := jx.DecodeBytes(data) return s.Decode(d) } @@ -1049,6 +981,102 @@ func (s *Operation) UnmarshalJSON(data []byte) error { 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. func (o OptInt32) Encode(e *jx.Encoder) { if !o.Set { @@ -2615,91 +2643,35 @@ func (s *Submission) UnmarshalJSON(data []byte) error { } // Encode implements json.Marshaler. -func (s *SubmissionCreate) Encode(e *jx.Encoder) { +func (s *SubmissionTriggerCreate) Encode(e *jx.Encoder) { e.ObjStart() s.encodeFields(e) e.ObjEnd() } // encodeFields encodes fields. -func (s *SubmissionCreate) 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) - } +func (s *SubmissionTriggerCreate) encodeFields(e *jx.Encoder) { { e.FieldStart("AssetID") e.Int64(s.AssetID) } - { - e.FieldStart("AssetVersion") - e.Int64(s.AssetVersion) - } } -var jsonFieldsNameOfSubmissionCreate = [5]string{ - 0: "DisplayName", - 1: "Creator", - 2: "GameID", - 3: "AssetID", - 4: "AssetVersion", +var jsonFieldsNameOfSubmissionTriggerCreate = [1]string{ + 0: "AssetID", } -// Decode decodes SubmissionCreate from json. -func (s *SubmissionCreate) Decode(d *jx.Decoder) error { +// Decode decodes SubmissionTriggerCreate from json. +func (s *SubmissionTriggerCreate) Decode(d *jx.Decoder) error { 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 if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { 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": - requiredBitSet[0] |= 1 << 3 + requiredBitSet[0] |= 1 << 0 if err := func() error { v, err := d.Int64() s.AssetID = int64(v) @@ -2710,29 +2682,17 @@ func (s *SubmissionCreate) Decode(d *jx.Decoder) error { }(); err != nil { 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: return d.Skip() } return nil }); err != nil { - return errors.Wrap(err, "decode SubmissionCreate") + return errors.Wrap(err, "decode SubmissionTriggerCreate") } // Validate required fields. var failures []validate.FieldError for i, mask := range [1]uint8{ - 0b00011111, + 0b00000001, } { if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { // 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) fieldIdx := i*8 + bitIdx var name string - if fieldIdx < len(jsonFieldsNameOfSubmissionCreate) { - name = jsonFieldsNameOfSubmissionCreate[fieldIdx] + if fieldIdx < len(jsonFieldsNameOfSubmissionTriggerCreate) { + name = jsonFieldsNameOfSubmissionTriggerCreate[fieldIdx] } else { name = strconv.Itoa(fieldIdx) } @@ -2766,14 +2726,14 @@ func (s *SubmissionCreate) Decode(d *jx.Decoder) error { } // MarshalJSON implements stdjson.Marshaler. -func (s *SubmissionCreate) MarshalJSON() ([]byte, error) { +func (s *SubmissionTriggerCreate) MarshalJSON() ([]byte, error) { e := jx.Encoder{} s.Encode(&e) return e.Bytes(), nil } // UnmarshalJSON implements stdjson.Unmarshaler. -func (s *SubmissionCreate) UnmarshalJSON(data []byte) error { +func (s *SubmissionTriggerCreate) UnmarshalJSON(data []byte) error { d := jx.DecodeBytes(data) return s.Decode(d) } diff --git a/pkg/api/oas_request_decoders_gen.go b/pkg/api/oas_request_decoders_gen.go index da76dc0..1fa2247 100644 --- a/pkg/api/oas_request_decoders_gen.go +++ b/pkg/api/oas_request_decoders_gen.go @@ -16,7 +16,7 @@ import ( ) func (s *Server) decodeCreateMapfixRequest(r *http.Request) ( - req *MapfixCreate, + req *MapfixTriggerCreate, close func() error, rerr error, ) { @@ -55,7 +55,7 @@ func (s *Server) decodeCreateMapfixRequest(r *http.Request) ( d := jx.DecodeBytes(buf) - var request MapfixCreate + var request MapfixTriggerCreate if err := func() error { if err := request.Decode(d); err != nil { return err @@ -72,14 +72,6 @@ func (s *Server) decodeCreateMapfixRequest(r *http.Request) ( } 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 default: return req, close, validate.InvalidContentType(ct) @@ -221,7 +213,7 @@ func (s *Server) decodeCreateScriptPolicyRequest(r *http.Request) ( } func (s *Server) decodeCreateSubmissionRequest(r *http.Request) ( - req *SubmissionCreate, + req *SubmissionTriggerCreate, close func() error, rerr error, ) { @@ -260,7 +252,7 @@ func (s *Server) decodeCreateSubmissionRequest(r *http.Request) ( d := jx.DecodeBytes(buf) - var request SubmissionCreate + var request SubmissionTriggerCreate if err := func() error { if err := request.Decode(d); err != nil { return err @@ -277,14 +269,6 @@ func (s *Server) decodeCreateSubmissionRequest(r *http.Request) ( } 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 default: return req, close, validate.InvalidContentType(ct) diff --git a/pkg/api/oas_request_encoders_gen.go b/pkg/api/oas_request_encoders_gen.go index b8686b0..52f1046 100644 --- a/pkg/api/oas_request_encoders_gen.go +++ b/pkg/api/oas_request_encoders_gen.go @@ -12,7 +12,7 @@ import ( ) func encodeCreateMapfixRequest( - req *MapfixCreate, + req *MapfixTriggerCreate, r *http.Request, ) error { const contentType = "application/json" @@ -54,7 +54,7 @@ func encodeCreateScriptPolicyRequest( } func encodeCreateSubmissionRequest( - req *SubmissionCreate, + req *SubmissionTriggerCreate, r *http.Request, ) error { const contentType = "application/json" diff --git a/pkg/api/oas_response_decoders_gen.go b/pkg/api/oas_response_decoders_gen.go index d871088..197eacd 100644 --- a/pkg/api/oas_response_decoders_gen.go +++ b/pkg/api/oas_response_decoders_gen.go @@ -933,7 +933,7 @@ func decodeActionSubmissionValidatedResponse(resp *http.Response) (res *ActionSu 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 { case 201: // Code 201. @@ -949,7 +949,7 @@ func decodeCreateMapfixResponse(resp *http.Response) (res *ID, _ error) { } d := jx.DecodeBytes(buf) - var response ID + var response OperationID if err := func() error { if err := response.Decode(d); err != nil { return err @@ -1182,7 +1182,7 @@ func decodeCreateScriptPolicyResponse(resp *http.Response) (res *ID, _ 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 { case 201: // Code 201. @@ -1198,7 +1198,7 @@ func decodeCreateSubmissionResponse(resp *http.Response) (res *ID, _ error) { } d := jx.DecodeBytes(buf) - var response ID + var response OperationID if err := func() error { if err := response.Decode(d); err != nil { return err diff --git a/pkg/api/oas_response_encoders_gen.go b/pkg/api/oas_response_encoders_gen.go index 914e275..58f61b3 100644 --- a/pkg/api/oas_response_encoders_gen.go +++ b/pkg/api/oas_response_encoders_gen.go @@ -139,7 +139,7 @@ func encodeActionSubmissionValidatedResponse(response *ActionSubmissionValidated 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.WriteHeader(201) span.SetStatus(codes.Ok, http.StatusText(201)) @@ -181,7 +181,7 @@ func encodeCreateScriptPolicyResponse(response *ID, w http.ResponseWriter, span 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.WriteHeader(201) span.SetStatus(codes.Ok, http.StatusText(201)) diff --git a/pkg/api/oas_router_gen.go b/pkg/api/oas_router_gen.go index 46e8499..414d7e4 100644 --- a/pkg/api/oas_router_gen.go +++ b/pkg/api/oas_router_gen.go @@ -1264,7 +1264,7 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return r, true case "POST": r.name = CreateMapfixOperation - r.summary = "Create new mapfix" + r.summary = "Trigger the validator to create a mapfix" r.operationID = "createMapfix" r.pathPattern = "/mapfixes" r.args = args @@ -2058,7 +2058,7 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return r, true case "POST": r.name = CreateSubmissionOperation - r.summary = "Create new submission" + r.summary = "Trigger the validator to create a new submission" r.operationID = "createSubmission" r.pathPattern = "/submissions" r.args = args diff --git a/pkg/api/oas_schemas_gen.go b/pkg/api/oas_schemas_gen.go index e9c86a7..5141d86 100644 --- a/pkg/api/oas_schemas_gen.go +++ b/pkg/api/oas_schemas_gen.go @@ -359,73 +359,29 @@ func (s *Mapfix) SetStatusMessage(val string) { s.StatusMessage = val } -// Ref: #/components/schemas/MapfixCreate -type MapfixCreate struct { - DisplayName string `json:"DisplayName"` - Creator string `json:"Creator"` - 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 +// Ref: #/components/schemas/MapfixTriggerCreate +type MapfixTriggerCreate struct { + AssetID int64 `json:"AssetID"` + TargetAssetID int64 `json:"TargetAssetID"` } // GetAssetID returns the value of AssetID. -func (s *MapfixCreate) GetAssetID() int64 { +func (s *MapfixTriggerCreate) GetAssetID() int64 { return s.AssetID } -// GetAssetVersion returns the value of AssetVersion. -func (s *MapfixCreate) GetAssetVersion() int64 { - return s.AssetVersion -} - // GetTargetAssetID returns the value of TargetAssetID. -func (s *MapfixCreate) GetTargetAssetID() int64 { +func (s *MapfixTriggerCreate) GetTargetAssetID() int64 { 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. -func (s *MapfixCreate) SetAssetID(val int64) { +func (s *MapfixTriggerCreate) SetAssetID(val int64) { s.AssetID = val } -// SetAssetVersion sets the value of AssetVersion. -func (s *MapfixCreate) SetAssetVersion(val int64) { - s.AssetVersion = val -} - // SetTargetAssetID sets the value of TargetAssetID. -func (s *MapfixCreate) SetTargetAssetID(val int64) { +func (s *MapfixTriggerCreate) SetTargetAssetID(val int64) { s.TargetAssetID = val } @@ -499,6 +455,21 @@ func (s *Operation) SetPath(val string) { 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. func NewOptInt32(v int32) OptInt32 { return OptInt32{ @@ -1166,65 +1137,21 @@ func (s *Submission) SetStatusMessage(val string) { s.StatusMessage = val } -// Ref: #/components/schemas/SubmissionCreate -type SubmissionCreate struct { - DisplayName string `json:"DisplayName"` - 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 +// Ref: #/components/schemas/SubmissionTriggerCreate +type SubmissionTriggerCreate struct { + AssetID int64 `json:"AssetID"` } // GetAssetID returns the value of AssetID. -func (s *SubmissionCreate) GetAssetID() int64 { +func (s *SubmissionTriggerCreate) GetAssetID() int64 { 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. -func (s *SubmissionCreate) SetAssetID(val int64) { +func (s *SubmissionTriggerCreate) SetAssetID(val int64) { s.AssetID = val } -// SetAssetVersion sets the value of AssetVersion. -func (s *SubmissionCreate) SetAssetVersion(val int64) { - s.AssetVersion = val -} - // UpdateMapfixModelNoContent is response for UpdateMapfixModel operation. type UpdateMapfixModelNoContent struct{} diff --git a/pkg/api/oas_server_gen.go b/pkg/api/oas_server_gen.go index 9a623ad..b06f259 100644 --- a/pkg/api/oas_server_gen.go +++ b/pkg/api/oas_server_gen.go @@ -118,10 +118,10 @@ type Handler interface { ActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) error // CreateMapfix implements createMapfix operation. // - // Create new mapfix. + // Trigger the validator to create a mapfix. // // POST /mapfixes - CreateMapfix(ctx context.Context, req *MapfixCreate) (*ID, error) + CreateMapfix(ctx context.Context, req *MapfixTriggerCreate) (*OperationID, error) // CreateScript implements createScript operation. // // Create a new script. @@ -136,10 +136,10 @@ type Handler interface { CreateScriptPolicy(ctx context.Context, req *ScriptPolicyCreate) (*ID, error) // CreateSubmission implements createSubmission operation. // - // Create new submission. + // Trigger the validator to create a new submission. // // POST /submissions - CreateSubmission(ctx context.Context, req *SubmissionCreate) (*ID, error) + CreateSubmission(ctx context.Context, req *SubmissionTriggerCreate) (*OperationID, error) // DeleteScript implements deleteScript operation. // // Delete the specified script by ID. diff --git a/pkg/api/oas_unimplemented_gen.go b/pkg/api/oas_unimplemented_gen.go index 6e9f4f3..3e92782 100644 --- a/pkg/api/oas_unimplemented_gen.go +++ b/pkg/api/oas_unimplemented_gen.go @@ -177,10 +177,10 @@ func (UnimplementedHandler) ActionSubmissionValidated(ctx context.Context, param // CreateMapfix implements createMapfix operation. // -// Create new mapfix. +// Trigger the validator to create a mapfix. // // 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 } @@ -204,10 +204,10 @@ func (UnimplementedHandler) CreateScriptPolicy(ctx context.Context, req *ScriptP // CreateSubmission implements createSubmission operation. // -// Create new submission. +// Trigger the validator to create a new submission. // // 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 } diff --git a/pkg/api/oas_validators_gen.go b/pkg/api/oas_validators_gen.go index 19344a1..006fce8 100644 --- a/pkg/api/oas_validators_gen.go +++ b/pkg/api/oas_validators_gen.go @@ -127,56 +127,6 @@ func (s *Mapfix) Validate() error { 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 { if s == nil { return validate.ErrNilPointer @@ -510,56 +460,6 @@ func (s *Submission) Validate() error { 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 { if s == nil { return validate.ErrNilPointer diff --git a/pkg/internal/oas_client_gen.go b/pkg/internal/oas_client_gen.go index 8c64dc5..9095d81 100644 --- a/pkg/internal/oas_client_gen.go +++ b/pkg/internal/oas_client_gen.go @@ -64,6 +64,12 @@ type Invoker interface { // // POST /submissions/{SubmissionID}/status/validator-validated ActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) error + // CreateMapfix invokes createMapfix operation. + // + // Create a mapfix. + // + // POST /mapfixes + CreateMapfix(ctx context.Context, request *MapfixCreate) (*ID, error) // CreateScript invokes createScript operation. // // Create a new script. @@ -76,6 +82,12 @@ type Invoker interface { // // POST /script-policy CreateScriptPolicy(ctx context.Context, request *ScriptPolicyCreate) (*ID, error) + // CreateSubmission invokes createSubmission operation. + // + // Create a new submission. + // + // POST /submissions + CreateSubmission(ctx context.Context, request *SubmissionCreate) (*ID, error) // GetScript invokes getScript operation. // // Get the specified script by ID. @@ -755,6 +767,81 @@ func (c *Client) sendActionSubmissionValidated(ctx context.Context, params Actio return result, nil } +// CreateMapfix invokes createMapfix operation. +// +// Create a mapfix. +// +// POST /mapfixes +func (c *Client) CreateMapfix(ctx context.Context, request *MapfixCreate) (*ID, error) { + res, err := c.sendCreateMapfix(ctx, request) + return res, err +} + +func (c *Client) sendCreateMapfix(ctx context.Context, request *MapfixCreate) (res *ID, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createMapfix"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes"), + } + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, CreateMapfixOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/mapfixes" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + if err := encodeCreateMapfixRequest(request, r); err != nil { + return res, errors.Wrap(err, "encode request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + defer resp.Body.Close() + + stage = "DecodeResponse" + result, err := decodeCreateMapfixResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + // CreateScript invokes createScript operation. // // Create a new script. @@ -905,6 +992,81 @@ func (c *Client) sendCreateScriptPolicy(ctx context.Context, request *ScriptPoli return result, nil } +// CreateSubmission invokes createSubmission operation. +// +// Create a new submission. +// +// POST /submissions +func (c *Client) CreateSubmission(ctx context.Context, request *SubmissionCreate) (*ID, error) { + res, err := c.sendCreateSubmission(ctx, request) + return res, err +} + +func (c *Client) sendCreateSubmission(ctx context.Context, request *SubmissionCreate) (res *ID, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createSubmission"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions"), + } + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, CreateSubmissionOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/submissions" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + if err := encodeCreateSubmissionRequest(request, r); err != nil { + return res, errors.Wrap(err, "encode request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + defer resp.Body.Close() + + stage = "DecodeResponse" + result, err := decodeCreateSubmissionResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + // GetScript invokes getScript operation. // // Get the specified script by ID. diff --git a/pkg/internal/oas_handlers_gen.go b/pkg/internal/oas_handlers_gen.go index 346fefb..5a77b23 100644 --- a/pkg/internal/oas_handlers_gen.go +++ b/pkg/internal/oas_handlers_gen.go @@ -936,6 +936,155 @@ func (s *Server) handleActionSubmissionValidatedRequest(args [1]string, argsEsca } } +// handleCreateMapfixRequest handles createMapfix operation. +// +// Create a mapfix. +// +// POST /mapfixes +func (s *Server) handleCreateMapfixRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createMapfix"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), CreateMapfixOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code >= 100 && code < 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: CreateMapfixOperation, + ID: "createMapfix", + } + ) + request, close, err := s.decodeCreateMapfixRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() + + var response *ID + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: CreateMapfixOperation, + OperationSummary: "Create a mapfix", + OperationID: "createMapfix", + Body: request, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = *MapfixCreate + Params = struct{} + Response = *ID + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.CreateMapfix(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.CreateMapfix(ctx, request) + } + if err != nil { + if errRes, ok := errors.Into[*ErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeCreateMapfixResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + // handleCreateScriptRequest handles createScript operation. // // Create a new script. @@ -1234,6 +1383,155 @@ func (s *Server) handleCreateScriptPolicyRequest(args [0]string, argsEscaped boo } } +// handleCreateSubmissionRequest handles createSubmission operation. +// +// Create a new submission. +// +// POST /submissions +func (s *Server) handleCreateSubmissionRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createSubmission"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), CreateSubmissionOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code >= 100 && code < 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: CreateSubmissionOperation, + ID: "createSubmission", + } + ) + request, close, err := s.decodeCreateSubmissionRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() + + var response *ID + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: CreateSubmissionOperation, + OperationSummary: "Create a new submission", + OperationID: "createSubmission", + Body: request, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = *SubmissionCreate + Params = struct{} + Response = *ID + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.CreateSubmission(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.CreateSubmission(ctx, request) + } + if err != nil { + if errRes, ok := errors.Into[*ErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeCreateSubmissionResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + // handleGetScriptRequest handles getScript operation. // // Get the specified script by ID. diff --git a/pkg/internal/oas_json_gen.go b/pkg/internal/oas_json_gen.go index 7b03e7b..7ad30b5 100644 --- a/pkg/internal/oas_json_gen.go +++ b/pkg/internal/oas_json_gen.go @@ -221,6 +221,221 @@ func (s *ID) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode implements json.Marshaler. +func (s *MapfixCreate) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *MapfixCreate) encodeFields(e *jx.Encoder) { + { + e.FieldStart("OperationID") + e.Int32(s.OperationID) + } + { + e.FieldStart("AssetOwner") + e.Int64(s.AssetOwner) + } + { + 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.Int64(s.AssetID) + } + { + e.FieldStart("AssetVersion") + e.Int64(s.AssetVersion) + } + { + e.FieldStart("TargetAssetID") + e.Int64(s.TargetAssetID) + } +} + +var jsonFieldsNameOfMapfixCreate = [8]string{ + 0: "OperationID", + 1: "AssetOwner", + 2: "DisplayName", + 3: "Creator", + 4: "GameID", + 5: "AssetID", + 6: "AssetVersion", + 7: "TargetAssetID", +} + +// Decode decodes MapfixCreate from json. +func (s *MapfixCreate) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode MapfixCreate 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\"") + } + case "AssetOwner": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Int64() + s.AssetOwner = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"AssetOwner\"") + } + case "DisplayName": + requiredBitSet[0] |= 1 << 2 + 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 << 3 + 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 << 4 + 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": + requiredBitSet[0] |= 1 << 5 + if err := func() error { + v, err := d.Int64() + s.AssetID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"AssetID\"") + } + case "AssetVersion": + requiredBitSet[0] |= 1 << 6 + 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": + requiredBitSet[0] |= 1 << 7 + if err := func() error { + v, err := d.Int64() + s.TargetAssetID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"TargetAssetID\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode MapfixCreate") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b11111111, + } { + 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(jsonFieldsNameOfMapfixCreate) { + name = jsonFieldsNameOfMapfixCreate[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 *MapfixCreate) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *MapfixCreate) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes int64 as json. func (o OptInt64) Encode(e *jx.Encoder) { if !o.Set { @@ -860,3 +1075,201 @@ func (s *ScriptPolicyCreate) UnmarshalJSON(data []byte) error { d := jx.DecodeBytes(data) return s.Decode(d) } + +// Encode implements json.Marshaler. +func (s *SubmissionCreate) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *SubmissionCreate) encodeFields(e *jx.Encoder) { + { + e.FieldStart("OperationID") + e.Int32(s.OperationID) + } + { + e.FieldStart("AssetOwner") + e.Int64(s.AssetOwner) + } + { + 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.Int64(s.AssetID) + } + { + e.FieldStart("AssetVersion") + e.Int64(s.AssetVersion) + } +} + +var jsonFieldsNameOfSubmissionCreate = [7]string{ + 0: "OperationID", + 1: "AssetOwner", + 2: "DisplayName", + 3: "Creator", + 4: "GameID", + 5: "AssetID", + 6: "AssetVersion", +} + +// Decode decodes SubmissionCreate from json. +func (s *SubmissionCreate) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode SubmissionCreate 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\"") + } + case "AssetOwner": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Int64() + s.AssetOwner = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"AssetOwner\"") + } + case "DisplayName": + requiredBitSet[0] |= 1 << 2 + 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 << 3 + 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 << 4 + 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": + requiredBitSet[0] |= 1 << 5 + if err := func() error { + v, err := d.Int64() + s.AssetID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"AssetID\"") + } + case "AssetVersion": + requiredBitSet[0] |= 1 << 6 + 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: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode SubmissionCreate") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b01111111, + } { + 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(jsonFieldsNameOfSubmissionCreate) { + name = jsonFieldsNameOfSubmissionCreate[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 *SubmissionCreate) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *SubmissionCreate) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} diff --git a/pkg/internal/oas_operations_gen.go b/pkg/internal/oas_operations_gen.go index d472077..6fafed1 100644 --- a/pkg/internal/oas_operations_gen.go +++ b/pkg/internal/oas_operations_gen.go @@ -12,8 +12,10 @@ const ( ActionSubmissionAcceptedOperation OperationName = "ActionSubmissionAccepted" ActionSubmissionUploadedOperation OperationName = "ActionSubmissionUploaded" ActionSubmissionValidatedOperation OperationName = "ActionSubmissionValidated" + CreateMapfixOperation OperationName = "CreateMapfix" CreateScriptOperation OperationName = "CreateScript" CreateScriptPolicyOperation OperationName = "CreateScriptPolicy" + CreateSubmissionOperation OperationName = "CreateSubmission" GetScriptOperation OperationName = "GetScript" ListScriptPolicyOperation OperationName = "ListScriptPolicy" ListScriptsOperation OperationName = "ListScripts" diff --git a/pkg/internal/oas_request_decoders_gen.go b/pkg/internal/oas_request_decoders_gen.go index db79c40..5be039e 100644 --- a/pkg/internal/oas_request_decoders_gen.go +++ b/pkg/internal/oas_request_decoders_gen.go @@ -15,6 +15,77 @@ import ( "github.com/ogen-go/ogen/validate" ) +func (s *Server) decodeCreateMapfixRequest(r *http.Request) ( + req *MapfixCreate, + close func() error, + rerr error, +) { + var closers []func() error + close = func() error { + var merr error + // Close in reverse order, to match defer behavior. + for i := len(closers) - 1; i >= 0; i-- { + c := closers[i] + merr = multierr.Append(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = multierr.Append(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + if err != nil { + return req, close, err + } + + if len(buf) == 0 { + return req, close, validate.ErrBodyRequired + } + + d := jx.DecodeBytes(buf) + + var request MapfixCreate + if err := func() error { + if err := request.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: 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 + default: + return req, close, validate.InvalidContentType(ct) + } +} + func (s *Server) decodeCreateScriptRequest(r *http.Request) ( req *ScriptCreate, close func() error, @@ -148,3 +219,74 @@ func (s *Server) decodeCreateScriptPolicyRequest(r *http.Request) ( return req, close, validate.InvalidContentType(ct) } } + +func (s *Server) decodeCreateSubmissionRequest(r *http.Request) ( + req *SubmissionCreate, + close func() error, + rerr error, +) { + var closers []func() error + close = func() error { + var merr error + // Close in reverse order, to match defer behavior. + for i := len(closers) - 1; i >= 0; i-- { + c := closers[i] + merr = multierr.Append(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = multierr.Append(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + if err != nil { + return req, close, err + } + + if len(buf) == 0 { + return req, close, validate.ErrBodyRequired + } + + d := jx.DecodeBytes(buf) + + var request SubmissionCreate + if err := func() error { + if err := request.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: 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 + default: + return req, close, validate.InvalidContentType(ct) + } +} diff --git a/pkg/internal/oas_request_encoders_gen.go b/pkg/internal/oas_request_encoders_gen.go index a0e7305..1e38200 100644 --- a/pkg/internal/oas_request_encoders_gen.go +++ b/pkg/internal/oas_request_encoders_gen.go @@ -11,6 +11,20 @@ import ( ht "github.com/ogen-go/ogen/http" ) +func encodeCreateMapfixRequest( + req *MapfixCreate, + r *http.Request, +) error { + const contentType = "application/json" + e := new(jx.Encoder) + { + req.Encode(e) + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} + func encodeCreateScriptRequest( req *ScriptCreate, r *http.Request, @@ -38,3 +52,17 @@ func encodeCreateScriptPolicyRequest( ht.SetBody(r, bytes.NewReader(encoded), contentType) return nil } + +func encodeCreateSubmissionRequest( + req *SubmissionCreate, + r *http.Request, +) error { + const contentType = "application/json" + e := new(jx.Encoder) + { + req.Encode(e) + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} diff --git a/pkg/internal/oas_response_decoders_gen.go b/pkg/internal/oas_response_decoders_gen.go index 226883f..a667917 100644 --- a/pkg/internal/oas_response_decoders_gen.go +++ b/pkg/internal/oas_response_decoders_gen.go @@ -321,6 +321,89 @@ func decodeActionSubmissionValidatedResponse(resp *http.Response) (res *ActionSu return res, errors.Wrap(defRes, "error") } +func decodeCreateMapfixResponse(resp *http.Response) (res *ID, _ error) { + switch resp.StatusCode { + case 201: + // Code 201. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ID + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *ErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &ErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + func decodeCreateScriptResponse(resp *http.Response) (res *ID, _ error) { switch resp.StatusCode { case 201: @@ -487,6 +570,89 @@ func decodeCreateScriptPolicyResponse(resp *http.Response) (res *ID, _ error) { return res, errors.Wrap(defRes, "error") } +func decodeCreateSubmissionResponse(resp *http.Response) (res *ID, _ error) { + switch resp.StatusCode { + case 201: + // Code 201. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ID + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *ErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &ErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + func decodeGetScriptResponse(resp *http.Response) (res *Script, _ error) { switch resp.StatusCode { case 200: diff --git a/pkg/internal/oas_response_encoders_gen.go b/pkg/internal/oas_response_encoders_gen.go index c7d2b1f..f8a52bd 100644 --- a/pkg/internal/oas_response_encoders_gen.go +++ b/pkg/internal/oas_response_encoders_gen.go @@ -55,6 +55,20 @@ func encodeActionSubmissionValidatedResponse(response *ActionSubmissionValidated return nil } +func encodeCreateMapfixResponse(response *ID, w http.ResponseWriter, span trace.Span) error { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(201) + span.SetStatus(codes.Ok, http.StatusText(201)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil +} + func encodeCreateScriptResponse(response *ID, w http.ResponseWriter, span trace.Span) error { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(201) @@ -83,6 +97,20 @@ func encodeCreateScriptPolicyResponse(response *ID, w http.ResponseWriter, span return nil } +func encodeCreateSubmissionResponse(response *ID, w http.ResponseWriter, span trace.Span) error { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(201) + span.SetStatus(codes.Ok, http.StatusText(201)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil +} + func encodeGetScriptResponse(response *Script, w http.ResponseWriter, span trace.Span) error { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) diff --git a/pkg/internal/oas_router_gen.go b/pkg/internal/oas_router_gen.go index 77e8063..0d71206 100644 --- a/pkg/internal/oas_router_gen.go +++ b/pkg/internal/oas_router_gen.go @@ -61,25 +61,23 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'm': // Prefix: "mapfixes/" + case 'm': // Prefix: "mapfixes" - if l := len("mapfixes/"); len(elem) >= l && elem[0:l] == "mapfixes/" { + if l := len("mapfixes"); len(elem) >= l && elem[0:l] == "mapfixes" { elem = elem[l:] } else { break } - // Param: "MapfixID" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - break + switch r.Method { + case "POST": + s.handleCreateMapfixRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return } switch elem[0] { case '/': // Prefix: "/" @@ -90,13 +88,22 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } + // Param: "MapfixID" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case 's': // Prefix: "status/validator-" + case '/': // Prefix: "/" - if l := len("status/validator-"); len(elem) >= l && elem[0:l] == "status/validator-" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -106,9 +113,89 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'f': // Prefix: "failed" + case 's': // Prefix: "status/validator-" - if l := len("failed"); len(elem) >= l && elem[0:l] == "failed" { + if l := len("status/validator-"); len(elem) >= l && elem[0:l] == "status/validator-" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'f': // Prefix: "failed" + + if l := len("failed"); len(elem) >= l && elem[0:l] == "failed" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixAcceptedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'u': // Prefix: "uploaded" + + if l := len("uploaded"); len(elem) >= l && elem[0:l] == "uploaded" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixUploadedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'v': // Prefix: "validated" + + if l := len("validated"); len(elem) >= l && elem[0:l] == "validated" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixValidatedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + } + + case 'v': // Prefix: "validated-model" + + if l := len("validated-model"); len(elem) >= l && elem[0:l] == "validated-model" { elem = elem[l:] } else { break @@ -118,7 +205,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "POST": - s.handleActionMapfixAcceptedRequest([1]string{ + s.handleUpdateMapfixValidatedModelRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -128,72 +215,6 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'u': // Prefix: "uploaded" - - if l := len("uploaded"); len(elem) >= l && elem[0:l] == "uploaded" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixUploadedRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - case 'v': // Prefix: "validated" - - if l := len("validated"); len(elem) >= l && elem[0:l] == "validated" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionMapfixValidatedRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - } - - case 'v': // Prefix: "validated-model" - - if l := len("validated-model"); len(elem) >= l && elem[0:l] == "validated-model" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleUpdateMapfixValidatedModelRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return } } @@ -302,25 +323,23 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'u': // Prefix: "ubmissions/" + case 'u': // Prefix: "ubmissions" - if l := len("ubmissions/"); len(elem) >= l && elem[0:l] == "ubmissions/" { + if l := len("ubmissions"); len(elem) >= l && elem[0:l] == "ubmissions" { elem = elem[l:] } else { break } - // Param: "SubmissionID" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - break + switch r.Method { + case "POST": + s.handleCreateSubmissionRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return } switch elem[0] { case '/': // Prefix: "/" @@ -331,13 +350,22 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } + // Param: "SubmissionID" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case 's': // Prefix: "status/validator-" + case '/': // Prefix: "/" - if l := len("status/validator-"); len(elem) >= l && elem[0:l] == "status/validator-" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -347,9 +375,89 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'f': // Prefix: "failed" + case 's': // Prefix: "status/validator-" - if l := len("failed"); len(elem) >= l && elem[0:l] == "failed" { + if l := len("status/validator-"); len(elem) >= l && elem[0:l] == "status/validator-" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'f': // Prefix: "failed" + + if l := len("failed"); len(elem) >= l && elem[0:l] == "failed" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionSubmissionAcceptedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'u': // Prefix: "uploaded" + + if l := len("uploaded"); len(elem) >= l && elem[0:l] == "uploaded" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionSubmissionUploadedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'v': // Prefix: "validated" + + if l := len("validated"); len(elem) >= l && elem[0:l] == "validated" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionSubmissionValidatedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + } + + case 'v': // Prefix: "validated-model" + + if l := len("validated-model"); len(elem) >= l && elem[0:l] == "validated-model" { elem = elem[l:] } else { break @@ -359,7 +467,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "POST": - s.handleActionSubmissionAcceptedRequest([1]string{ + s.handleUpdateSubmissionValidatedModelRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -369,72 +477,6 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'u': // Prefix: "uploaded" - - if l := len("uploaded"); len(elem) >= l && elem[0:l] == "uploaded" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionSubmissionUploadedRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - case 'v': // Prefix: "validated" - - if l := len("validated"); len(elem) >= l && elem[0:l] == "validated" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleActionSubmissionValidatedRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return - } - - } - - case 'v': // Prefix: "validated-model" - - if l := len("validated-model"); len(elem) >= l && elem[0:l] == "validated-model" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleUpdateSubmissionValidatedModelRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, "POST") - } - - return } } @@ -537,25 +579,27 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'm': // Prefix: "mapfixes/" + case 'm': // Prefix: "mapfixes" - if l := len("mapfixes/"); len(elem) >= l && elem[0:l] == "mapfixes/" { + if l := len("mapfixes"); len(elem) >= l && elem[0:l] == "mapfixes" { elem = elem[l:] } else { break } - // Param: "MapfixID" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - break + switch method { + case "POST": + r.name = CreateMapfixOperation + r.summary = "Create a mapfix" + r.operationID = "createMapfix" + r.pathPattern = "/mapfixes" + r.args = args + r.count = 0 + return r, true + default: + return + } } switch elem[0] { case '/': // Prefix: "/" @@ -566,13 +610,22 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } + // Param: "MapfixID" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case 's': // Prefix: "status/validator-" + case '/': // Prefix: "/" - if l := len("status/validator-"); len(elem) >= l && elem[0:l] == "status/validator-" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -582,9 +635,95 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'f': // Prefix: "failed" + case 's': // Prefix: "status/validator-" - if l := len("failed"); len(elem) >= l && elem[0:l] == "failed" { + if l := len("status/validator-"); len(elem) >= l && elem[0:l] == "status/validator-" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'f': // Prefix: "failed" + + if l := len("failed"); len(elem) >= l && elem[0:l] == "failed" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixAcceptedOperation + r.summary = "(Internal endpoint) Role Validator changes status from Validating -> Accepted" + r.operationID = "actionMapfixAccepted" + r.pathPattern = "/mapfixes/{MapfixID}/status/validator-failed" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'u': // Prefix: "uploaded" + + if l := len("uploaded"); len(elem) >= l && elem[0:l] == "uploaded" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixUploadedOperation + r.summary = "(Internal endpoint) Role Validator changes status from Uploading -> Uploaded" + r.operationID = "actionMapfixUploaded" + r.pathPattern = "/mapfixes/{MapfixID}/status/validator-uploaded" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'v': // Prefix: "validated" + + if l := len("validated"); len(elem) >= l && elem[0:l] == "validated" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixValidatedOperation + r.summary = "(Internal endpoint) Role Validator changes status from Validating -> Validated" + r.operationID = "actionMapfixValidated" + r.pathPattern = "/mapfixes/{MapfixID}/status/validator-validated" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 'v': // Prefix: "validated-model" + + if l := len("validated-model"); len(elem) >= l && elem[0:l] == "validated-model" { elem = elem[l:] } else { break @@ -594,10 +733,10 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "POST": - r.name = ActionMapfixAcceptedOperation - r.summary = "(Internal endpoint) Role Validator changes status from Validating -> Accepted" - r.operationID = "actionMapfixAccepted" - r.pathPattern = "/mapfixes/{MapfixID}/status/validator-failed" + r.name = UpdateMapfixValidatedModelOperation + r.summary = "Update validated model" + r.operationID = "updateMapfixValidatedModel" + r.pathPattern = "/mapfixes/{MapfixID}/validated-model" r.args = args r.count = 1 return r, true @@ -606,78 +745,6 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'u': // Prefix: "uploaded" - - if l := len("uploaded"); len(elem) >= l && elem[0:l] == "uploaded" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixUploadedOperation - r.summary = "(Internal endpoint) Role Validator changes status from Uploading -> Uploaded" - r.operationID = "actionMapfixUploaded" - r.pathPattern = "/mapfixes/{MapfixID}/status/validator-uploaded" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'v': // Prefix: "validated" - - if l := len("validated"); len(elem) >= l && elem[0:l] == "validated" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionMapfixValidatedOperation - r.summary = "(Internal endpoint) Role Validator changes status from Validating -> Validated" - r.operationID = "actionMapfixValidated" - r.pathPattern = "/mapfixes/{MapfixID}/status/validator-validated" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - case 'v': // Prefix: "validated-model" - - if l := len("validated-model"); len(elem) >= l && elem[0:l] == "validated-model" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = UpdateMapfixValidatedModelOperation - r.summary = "Update validated model" - r.operationID = "updateMapfixValidatedModel" - r.pathPattern = "/mapfixes/{MapfixID}/validated-model" - r.args = args - r.count = 1 - return r, true - default: - return - } } } @@ -808,25 +875,27 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'u': // Prefix: "ubmissions/" + case 'u': // Prefix: "ubmissions" - if l := len("ubmissions/"); len(elem) >= l && elem[0:l] == "ubmissions/" { + if l := len("ubmissions"); len(elem) >= l && elem[0:l] == "ubmissions" { elem = elem[l:] } else { break } - // Param: "SubmissionID" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - break + switch method { + case "POST": + r.name = CreateSubmissionOperation + r.summary = "Create a new submission" + r.operationID = "createSubmission" + r.pathPattern = "/submissions" + r.args = args + r.count = 0 + return r, true + default: + return + } } switch elem[0] { case '/': // Prefix: "/" @@ -837,13 +906,22 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } + // Param: "SubmissionID" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case 's': // Prefix: "status/validator-" + case '/': // Prefix: "/" - if l := len("status/validator-"); len(elem) >= l && elem[0:l] == "status/validator-" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -853,9 +931,95 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'f': // Prefix: "failed" + case 's': // Prefix: "status/validator-" - if l := len("failed"); len(elem) >= l && elem[0:l] == "failed" { + if l := len("status/validator-"); len(elem) >= l && elem[0:l] == "status/validator-" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'f': // Prefix: "failed" + + if l := len("failed"); len(elem) >= l && elem[0:l] == "failed" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionSubmissionAcceptedOperation + r.summary = "(Internal endpoint) Role Validator changes status from Validating -> Accepted" + r.operationID = "actionSubmissionAccepted" + r.pathPattern = "/submissions/{SubmissionID}/status/validator-failed" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'u': // Prefix: "uploaded" + + if l := len("uploaded"); len(elem) >= l && elem[0:l] == "uploaded" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionSubmissionUploadedOperation + r.summary = "(Internal endpoint) Role Validator changes status from Uploading -> Uploaded" + r.operationID = "actionSubmissionUploaded" + r.pathPattern = "/submissions/{SubmissionID}/status/validator-uploaded" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'v': // Prefix: "validated" + + if l := len("validated"); len(elem) >= l && elem[0:l] == "validated" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionSubmissionValidatedOperation + r.summary = "(Internal endpoint) Role Validator changes status from Validating -> Validated" + r.operationID = "actionSubmissionValidated" + r.pathPattern = "/submissions/{SubmissionID}/status/validator-validated" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 'v': // Prefix: "validated-model" + + if l := len("validated-model"); len(elem) >= l && elem[0:l] == "validated-model" { elem = elem[l:] } else { break @@ -865,10 +1029,10 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "POST": - r.name = ActionSubmissionAcceptedOperation - r.summary = "(Internal endpoint) Role Validator changes status from Validating -> Accepted" - r.operationID = "actionSubmissionAccepted" - r.pathPattern = "/submissions/{SubmissionID}/status/validator-failed" + r.name = UpdateSubmissionValidatedModelOperation + r.summary = "Update validated model" + r.operationID = "updateSubmissionValidatedModel" + r.pathPattern = "/submissions/{SubmissionID}/validated-model" r.args = args r.count = 1 return r, true @@ -877,78 +1041,6 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'u': // Prefix: "uploaded" - - if l := len("uploaded"); len(elem) >= l && elem[0:l] == "uploaded" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionSubmissionUploadedOperation - r.summary = "(Internal endpoint) Role Validator changes status from Uploading -> Uploaded" - r.operationID = "actionSubmissionUploaded" - r.pathPattern = "/submissions/{SubmissionID}/status/validator-uploaded" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'v': // Prefix: "validated" - - if l := len("validated"); len(elem) >= l && elem[0:l] == "validated" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ActionSubmissionValidatedOperation - r.summary = "(Internal endpoint) Role Validator changes status from Validating -> Validated" - r.operationID = "actionSubmissionValidated" - r.pathPattern = "/submissions/{SubmissionID}/status/validator-validated" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - case 'v': // Prefix: "validated-model" - - if l := len("validated-model"); len(elem) >= l && elem[0:l] == "validated-model" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = UpdateSubmissionValidatedModelOperation - r.summary = "Update validated model" - r.operationID = "updateSubmissionValidatedModel" - r.pathPattern = "/submissions/{SubmissionID}/validated-model" - r.args = args - r.count = 1 - return r, true - default: - return - } } } diff --git a/pkg/internal/oas_schemas_gen.go b/pkg/internal/oas_schemas_gen.go index 2f06835..86270ec 100644 --- a/pkg/internal/oas_schemas_gen.go +++ b/pkg/internal/oas_schemas_gen.go @@ -96,6 +96,98 @@ func (s *ID) SetID(val int64) { s.ID = val } +// Ref: #/components/schemas/MapfixCreate +type MapfixCreate struct { + OperationID int32 `json:"OperationID"` + AssetOwner int64 `json:"AssetOwner"` + DisplayName string `json:"DisplayName"` + Creator string `json:"Creator"` + GameID int32 `json:"GameID"` + AssetID int64 `json:"AssetID"` + AssetVersion int64 `json:"AssetVersion"` + TargetAssetID int64 `json:"TargetAssetID"` +} + +// GetOperationID returns the value of OperationID. +func (s *MapfixCreate) GetOperationID() int32 { + return s.OperationID +} + +// GetAssetOwner returns the value of AssetOwner. +func (s *MapfixCreate) GetAssetOwner() int64 { + return s.AssetOwner +} + +// 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. +func (s *MapfixCreate) GetAssetID() int64 { + return s.AssetID +} + +// GetAssetVersion returns the value of AssetVersion. +func (s *MapfixCreate) GetAssetVersion() int64 { + return s.AssetVersion +} + +// GetTargetAssetID returns the value of TargetAssetID. +func (s *MapfixCreate) GetTargetAssetID() int64 { + return s.TargetAssetID +} + +// SetOperationID sets the value of OperationID. +func (s *MapfixCreate) SetOperationID(val int32) { + s.OperationID = val +} + +// SetAssetOwner sets the value of AssetOwner. +func (s *MapfixCreate) SetAssetOwner(val int64) { + s.AssetOwner = val +} + +// 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. +func (s *MapfixCreate) SetAssetID(val int64) { + s.AssetID = val +} + +// SetAssetVersion sets the value of AssetVersion. +func (s *MapfixCreate) SetAssetVersion(val int64) { + s.AssetVersion = val +} + +// SetTargetAssetID sets the value of TargetAssetID. +func (s *MapfixCreate) SetTargetAssetID(val int64) { + s.TargetAssetID = val +} + // NewOptInt32 returns new OptInt32 with value set to v. func NewOptInt32(v int32) OptInt32 { return OptInt32{ @@ -437,6 +529,87 @@ func (s *ScriptPolicyCreate) SetPolicy(val int32) { s.Policy = val } +// Ref: #/components/schemas/SubmissionCreate +type SubmissionCreate struct { + OperationID int32 `json:"OperationID"` + AssetOwner int64 `json:"AssetOwner"` + DisplayName string `json:"DisplayName"` + Creator string `json:"Creator"` + GameID int32 `json:"GameID"` + AssetID int64 `json:"AssetID"` + AssetVersion int64 `json:"AssetVersion"` +} + +// GetOperationID returns the value of OperationID. +func (s *SubmissionCreate) GetOperationID() int32 { + return s.OperationID +} + +// GetAssetOwner returns the value of AssetOwner. +func (s *SubmissionCreate) GetAssetOwner() int64 { + return s.AssetOwner +} + +// 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. +func (s *SubmissionCreate) GetAssetID() int64 { + return s.AssetID +} + +// GetAssetVersion returns the value of AssetVersion. +func (s *SubmissionCreate) GetAssetVersion() int64 { + return s.AssetVersion +} + +// SetOperationID sets the value of OperationID. +func (s *SubmissionCreate) SetOperationID(val int32) { + s.OperationID = val +} + +// SetAssetOwner sets the value of AssetOwner. +func (s *SubmissionCreate) SetAssetOwner(val int64) { + s.AssetOwner = val +} + +// 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. +func (s *SubmissionCreate) SetAssetID(val int64) { + s.AssetID = val +} + +// SetAssetVersion sets the value of AssetVersion. +func (s *SubmissionCreate) SetAssetVersion(val int64) { + s.AssetVersion = val +} + // UpdateMapfixValidatedModelNoContent is response for UpdateMapfixValidatedModel operation. type UpdateMapfixValidatedModelNoContent struct{} diff --git a/pkg/internal/oas_server_gen.go b/pkg/internal/oas_server_gen.go index 846550e..0ca4100 100644 --- a/pkg/internal/oas_server_gen.go +++ b/pkg/internal/oas_server_gen.go @@ -44,6 +44,12 @@ type Handler interface { // // POST /submissions/{SubmissionID}/status/validator-validated ActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) error + // CreateMapfix implements createMapfix operation. + // + // Create a mapfix. + // + // POST /mapfixes + CreateMapfix(ctx context.Context, req *MapfixCreate) (*ID, error) // CreateScript implements createScript operation. // // Create a new script. @@ -56,6 +62,12 @@ type Handler interface { // // POST /script-policy CreateScriptPolicy(ctx context.Context, req *ScriptPolicyCreate) (*ID, error) + // CreateSubmission implements createSubmission operation. + // + // Create a new submission. + // + // POST /submissions + CreateSubmission(ctx context.Context, req *SubmissionCreate) (*ID, error) // GetScript implements getScript operation. // // Get the specified script by ID. diff --git a/pkg/internal/oas_unimplemented_gen.go b/pkg/internal/oas_unimplemented_gen.go index 1a08c02..c4ac65a 100644 --- a/pkg/internal/oas_unimplemented_gen.go +++ b/pkg/internal/oas_unimplemented_gen.go @@ -67,6 +67,15 @@ func (UnimplementedHandler) ActionSubmissionValidated(ctx context.Context, param return ht.ErrNotImplemented } +// CreateMapfix implements createMapfix operation. +// +// Create a mapfix. +// +// POST /mapfixes +func (UnimplementedHandler) CreateMapfix(ctx context.Context, req *MapfixCreate) (r *ID, _ error) { + return r, ht.ErrNotImplemented +} + // CreateScript implements createScript operation. // // Create a new script. @@ -85,6 +94,15 @@ func (UnimplementedHandler) CreateScriptPolicy(ctx context.Context, req *ScriptP return r, ht.ErrNotImplemented } +// CreateSubmission implements createSubmission operation. +// +// Create a new submission. +// +// POST /submissions +func (UnimplementedHandler) CreateSubmission(ctx context.Context, req *SubmissionCreate) (r *ID, _ error) { + return r, ht.ErrNotImplemented +} + // GetScript implements getScript operation. // // Get the specified script by ID. diff --git a/pkg/internal/oas_validators_gen.go b/pkg/internal/oas_validators_gen.go index 973f07b..733e7f4 100644 --- a/pkg/internal/oas_validators_gen.go +++ b/pkg/internal/oas_validators_gen.go @@ -8,6 +8,56 @@ import ( "github.com/ogen-go/ogen/validate" ) +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 *Script) Validate() error { if s == nil { return validate.ErrNilPointer @@ -157,3 +207,53 @@ func (s *ScriptPolicy) Validate() error { } 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 +}