diff --git a/Cargo.lock b/Cargo.lock index ad8822b..005dc99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -54,12 +54,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - [[package]] name = "arrayref" version = "0.3.9" @@ -108,17 +102,6 @@ dependencies = [ "url", ] -[[package]] -name = "async-trait" -version = "0.1.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "atomic-waker" version = "1.1.2" @@ -131,51 +114,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "axum" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" -dependencies = [ - "axum-core", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", -] - [[package]] name = "backtrace" version = "0.3.75" @@ -448,12 +386,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - [[package]] name = "encoding_rs" version = "0.8.35" @@ -730,12 +662,6 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyper" version = "1.6.0" @@ -749,7 +675,6 @@ dependencies = [ "http", "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -773,19 +698,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "hyper-timeout" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" -dependencies = [ - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -985,15 +897,6 @@ dependencies = [ "serde", ] -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.15" @@ -1115,20 +1018,13 @@ dependencies = [ "rbx_dom_weak", "rbx_reflection_database", "rbx_xml", - "rust-grpc", "serde", "serde_json", "siphasher", + "submissions-api", "tokio", - "tonic", ] -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - [[package]] name = "memchr" version = "2.7.5" @@ -1436,39 +1332,6 @@ dependencies = [ "syn", ] -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "prost-types" -version = "0.13.5-serde3" -source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "e42128b6e3a6655aa5f72ac65a33848a512eb9b23e98986adc4bbe6559ea88ce" -dependencies = [ - "prost", - "serde", -] - [[package]] name = "quote" version = "1.0.40" @@ -1727,18 +1590,6 @@ dependencies = [ "serde", ] -[[package]] -name = "rust-grpc" -version = "1.3.0" -source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" -checksum = "23dc6efbef932befc29c64b9484be3686c97217f6197a91c2028c2eeee022f46" -dependencies = [ - "prost", - "prost-types", - "serde", - "tonic", -] - [[package]] name = "rustc-demangle" version = "0.1.25" @@ -2237,17 +2088,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" version = "0.7.15" @@ -2282,35 +2122,6 @@ dependencies = [ "webpki-roots 0.26.11", ] -[[package]] -name = "tonic" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9" -dependencies = [ - "async-trait", - "axum", - "base64 0.22.1", - "bytes", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "prost", - "socket2", - "tokio", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower" version = "0.5.2" @@ -2319,15 +2130,11 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "indexmap", "pin-project-lite", - "slab", "sync_wrapper", "tokio", - "tokio-util", "tower-layer", "tower-service", - "tracing", ] [[package]] diff --git a/generate.go b/generate.go index a27289b..6a2f0b5 100644 --- a/generate.go +++ b/generate.go @@ -1,3 +1,4 @@ package main //go:generate go run github.com/ogen-go/ogen/cmd/ogen@latest --target pkg/api --clean openapi.yaml +//go:generate go run github.com/ogen-go/ogen/cmd/ogen@latest --target pkg/internal --clean openapi-internal.yaml diff --git a/go.mod b/go.mod index 1b5d891..46531c0 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22 toolchain go1.23.3 require ( - git.itzana.me/strafesnet/go-grpc v0.0.0-20250719033306-150dea07cf00 + git.itzana.me/strafesnet/go-grpc v0.0.0-20241129081229-9e166b3d11f7 git.itzana.me/strafesnet/utils v0.0.0-20220716194944-d8ca164052f9 github.com/dchest/siphash v1.2.3 github.com/go-faster/errors v0.7.1 @@ -53,7 +53,7 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/segmentio/asm v1.2.0 // indirect - go.uber.org/multierr v1.11.0 // indirect + go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 // indirect golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc // indirect golang.org/x/net v0.25.0 // indirect diff --git a/go.sum b/go.sum index 003bde8..18afd3c 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -git.itzana.me/strafesnet/go-grpc v0.0.0-20250719033306-150dea07cf00 h1:L9HiJzMrXCKZhZz+RyUr5RXdMcGQMU85aap6L+QQDZ0= -git.itzana.me/strafesnet/go-grpc v0.0.0-20250719033306-150dea07cf00/go.mod h1:X7XTRUScRkBWq8q8bplbeso105RPDlnY7J6Wy1IwBMs= +git.itzana.me/strafesnet/go-grpc v0.0.0-20241129081229-9e166b3d11f7 h1:5XzWd3ZZjSw1M60IfHuILty2vRPBYiqM0FZ+E7uHCi8= +git.itzana.me/strafesnet/go-grpc v0.0.0-20241129081229-9e166b3d11f7/go.mod h1:X7XTRUScRkBWq8q8bplbeso105RPDlnY7J6Wy1IwBMs= git.itzana.me/strafesnet/utils v0.0.0-20220716194944-d8ca164052f9 h1:7lU6jyR7S7Rhh1dnUp7GyIRHUTBXZagw8F4n4hOyxLw= git.itzana.me/strafesnet/utils v0.0.0-20220716194944-d8ca164052f9/go.mod h1:uyYerSieEt4v0MJCdPLppG0LtJ4Yj035vuTetWGsxjY= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= diff --git a/openapi-internal.yaml b/openapi-internal.yaml new file mode 100644 index 0000000..df43188 --- /dev/null +++ b/openapi-internal.yaml @@ -0,0 +1,953 @@ +openapi: 3.1.0 +info: + title: StrafesNET Internal - OpenAPI 3.1 + description: Internal operations inaccessible from the public internet. + version: 0.1.0 +tags: + - name: Mapfixes + description: Mapfix operations + - name: Operations + description: Long-running operations + - name: Scripts + description: Script operations + - name: ScriptPolicy + description: Script policy operations + - name: Submissions + description: Submission operations +paths: + /mapfixes: + post: + summary: Create a mapfix + operationId: createMapfix + tags: + - Mapfixes + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/MapfixCreate' + responses: + "201": + description: Successful response + content: + application/json: + schema: + $ref: "#/components/schemas/MapfixID" + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /mapfixes/{MapfixID}/validated-model: + post: + summary: Update validated model + operationId: updateMapfixValidatedModel + tags: + - Mapfixes + parameters: + - $ref: '#/components/parameters/MapfixID' + - name: ValidatedModelID + in: query + required: true + schema: + type: integer + format: int64 + minimum: 0 + - name: ValidatedModelVersion + in: query + required: true + schema: + type: integer + format: int64 + minimum: 0 + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /mapfixes/{MapfixID}/error: + post: + summary: Validator posts an error to the audit log + operationId: createMapfixAuditError + tags: + - Mapfixes + parameters: + - $ref: '#/components/parameters/MapfixID' + - name: ErrorMessage + in: query + required: true + schema: + type: string + minLength: 0 + maxLength: 4096 + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /mapfixes/{MapfixID}/checklist: + post: + summary: Validator posts a checklist to the audit log + operationId: createMapfixAuditCheckList + tags: + - Mapfixes + parameters: + - $ref: '#/components/parameters/MapfixID' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CheckList' + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /mapfixes/{MapfixID}/status/validator-submitted: + post: + summary: (Internal endpoint) Role Validator changes status from Submitting -> Submitted + operationId: actionMapfixSubmitted + tags: + - Mapfixes + parameters: + - $ref: '#/components/parameters/MapfixID' + - name: ModelVersion + in: query + required: true + schema: + type: integer + format: int64 + minimum: 0 + - name: DisplayName + in: query + required: true + schema: + type: string + maxLength: 128 + - name: Creator + in: query + required: true + schema: + type: string + maxLength: 128 + - name: GameID + in: query + required: true + schema: + type: integer + format: int32 + minimum: 0 + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /mapfixes/{MapfixID}/status/validator-request-changes: + post: + summary: (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested + operationId: actionMapfixRequestChanges + tags: + - Mapfixes + parameters: + - $ref: '#/components/parameters/MapfixID' + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /mapfixes/{MapfixID}/status/validator-validated: + post: + summary: (Internal endpoint) Role Validator changes status from Validating -> Validated + operationId: actionMapfixValidated + tags: + - Mapfixes + parameters: + - $ref: '#/components/parameters/MapfixID' + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /mapfixes/{MapfixID}/status/validator-failed: + post: + summary: (Internal endpoint) Role Validator changes status from Validating -> Accepted + operationId: actionMapfixAccepted + tags: + - Mapfixes + parameters: + - $ref: '#/components/parameters/MapfixID' + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /mapfixes/{MapfixID}/status/validator-uploaded: + post: + summary: (Internal endpoint) Role Validator changes status from Uploading -> Uploaded + operationId: actionMapfixUploaded + tags: + - Mapfixes + parameters: + - $ref: '#/components/parameters/MapfixID' + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /operations/{OperationID}/status/operation-failed: + post: + summary: (Internal endpoint) Fail an operation and write a StatusMessage + operationId: actionOperationFailed + tags: + - Operations + parameters: + - $ref: '#/components/parameters/OperationID' + - name: StatusMessage + in: query + required: true + schema: + type: string + minLength: 0 + maxLength: 4096 + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /submissions: + post: + summary: Create a new submission + operationId: createSubmission + tags: + - Submissions + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SubmissionCreate' + responses: + "201": + description: Successful response + content: + application/json: + schema: + $ref: "#/components/schemas/SubmissionID" + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /submissions/{SubmissionID}/validated-model: + post: + summary: Update validated model + operationId: updateSubmissionValidatedModel + tags: + - Submissions + parameters: + - $ref: '#/components/parameters/SubmissionID' + - name: ValidatedModelID + in: query + required: true + schema: + type: integer + format: int64 + minimum: 0 + - name: ValidatedModelVersion + in: query + required: true + schema: + type: integer + format: int64 + minimum: 0 + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /submissions/{SubmissionID}/error: + post: + summary: Validator posts an error to the audit log + operationId: createSubmissionAuditError + tags: + - Submissions + parameters: + - $ref: '#/components/parameters/SubmissionID' + - name: ErrorMessage + in: query + required: true + schema: + type: string + minLength: 0 + maxLength: 4096 + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /submissions/{SubmissionID}/checklist: + post: + summary: Validator posts a checklist to the audit log + operationId: createSubmissionAuditCheckList + tags: + - Submissions + parameters: + - $ref: '#/components/parameters/SubmissionID' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CheckList' + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /submissions/{SubmissionID}/status/validator-submitted: + post: + summary: (Internal endpoint) Role Validator changes status from Submitting -> Submitted + operationId: actionSubmissionSubmitted + tags: + - Submissions + parameters: + - $ref: '#/components/parameters/SubmissionID' + - name: ModelVersion + in: query + required: true + schema: + type: integer + format: int64 + minimum: 0 + - name: DisplayName + in: query + required: true + schema: + type: string + maxLength: 128 + - name: Creator + in: query + required: true + schema: + type: string + maxLength: 128 + - name: GameID + in: query + required: true + schema: + type: integer + format: int32 + minimum: 0 + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /submissions/{SubmissionID}/status/validator-request-changes: + post: + summary: (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested + operationId: actionSubmissionRequestChanges + tags: + - Submissions + parameters: + - $ref: '#/components/parameters/SubmissionID' + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /submissions/{SubmissionID}/status/validator-validated: + post: + summary: (Internal endpoint) Role Validator changes status from Validating -> Validated + operationId: actionSubmissionValidated + tags: + - Submissions + parameters: + - $ref: '#/components/parameters/SubmissionID' + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /submissions/{SubmissionID}/status/validator-failed: + post: + summary: (Internal endpoint) Role Validator changes status from Validating -> Accepted + operationId: actionSubmissionAccepted + tags: + - Submissions + parameters: + - $ref: '#/components/parameters/SubmissionID' + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /submissions/{SubmissionID}/status/validator-uploaded: + post: + summary: (Internal endpoint) Role Validator changes status from Uploading -> Uploaded + operationId: actionSubmissionUploaded + tags: + - Submissions + parameters: + - $ref: '#/components/parameters/SubmissionID' + - name: UploadedAssetID + in: query + required: true + schema: + type: integer + format: int64 + minimum: 0 + responses: + "204": + description: Successful response + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /script-policy: + get: + summary: Get list of script policies + operationId: listScriptPolicy + tags: + - ScriptPolicy + parameters: + - $ref: "#/components/parameters/Page" + - $ref: "#/components/parameters/Limit" + - name: FromScriptHash + in: query + schema: + type: string + minLength: 16 + maxLength: 16 + - name: ToScriptID + in: query + schema: + type: integer + format: int64 + minimum: 0 + - name: Policy + in: query + schema: + type: integer + format: int32 + minimum: 0 + responses: + "200": + description: Successful response + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/ScriptPolicy" + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + post: + summary: Create a new script policy + operationId: createScriptPolicy + tags: + - ScriptPolicy + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ScriptPolicyCreate' + responses: + "201": + description: Successful response + content: + application/json: + schema: + $ref: "#/components/schemas/ScriptPolicyID" + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /scripts: + get: + summary: Get list of scripts + operationId: listScripts + tags: + - Scripts + parameters: + - $ref: "#/components/parameters/Page" + - $ref: "#/components/parameters/Limit" + - name: Hash + in: query + schema: + type: string + minLength: 16 + maxLength: 16 + - name: Name + in: query + schema: + type: string + maxLength: 128 + - name: Source + in: query + schema: + type: string + maxLength: 1048576 + - name: ResourceType + in: query + schema: + type: integer + format: int32 + minimum: 0 + - name: ResourceID + in: query + schema: + type: integer + format: int64 + minimum: 0 + responses: + "200": + description: Successful response + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Script" + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + post: + summary: Create a new script + operationId: createScript + tags: + - Scripts + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ScriptCreate' + responses: + "201": + description: Successful response + content: + application/json: + schema: + $ref: "#/components/schemas/ScriptID" + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /scripts/{ScriptID}: + get: + summary: Get the specified script by ID + operationId: getScript + tags: + - Scripts + parameters: + - $ref: '#/components/parameters/ScriptID' + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: "#/components/schemas/Script" + default: + description: General Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" +components: + parameters: + MapfixID: + name: MapfixID + in: path + required: true + description: The unique identifier for a submission. + schema: + type: integer + format: int64 + minimum: 0 + OperationID: + name: OperationID + in: path + required: true + description: The unique identifier for a long-running operation. + schema: + type: integer + format: int32 + minimum: 0 + SubmissionID: + name: SubmissionID + in: path + required: true + description: The unique identifier for a submission. + schema: + type: integer + format: int64 + minimum: 0 + ScriptID: + name: ScriptID + in: path + required: true + description: The unique identifier for a script. + schema: + type: integer + format: int64 + minimum: 0 + Page: + name: Page + in: query + required: true + schema: + type: integer + format: int32 + minimum: 1 + Limit: + name: Limit + in: query + required: true + schema: + type: integer + format: int32 + minimum: 1 + maximum: 100 + schemas: + MapfixID: + required: + - MapfixID + type: object + properties: + MapfixID: + type: integer + format: int64 + minimum: 0 + SubmissionID: + required: + - SubmissionID + type: object + properties: + SubmissionID: + type: integer + format: int64 + minimum: 0 + ScriptID: + required: + - ScriptID + type: object + properties: + ScriptID: + type: integer + format: int64 + minimum: 0 + ScriptPolicyID: + required: + - ScriptPolicyID + type: object + properties: + ScriptPolicyID: + type: integer + format: int64 + minimum: 0 + MapfixCreate: + required: + - OperationID + - AssetOwner + - DisplayName + - Creator + - GameID + - AssetID + - AssetVersion + - TargetAssetID + - Description + type: object + properties: + OperationID: + type: integer + format: int32 + minimum: 0 + AssetOwner: + type: integer + format: int64 + minimum: 0 + DisplayName: + type: string + maxLength: 128 + Creator: + type: string + maxLength: 128 + GameID: + type: integer + format: int32 + minimum: 0 + AssetID: + type: integer + format: int64 + minimum: 0 + AssetVersion: + type: integer + format: int64 + minimum: 0 + TargetAssetID: + type: integer + format: int64 + minimum: 0 + Description: + type: string + maxLength: 256 + SubmissionCreate: + required: + - OperationID + - AssetOwner + - DisplayName + - Creator + - GameID + - AssetID + - AssetVersion + - Status + - Roles + type: object + properties: + OperationID: + type: integer + format: int32 + minimum: 0 + AssetOwner: + type: integer + format: int64 + minimum: 0 + DisplayName: + type: string + maxLength: 128 + Creator: + type: string + maxLength: 128 + GameID: + type: integer + format: int32 + minimum: 0 + AssetID: + type: integer + format: int64 + minimum: 0 + AssetVersion: + type: integer + format: int64 + minimum: 0 + Status: + type: integer + format: uint32 + minimum: 0 + maximum: 9 + Roles: + type: integer + format: uint32 + Script: + required: + - ID + - Name + - Hash + - Source + - ResourceType + - ResourceID + type: object + properties: + ID: + type: integer + format: int64 + minimum: 0 + Name: + type: string + maxLength: 128 + Hash: + type: string + minLength: 16 + maxLength: 16 + Source: + type: string + maxLength: 1048576 + ResourceType: + type: integer + format: int32 + minimum: 0 + ResourceID: + type: integer + format: int64 + minimum: 0 + ScriptCreate: + required: + - Name + - Source + - ResourceType +# - ResourceID + type: object + properties: + Name: + type: string + maxLength: 128 + Source: + type: string + maxLength: 1048576 + ResourceType: + type: integer + format: int32 + minimum: 0 + ResourceID: + type: integer + format: int64 + minimum: 0 + ScriptPolicy: + required: + - ID + - FromScriptHash + - ToScriptID + - Policy + type: object + properties: + ID: + type: integer + format: int64 + minimum: 0 + FromScriptHash: + type: string + minLength: 16 + maxLength: 16 + ToScriptID: + type: integer + format: int64 + minimum: 0 + Policy: + type: integer + format: int32 + minimum: 0 + ScriptPolicyCreate: + required: + - FromScriptID + - ToScriptID + - Policy + type: object + properties: + FromScriptID: + type: integer + format: int64 + minimum: 0 + ToScriptID: + type: integer + format: int64 + minimum: 0 + Policy: + type: integer + format: int32 + minimum: 0 + Check: + required: + - Name + - Summary + - Passed + type: object + properties: + Name: + type: string + maxLength: 128 + Summary: + type: string + maxLength: 4096 + Passed: + type: boolean + CheckList: + type: array + items: + $ref: "#/components/schemas/Check" + Error: + description: Represents error object + type: object + properties: + code: + type: integer + format: int64 + minimum: 0 + message: + type: string + required: + - code + - message diff --git a/pkg/cmds/serve.go b/pkg/cmds/serve.go index 274e2fc..4de78a8 100644 --- a/pkg/cmds/serve.go +++ b/pkg/cmds/serve.go @@ -2,19 +2,18 @@ package cmds import ( "fmt" - "net" "net/http" "git.itzana.me/strafesnet/go-grpc/auth" "git.itzana.me/strafesnet/go-grpc/maps" "git.itzana.me/strafesnet/go-grpc/users" - "git.itzana.me/strafesnet/go-grpc/validator" "git.itzana.me/strafesnet/maps-service/pkg/api" "git.itzana.me/strafesnet/maps-service/pkg/datastore/gormstore" + internal "git.itzana.me/strafesnet/maps-service/pkg/internal" "git.itzana.me/strafesnet/maps-service/pkg/roblox" - "git.itzana.me/strafesnet/maps-service/pkg/service" - "git.itzana.me/strafesnet/maps-service/pkg/validator_controller" "git.itzana.me/strafesnet/maps-service/pkg/web_api" + "git.itzana.me/strafesnet/maps-service/pkg/service" + "git.itzana.me/strafesnet/maps-service/pkg/service_internal" "github.com/nats-io/nats.go" log "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" @@ -160,31 +159,18 @@ func serve(ctx *cli.Context) error { log.WithError(err).Fatal("failed to initialize api server") } - grpcServer := grpc.NewServer() + svc_internal := service_internal.NewService(&svc_inner) - mapfix_controller := validator_controller.NewMapfixesController(&svc_inner) - operation_controller := validator_controller.NewOperationsController(&svc_inner) - script_controller := validator_controller.NewScriptsController(&svc_inner) - script_policy_controller := validator_controller.NewScriptPolicyController(&svc_inner) - submission_controller := validator_controller.NewSubmissionsController(&svc_inner) - - validator.RegisterValidatorMapfixServiceServer(grpcServer,&mapfix_controller) - validator.RegisterValidatorOperationServiceServer(grpcServer,&operation_controller) - validator.RegisterValidatorScriptServiceServer(grpcServer,&script_controller) - validator.RegisterValidatorScriptPolicyServiceServer(grpcServer,&script_policy_controller) - validator.RegisterValidatorSubmissionServiceServer(grpcServer,&submission_controller) - - port := ctx.Int("port-internal") - lis, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) + srv_internal, err := internal.NewServer(&svc_internal, internal.WithPathPrefix("/v1")) if err != nil { - log.WithField("error", err).Fatalln("failed to net.Listen") + log.WithError(err).Fatal("failed to initialize api server") } // Channel to collect errors errChan := make(chan error, 2) // First server go func(errChan chan error) { - errChan <- grpcServer.Serve(lis) + errChan <- http.ListenAndServe(fmt.Sprintf(":%d", ctx.Int("port-internal")), srv_internal) }(errChan) // Second server diff --git a/pkg/internal/oas_cfg_gen.go b/pkg/internal/oas_cfg_gen.go new file mode 100644 index 0000000..fc3ff34 --- /dev/null +++ b/pkg/internal/oas_cfg_gen.go @@ -0,0 +1,283 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "net/http" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/trace" + + ht "github.com/ogen-go/ogen/http" + "github.com/ogen-go/ogen/middleware" + "github.com/ogen-go/ogen/ogenerrors" + "github.com/ogen-go/ogen/otelogen" +) + +var ( + // Allocate option closure once. + clientSpanKind = trace.WithSpanKind(trace.SpanKindClient) + // Allocate option closure once. + serverSpanKind = trace.WithSpanKind(trace.SpanKindServer) +) + +type ( + optionFunc[C any] func(*C) + otelOptionFunc func(*otelConfig) +) + +type otelConfig struct { + TracerProvider trace.TracerProvider + Tracer trace.Tracer + MeterProvider metric.MeterProvider + Meter metric.Meter +} + +func (cfg *otelConfig) initOTEL() { + if cfg.TracerProvider == nil { + cfg.TracerProvider = otel.GetTracerProvider() + } + if cfg.MeterProvider == nil { + cfg.MeterProvider = otel.GetMeterProvider() + } + cfg.Tracer = cfg.TracerProvider.Tracer(otelogen.Name, + trace.WithInstrumentationVersion(otelogen.SemVersion()), + ) + cfg.Meter = cfg.MeterProvider.Meter(otelogen.Name, + metric.WithInstrumentationVersion(otelogen.SemVersion()), + ) +} + +// ErrorHandler is error handler. +type ErrorHandler = ogenerrors.ErrorHandler + +type serverConfig struct { + otelConfig + NotFound http.HandlerFunc + MethodNotAllowed func(w http.ResponseWriter, r *http.Request, allowed string) + ErrorHandler ErrorHandler + Prefix string + Middleware Middleware + MaxMultipartMemory int64 +} + +// ServerOption is server config option. +type ServerOption interface { + applyServer(*serverConfig) +} + +var _ ServerOption = (optionFunc[serverConfig])(nil) + +func (o optionFunc[C]) applyServer(c *C) { + o(c) +} + +var _ ServerOption = (otelOptionFunc)(nil) + +func (o otelOptionFunc) applyServer(c *serverConfig) { + o(&c.otelConfig) +} + +func newServerConfig(opts ...ServerOption) serverConfig { + cfg := serverConfig{ + NotFound: http.NotFound, + MethodNotAllowed: func(w http.ResponseWriter, r *http.Request, allowed string) { + status := http.StatusMethodNotAllowed + if r.Method == "OPTIONS" { + w.Header().Set("Access-Control-Allow-Methods", allowed) + w.Header().Set("Access-Control-Allow-Headers", "Content-Type") + status = http.StatusNoContent + } else { + w.Header().Set("Allow", allowed) + } + w.WriteHeader(status) + }, + ErrorHandler: ogenerrors.DefaultErrorHandler, + Middleware: nil, + MaxMultipartMemory: 32 << 20, // 32 MB + } + for _, opt := range opts { + opt.applyServer(&cfg) + } + cfg.initOTEL() + return cfg +} + +type baseServer struct { + cfg serverConfig + requests metric.Int64Counter + errors metric.Int64Counter + duration metric.Float64Histogram +} + +func (s baseServer) notFound(w http.ResponseWriter, r *http.Request) { + s.cfg.NotFound(w, r) +} + +func (s baseServer) notAllowed(w http.ResponseWriter, r *http.Request, allowed string) { + s.cfg.MethodNotAllowed(w, r, allowed) +} + +func (cfg serverConfig) baseServer() (s baseServer, err error) { + s = baseServer{cfg: cfg} + if s.requests, err = otelogen.ServerRequestCountCounter(s.cfg.Meter); err != nil { + return s, err + } + if s.errors, err = otelogen.ServerErrorsCountCounter(s.cfg.Meter); err != nil { + return s, err + } + if s.duration, err = otelogen.ServerDurationHistogram(s.cfg.Meter); err != nil { + return s, err + } + return s, nil +} + +type clientConfig struct { + otelConfig + Client ht.Client +} + +// ClientOption is client config option. +type ClientOption interface { + applyClient(*clientConfig) +} + +var _ ClientOption = (optionFunc[clientConfig])(nil) + +func (o optionFunc[C]) applyClient(c *C) { + o(c) +} + +var _ ClientOption = (otelOptionFunc)(nil) + +func (o otelOptionFunc) applyClient(c *clientConfig) { + o(&c.otelConfig) +} + +func newClientConfig(opts ...ClientOption) clientConfig { + cfg := clientConfig{ + Client: http.DefaultClient, + } + for _, opt := range opts { + opt.applyClient(&cfg) + } + cfg.initOTEL() + return cfg +} + +type baseClient struct { + cfg clientConfig + requests metric.Int64Counter + errors metric.Int64Counter + duration metric.Float64Histogram +} + +func (cfg clientConfig) baseClient() (c baseClient, err error) { + c = baseClient{cfg: cfg} + if c.requests, err = otelogen.ClientRequestCountCounter(c.cfg.Meter); err != nil { + return c, err + } + if c.errors, err = otelogen.ClientErrorsCountCounter(c.cfg.Meter); err != nil { + return c, err + } + if c.duration, err = otelogen.ClientDurationHistogram(c.cfg.Meter); err != nil { + return c, err + } + return c, nil +} + +// Option is config option. +type Option interface { + ServerOption + ClientOption +} + +// WithTracerProvider specifies a tracer provider to use for creating a tracer. +// +// If none is specified, the global provider is used. +func WithTracerProvider(provider trace.TracerProvider) Option { + return otelOptionFunc(func(cfg *otelConfig) { + if provider != nil { + cfg.TracerProvider = provider + } + }) +} + +// WithMeterProvider specifies a meter provider to use for creating a meter. +// +// If none is specified, the otel.GetMeterProvider() is used. +func WithMeterProvider(provider metric.MeterProvider) Option { + return otelOptionFunc(func(cfg *otelConfig) { + if provider != nil { + cfg.MeterProvider = provider + } + }) +} + +// WithClient specifies http client to use. +func WithClient(client ht.Client) ClientOption { + return optionFunc[clientConfig](func(cfg *clientConfig) { + if client != nil { + cfg.Client = client + } + }) +} + +// WithNotFound specifies Not Found handler to use. +func WithNotFound(notFound http.HandlerFunc) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + if notFound != nil { + cfg.NotFound = notFound + } + }) +} + +// WithMethodNotAllowed specifies Method Not Allowed handler to use. +func WithMethodNotAllowed(methodNotAllowed func(w http.ResponseWriter, r *http.Request, allowed string)) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + if methodNotAllowed != nil { + cfg.MethodNotAllowed = methodNotAllowed + } + }) +} + +// WithErrorHandler specifies error handler to use. +func WithErrorHandler(h ErrorHandler) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + if h != nil { + cfg.ErrorHandler = h + } + }) +} + +// WithPathPrefix specifies server path prefix. +func WithPathPrefix(prefix string) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + cfg.Prefix = prefix + }) +} + +// WithMiddleware specifies middlewares to use. +func WithMiddleware(m ...Middleware) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + switch len(m) { + case 0: + cfg.Middleware = nil + case 1: + cfg.Middleware = m[0] + default: + cfg.Middleware = middleware.ChainMiddlewares(m...) + } + }) +} + +// WithMaxMultipartMemory specifies limit of memory for storing file parts. +// File parts which can't be stored in memory will be stored on disk in temporary files. +func WithMaxMultipartMemory(max int64) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + if max > 0 { + cfg.MaxMultipartMemory = max + } + }) +} diff --git a/pkg/internal/oas_client_gen.go b/pkg/internal/oas_client_gen.go new file mode 100644 index 0000000..ba9a38c --- /dev/null +++ b/pkg/internal/oas_client_gen.go @@ -0,0 +1,2765 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "context" + "net/url" + "strings" + "time" + + "github.com/go-faster/errors" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/metric" + semconv "go.opentelemetry.io/otel/semconv/v1.26.0" + "go.opentelemetry.io/otel/trace" + + "github.com/ogen-go/ogen/conv" + ht "github.com/ogen-go/ogen/http" + "github.com/ogen-go/ogen/otelogen" + "github.com/ogen-go/ogen/uri" +) + +func trimTrailingSlashes(u *url.URL) { + u.Path = strings.TrimRight(u.Path, "/") + u.RawPath = strings.TrimRight(u.RawPath, "/") +} + +// Invoker invokes operations described by OpenAPI v3 specification. +type Invoker interface { + // ActionMapfixAccepted invokes actionMapfixAccepted operation. + // + // (Internal endpoint) Role Validator changes status from Validating -> Accepted. + // + // POST /mapfixes/{MapfixID}/status/validator-failed + ActionMapfixAccepted(ctx context.Context, params ActionMapfixAcceptedParams) error + // ActionMapfixRequestChanges invokes actionMapfixRequestChanges operation. + // + // (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested. + // + // POST /mapfixes/{MapfixID}/status/validator-request-changes + ActionMapfixRequestChanges(ctx context.Context, params ActionMapfixRequestChangesParams) error + // ActionMapfixSubmitted invokes actionMapfixSubmitted operation. + // + // (Internal endpoint) Role Validator changes status from Submitting -> Submitted. + // + // POST /mapfixes/{MapfixID}/status/validator-submitted + ActionMapfixSubmitted(ctx context.Context, params ActionMapfixSubmittedParams) error + // ActionMapfixUploaded invokes actionMapfixUploaded operation. + // + // (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. + // + // POST /mapfixes/{MapfixID}/status/validator-uploaded + ActionMapfixUploaded(ctx context.Context, params ActionMapfixUploadedParams) error + // ActionMapfixValidated invokes actionMapfixValidated operation. + // + // (Internal endpoint) Role Validator changes status from Validating -> Validated. + // + // POST /mapfixes/{MapfixID}/status/validator-validated + ActionMapfixValidated(ctx context.Context, params ActionMapfixValidatedParams) error + // ActionOperationFailed invokes actionOperationFailed operation. + // + // (Internal endpoint) Fail an operation and write a StatusMessage. + // + // POST /operations/{OperationID}/status/operation-failed + ActionOperationFailed(ctx context.Context, params ActionOperationFailedParams) error + // ActionSubmissionAccepted invokes actionSubmissionAccepted operation. + // + // (Internal endpoint) Role Validator changes status from Validating -> Accepted. + // + // POST /submissions/{SubmissionID}/status/validator-failed + ActionSubmissionAccepted(ctx context.Context, params ActionSubmissionAcceptedParams) error + // ActionSubmissionRequestChanges invokes actionSubmissionRequestChanges operation. + // + // (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested. + // + // POST /submissions/{SubmissionID}/status/validator-request-changes + ActionSubmissionRequestChanges(ctx context.Context, params ActionSubmissionRequestChangesParams) error + // ActionSubmissionSubmitted invokes actionSubmissionSubmitted operation. + // + // (Internal endpoint) Role Validator changes status from Submitting -> Submitted. + // + // POST /submissions/{SubmissionID}/status/validator-submitted + ActionSubmissionSubmitted(ctx context.Context, params ActionSubmissionSubmittedParams) error + // ActionSubmissionUploaded invokes actionSubmissionUploaded operation. + // + // (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. + // + // POST /submissions/{SubmissionID}/status/validator-uploaded + ActionSubmissionUploaded(ctx context.Context, params ActionSubmissionUploadedParams) error + // ActionSubmissionValidated invokes actionSubmissionValidated operation. + // + // (Internal endpoint) Role Validator changes status from Validating -> Validated. + // + // 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) (*MapfixID, error) + // CreateMapfixAuditCheckList invokes createMapfixAuditCheckList operation. + // + // Validator posts a checklist to the audit log. + // + // POST /mapfixes/{MapfixID}/checklist + CreateMapfixAuditCheckList(ctx context.Context, request CheckList, params CreateMapfixAuditCheckListParams) error + // CreateMapfixAuditError invokes createMapfixAuditError operation. + // + // Validator posts an error to the audit log. + // + // POST /mapfixes/{MapfixID}/error + CreateMapfixAuditError(ctx context.Context, params CreateMapfixAuditErrorParams) error + // CreateScript invokes createScript operation. + // + // Create a new script. + // + // POST /scripts + CreateScript(ctx context.Context, request *ScriptCreate) (*ScriptID, error) + // CreateScriptPolicy invokes createScriptPolicy operation. + // + // Create a new script policy. + // + // POST /script-policy + CreateScriptPolicy(ctx context.Context, request *ScriptPolicyCreate) (*ScriptPolicyID, error) + // CreateSubmission invokes createSubmission operation. + // + // Create a new submission. + // + // POST /submissions + CreateSubmission(ctx context.Context, request *SubmissionCreate) (*SubmissionID, error) + // CreateSubmissionAuditCheckList invokes createSubmissionAuditCheckList operation. + // + // Validator posts a checklist to the audit log. + // + // POST /submissions/{SubmissionID}/checklist + CreateSubmissionAuditCheckList(ctx context.Context, request CheckList, params CreateSubmissionAuditCheckListParams) error + // CreateSubmissionAuditError invokes createSubmissionAuditError operation. + // + // Validator posts an error to the audit log. + // + // POST /submissions/{SubmissionID}/error + CreateSubmissionAuditError(ctx context.Context, params CreateSubmissionAuditErrorParams) error + // GetScript invokes getScript operation. + // + // Get the specified script by ID. + // + // GET /scripts/{ScriptID} + GetScript(ctx context.Context, params GetScriptParams) (*Script, error) + // ListScriptPolicy invokes listScriptPolicy operation. + // + // Get list of script policies. + // + // GET /script-policy + ListScriptPolicy(ctx context.Context, params ListScriptPolicyParams) ([]ScriptPolicy, error) + // ListScripts invokes listScripts operation. + // + // Get list of scripts. + // + // GET /scripts + ListScripts(ctx context.Context, params ListScriptsParams) ([]Script, error) + // UpdateMapfixValidatedModel invokes updateMapfixValidatedModel operation. + // + // Update validated model. + // + // POST /mapfixes/{MapfixID}/validated-model + UpdateMapfixValidatedModel(ctx context.Context, params UpdateMapfixValidatedModelParams) error + // UpdateSubmissionValidatedModel invokes updateSubmissionValidatedModel operation. + // + // Update validated model. + // + // POST /submissions/{SubmissionID}/validated-model + UpdateSubmissionValidatedModel(ctx context.Context, params UpdateSubmissionValidatedModelParams) error +} + +// Client implements OAS client. +type Client struct { + serverURL *url.URL + baseClient +} +type errorHandler interface { + NewError(ctx context.Context, err error) *ErrorStatusCode +} + +var _ Handler = struct { + errorHandler + *Client +}{} + +// NewClient initializes new Client defined by OAS. +func NewClient(serverURL string, opts ...ClientOption) (*Client, error) { + u, err := url.Parse(serverURL) + if err != nil { + return nil, err + } + trimTrailingSlashes(u) + + c, err := newClientConfig(opts...).baseClient() + if err != nil { + return nil, err + } + return &Client{ + serverURL: u, + baseClient: c, + }, nil +} + +type serverURLKey struct{} + +// WithServerURL sets context key to override server URL. +func WithServerURL(ctx context.Context, u *url.URL) context.Context { + return context.WithValue(ctx, serverURLKey{}, u) +} + +func (c *Client) requestURL(ctx context.Context) *url.URL { + u, ok := ctx.Value(serverURLKey{}).(*url.URL) + if !ok { + return c.serverURL + } + return u +} + +// ActionMapfixAccepted invokes actionMapfixAccepted operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Accepted. +// +// POST /mapfixes/{MapfixID}/status/validator-failed +func (c *Client) ActionMapfixAccepted(ctx context.Context, params ActionMapfixAcceptedParams) error { + _, err := c.sendActionMapfixAccepted(ctx, params) + return err +} + +func (c *Client) sendActionMapfixAccepted(ctx context.Context, params ActionMapfixAcceptedParams) (res *ActionMapfixAcceptedNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionMapfixAccepted"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/status/validator-failed"), + } + + // 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, ActionMapfixAcceptedOperation, + 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 [3]string + pathParts[0] = "/mapfixes/" + { + // Encode "MapfixID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "MapfixID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.MapfixID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/validator-failed" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionMapfixAcceptedResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ActionMapfixRequestChanges invokes actionMapfixRequestChanges operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested. +// +// POST /mapfixes/{MapfixID}/status/validator-request-changes +func (c *Client) ActionMapfixRequestChanges(ctx context.Context, params ActionMapfixRequestChangesParams) error { + _, err := c.sendActionMapfixRequestChanges(ctx, params) + return err +} + +func (c *Client) sendActionMapfixRequestChanges(ctx context.Context, params ActionMapfixRequestChangesParams) (res *ActionMapfixRequestChangesNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionMapfixRequestChanges"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/status/validator-request-changes"), + } + + // 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, ActionMapfixRequestChangesOperation, + 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 [3]string + pathParts[0] = "/mapfixes/" + { + // Encode "MapfixID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "MapfixID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.MapfixID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/validator-request-changes" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionMapfixRequestChangesResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ActionMapfixSubmitted invokes actionMapfixSubmitted operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> Submitted. +// +// POST /mapfixes/{MapfixID}/status/validator-submitted +func (c *Client) ActionMapfixSubmitted(ctx context.Context, params ActionMapfixSubmittedParams) error { + _, err := c.sendActionMapfixSubmitted(ctx, params) + return err +} + +func (c *Client) sendActionMapfixSubmitted(ctx context.Context, params ActionMapfixSubmittedParams) (res *ActionMapfixSubmittedNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionMapfixSubmitted"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/status/validator-submitted"), + } + + // 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, ActionMapfixSubmittedOperation, + 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 [3]string + pathParts[0] = "/mapfixes/" + { + // Encode "MapfixID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "MapfixID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.MapfixID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/validator-submitted" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "ModelVersion" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ModelVersion", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int64ToString(params.ModelVersion)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "DisplayName" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "DisplayName", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.StringToString(params.DisplayName)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "Creator" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "Creator", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.StringToString(params.Creator)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "GameID" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "GameID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int32ToString(params.GameID)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionMapfixSubmittedResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ActionMapfixUploaded invokes actionMapfixUploaded operation. +// +// (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. +// +// POST /mapfixes/{MapfixID}/status/validator-uploaded +func (c *Client) ActionMapfixUploaded(ctx context.Context, params ActionMapfixUploadedParams) error { + _, err := c.sendActionMapfixUploaded(ctx, params) + return err +} + +func (c *Client) sendActionMapfixUploaded(ctx context.Context, params ActionMapfixUploadedParams) (res *ActionMapfixUploadedNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionMapfixUploaded"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/status/validator-uploaded"), + } + + // 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, ActionMapfixUploadedOperation, + 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 [3]string + pathParts[0] = "/mapfixes/" + { + // Encode "MapfixID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "MapfixID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.MapfixID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/validator-uploaded" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionMapfixUploadedResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ActionMapfixValidated invokes actionMapfixValidated operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Validated. +// +// POST /mapfixes/{MapfixID}/status/validator-validated +func (c *Client) ActionMapfixValidated(ctx context.Context, params ActionMapfixValidatedParams) error { + _, err := c.sendActionMapfixValidated(ctx, params) + return err +} + +func (c *Client) sendActionMapfixValidated(ctx context.Context, params ActionMapfixValidatedParams) (res *ActionMapfixValidatedNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionMapfixValidated"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/status/validator-validated"), + } + + // 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, ActionMapfixValidatedOperation, + 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 [3]string + pathParts[0] = "/mapfixes/" + { + // Encode "MapfixID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "MapfixID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.MapfixID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/validator-validated" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionMapfixValidatedResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ActionOperationFailed invokes actionOperationFailed operation. +// +// (Internal endpoint) Fail an operation and write a StatusMessage. +// +// POST /operations/{OperationID}/status/operation-failed +func (c *Client) ActionOperationFailed(ctx context.Context, params ActionOperationFailedParams) error { + _, err := c.sendActionOperationFailed(ctx, params) + return err +} + +func (c *Client) sendActionOperationFailed(ctx context.Context, params ActionOperationFailedParams) (res *ActionOperationFailedNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionOperationFailed"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/operations/{OperationID}/status/operation-failed"), + } + + // 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, ActionOperationFailedOperation, + 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 [3]string + pathParts[0] = "/operations/" + { + // Encode "OperationID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "OperationID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int32ToString(params.OperationID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/operation-failed" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "StatusMessage" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "StatusMessage", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.StringToString(params.StatusMessage)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionOperationFailedResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ActionSubmissionAccepted invokes actionSubmissionAccepted operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Accepted. +// +// POST /submissions/{SubmissionID}/status/validator-failed +func (c *Client) ActionSubmissionAccepted(ctx context.Context, params ActionSubmissionAcceptedParams) error { + _, err := c.sendActionSubmissionAccepted(ctx, params) + return err +} + +func (c *Client) sendActionSubmissionAccepted(ctx context.Context, params ActionSubmissionAcceptedParams) (res *ActionSubmissionAcceptedNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionSubmissionAccepted"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status/validator-failed"), + } + + // 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, ActionSubmissionAcceptedOperation, + 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 [3]string + pathParts[0] = "/submissions/" + { + // Encode "SubmissionID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "SubmissionID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/validator-failed" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionSubmissionAcceptedResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ActionSubmissionRequestChanges invokes actionSubmissionRequestChanges operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested. +// +// POST /submissions/{SubmissionID}/status/validator-request-changes +func (c *Client) ActionSubmissionRequestChanges(ctx context.Context, params ActionSubmissionRequestChangesParams) error { + _, err := c.sendActionSubmissionRequestChanges(ctx, params) + return err +} + +func (c *Client) sendActionSubmissionRequestChanges(ctx context.Context, params ActionSubmissionRequestChangesParams) (res *ActionSubmissionRequestChangesNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionSubmissionRequestChanges"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status/validator-request-changes"), + } + + // 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, ActionSubmissionRequestChangesOperation, + 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 [3]string + pathParts[0] = "/submissions/" + { + // Encode "SubmissionID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "SubmissionID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/validator-request-changes" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionSubmissionRequestChangesResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ActionSubmissionSubmitted invokes actionSubmissionSubmitted operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> Submitted. +// +// POST /submissions/{SubmissionID}/status/validator-submitted +func (c *Client) ActionSubmissionSubmitted(ctx context.Context, params ActionSubmissionSubmittedParams) error { + _, err := c.sendActionSubmissionSubmitted(ctx, params) + return err +} + +func (c *Client) sendActionSubmissionSubmitted(ctx context.Context, params ActionSubmissionSubmittedParams) (res *ActionSubmissionSubmittedNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionSubmissionSubmitted"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status/validator-submitted"), + } + + // 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, ActionSubmissionSubmittedOperation, + 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 [3]string + pathParts[0] = "/submissions/" + { + // Encode "SubmissionID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "SubmissionID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/validator-submitted" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "ModelVersion" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ModelVersion", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int64ToString(params.ModelVersion)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "DisplayName" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "DisplayName", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.StringToString(params.DisplayName)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "Creator" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "Creator", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.StringToString(params.Creator)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "GameID" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "GameID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int32ToString(params.GameID)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionSubmissionSubmittedResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ActionSubmissionUploaded invokes actionSubmissionUploaded operation. +// +// (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. +// +// POST /submissions/{SubmissionID}/status/validator-uploaded +func (c *Client) ActionSubmissionUploaded(ctx context.Context, params ActionSubmissionUploadedParams) error { + _, err := c.sendActionSubmissionUploaded(ctx, params) + return err +} + +func (c *Client) sendActionSubmissionUploaded(ctx context.Context, params ActionSubmissionUploadedParams) (res *ActionSubmissionUploadedNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionSubmissionUploaded"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status/validator-uploaded"), + } + + // 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, ActionSubmissionUploadedOperation, + 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 [3]string + pathParts[0] = "/submissions/" + { + // Encode "SubmissionID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "SubmissionID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/validator-uploaded" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "UploadedAssetID" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "UploadedAssetID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int64ToString(params.UploadedAssetID)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionSubmissionUploadedResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ActionSubmissionValidated invokes actionSubmissionValidated operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Validated. +// +// POST /submissions/{SubmissionID}/status/validator-validated +func (c *Client) ActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) error { + _, err := c.sendActionSubmissionValidated(ctx, params) + return err +} + +func (c *Client) sendActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) (res *ActionSubmissionValidatedNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionSubmissionValidated"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status/validator-validated"), + } + + // 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, ActionSubmissionValidatedOperation, + 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 [3]string + pathParts[0] = "/submissions/" + { + // Encode "SubmissionID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "SubmissionID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/status/validator-validated" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeActionSubmissionValidatedResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// CreateMapfix invokes createMapfix operation. +// +// Create a mapfix. +// +// POST /mapfixes +func (c *Client) CreateMapfix(ctx context.Context, request *MapfixCreate) (*MapfixID, error) { + res, err := c.sendCreateMapfix(ctx, request) + return res, err +} + +func (c *Client) sendCreateMapfix(ctx context.Context, request *MapfixCreate) (res *MapfixID, 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 +} + +// CreateMapfixAuditCheckList invokes createMapfixAuditCheckList operation. +// +// Validator posts a checklist to the audit log. +// +// POST /mapfixes/{MapfixID}/checklist +func (c *Client) CreateMapfixAuditCheckList(ctx context.Context, request CheckList, params CreateMapfixAuditCheckListParams) error { + _, err := c.sendCreateMapfixAuditCheckList(ctx, request, params) + return err +} + +func (c *Client) sendCreateMapfixAuditCheckList(ctx context.Context, request CheckList, params CreateMapfixAuditCheckListParams) (res *CreateMapfixAuditCheckListNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createMapfixAuditCheckList"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/checklist"), + } + + // 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, CreateMapfixAuditCheckListOperation, + 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 [3]string + pathParts[0] = "/mapfixes/" + { + // Encode "MapfixID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "MapfixID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.MapfixID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/checklist" + 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 := encodeCreateMapfixAuditCheckListRequest(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 := decodeCreateMapfixAuditCheckListResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// CreateMapfixAuditError invokes createMapfixAuditError operation. +// +// Validator posts an error to the audit log. +// +// POST /mapfixes/{MapfixID}/error +func (c *Client) CreateMapfixAuditError(ctx context.Context, params CreateMapfixAuditErrorParams) error { + _, err := c.sendCreateMapfixAuditError(ctx, params) + return err +} + +func (c *Client) sendCreateMapfixAuditError(ctx context.Context, params CreateMapfixAuditErrorParams) (res *CreateMapfixAuditErrorNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createMapfixAuditError"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/error"), + } + + // 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, CreateMapfixAuditErrorOperation, + 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 [3]string + pathParts[0] = "/mapfixes/" + { + // Encode "MapfixID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "MapfixID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.MapfixID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/error" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "ErrorMessage" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ErrorMessage", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.StringToString(params.ErrorMessage)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeCreateMapfixAuditErrorResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// CreateScript invokes createScript operation. +// +// Create a new script. +// +// POST /scripts +func (c *Client) CreateScript(ctx context.Context, request *ScriptCreate) (*ScriptID, error) { + res, err := c.sendCreateScript(ctx, request) + return res, err +} + +func (c *Client) sendCreateScript(ctx context.Context, request *ScriptCreate) (res *ScriptID, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createScript"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/scripts"), + } + + // 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, CreateScriptOperation, + 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] = "/scripts" + 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 := encodeCreateScriptRequest(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 := decodeCreateScriptResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// CreateScriptPolicy invokes createScriptPolicy operation. +// +// Create a new script policy. +// +// POST /script-policy +func (c *Client) CreateScriptPolicy(ctx context.Context, request *ScriptPolicyCreate) (*ScriptPolicyID, error) { + res, err := c.sendCreateScriptPolicy(ctx, request) + return res, err +} + +func (c *Client) sendCreateScriptPolicy(ctx context.Context, request *ScriptPolicyCreate) (res *ScriptPolicyID, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createScriptPolicy"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/script-policy"), + } + + // 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, CreateScriptPolicyOperation, + 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] = "/script-policy" + 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 := encodeCreateScriptPolicyRequest(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 := decodeCreateScriptPolicyResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// CreateSubmission invokes createSubmission operation. +// +// Create a new submission. +// +// POST /submissions +func (c *Client) CreateSubmission(ctx context.Context, request *SubmissionCreate) (*SubmissionID, error) { + res, err := c.sendCreateSubmission(ctx, request) + return res, err +} + +func (c *Client) sendCreateSubmission(ctx context.Context, request *SubmissionCreate) (res *SubmissionID, 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 +} + +// CreateSubmissionAuditCheckList invokes createSubmissionAuditCheckList operation. +// +// Validator posts a checklist to the audit log. +// +// POST /submissions/{SubmissionID}/checklist +func (c *Client) CreateSubmissionAuditCheckList(ctx context.Context, request CheckList, params CreateSubmissionAuditCheckListParams) error { + _, err := c.sendCreateSubmissionAuditCheckList(ctx, request, params) + return err +} + +func (c *Client) sendCreateSubmissionAuditCheckList(ctx context.Context, request CheckList, params CreateSubmissionAuditCheckListParams) (res *CreateSubmissionAuditCheckListNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createSubmissionAuditCheckList"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/checklist"), + } + + // 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, CreateSubmissionAuditCheckListOperation, + 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 [3]string + pathParts[0] = "/submissions/" + { + // Encode "SubmissionID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "SubmissionID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/checklist" + 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 := encodeCreateSubmissionAuditCheckListRequest(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 := decodeCreateSubmissionAuditCheckListResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// CreateSubmissionAuditError invokes createSubmissionAuditError operation. +// +// Validator posts an error to the audit log. +// +// POST /submissions/{SubmissionID}/error +func (c *Client) CreateSubmissionAuditError(ctx context.Context, params CreateSubmissionAuditErrorParams) error { + _, err := c.sendCreateSubmissionAuditError(ctx, params) + return err +} + +func (c *Client) sendCreateSubmissionAuditError(ctx context.Context, params CreateSubmissionAuditErrorParams) (res *CreateSubmissionAuditErrorNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createSubmissionAuditError"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/error"), + } + + // 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, CreateSubmissionAuditErrorOperation, + 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 [3]string + pathParts[0] = "/submissions/" + { + // Encode "SubmissionID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "SubmissionID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/error" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "ErrorMessage" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ErrorMessage", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.StringToString(params.ErrorMessage)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeCreateSubmissionAuditErrorResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// GetScript invokes getScript operation. +// +// Get the specified script by ID. +// +// GET /scripts/{ScriptID} +func (c *Client) GetScript(ctx context.Context, params GetScriptParams) (*Script, error) { + res, err := c.sendGetScript(ctx, params) + return res, err +} + +func (c *Client) sendGetScript(ctx context.Context, params GetScriptParams) (res *Script, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getScript"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/scripts/{ScriptID}"), + } + + // 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, GetScriptOperation, + 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 [2]string + pathParts[0] = "/scripts/" + { + // Encode "ScriptID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "ScriptID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.ScriptID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "GET", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeGetScriptResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ListScriptPolicy invokes listScriptPolicy operation. +// +// Get list of script policies. +// +// GET /script-policy +func (c *Client) ListScriptPolicy(ctx context.Context, params ListScriptPolicyParams) ([]ScriptPolicy, error) { + res, err := c.sendListScriptPolicy(ctx, params) + return res, err +} + +func (c *Client) sendListScriptPolicy(ctx context.Context, params ListScriptPolicyParams) (res []ScriptPolicy, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listScriptPolicy"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/script-policy"), + } + + // 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, ListScriptPolicyOperation, + 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] = "/script-policy" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "Page" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "Page", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int32ToString(params.Page)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "Limit" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "Limit", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int32ToString(params.Limit)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "FromScriptHash" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "FromScriptHash", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.FromScriptHash.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "ToScriptID" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ToScriptID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.ToScriptID.Get(); ok { + return e.EncodeValue(conv.Int64ToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "Policy" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "Policy", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Policy.Get(); ok { + return e.EncodeValue(conv.Int32ToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "GET", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeListScriptPolicyResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ListScripts invokes listScripts operation. +// +// Get list of scripts. +// +// GET /scripts +func (c *Client) ListScripts(ctx context.Context, params ListScriptsParams) ([]Script, error) { + res, err := c.sendListScripts(ctx, params) + return res, err +} + +func (c *Client) sendListScripts(ctx context.Context, params ListScriptsParams) (res []Script, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listScripts"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/scripts"), + } + + // 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, ListScriptsOperation, + 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] = "/scripts" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "Page" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "Page", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int32ToString(params.Page)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "Limit" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "Limit", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int32ToString(params.Limit)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "Hash" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "Hash", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Hash.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "Name" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "Name", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Name.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "Source" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "Source", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Source.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "ResourceType" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ResourceType", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.ResourceType.Get(); ok { + return e.EncodeValue(conv.Int32ToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "ResourceID" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ResourceID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.ResourceID.Get(); ok { + return e.EncodeValue(conv.Int64ToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "GET", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeListScriptsResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// UpdateMapfixValidatedModel invokes updateMapfixValidatedModel operation. +// +// Update validated model. +// +// POST /mapfixes/{MapfixID}/validated-model +func (c *Client) UpdateMapfixValidatedModel(ctx context.Context, params UpdateMapfixValidatedModelParams) error { + _, err := c.sendUpdateMapfixValidatedModel(ctx, params) + return err +} + +func (c *Client) sendUpdateMapfixValidatedModel(ctx context.Context, params UpdateMapfixValidatedModelParams) (res *UpdateMapfixValidatedModelNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("updateMapfixValidatedModel"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/validated-model"), + } + + // 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, UpdateMapfixValidatedModelOperation, + 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 [3]string + pathParts[0] = "/mapfixes/" + { + // Encode "MapfixID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "MapfixID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.MapfixID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/validated-model" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "ValidatedModelID" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ValidatedModelID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int64ToString(params.ValidatedModelID)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "ValidatedModelVersion" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ValidatedModelVersion", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int64ToString(params.ValidatedModelVersion)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeUpdateMapfixValidatedModelResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// UpdateSubmissionValidatedModel invokes updateSubmissionValidatedModel operation. +// +// Update validated model. +// +// POST /submissions/{SubmissionID}/validated-model +func (c *Client) UpdateSubmissionValidatedModel(ctx context.Context, params UpdateSubmissionValidatedModelParams) error { + _, err := c.sendUpdateSubmissionValidatedModel(ctx, params) + return err +} + +func (c *Client) sendUpdateSubmissionValidatedModel(ctx context.Context, params UpdateSubmissionValidatedModelParams) (res *UpdateSubmissionValidatedModelNoContent, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("updateSubmissionValidatedModel"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/validated-model"), + } + + // 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, UpdateSubmissionValidatedModelOperation, + 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 [3]string + pathParts[0] = "/submissions/" + { + // Encode "SubmissionID" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "SubmissionID", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/validated-model" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "ValidatedModelID" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ValidatedModelID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int64ToString(params.ValidatedModelID)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "ValidatedModelVersion" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "ValidatedModelVersion", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + return e.EncodeValue(conv.Int64ToString(params.ValidatedModelVersion)) + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create 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 := decodeUpdateSubmissionValidatedModelResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} diff --git a/pkg/internal/oas_handlers_gen.go b/pkg/internal/oas_handlers_gen.go new file mode 100644 index 0000000..fc18a64 --- /dev/null +++ b/pkg/internal/oas_handlers_gen.go @@ -0,0 +1,3741 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "context" + "net/http" + "time" + + "github.com/go-faster/errors" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/metric" + semconv "go.opentelemetry.io/otel/semconv/v1.26.0" + "go.opentelemetry.io/otel/trace" + + ht "github.com/ogen-go/ogen/http" + "github.com/ogen-go/ogen/middleware" + "github.com/ogen-go/ogen/ogenerrors" + "github.com/ogen-go/ogen/otelogen" +) + +type codeRecorder struct { + http.ResponseWriter + status int +} + +func (c *codeRecorder) WriteHeader(status int) { + c.status = status + c.ResponseWriter.WriteHeader(status) +} + +// handleActionMapfixAcceptedRequest handles actionMapfixAccepted operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Accepted. +// +// POST /mapfixes/{MapfixID}/status/validator-failed +func (s *Server) handleActionMapfixAcceptedRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionMapfixAccepted"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/status/validator-failed"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionMapfixAcceptedOperation, + 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: ActionMapfixAcceptedOperation, + ID: "actionMapfixAccepted", + } + ) + params, err := decodeActionMapfixAcceptedParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionMapfixAcceptedNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionMapfixAcceptedOperation, + OperationSummary: "(Internal endpoint) Role Validator changes status from Validating -> Accepted", + OperationID: "actionMapfixAccepted", + Body: nil, + Params: middleware.Parameters{ + { + Name: "MapfixID", + In: "path", + }: params.MapfixID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionMapfixAcceptedParams + Response = *ActionMapfixAcceptedNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionMapfixAcceptedParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionMapfixAccepted(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionMapfixAccepted(ctx, params) + } + 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 := encodeActionMapfixAcceptedResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleActionMapfixRequestChangesRequest handles actionMapfixRequestChanges operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested. +// +// POST /mapfixes/{MapfixID}/status/validator-request-changes +func (s *Server) handleActionMapfixRequestChangesRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionMapfixRequestChanges"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/status/validator-request-changes"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionMapfixRequestChangesOperation, + 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: ActionMapfixRequestChangesOperation, + ID: "actionMapfixRequestChanges", + } + ) + params, err := decodeActionMapfixRequestChangesParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionMapfixRequestChangesNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionMapfixRequestChangesOperation, + OperationSummary: "(Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested", + OperationID: "actionMapfixRequestChanges", + Body: nil, + Params: middleware.Parameters{ + { + Name: "MapfixID", + In: "path", + }: params.MapfixID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionMapfixRequestChangesParams + Response = *ActionMapfixRequestChangesNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionMapfixRequestChangesParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionMapfixRequestChanges(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionMapfixRequestChanges(ctx, params) + } + 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 := encodeActionMapfixRequestChangesResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleActionMapfixSubmittedRequest handles actionMapfixSubmitted operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> Submitted. +// +// POST /mapfixes/{MapfixID}/status/validator-submitted +func (s *Server) handleActionMapfixSubmittedRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionMapfixSubmitted"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/status/validator-submitted"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionMapfixSubmittedOperation, + 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: ActionMapfixSubmittedOperation, + ID: "actionMapfixSubmitted", + } + ) + params, err := decodeActionMapfixSubmittedParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionMapfixSubmittedNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionMapfixSubmittedOperation, + OperationSummary: "(Internal endpoint) Role Validator changes status from Submitting -> Submitted", + OperationID: "actionMapfixSubmitted", + Body: nil, + Params: middleware.Parameters{ + { + Name: "MapfixID", + In: "path", + }: params.MapfixID, + { + Name: "ModelVersion", + In: "query", + }: params.ModelVersion, + { + Name: "DisplayName", + In: "query", + }: params.DisplayName, + { + Name: "Creator", + In: "query", + }: params.Creator, + { + Name: "GameID", + In: "query", + }: params.GameID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionMapfixSubmittedParams + Response = *ActionMapfixSubmittedNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionMapfixSubmittedParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionMapfixSubmitted(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionMapfixSubmitted(ctx, params) + } + 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 := encodeActionMapfixSubmittedResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleActionMapfixUploadedRequest handles actionMapfixUploaded operation. +// +// (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. +// +// POST /mapfixes/{MapfixID}/status/validator-uploaded +func (s *Server) handleActionMapfixUploadedRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionMapfixUploaded"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/status/validator-uploaded"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionMapfixUploadedOperation, + 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: ActionMapfixUploadedOperation, + ID: "actionMapfixUploaded", + } + ) + params, err := decodeActionMapfixUploadedParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionMapfixUploadedNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionMapfixUploadedOperation, + OperationSummary: "(Internal endpoint) Role Validator changes status from Uploading -> Uploaded", + OperationID: "actionMapfixUploaded", + Body: nil, + Params: middleware.Parameters{ + { + Name: "MapfixID", + In: "path", + }: params.MapfixID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionMapfixUploadedParams + Response = *ActionMapfixUploadedNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionMapfixUploadedParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionMapfixUploaded(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionMapfixUploaded(ctx, params) + } + 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 := encodeActionMapfixUploadedResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleActionMapfixValidatedRequest handles actionMapfixValidated operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Validated. +// +// POST /mapfixes/{MapfixID}/status/validator-validated +func (s *Server) handleActionMapfixValidatedRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionMapfixValidated"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/status/validator-validated"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionMapfixValidatedOperation, + 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: ActionMapfixValidatedOperation, + ID: "actionMapfixValidated", + } + ) + params, err := decodeActionMapfixValidatedParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionMapfixValidatedNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionMapfixValidatedOperation, + OperationSummary: "(Internal endpoint) Role Validator changes status from Validating -> Validated", + OperationID: "actionMapfixValidated", + Body: nil, + Params: middleware.Parameters{ + { + Name: "MapfixID", + In: "path", + }: params.MapfixID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionMapfixValidatedParams + Response = *ActionMapfixValidatedNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionMapfixValidatedParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionMapfixValidated(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionMapfixValidated(ctx, params) + } + 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 := encodeActionMapfixValidatedResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleActionOperationFailedRequest handles actionOperationFailed operation. +// +// (Internal endpoint) Fail an operation and write a StatusMessage. +// +// POST /operations/{OperationID}/status/operation-failed +func (s *Server) handleActionOperationFailedRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionOperationFailed"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/operations/{OperationID}/status/operation-failed"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionOperationFailedOperation, + 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: ActionOperationFailedOperation, + ID: "actionOperationFailed", + } + ) + params, err := decodeActionOperationFailedParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionOperationFailedNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionOperationFailedOperation, + OperationSummary: "(Internal endpoint) Fail an operation and write a StatusMessage", + OperationID: "actionOperationFailed", + Body: nil, + Params: middleware.Parameters{ + { + Name: "OperationID", + In: "path", + }: params.OperationID, + { + Name: "StatusMessage", + In: "query", + }: params.StatusMessage, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionOperationFailedParams + Response = *ActionOperationFailedNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionOperationFailedParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionOperationFailed(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionOperationFailed(ctx, params) + } + 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 := encodeActionOperationFailedResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleActionSubmissionAcceptedRequest handles actionSubmissionAccepted operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Accepted. +// +// POST /submissions/{SubmissionID}/status/validator-failed +func (s *Server) handleActionSubmissionAcceptedRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionSubmissionAccepted"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status/validator-failed"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionSubmissionAcceptedOperation, + 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: ActionSubmissionAcceptedOperation, + ID: "actionSubmissionAccepted", + } + ) + params, err := decodeActionSubmissionAcceptedParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionSubmissionAcceptedNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionSubmissionAcceptedOperation, + OperationSummary: "(Internal endpoint) Role Validator changes status from Validating -> Accepted", + OperationID: "actionSubmissionAccepted", + Body: nil, + Params: middleware.Parameters{ + { + Name: "SubmissionID", + In: "path", + }: params.SubmissionID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionSubmissionAcceptedParams + Response = *ActionSubmissionAcceptedNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionSubmissionAcceptedParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionSubmissionAccepted(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionSubmissionAccepted(ctx, params) + } + 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 := encodeActionSubmissionAcceptedResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleActionSubmissionRequestChangesRequest handles actionSubmissionRequestChanges operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested. +// +// POST /submissions/{SubmissionID}/status/validator-request-changes +func (s *Server) handleActionSubmissionRequestChangesRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionSubmissionRequestChanges"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status/validator-request-changes"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionSubmissionRequestChangesOperation, + 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: ActionSubmissionRequestChangesOperation, + ID: "actionSubmissionRequestChanges", + } + ) + params, err := decodeActionSubmissionRequestChangesParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionSubmissionRequestChangesNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionSubmissionRequestChangesOperation, + OperationSummary: "(Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested", + OperationID: "actionSubmissionRequestChanges", + Body: nil, + Params: middleware.Parameters{ + { + Name: "SubmissionID", + In: "path", + }: params.SubmissionID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionSubmissionRequestChangesParams + Response = *ActionSubmissionRequestChangesNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionSubmissionRequestChangesParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionSubmissionRequestChanges(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionSubmissionRequestChanges(ctx, params) + } + 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 := encodeActionSubmissionRequestChangesResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleActionSubmissionSubmittedRequest handles actionSubmissionSubmitted operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> Submitted. +// +// POST /submissions/{SubmissionID}/status/validator-submitted +func (s *Server) handleActionSubmissionSubmittedRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionSubmissionSubmitted"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status/validator-submitted"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionSubmissionSubmittedOperation, + 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: ActionSubmissionSubmittedOperation, + ID: "actionSubmissionSubmitted", + } + ) + params, err := decodeActionSubmissionSubmittedParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionSubmissionSubmittedNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionSubmissionSubmittedOperation, + OperationSummary: "(Internal endpoint) Role Validator changes status from Submitting -> Submitted", + OperationID: "actionSubmissionSubmitted", + Body: nil, + Params: middleware.Parameters{ + { + Name: "SubmissionID", + In: "path", + }: params.SubmissionID, + { + Name: "ModelVersion", + In: "query", + }: params.ModelVersion, + { + Name: "DisplayName", + In: "query", + }: params.DisplayName, + { + Name: "Creator", + In: "query", + }: params.Creator, + { + Name: "GameID", + In: "query", + }: params.GameID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionSubmissionSubmittedParams + Response = *ActionSubmissionSubmittedNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionSubmissionSubmittedParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionSubmissionSubmitted(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionSubmissionSubmitted(ctx, params) + } + 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 := encodeActionSubmissionSubmittedResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleActionSubmissionUploadedRequest handles actionSubmissionUploaded operation. +// +// (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. +// +// POST /submissions/{SubmissionID}/status/validator-uploaded +func (s *Server) handleActionSubmissionUploadedRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionSubmissionUploaded"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status/validator-uploaded"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionSubmissionUploadedOperation, + 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: ActionSubmissionUploadedOperation, + ID: "actionSubmissionUploaded", + } + ) + params, err := decodeActionSubmissionUploadedParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionSubmissionUploadedNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionSubmissionUploadedOperation, + OperationSummary: "(Internal endpoint) Role Validator changes status from Uploading -> Uploaded", + OperationID: "actionSubmissionUploaded", + Body: nil, + Params: middleware.Parameters{ + { + Name: "SubmissionID", + In: "path", + }: params.SubmissionID, + { + Name: "UploadedAssetID", + In: "query", + }: params.UploadedAssetID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionSubmissionUploadedParams + Response = *ActionSubmissionUploadedNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionSubmissionUploadedParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionSubmissionUploaded(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionSubmissionUploaded(ctx, params) + } + 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 := encodeActionSubmissionUploadedResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleActionSubmissionValidatedRequest handles actionSubmissionValidated operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Validated. +// +// POST /submissions/{SubmissionID}/status/validator-validated +func (s *Server) handleActionSubmissionValidatedRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("actionSubmissionValidated"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status/validator-validated"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ActionSubmissionValidatedOperation, + 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: ActionSubmissionValidatedOperation, + ID: "actionSubmissionValidated", + } + ) + params, err := decodeActionSubmissionValidatedParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *ActionSubmissionValidatedNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ActionSubmissionValidatedOperation, + OperationSummary: "(Internal endpoint) Role Validator changes status from Validating -> Validated", + OperationID: "actionSubmissionValidated", + Body: nil, + Params: middleware.Parameters{ + { + Name: "SubmissionID", + In: "path", + }: params.SubmissionID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ActionSubmissionValidatedParams + Response = *ActionSubmissionValidatedNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackActionSubmissionValidatedParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.ActionSubmissionValidated(ctx, params) + return response, err + }, + ) + } else { + err = s.h.ActionSubmissionValidated(ctx, params) + } + 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 := encodeActionSubmissionValidatedResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// 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 *MapfixID + 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 = *MapfixID + ) + 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 + } +} + +// handleCreateMapfixAuditCheckListRequest handles createMapfixAuditCheckList operation. +// +// Validator posts a checklist to the audit log. +// +// POST /mapfixes/{MapfixID}/checklist +func (s *Server) handleCreateMapfixAuditCheckListRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createMapfixAuditCheckList"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/checklist"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), CreateMapfixAuditCheckListOperation, + 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: CreateMapfixAuditCheckListOperation, + ID: "createMapfixAuditCheckList", + } + ) + params, err := decodeCreateMapfixAuditCheckListParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + request, close, err := s.decodeCreateMapfixAuditCheckListRequest(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 *CreateMapfixAuditCheckListNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: CreateMapfixAuditCheckListOperation, + OperationSummary: "Validator posts a checklist to the audit log", + OperationID: "createMapfixAuditCheckList", + Body: request, + Params: middleware.Parameters{ + { + Name: "MapfixID", + In: "path", + }: params.MapfixID, + }, + Raw: r, + } + + type ( + Request = CheckList + Params = CreateMapfixAuditCheckListParams + Response = *CreateMapfixAuditCheckListNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackCreateMapfixAuditCheckListParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.CreateMapfixAuditCheckList(ctx, request, params) + return response, err + }, + ) + } else { + err = s.h.CreateMapfixAuditCheckList(ctx, request, params) + } + 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 := encodeCreateMapfixAuditCheckListResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleCreateMapfixAuditErrorRequest handles createMapfixAuditError operation. +// +// Validator posts an error to the audit log. +// +// POST /mapfixes/{MapfixID}/error +func (s *Server) handleCreateMapfixAuditErrorRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createMapfixAuditError"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/error"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), CreateMapfixAuditErrorOperation, + 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: CreateMapfixAuditErrorOperation, + ID: "createMapfixAuditError", + } + ) + params, err := decodeCreateMapfixAuditErrorParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *CreateMapfixAuditErrorNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: CreateMapfixAuditErrorOperation, + OperationSummary: "Validator posts an error to the audit log", + OperationID: "createMapfixAuditError", + Body: nil, + Params: middleware.Parameters{ + { + Name: "MapfixID", + In: "path", + }: params.MapfixID, + { + Name: "ErrorMessage", + In: "query", + }: params.ErrorMessage, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = CreateMapfixAuditErrorParams + Response = *CreateMapfixAuditErrorNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackCreateMapfixAuditErrorParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.CreateMapfixAuditError(ctx, params) + return response, err + }, + ) + } else { + err = s.h.CreateMapfixAuditError(ctx, params) + } + 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 := encodeCreateMapfixAuditErrorResponse(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. +// +// POST /scripts +func (s *Server) handleCreateScriptRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createScript"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/scripts"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), CreateScriptOperation, + 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: CreateScriptOperation, + ID: "createScript", + } + ) + request, close, err := s.decodeCreateScriptRequest(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 *ScriptID + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: CreateScriptOperation, + OperationSummary: "Create a new script", + OperationID: "createScript", + Body: request, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = *ScriptCreate + Params = struct{} + Response = *ScriptID + ) + 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.CreateScript(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.CreateScript(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 := encodeCreateScriptResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleCreateScriptPolicyRequest handles createScriptPolicy operation. +// +// Create a new script policy. +// +// POST /script-policy +func (s *Server) handleCreateScriptPolicyRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createScriptPolicy"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/script-policy"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), CreateScriptPolicyOperation, + 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: CreateScriptPolicyOperation, + ID: "createScriptPolicy", + } + ) + request, close, err := s.decodeCreateScriptPolicyRequest(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 *ScriptPolicyID + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: CreateScriptPolicyOperation, + OperationSummary: "Create a new script policy", + OperationID: "createScriptPolicy", + Body: request, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = *ScriptPolicyCreate + Params = struct{} + Response = *ScriptPolicyID + ) + 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.CreateScriptPolicy(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.CreateScriptPolicy(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 := encodeCreateScriptPolicyResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// 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 *SubmissionID + 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 = *SubmissionID + ) + 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 + } +} + +// handleCreateSubmissionAuditCheckListRequest handles createSubmissionAuditCheckList operation. +// +// Validator posts a checklist to the audit log. +// +// POST /submissions/{SubmissionID}/checklist +func (s *Server) handleCreateSubmissionAuditCheckListRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createSubmissionAuditCheckList"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/checklist"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), CreateSubmissionAuditCheckListOperation, + 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: CreateSubmissionAuditCheckListOperation, + ID: "createSubmissionAuditCheckList", + } + ) + params, err := decodeCreateSubmissionAuditCheckListParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + request, close, err := s.decodeCreateSubmissionAuditCheckListRequest(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 *CreateSubmissionAuditCheckListNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: CreateSubmissionAuditCheckListOperation, + OperationSummary: "Validator posts a checklist to the audit log", + OperationID: "createSubmissionAuditCheckList", + Body: request, + Params: middleware.Parameters{ + { + Name: "SubmissionID", + In: "path", + }: params.SubmissionID, + }, + Raw: r, + } + + type ( + Request = CheckList + Params = CreateSubmissionAuditCheckListParams + Response = *CreateSubmissionAuditCheckListNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackCreateSubmissionAuditCheckListParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.CreateSubmissionAuditCheckList(ctx, request, params) + return response, err + }, + ) + } else { + err = s.h.CreateSubmissionAuditCheckList(ctx, request, params) + } + 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 := encodeCreateSubmissionAuditCheckListResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleCreateSubmissionAuditErrorRequest handles createSubmissionAuditError operation. +// +// Validator posts an error to the audit log. +// +// POST /submissions/{SubmissionID}/error +func (s *Server) handleCreateSubmissionAuditErrorRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("createSubmissionAuditError"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/error"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), CreateSubmissionAuditErrorOperation, + 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: CreateSubmissionAuditErrorOperation, + ID: "createSubmissionAuditError", + } + ) + params, err := decodeCreateSubmissionAuditErrorParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *CreateSubmissionAuditErrorNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: CreateSubmissionAuditErrorOperation, + OperationSummary: "Validator posts an error to the audit log", + OperationID: "createSubmissionAuditError", + Body: nil, + Params: middleware.Parameters{ + { + Name: "SubmissionID", + In: "path", + }: params.SubmissionID, + { + Name: "ErrorMessage", + In: "query", + }: params.ErrorMessage, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = CreateSubmissionAuditErrorParams + Response = *CreateSubmissionAuditErrorNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackCreateSubmissionAuditErrorParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.CreateSubmissionAuditError(ctx, params) + return response, err + }, + ) + } else { + err = s.h.CreateSubmissionAuditError(ctx, params) + } + 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 := encodeCreateSubmissionAuditErrorResponse(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. +// +// GET /scripts/{ScriptID} +func (s *Server) handleGetScriptRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getScript"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/scripts/{ScriptID}"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), GetScriptOperation, + 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: GetScriptOperation, + ID: "getScript", + } + ) + params, err := decodeGetScriptParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *Script + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: GetScriptOperation, + OperationSummary: "Get the specified script by ID", + OperationID: "getScript", + Body: nil, + Params: middleware.Parameters{ + { + Name: "ScriptID", + In: "path", + }: params.ScriptID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = GetScriptParams + Response = *Script + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackGetScriptParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.GetScript(ctx, params) + return response, err + }, + ) + } else { + response, err = s.h.GetScript(ctx, params) + } + 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 := encodeGetScriptResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleListScriptPolicyRequest handles listScriptPolicy operation. +// +// Get list of script policies. +// +// GET /script-policy +func (s *Server) handleListScriptPolicyRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listScriptPolicy"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/script-policy"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ListScriptPolicyOperation, + 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: ListScriptPolicyOperation, + ID: "listScriptPolicy", + } + ) + params, err := decodeListScriptPolicyParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response []ScriptPolicy + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ListScriptPolicyOperation, + OperationSummary: "Get list of script policies", + OperationID: "listScriptPolicy", + Body: nil, + Params: middleware.Parameters{ + { + Name: "Page", + In: "query", + }: params.Page, + { + Name: "Limit", + In: "query", + }: params.Limit, + { + Name: "FromScriptHash", + In: "query", + }: params.FromScriptHash, + { + Name: "ToScriptID", + In: "query", + }: params.ToScriptID, + { + Name: "Policy", + In: "query", + }: params.Policy, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ListScriptPolicyParams + Response = []ScriptPolicy + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackListScriptPolicyParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.ListScriptPolicy(ctx, params) + return response, err + }, + ) + } else { + response, err = s.h.ListScriptPolicy(ctx, params) + } + 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 := encodeListScriptPolicyResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleListScriptsRequest handles listScripts operation. +// +// Get list of scripts. +// +// GET /scripts +func (s *Server) handleListScriptsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listScripts"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/scripts"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ListScriptsOperation, + 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: ListScriptsOperation, + ID: "listScripts", + } + ) + params, err := decodeListScriptsParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response []Script + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ListScriptsOperation, + OperationSummary: "Get list of scripts", + OperationID: "listScripts", + Body: nil, + Params: middleware.Parameters{ + { + Name: "Page", + In: "query", + }: params.Page, + { + Name: "Limit", + In: "query", + }: params.Limit, + { + Name: "Hash", + In: "query", + }: params.Hash, + { + Name: "Name", + In: "query", + }: params.Name, + { + Name: "Source", + In: "query", + }: params.Source, + { + Name: "ResourceType", + In: "query", + }: params.ResourceType, + { + Name: "ResourceID", + In: "query", + }: params.ResourceID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ListScriptsParams + Response = []Script + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackListScriptsParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.ListScripts(ctx, params) + return response, err + }, + ) + } else { + response, err = s.h.ListScripts(ctx, params) + } + 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 := encodeListScriptsResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleUpdateMapfixValidatedModelRequest handles updateMapfixValidatedModel operation. +// +// Update validated model. +// +// POST /mapfixes/{MapfixID}/validated-model +func (s *Server) handleUpdateMapfixValidatedModelRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("updateMapfixValidatedModel"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/mapfixes/{MapfixID}/validated-model"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), UpdateMapfixValidatedModelOperation, + 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: UpdateMapfixValidatedModelOperation, + ID: "updateMapfixValidatedModel", + } + ) + params, err := decodeUpdateMapfixValidatedModelParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *UpdateMapfixValidatedModelNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: UpdateMapfixValidatedModelOperation, + OperationSummary: "Update validated model", + OperationID: "updateMapfixValidatedModel", + Body: nil, + Params: middleware.Parameters{ + { + Name: "MapfixID", + In: "path", + }: params.MapfixID, + { + Name: "ValidatedModelID", + In: "query", + }: params.ValidatedModelID, + { + Name: "ValidatedModelVersion", + In: "query", + }: params.ValidatedModelVersion, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = UpdateMapfixValidatedModelParams + Response = *UpdateMapfixValidatedModelNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackUpdateMapfixValidatedModelParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.UpdateMapfixValidatedModel(ctx, params) + return response, err + }, + ) + } else { + err = s.h.UpdateMapfixValidatedModel(ctx, params) + } + 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 := encodeUpdateMapfixValidatedModelResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleUpdateSubmissionValidatedModelRequest handles updateSubmissionValidatedModel operation. +// +// Update validated model. +// +// POST /submissions/{SubmissionID}/validated-model +func (s *Server) handleUpdateSubmissionValidatedModelRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("updateSubmissionValidatedModel"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/validated-model"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), UpdateSubmissionValidatedModelOperation, + 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: UpdateSubmissionValidatedModelOperation, + ID: "updateSubmissionValidatedModel", + } + ) + params, err := decodeUpdateSubmissionValidatedModelParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var response *UpdateSubmissionValidatedModelNoContent + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: UpdateSubmissionValidatedModelOperation, + OperationSummary: "Update validated model", + OperationID: "updateSubmissionValidatedModel", + Body: nil, + Params: middleware.Parameters{ + { + Name: "SubmissionID", + In: "path", + }: params.SubmissionID, + { + Name: "ValidatedModelID", + In: "query", + }: params.ValidatedModelID, + { + Name: "ValidatedModelVersion", + In: "query", + }: params.ValidatedModelVersion, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = UpdateSubmissionValidatedModelParams + Response = *UpdateSubmissionValidatedModelNoContent + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackUpdateSubmissionValidatedModelParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + err = s.h.UpdateSubmissionValidatedModel(ctx, params) + return response, err + }, + ) + } else { + err = s.h.UpdateSubmissionValidatedModel(ctx, params) + } + 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 := encodeUpdateSubmissionValidatedModelResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} diff --git a/pkg/internal/oas_json_gen.go b/pkg/internal/oas_json_gen.go new file mode 100644 index 0000000..4f95e1c --- /dev/null +++ b/pkg/internal/oas_json_gen.go @@ -0,0 +1,1796 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "math/bits" + "strconv" + + "github.com/go-faster/errors" + "github.com/go-faster/jx" + + "github.com/ogen-go/ogen/validate" +) + +// Encode implements json.Marshaler. +func (s *Check) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *Check) encodeFields(e *jx.Encoder) { + { + e.FieldStart("Name") + e.Str(s.Name) + } + { + e.FieldStart("Summary") + e.Str(s.Summary) + } + { + e.FieldStart("Passed") + e.Bool(s.Passed) + } +} + +var jsonFieldsNameOfCheck = [3]string{ + 0: "Name", + 1: "Summary", + 2: "Passed", +} + +// Decode decodes Check from json. +func (s *Check) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode Check to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "Name": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Name = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Name\"") + } + case "Summary": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Summary = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Summary\"") + } + case "Passed": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.Bool() + s.Passed = bool(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Passed\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode Check") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000111, + } { + 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(jsonFieldsNameOfCheck) { + name = jsonFieldsNameOfCheck[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 *Check) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *Check) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes CheckList as json. +func (s CheckList) Encode(e *jx.Encoder) { + unwrapped := []Check(s) + + e.ArrStart() + for _, elem := range unwrapped { + elem.Encode(e) + } + e.ArrEnd() +} + +// Decode decodes CheckList from json. +func (s *CheckList) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode CheckList to nil") + } + var unwrapped []Check + if err := func() error { + unwrapped = make([]Check, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem Check + if err := elem.Decode(d); err != nil { + return err + } + unwrapped = append(unwrapped, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = CheckList(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s CheckList) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *CheckList) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *Error) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *Error) encodeFields(e *jx.Encoder) { + { + e.FieldStart("code") + e.Int64(s.Code) + } + { + e.FieldStart("message") + e.Str(s.Message) + } +} + +var jsonFieldsNameOfError = [2]string{ + 0: "code", + 1: "message", +} + +// Decode decodes Error from json. +func (s *Error) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode Error to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "code": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.Code = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"code\"") + } + case "message": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Message = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"message\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode Error") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + 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(jsonFieldsNameOfError) { + name = jsonFieldsNameOfError[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 *Error) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *Error) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + 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) + } + { + e.FieldStart("Description") + e.Str(s.Description) + } +} + +var jsonFieldsNameOfMapfixCreate = [9]string{ + 0: "OperationID", + 1: "AssetOwner", + 2: "DisplayName", + 3: "Creator", + 4: "GameID", + 5: "AssetID", + 6: "AssetVersion", + 7: "TargetAssetID", + 8: "Description", +} + +// 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 [2]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\"") + } + case "Description": + requiredBitSet[1] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Description = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Description\"") + } + 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 [2]uint8{ + 0b11111111, + 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(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 implements json.Marshaler. +func (s *MapfixID) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *MapfixID) encodeFields(e *jx.Encoder) { + { + e.FieldStart("MapfixID") + e.Int64(s.MapfixID) + } +} + +var jsonFieldsNameOfMapfixID = [1]string{ + 0: "MapfixID", +} + +// Decode decodes MapfixID from json. +func (s *MapfixID) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode MapfixID to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "MapfixID": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.MapfixID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"MapfixID\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode MapfixID") + } + // 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(jsonFieldsNameOfMapfixID) { + name = jsonFieldsNameOfMapfixID[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 *MapfixID) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *MapfixID) 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 { + return + } + e.Int64(int64(o.Value)) +} + +// Decode decodes int64 from json. +func (o *OptInt64) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptInt64 to nil") + } + o.Set = true + v, err := d.Int64() + if err != nil { + return err + } + o.Value = int64(v) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptInt64) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptInt64) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *Script) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *Script) encodeFields(e *jx.Encoder) { + { + e.FieldStart("ID") + e.Int64(s.ID) + } + { + e.FieldStart("Name") + e.Str(s.Name) + } + { + e.FieldStart("Hash") + e.Str(s.Hash) + } + { + e.FieldStart("Source") + e.Str(s.Source) + } + { + e.FieldStart("ResourceType") + e.Int32(s.ResourceType) + } + { + e.FieldStart("ResourceID") + e.Int64(s.ResourceID) + } +} + +var jsonFieldsNameOfScript = [6]string{ + 0: "ID", + 1: "Name", + 2: "Hash", + 3: "Source", + 4: "ResourceType", + 5: "ResourceID", +} + +// Decode decodes Script from json. +func (s *Script) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode Script to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "ID": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.ID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ID\"") + } + case "Name": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Name = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Name\"") + } + case "Hash": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.Str() + s.Hash = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Hash\"") + } + case "Source": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + v, err := d.Str() + s.Source = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Source\"") + } + case "ResourceType": + requiredBitSet[0] |= 1 << 4 + if err := func() error { + v, err := d.Int32() + s.ResourceType = int32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ResourceType\"") + } + case "ResourceID": + requiredBitSet[0] |= 1 << 5 + if err := func() error { + v, err := d.Int64() + s.ResourceID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ResourceID\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode Script") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00111111, + } { + 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(jsonFieldsNameOfScript) { + name = jsonFieldsNameOfScript[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 *Script) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *Script) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ScriptCreate) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ScriptCreate) encodeFields(e *jx.Encoder) { + { + e.FieldStart("Name") + e.Str(s.Name) + } + { + e.FieldStart("Source") + e.Str(s.Source) + } + { + e.FieldStart("ResourceType") + e.Int32(s.ResourceType) + } + { + if s.ResourceID.Set { + e.FieldStart("ResourceID") + s.ResourceID.Encode(e) + } + } +} + +var jsonFieldsNameOfScriptCreate = [4]string{ + 0: "Name", + 1: "Source", + 2: "ResourceType", + 3: "ResourceID", +} + +// Decode decodes ScriptCreate from json. +func (s *ScriptCreate) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ScriptCreate to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "Name": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Name = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Name\"") + } + case "Source": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Source = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Source\"") + } + case "ResourceType": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.Int32() + s.ResourceType = int32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ResourceType\"") + } + case "ResourceID": + if err := func() error { + s.ResourceID.Reset() + if err := s.ResourceID.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ResourceID\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ScriptCreate") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000111, + } { + 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(jsonFieldsNameOfScriptCreate) { + name = jsonFieldsNameOfScriptCreate[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 *ScriptCreate) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ScriptCreate) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ScriptID) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ScriptID) encodeFields(e *jx.Encoder) { + { + e.FieldStart("ScriptID") + e.Int64(s.ScriptID) + } +} + +var jsonFieldsNameOfScriptID = [1]string{ + 0: "ScriptID", +} + +// Decode decodes ScriptID from json. +func (s *ScriptID) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ScriptID to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "ScriptID": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.ScriptID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ScriptID\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ScriptID") + } + // 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(jsonFieldsNameOfScriptID) { + name = jsonFieldsNameOfScriptID[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 *ScriptID) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ScriptID) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ScriptPolicy) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ScriptPolicy) encodeFields(e *jx.Encoder) { + { + e.FieldStart("ID") + e.Int64(s.ID) + } + { + e.FieldStart("FromScriptHash") + e.Str(s.FromScriptHash) + } + { + e.FieldStart("ToScriptID") + e.Int64(s.ToScriptID) + } + { + e.FieldStart("Policy") + e.Int32(s.Policy) + } +} + +var jsonFieldsNameOfScriptPolicy = [4]string{ + 0: "ID", + 1: "FromScriptHash", + 2: "ToScriptID", + 3: "Policy", +} + +// Decode decodes ScriptPolicy from json. +func (s *ScriptPolicy) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ScriptPolicy to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "ID": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.ID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ID\"") + } + case "FromScriptHash": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.FromScriptHash = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"FromScriptHash\"") + } + case "ToScriptID": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.Int64() + s.ToScriptID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ToScriptID\"") + } + case "Policy": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + v, err := d.Int32() + s.Policy = int32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Policy\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ScriptPolicy") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00001111, + } { + 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(jsonFieldsNameOfScriptPolicy) { + name = jsonFieldsNameOfScriptPolicy[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 *ScriptPolicy) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ScriptPolicy) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ScriptPolicyCreate) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ScriptPolicyCreate) encodeFields(e *jx.Encoder) { + { + e.FieldStart("FromScriptID") + e.Int64(s.FromScriptID) + } + { + e.FieldStart("ToScriptID") + e.Int64(s.ToScriptID) + } + { + e.FieldStart("Policy") + e.Int32(s.Policy) + } +} + +var jsonFieldsNameOfScriptPolicyCreate = [3]string{ + 0: "FromScriptID", + 1: "ToScriptID", + 2: "Policy", +} + +// Decode decodes ScriptPolicyCreate from json. +func (s *ScriptPolicyCreate) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ScriptPolicyCreate to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "FromScriptID": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.FromScriptID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"FromScriptID\"") + } + case "ToScriptID": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Int64() + s.ToScriptID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ToScriptID\"") + } + case "Policy": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.Int32() + s.Policy = int32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Policy\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ScriptPolicyCreate") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000111, + } { + 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(jsonFieldsNameOfScriptPolicyCreate) { + name = jsonFieldsNameOfScriptPolicyCreate[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 *ScriptPolicyCreate) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ScriptPolicyCreate) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ScriptPolicyID) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ScriptPolicyID) encodeFields(e *jx.Encoder) { + { + e.FieldStart("ScriptPolicyID") + e.Int64(s.ScriptPolicyID) + } +} + +var jsonFieldsNameOfScriptPolicyID = [1]string{ + 0: "ScriptPolicyID", +} + +// Decode decodes ScriptPolicyID from json. +func (s *ScriptPolicyID) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ScriptPolicyID to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "ScriptPolicyID": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.ScriptPolicyID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ScriptPolicyID\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ScriptPolicyID") + } + // 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(jsonFieldsNameOfScriptPolicyID) { + name = jsonFieldsNameOfScriptPolicyID[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 *ScriptPolicyID) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ScriptPolicyID) 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) + } + { + e.FieldStart("Status") + e.UInt32(s.Status) + } + { + e.FieldStart("Roles") + e.UInt32(s.Roles) + } +} + +var jsonFieldsNameOfSubmissionCreate = [9]string{ + 0: "OperationID", + 1: "AssetOwner", + 2: "DisplayName", + 3: "Creator", + 4: "GameID", + 5: "AssetID", + 6: "AssetVersion", + 7: "Status", + 8: "Roles", +} + +// 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 [2]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 "Status": + requiredBitSet[0] |= 1 << 7 + if err := func() error { + v, err := d.UInt32() + s.Status = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Status\"") + } + case "Roles": + requiredBitSet[1] |= 1 << 0 + if err := func() error { + v, err := d.UInt32() + s.Roles = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"Roles\"") + } + 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 [2]uint8{ + 0b11111111, + 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(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) +} + +// Encode implements json.Marshaler. +func (s *SubmissionID) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *SubmissionID) encodeFields(e *jx.Encoder) { + { + e.FieldStart("SubmissionID") + e.Int64(s.SubmissionID) + } +} + +var jsonFieldsNameOfSubmissionID = [1]string{ + 0: "SubmissionID", +} + +// Decode decodes SubmissionID from json. +func (s *SubmissionID) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode SubmissionID to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "SubmissionID": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.SubmissionID = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"SubmissionID\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode SubmissionID") + } + // 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(jsonFieldsNameOfSubmissionID) { + name = jsonFieldsNameOfSubmissionID[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 *SubmissionID) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *SubmissionID) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} diff --git a/pkg/internal/oas_labeler_gen.go b/pkg/internal/oas_labeler_gen.go new file mode 100644 index 0000000..7e519e8 --- /dev/null +++ b/pkg/internal/oas_labeler_gen.go @@ -0,0 +1,42 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "context" + + "go.opentelemetry.io/otel/attribute" +) + +// Labeler is used to allow adding custom attributes to the server request metrics. +type Labeler struct { + attrs []attribute.KeyValue +} + +// Add attributes to the Labeler. +func (l *Labeler) Add(attrs ...attribute.KeyValue) { + l.attrs = append(l.attrs, attrs...) +} + +// AttributeSet returns the attributes added to the Labeler as an attribute.Set. +func (l *Labeler) AttributeSet() attribute.Set { + return attribute.NewSet(l.attrs...) +} + +type labelerContextKey struct{} + +// LabelerFromContext retrieves the Labeler from the provided context, if present. +// +// If no Labeler was found in the provided context a new, empty Labeler is returned and the second +// return value is false. In this case it is safe to use the Labeler but any attributes added to +// it will not be used. +func LabelerFromContext(ctx context.Context) (*Labeler, bool) { + if l, ok := ctx.Value(labelerContextKey{}).(*Labeler); ok { + return l, true + } + return &Labeler{}, false +} + +func contextWithLabeler(ctx context.Context, l *Labeler) context.Context { + return context.WithValue(ctx, labelerContextKey{}, l) +} diff --git a/pkg/internal/oas_middleware_gen.go b/pkg/internal/oas_middleware_gen.go new file mode 100644 index 0000000..6f58a1a --- /dev/null +++ b/pkg/internal/oas_middleware_gen.go @@ -0,0 +1,10 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "github.com/ogen-go/ogen/middleware" +) + +// Middleware is middleware type. +type Middleware = middleware.Middleware diff --git a/pkg/internal/oas_operations_gen.go b/pkg/internal/oas_operations_gen.go new file mode 100644 index 0000000..a789b23 --- /dev/null +++ b/pkg/internal/oas_operations_gen.go @@ -0,0 +1,33 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +// OperationName is the ogen operation name +type OperationName = string + +const ( + ActionMapfixAcceptedOperation OperationName = "ActionMapfixAccepted" + ActionMapfixRequestChangesOperation OperationName = "ActionMapfixRequestChanges" + ActionMapfixSubmittedOperation OperationName = "ActionMapfixSubmitted" + ActionMapfixUploadedOperation OperationName = "ActionMapfixUploaded" + ActionMapfixValidatedOperation OperationName = "ActionMapfixValidated" + ActionOperationFailedOperation OperationName = "ActionOperationFailed" + ActionSubmissionAcceptedOperation OperationName = "ActionSubmissionAccepted" + ActionSubmissionRequestChangesOperation OperationName = "ActionSubmissionRequestChanges" + ActionSubmissionSubmittedOperation OperationName = "ActionSubmissionSubmitted" + ActionSubmissionUploadedOperation OperationName = "ActionSubmissionUploaded" + ActionSubmissionValidatedOperation OperationName = "ActionSubmissionValidated" + CreateMapfixOperation OperationName = "CreateMapfix" + CreateMapfixAuditCheckListOperation OperationName = "CreateMapfixAuditCheckList" + CreateMapfixAuditErrorOperation OperationName = "CreateMapfixAuditError" + CreateScriptOperation OperationName = "CreateScript" + CreateScriptPolicyOperation OperationName = "CreateScriptPolicy" + CreateSubmissionOperation OperationName = "CreateSubmission" + CreateSubmissionAuditCheckListOperation OperationName = "CreateSubmissionAuditCheckList" + CreateSubmissionAuditErrorOperation OperationName = "CreateSubmissionAuditError" + GetScriptOperation OperationName = "GetScript" + ListScriptPolicyOperation OperationName = "ListScriptPolicy" + ListScriptsOperation OperationName = "ListScripts" + UpdateMapfixValidatedModelOperation OperationName = "UpdateMapfixValidatedModel" + UpdateSubmissionValidatedModelOperation OperationName = "UpdateSubmissionValidatedModel" +) diff --git a/pkg/internal/oas_parameters_gen.go b/pkg/internal/oas_parameters_gen.go new file mode 100644 index 0000000..7194603 --- /dev/null +++ b/pkg/internal/oas_parameters_gen.go @@ -0,0 +1,3353 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "net/http" + "net/url" + + "github.com/go-faster/errors" + + "github.com/ogen-go/ogen/conv" + "github.com/ogen-go/ogen/middleware" + "github.com/ogen-go/ogen/ogenerrors" + "github.com/ogen-go/ogen/uri" + "github.com/ogen-go/ogen/validate" +) + +// ActionMapfixAcceptedParams is parameters of actionMapfixAccepted operation. +type ActionMapfixAcceptedParams struct { + // The unique identifier for a submission. + MapfixID int64 +} + +func unpackActionMapfixAcceptedParams(packed middleware.Parameters) (params ActionMapfixAcceptedParams) { + { + key := middleware.ParameterKey{ + Name: "MapfixID", + In: "path", + } + params.MapfixID = packed[key].(int64) + } + return params +} + +func decodeActionMapfixAcceptedParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionMapfixAcceptedParams, _ error) { + // Decode path: MapfixID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "MapfixID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.MapfixID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.MapfixID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "MapfixID", + In: "path", + Err: err, + } + } + return params, nil +} + +// ActionMapfixRequestChangesParams is parameters of actionMapfixRequestChanges operation. +type ActionMapfixRequestChangesParams struct { + // The unique identifier for a submission. + MapfixID int64 +} + +func unpackActionMapfixRequestChangesParams(packed middleware.Parameters) (params ActionMapfixRequestChangesParams) { + { + key := middleware.ParameterKey{ + Name: "MapfixID", + In: "path", + } + params.MapfixID = packed[key].(int64) + } + return params +} + +func decodeActionMapfixRequestChangesParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionMapfixRequestChangesParams, _ error) { + // Decode path: MapfixID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "MapfixID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.MapfixID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.MapfixID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "MapfixID", + In: "path", + Err: err, + } + } + return params, nil +} + +// ActionMapfixSubmittedParams is parameters of actionMapfixSubmitted operation. +type ActionMapfixSubmittedParams struct { + // The unique identifier for a submission. + MapfixID int64 + ModelVersion int64 + DisplayName string + Creator string + GameID int32 +} + +func unpackActionMapfixSubmittedParams(packed middleware.Parameters) (params ActionMapfixSubmittedParams) { + { + key := middleware.ParameterKey{ + Name: "MapfixID", + In: "path", + } + params.MapfixID = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "ModelVersion", + In: "query", + } + params.ModelVersion = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "DisplayName", + In: "query", + } + params.DisplayName = packed[key].(string) + } + { + key := middleware.ParameterKey{ + Name: "Creator", + In: "query", + } + params.Creator = packed[key].(string) + } + { + key := middleware.ParameterKey{ + Name: "GameID", + In: "query", + } + params.GameID = packed[key].(int32) + } + return params +} + +func decodeActionMapfixSubmittedParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionMapfixSubmittedParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode path: MapfixID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "MapfixID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.MapfixID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.MapfixID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "MapfixID", + In: "path", + Err: err, + } + } + // Decode query: ModelVersion. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ModelVersion", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.ModelVersion = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.ModelVersion)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ModelVersion", + In: "query", + Err: err, + } + } + // Decode query: DisplayName. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "DisplayName", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + params.DisplayName = c + return nil + }); err != nil { + return 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(params.DisplayName)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "DisplayName", + In: "query", + Err: err, + } + } + // Decode query: Creator. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "Creator", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + params.Creator = c + return nil + }); err != nil { + return 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(params.Creator)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "Creator", + In: "query", + Err: err, + } + } + // Decode query: GameID. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "GameID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt32(val) + if err != nil { + return err + } + + params.GameID = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.GameID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "GameID", + In: "query", + Err: err, + } + } + return params, nil +} + +// ActionMapfixUploadedParams is parameters of actionMapfixUploaded operation. +type ActionMapfixUploadedParams struct { + // The unique identifier for a submission. + MapfixID int64 +} + +func unpackActionMapfixUploadedParams(packed middleware.Parameters) (params ActionMapfixUploadedParams) { + { + key := middleware.ParameterKey{ + Name: "MapfixID", + In: "path", + } + params.MapfixID = packed[key].(int64) + } + return params +} + +func decodeActionMapfixUploadedParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionMapfixUploadedParams, _ error) { + // Decode path: MapfixID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "MapfixID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.MapfixID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.MapfixID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "MapfixID", + In: "path", + Err: err, + } + } + return params, nil +} + +// ActionMapfixValidatedParams is parameters of actionMapfixValidated operation. +type ActionMapfixValidatedParams struct { + // The unique identifier for a submission. + MapfixID int64 +} + +func unpackActionMapfixValidatedParams(packed middleware.Parameters) (params ActionMapfixValidatedParams) { + { + key := middleware.ParameterKey{ + Name: "MapfixID", + In: "path", + } + params.MapfixID = packed[key].(int64) + } + return params +} + +func decodeActionMapfixValidatedParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionMapfixValidatedParams, _ error) { + // Decode path: MapfixID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "MapfixID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.MapfixID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.MapfixID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "MapfixID", + In: "path", + Err: err, + } + } + return params, nil +} + +// ActionOperationFailedParams is parameters of actionOperationFailed operation. +type ActionOperationFailedParams struct { + // The unique identifier for a long-running operation. + OperationID int32 + StatusMessage string +} + +func unpackActionOperationFailedParams(packed middleware.Parameters) (params ActionOperationFailedParams) { + { + key := middleware.ParameterKey{ + Name: "OperationID", + In: "path", + } + params.OperationID = packed[key].(int32) + } + { + key := middleware.ParameterKey{ + Name: "StatusMessage", + In: "query", + } + params.StatusMessage = packed[key].(string) + } + return params +} + +func decodeActionOperationFailedParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionOperationFailedParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode path: OperationID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "OperationID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt32(val) + if err != nil { + return err + } + + params.OperationID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.OperationID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "OperationID", + In: "path", + Err: err, + } + } + // Decode query: StatusMessage. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "StatusMessage", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + params.StatusMessage = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: true, + MaxLength: 4096, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(params.StatusMessage)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "StatusMessage", + In: "query", + Err: err, + } + } + return params, nil +} + +// ActionSubmissionAcceptedParams is parameters of actionSubmissionAccepted operation. +type ActionSubmissionAcceptedParams struct { + // The unique identifier for a submission. + SubmissionID int64 +} + +func unpackActionSubmissionAcceptedParams(packed middleware.Parameters) (params ActionSubmissionAcceptedParams) { + { + key := middleware.ParameterKey{ + Name: "SubmissionID", + In: "path", + } + params.SubmissionID = packed[key].(int64) + } + return params +} + +func decodeActionSubmissionAcceptedParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionSubmissionAcceptedParams, _ error) { + // Decode path: SubmissionID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "SubmissionID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.SubmissionID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.SubmissionID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "SubmissionID", + In: "path", + Err: err, + } + } + return params, nil +} + +// ActionSubmissionRequestChangesParams is parameters of actionSubmissionRequestChanges operation. +type ActionSubmissionRequestChangesParams struct { + // The unique identifier for a submission. + SubmissionID int64 +} + +func unpackActionSubmissionRequestChangesParams(packed middleware.Parameters) (params ActionSubmissionRequestChangesParams) { + { + key := middleware.ParameterKey{ + Name: "SubmissionID", + In: "path", + } + params.SubmissionID = packed[key].(int64) + } + return params +} + +func decodeActionSubmissionRequestChangesParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionSubmissionRequestChangesParams, _ error) { + // Decode path: SubmissionID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "SubmissionID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.SubmissionID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.SubmissionID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "SubmissionID", + In: "path", + Err: err, + } + } + return params, nil +} + +// ActionSubmissionSubmittedParams is parameters of actionSubmissionSubmitted operation. +type ActionSubmissionSubmittedParams struct { + // The unique identifier for a submission. + SubmissionID int64 + ModelVersion int64 + DisplayName string + Creator string + GameID int32 +} + +func unpackActionSubmissionSubmittedParams(packed middleware.Parameters) (params ActionSubmissionSubmittedParams) { + { + key := middleware.ParameterKey{ + Name: "SubmissionID", + In: "path", + } + params.SubmissionID = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "ModelVersion", + In: "query", + } + params.ModelVersion = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "DisplayName", + In: "query", + } + params.DisplayName = packed[key].(string) + } + { + key := middleware.ParameterKey{ + Name: "Creator", + In: "query", + } + params.Creator = packed[key].(string) + } + { + key := middleware.ParameterKey{ + Name: "GameID", + In: "query", + } + params.GameID = packed[key].(int32) + } + return params +} + +func decodeActionSubmissionSubmittedParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionSubmissionSubmittedParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode path: SubmissionID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "SubmissionID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.SubmissionID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.SubmissionID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "SubmissionID", + In: "path", + Err: err, + } + } + // Decode query: ModelVersion. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ModelVersion", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.ModelVersion = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.ModelVersion)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ModelVersion", + In: "query", + Err: err, + } + } + // Decode query: DisplayName. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "DisplayName", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + params.DisplayName = c + return nil + }); err != nil { + return 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(params.DisplayName)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "DisplayName", + In: "query", + Err: err, + } + } + // Decode query: Creator. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "Creator", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + params.Creator = c + return nil + }); err != nil { + return 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(params.Creator)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "Creator", + In: "query", + Err: err, + } + } + // Decode query: GameID. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "GameID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt32(val) + if err != nil { + return err + } + + params.GameID = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.GameID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "GameID", + In: "query", + Err: err, + } + } + return params, nil +} + +// ActionSubmissionUploadedParams is parameters of actionSubmissionUploaded operation. +type ActionSubmissionUploadedParams struct { + // The unique identifier for a submission. + SubmissionID int64 + UploadedAssetID int64 +} + +func unpackActionSubmissionUploadedParams(packed middleware.Parameters) (params ActionSubmissionUploadedParams) { + { + key := middleware.ParameterKey{ + Name: "SubmissionID", + In: "path", + } + params.SubmissionID = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "UploadedAssetID", + In: "query", + } + params.UploadedAssetID = packed[key].(int64) + } + return params +} + +func decodeActionSubmissionUploadedParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionSubmissionUploadedParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode path: SubmissionID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "SubmissionID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.SubmissionID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.SubmissionID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "SubmissionID", + In: "path", + Err: err, + } + } + // Decode query: UploadedAssetID. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "UploadedAssetID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.UploadedAssetID = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.UploadedAssetID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "UploadedAssetID", + In: "query", + Err: err, + } + } + return params, nil +} + +// ActionSubmissionValidatedParams is parameters of actionSubmissionValidated operation. +type ActionSubmissionValidatedParams struct { + // The unique identifier for a submission. + SubmissionID int64 +} + +func unpackActionSubmissionValidatedParams(packed middleware.Parameters) (params ActionSubmissionValidatedParams) { + { + key := middleware.ParameterKey{ + Name: "SubmissionID", + In: "path", + } + params.SubmissionID = packed[key].(int64) + } + return params +} + +func decodeActionSubmissionValidatedParams(args [1]string, argsEscaped bool, r *http.Request) (params ActionSubmissionValidatedParams, _ error) { + // Decode path: SubmissionID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "SubmissionID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.SubmissionID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.SubmissionID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "SubmissionID", + In: "path", + Err: err, + } + } + return params, nil +} + +// CreateMapfixAuditCheckListParams is parameters of createMapfixAuditCheckList operation. +type CreateMapfixAuditCheckListParams struct { + // The unique identifier for a submission. + MapfixID int64 +} + +func unpackCreateMapfixAuditCheckListParams(packed middleware.Parameters) (params CreateMapfixAuditCheckListParams) { + { + key := middleware.ParameterKey{ + Name: "MapfixID", + In: "path", + } + params.MapfixID = packed[key].(int64) + } + return params +} + +func decodeCreateMapfixAuditCheckListParams(args [1]string, argsEscaped bool, r *http.Request) (params CreateMapfixAuditCheckListParams, _ error) { + // Decode path: MapfixID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "MapfixID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.MapfixID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.MapfixID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "MapfixID", + In: "path", + Err: err, + } + } + return params, nil +} + +// CreateMapfixAuditErrorParams is parameters of createMapfixAuditError operation. +type CreateMapfixAuditErrorParams struct { + // The unique identifier for a submission. + MapfixID int64 + ErrorMessage string +} + +func unpackCreateMapfixAuditErrorParams(packed middleware.Parameters) (params CreateMapfixAuditErrorParams) { + { + key := middleware.ParameterKey{ + Name: "MapfixID", + In: "path", + } + params.MapfixID = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "ErrorMessage", + In: "query", + } + params.ErrorMessage = packed[key].(string) + } + return params +} + +func decodeCreateMapfixAuditErrorParams(args [1]string, argsEscaped bool, r *http.Request) (params CreateMapfixAuditErrorParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode path: MapfixID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "MapfixID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.MapfixID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.MapfixID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "MapfixID", + In: "path", + Err: err, + } + } + // Decode query: ErrorMessage. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ErrorMessage", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + params.ErrorMessage = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: true, + MaxLength: 4096, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(params.ErrorMessage)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ErrorMessage", + In: "query", + Err: err, + } + } + return params, nil +} + +// CreateSubmissionAuditCheckListParams is parameters of createSubmissionAuditCheckList operation. +type CreateSubmissionAuditCheckListParams struct { + // The unique identifier for a submission. + SubmissionID int64 +} + +func unpackCreateSubmissionAuditCheckListParams(packed middleware.Parameters) (params CreateSubmissionAuditCheckListParams) { + { + key := middleware.ParameterKey{ + Name: "SubmissionID", + In: "path", + } + params.SubmissionID = packed[key].(int64) + } + return params +} + +func decodeCreateSubmissionAuditCheckListParams(args [1]string, argsEscaped bool, r *http.Request) (params CreateSubmissionAuditCheckListParams, _ error) { + // Decode path: SubmissionID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "SubmissionID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.SubmissionID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.SubmissionID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "SubmissionID", + In: "path", + Err: err, + } + } + return params, nil +} + +// CreateSubmissionAuditErrorParams is parameters of createSubmissionAuditError operation. +type CreateSubmissionAuditErrorParams struct { + // The unique identifier for a submission. + SubmissionID int64 + ErrorMessage string +} + +func unpackCreateSubmissionAuditErrorParams(packed middleware.Parameters) (params CreateSubmissionAuditErrorParams) { + { + key := middleware.ParameterKey{ + Name: "SubmissionID", + In: "path", + } + params.SubmissionID = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "ErrorMessage", + In: "query", + } + params.ErrorMessage = packed[key].(string) + } + return params +} + +func decodeCreateSubmissionAuditErrorParams(args [1]string, argsEscaped bool, r *http.Request) (params CreateSubmissionAuditErrorParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode path: SubmissionID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "SubmissionID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.SubmissionID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.SubmissionID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "SubmissionID", + In: "path", + Err: err, + } + } + // Decode query: ErrorMessage. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ErrorMessage", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + params.ErrorMessage = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: true, + MaxLength: 4096, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(params.ErrorMessage)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ErrorMessage", + In: "query", + Err: err, + } + } + return params, nil +} + +// GetScriptParams is parameters of getScript operation. +type GetScriptParams struct { + // The unique identifier for a script. + ScriptID int64 +} + +func unpackGetScriptParams(packed middleware.Parameters) (params GetScriptParams) { + { + key := middleware.ParameterKey{ + Name: "ScriptID", + In: "path", + } + params.ScriptID = packed[key].(int64) + } + return params +} + +func decodeGetScriptParams(args [1]string, argsEscaped bool, r *http.Request) (params GetScriptParams, _ error) { + // Decode path: ScriptID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "ScriptID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.ScriptID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.ScriptID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ScriptID", + In: "path", + Err: err, + } + } + return params, nil +} + +// ListScriptPolicyParams is parameters of listScriptPolicy operation. +type ListScriptPolicyParams struct { + Page int32 + Limit int32 + FromScriptHash OptString + ToScriptID OptInt64 + Policy OptInt32 +} + +func unpackListScriptPolicyParams(packed middleware.Parameters) (params ListScriptPolicyParams) { + { + key := middleware.ParameterKey{ + Name: "Page", + In: "query", + } + params.Page = packed[key].(int32) + } + { + key := middleware.ParameterKey{ + Name: "Limit", + In: "query", + } + params.Limit = packed[key].(int32) + } + { + key := middleware.ParameterKey{ + Name: "FromScriptHash", + In: "query", + } + if v, ok := packed[key]; ok { + params.FromScriptHash = v.(OptString) + } + } + { + key := middleware.ParameterKey{ + Name: "ToScriptID", + In: "query", + } + if v, ok := packed[key]; ok { + params.ToScriptID = v.(OptInt64) + } + } + { + key := middleware.ParameterKey{ + Name: "Policy", + In: "query", + } + if v, ok := packed[key]; ok { + params.Policy = v.(OptInt32) + } + } + return params +} + +func decodeListScriptPolicyParams(args [0]string, argsEscaped bool, r *http.Request) (params ListScriptPolicyParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode query: Page. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "Page", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt32(val) + if err != nil { + return err + } + + params.Page = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 1, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.Page)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "Page", + In: "query", + Err: err, + } + } + // Decode query: Limit. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "Limit", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt32(val) + if err != nil { + return err + } + + params.Limit = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 1, + MaxSet: true, + Max: 100, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.Limit)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "Limit", + In: "query", + Err: err, + } + } + // Decode query: FromScriptHash. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "FromScriptHash", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotFromScriptHashVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + paramsDotFromScriptHashVal = c + return nil + }(); err != nil { + return err + } + params.FromScriptHash.SetTo(paramsDotFromScriptHashVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.FromScriptHash.Get(); ok { + if err := func() error { + if err := (validate.String{ + MinLength: 16, + MinLengthSet: true, + MaxLength: 16, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(value)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "FromScriptHash", + In: "query", + Err: err, + } + } + // Decode query: ToScriptID. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ToScriptID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotToScriptIDVal int64 + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + paramsDotToScriptIDVal = c + return nil + }(); err != nil { + return err + } + params.ToScriptID.SetTo(paramsDotToScriptIDVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.ToScriptID.Get(); ok { + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(value)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ToScriptID", + In: "query", + Err: err, + } + } + // Decode query: Policy. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "Policy", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotPolicyVal int32 + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt32(val) + if err != nil { + return err + } + + paramsDotPolicyVal = c + return nil + }(); err != nil { + return err + } + params.Policy.SetTo(paramsDotPolicyVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.Policy.Get(); ok { + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(value)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "Policy", + In: "query", + Err: err, + } + } + return params, nil +} + +// ListScriptsParams is parameters of listScripts operation. +type ListScriptsParams struct { + Page int32 + Limit int32 + Hash OptString + Name OptString + Source OptString + ResourceType OptInt32 + ResourceID OptInt64 +} + +func unpackListScriptsParams(packed middleware.Parameters) (params ListScriptsParams) { + { + key := middleware.ParameterKey{ + Name: "Page", + In: "query", + } + params.Page = packed[key].(int32) + } + { + key := middleware.ParameterKey{ + Name: "Limit", + In: "query", + } + params.Limit = packed[key].(int32) + } + { + key := middleware.ParameterKey{ + Name: "Hash", + In: "query", + } + if v, ok := packed[key]; ok { + params.Hash = v.(OptString) + } + } + { + key := middleware.ParameterKey{ + Name: "Name", + In: "query", + } + if v, ok := packed[key]; ok { + params.Name = v.(OptString) + } + } + { + key := middleware.ParameterKey{ + Name: "Source", + In: "query", + } + if v, ok := packed[key]; ok { + params.Source = v.(OptString) + } + } + { + key := middleware.ParameterKey{ + Name: "ResourceType", + In: "query", + } + if v, ok := packed[key]; ok { + params.ResourceType = v.(OptInt32) + } + } + { + key := middleware.ParameterKey{ + Name: "ResourceID", + In: "query", + } + if v, ok := packed[key]; ok { + params.ResourceID = v.(OptInt64) + } + } + return params +} + +func decodeListScriptsParams(args [0]string, argsEscaped bool, r *http.Request) (params ListScriptsParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode query: Page. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "Page", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt32(val) + if err != nil { + return err + } + + params.Page = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 1, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.Page)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "Page", + In: "query", + Err: err, + } + } + // Decode query: Limit. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "Limit", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt32(val) + if err != nil { + return err + } + + params.Limit = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 1, + MaxSet: true, + Max: 100, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.Limit)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "Limit", + In: "query", + Err: err, + } + } + // Decode query: Hash. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "Hash", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotHashVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + paramsDotHashVal = c + return nil + }(); err != nil { + return err + } + params.Hash.SetTo(paramsDotHashVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.Hash.Get(); ok { + if err := func() error { + if err := (validate.String{ + MinLength: 16, + MinLengthSet: true, + MaxLength: 16, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(value)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "Hash", + In: "query", + Err: err, + } + } + // Decode query: Name. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "Name", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotNameVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + paramsDotNameVal = c + return nil + }(); err != nil { + return err + } + params.Name.SetTo(paramsDotNameVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.Name.Get(); ok { + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 128, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(value)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "Name", + In: "query", + Err: err, + } + } + // Decode query: Source. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "Source", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotSourceVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + paramsDotSourceVal = c + return nil + }(); err != nil { + return err + } + params.Source.SetTo(paramsDotSourceVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.Source.Get(); ok { + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 1048576, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(value)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "Source", + In: "query", + Err: err, + } + } + // Decode query: ResourceType. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ResourceType", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotResourceTypeVal int32 + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt32(val) + if err != nil { + return err + } + + paramsDotResourceTypeVal = c + return nil + }(); err != nil { + return err + } + params.ResourceType.SetTo(paramsDotResourceTypeVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.ResourceType.Get(); ok { + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(value)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ResourceType", + In: "query", + Err: err, + } + } + // Decode query: ResourceID. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ResourceID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotResourceIDVal int64 + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + paramsDotResourceIDVal = c + return nil + }(); err != nil { + return err + } + params.ResourceID.SetTo(paramsDotResourceIDVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.ResourceID.Get(); ok { + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(value)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ResourceID", + In: "query", + Err: err, + } + } + return params, nil +} + +// UpdateMapfixValidatedModelParams is parameters of updateMapfixValidatedModel operation. +type UpdateMapfixValidatedModelParams struct { + // The unique identifier for a submission. + MapfixID int64 + ValidatedModelID int64 + ValidatedModelVersion int64 +} + +func unpackUpdateMapfixValidatedModelParams(packed middleware.Parameters) (params UpdateMapfixValidatedModelParams) { + { + key := middleware.ParameterKey{ + Name: "MapfixID", + In: "path", + } + params.MapfixID = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "ValidatedModelID", + In: "query", + } + params.ValidatedModelID = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "ValidatedModelVersion", + In: "query", + } + params.ValidatedModelVersion = packed[key].(int64) + } + return params +} + +func decodeUpdateMapfixValidatedModelParams(args [1]string, argsEscaped bool, r *http.Request) (params UpdateMapfixValidatedModelParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode path: MapfixID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "MapfixID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.MapfixID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.MapfixID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "MapfixID", + In: "path", + Err: err, + } + } + // Decode query: ValidatedModelID. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ValidatedModelID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.ValidatedModelID = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.ValidatedModelID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ValidatedModelID", + In: "query", + Err: err, + } + } + // Decode query: ValidatedModelVersion. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ValidatedModelVersion", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.ValidatedModelVersion = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.ValidatedModelVersion)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ValidatedModelVersion", + In: "query", + Err: err, + } + } + return params, nil +} + +// UpdateSubmissionValidatedModelParams is parameters of updateSubmissionValidatedModel operation. +type UpdateSubmissionValidatedModelParams struct { + // The unique identifier for a submission. + SubmissionID int64 + ValidatedModelID int64 + ValidatedModelVersion int64 +} + +func unpackUpdateSubmissionValidatedModelParams(packed middleware.Parameters) (params UpdateSubmissionValidatedModelParams) { + { + key := middleware.ParameterKey{ + Name: "SubmissionID", + In: "path", + } + params.SubmissionID = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "ValidatedModelID", + In: "query", + } + params.ValidatedModelID = packed[key].(int64) + } + { + key := middleware.ParameterKey{ + Name: "ValidatedModelVersion", + In: "query", + } + params.ValidatedModelVersion = packed[key].(int64) + } + return params +} + +func decodeUpdateSubmissionValidatedModelParams(args [1]string, argsEscaped bool, r *http.Request) (params UpdateSubmissionValidatedModelParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode path: SubmissionID. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "SubmissionID", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.SubmissionID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.SubmissionID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "SubmissionID", + In: "path", + Err: err, + } + } + // Decode query: ValidatedModelID. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ValidatedModelID", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.ValidatedModelID = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.ValidatedModelID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ValidatedModelID", + In: "query", + Err: err, + } + } + // Decode query: ValidatedModelVersion. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "ValidatedModelVersion", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt64(val) + if err != nil { + return err + } + + params.ValidatedModelVersion = c + return nil + }); err != nil { + return err + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(params.ValidatedModelVersion)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } else { + return err + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "ValidatedModelVersion", + In: "query", + Err: err, + } + } + return params, nil +} diff --git a/pkg/internal/oas_request_decoders_gen.go b/pkg/internal/oas_request_decoders_gen.go new file mode 100644 index 0000000..3d02cd5 --- /dev/null +++ b/pkg/internal/oas_request_decoders_gen.go @@ -0,0 +1,441 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "io" + "mime" + "net/http" + + "github.com/go-faster/errors" + "github.com/go-faster/jx" + + "github.com/ogen-go/ogen/ogenerrors" + "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 = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(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) decodeCreateMapfixAuditCheckListRequest(r *http.Request) ( + req CheckList, + 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 = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(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 CheckList + 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, + 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 = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(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 ScriptCreate + 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) decodeCreateScriptPolicyRequest(r *http.Request) ( + req *ScriptPolicyCreate, + 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 = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(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 ScriptPolicyCreate + 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) 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 = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(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) + } +} + +func (s *Server) decodeCreateSubmissionAuditCheckListRequest(r *http.Request) ( + req CheckList, + 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 = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(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 CheckList + 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 new file mode 100644 index 0000000..a819e46 --- /dev/null +++ b/pkg/internal/oas_request_encoders_gen.go @@ -0,0 +1,96 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "bytes" + "net/http" + + "github.com/go-faster/jx" + + 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 encodeCreateMapfixAuditCheckListRequest( + req CheckList, + 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, +) 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 encodeCreateScriptPolicyRequest( + req *ScriptPolicyCreate, + 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 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 +} + +func encodeCreateSubmissionAuditCheckListRequest( + req CheckList, + 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 new file mode 100644 index 0000000..c68aff2 --- /dev/null +++ b/pkg/internal/oas_response_decoders_gen.go @@ -0,0 +1,1793 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "fmt" + "io" + "mime" + "net/http" + + "github.com/go-faster/errors" + "github.com/go-faster/jx" + + "github.com/ogen-go/ogen/ogenerrors" + "github.com/ogen-go/ogen/validate" +) + +func decodeActionMapfixAcceptedResponse(resp *http.Response) (res *ActionMapfixAcceptedNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionMapfixAcceptedNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeActionMapfixRequestChangesResponse(resp *http.Response) (res *ActionMapfixRequestChangesNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionMapfixRequestChangesNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeActionMapfixSubmittedResponse(resp *http.Response) (res *ActionMapfixSubmittedNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionMapfixSubmittedNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeActionMapfixUploadedResponse(resp *http.Response) (res *ActionMapfixUploadedNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionMapfixUploadedNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeActionMapfixValidatedResponse(resp *http.Response) (res *ActionMapfixValidatedNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionMapfixValidatedNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeActionOperationFailedResponse(resp *http.Response) (res *ActionOperationFailedNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionOperationFailedNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeActionSubmissionAcceptedResponse(resp *http.Response) (res *ActionSubmissionAcceptedNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionSubmissionAcceptedNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeActionSubmissionRequestChangesResponse(resp *http.Response) (res *ActionSubmissionRequestChangesNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionSubmissionRequestChangesNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeActionSubmissionSubmittedResponse(resp *http.Response) (res *ActionSubmissionSubmittedNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionSubmissionSubmittedNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeActionSubmissionUploadedResponse(resp *http.Response) (res *ActionSubmissionUploadedNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionSubmissionUploadedNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeActionSubmissionValidatedResponse(resp *http.Response) (res *ActionSubmissionValidatedNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &ActionSubmissionValidatedNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeCreateMapfixResponse(resp *http.Response) (res *MapfixID, _ 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 MapfixID + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeCreateMapfixAuditCheckListResponse(resp *http.Response) (res *CreateMapfixAuditCheckListNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &CreateMapfixAuditCheckListNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeCreateMapfixAuditErrorResponse(resp *http.Response) (res *CreateMapfixAuditErrorNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &CreateMapfixAuditErrorNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 *ScriptID, _ 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 ScriptID + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeCreateScriptPolicyResponse(resp *http.Response) (res *ScriptPolicyID, _ 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 ScriptPolicyID + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeCreateSubmissionResponse(resp *http.Response) (res *SubmissionID, _ 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 SubmissionID + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeCreateSubmissionAuditCheckListResponse(resp *http.Response) (res *CreateSubmissionAuditCheckListNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &CreateSubmissionAuditCheckListNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeCreateSubmissionAuditErrorResponse(resp *http.Response) (res *CreateSubmissionAuditErrorNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &CreateSubmissionAuditErrorNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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: + // Code 200. + 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 Script + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeListScriptPolicyResponse(resp *http.Response) (res []ScriptPolicy, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + 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 []ScriptPolicy + if err := func() error { + response = make([]ScriptPolicy, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem ScriptPolicy + if err := elem.Decode(d); err != nil { + return err + } + response = append(response, elem) + return nil + }); 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 + } + // Validate response. + if err := func() error { + if response == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range response { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeListScriptsResponse(resp *http.Response) (res []Script, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + 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 []Script + if err := func() error { + response = make([]Script, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem Script + if err := elem.Decode(d); err != nil { + return err + } + response = append(response, elem) + return nil + }); 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 + } + // Validate response. + if err := func() error { + if response == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range response { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeUpdateMapfixValidatedModelResponse(resp *http.Response) (res *UpdateMapfixValidatedModelNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &UpdateMapfixValidatedModelNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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 decodeUpdateSubmissionValidatedModelResponse(resp *http.Response) (res *UpdateSubmissionValidatedModelNoContent, _ error) { + switch resp.StatusCode { + case 204: + // Code 204. + return &UpdateSubmissionValidatedModelNoContent{}, nil + } + // 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 + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + 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") +} diff --git a/pkg/internal/oas_response_encoders_gen.go b/pkg/internal/oas_response_encoders_gen.go new file mode 100644 index 0000000..00268a8 --- /dev/null +++ b/pkg/internal/oas_response_encoders_gen.go @@ -0,0 +1,266 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "net/http" + + "github.com/go-faster/errors" + "github.com/go-faster/jx" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" + + ht "github.com/ogen-go/ogen/http" +) + +func encodeActionMapfixAcceptedResponse(response *ActionMapfixAcceptedNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeActionMapfixRequestChangesResponse(response *ActionMapfixRequestChangesNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeActionMapfixSubmittedResponse(response *ActionMapfixSubmittedNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeActionMapfixUploadedResponse(response *ActionMapfixUploadedNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeActionMapfixValidatedResponse(response *ActionMapfixValidatedNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeActionOperationFailedResponse(response *ActionOperationFailedNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeActionSubmissionAcceptedResponse(response *ActionSubmissionAcceptedNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeActionSubmissionRequestChangesResponse(response *ActionSubmissionRequestChangesNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeActionSubmissionSubmittedResponse(response *ActionSubmissionSubmittedNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeActionSubmissionUploadedResponse(response *ActionSubmissionUploadedNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeActionSubmissionValidatedResponse(response *ActionSubmissionValidatedNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeCreateMapfixResponse(response *MapfixID, 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 encodeCreateMapfixAuditCheckListResponse(response *CreateMapfixAuditCheckListNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeCreateMapfixAuditErrorResponse(response *CreateMapfixAuditErrorNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeCreateScriptResponse(response *ScriptID, 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 encodeCreateScriptPolicyResponse(response *ScriptPolicyID, 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 encodeCreateSubmissionResponse(response *SubmissionID, 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 encodeCreateSubmissionAuditCheckListResponse(response *CreateSubmissionAuditCheckListNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeCreateSubmissionAuditErrorResponse(response *CreateSubmissionAuditErrorNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + 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) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil +} + +func encodeListScriptPolicyResponse(response []ScriptPolicy, w http.ResponseWriter, span trace.Span) error { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + e.ArrStart() + for _, elem := range response { + elem.Encode(e) + } + e.ArrEnd() + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil +} + +func encodeListScriptsResponse(response []Script, w http.ResponseWriter, span trace.Span) error { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + e.ArrStart() + for _, elem := range response { + elem.Encode(e) + } + e.ArrEnd() + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil +} + +func encodeUpdateMapfixValidatedModelResponse(response *UpdateMapfixValidatedModelNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeUpdateSubmissionValidatedModelResponse(response *UpdateSubmissionValidatedModelNoContent, w http.ResponseWriter, span trace.Span) error { + w.WriteHeader(204) + span.SetStatus(codes.Ok, http.StatusText(204)) + + return nil +} + +func encodeErrorResponse(response *ErrorStatusCode, w http.ResponseWriter, span trace.Span) error { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + code := response.StatusCode + if code == 0 { + // Set default status code. + code = http.StatusOK + } + w.WriteHeader(code) + if st := http.StatusText(code); code >= http.StatusBadRequest { + span.SetStatus(codes.Error, st) + } else { + span.SetStatus(codes.Ok, st) + } + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + if code >= http.StatusInternalServerError { + return errors.Wrapf(ht.ErrInternalServerErrorResponse, "code: %d, message: %s", code, http.StatusText(code)) + } + return nil + +} diff --git a/pkg/internal/oas_router_gen.go b/pkg/internal/oas_router_gen.go new file mode 100644 index 0000000..e89474a --- /dev/null +++ b/pkg/internal/oas_router_gen.go @@ -0,0 +1,1517 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "net/http" + "net/url" + "strings" + + "github.com/ogen-go/ogen/uri" +) + +func (s *Server) cutPrefix(path string) (string, bool) { + prefix := s.cfg.Prefix + if prefix == "" { + return path, true + } + if !strings.HasPrefix(path, prefix) { + // Prefix doesn't match. + return "", false + } + // Cut prefix from the path. + return strings.TrimPrefix(path, prefix), true +} + +// ServeHTTP serves http request as defined by OpenAPI v3 specification, +// calling handler that matches the path or returning not found error. +func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + elem := r.URL.Path + elemIsEscaped := false + if rawPath := r.URL.RawPath; rawPath != "" { + if normalized, ok := uri.NormalizeEscapedPath(rawPath); ok { + elem = normalized + elemIsEscaped = strings.ContainsRune(elem, '%') + } + } + + elem, ok := s.cutPrefix(elem) + if !ok || len(elem) == 0 { + s.notFound(w, r) + return + } + args := [1]string{} + + // Static code generated router with unwrapped path search. + switch { + default: + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'm': // Prefix: "mapfixes" + + if l := len("mapfixes"); len(elem) >= l && elem[0:l] == "mapfixes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "POST": + s.handleCreateMapfixRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + 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 elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "checklist" + + if l := len("checklist"); len(elem) >= l && elem[0:l] == "checklist" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleCreateMapfixAuditCheckListRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'e': // Prefix: "error" + + if l := len("error"); len(elem) >= l && elem[0:l] == "error" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleCreateMapfixAuditErrorRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 's': // Prefix: "status/validator-" + + 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 'r': // Prefix: "request-changes" + + if l := len("request-changes"); len(elem) >= l && elem[0:l] == "request-changes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixRequestChangesRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 's': // Prefix: "submitted" + + if l := len("submitted"); len(elem) >= l && elem[0:l] == "submitted" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionMapfixSubmittedRequest([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 + } + + 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 + } + + } + + } + + } + + case 'o': // Prefix: "operations/" + + if l := len("operations/"); len(elem) >= l && elem[0:l] == "operations/" { + elem = elem[l:] + } else { + break + } + + // Param: "OperationID" + // 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 '/': // Prefix: "/status/operation-failed" + + if l := len("/status/operation-failed"); len(elem) >= l && elem[0:l] == "/status/operation-failed" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionOperationFailedRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + } + + case 's': // Prefix: "s" + + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "cript" + + if l := len("cript"); len(elem) >= l && elem[0:l] == "cript" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case '-': // Prefix: "-policy" + + if l := len("-policy"); len(elem) >= l && elem[0:l] == "-policy" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleListScriptPolicyRequest([0]string{}, elemIsEscaped, w, r) + case "POST": + s.handleCreateScriptPolicyRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "GET,POST") + } + + return + } + + case 's': // Prefix: "s" + + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleListScriptsRequest([0]string{}, elemIsEscaped, w, r) + case "POST": + s.handleCreateScriptRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "GET,POST") + } + + return + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + // Param: "ScriptID" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetScriptRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "GET") + } + + return + } + + } + + } + + case 'u': // Prefix: "ubmissions" + + if l := len("ubmissions"); len(elem) >= l && elem[0:l] == "ubmissions" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "POST": + s.handleCreateSubmissionRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + 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 elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "checklist" + + if l := len("checklist"); len(elem) >= l && elem[0:l] == "checklist" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleCreateSubmissionAuditCheckListRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 'e': // Prefix: "error" + + if l := len("error"); len(elem) >= l && elem[0:l] == "error" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleCreateSubmissionAuditErrorRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 's': // Prefix: "status/validator-" + + 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 'r': // Prefix: "request-changes" + + if l := len("request-changes"); len(elem) >= l && elem[0:l] == "request-changes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionSubmissionRequestChangesRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, "POST") + } + + return + } + + case 's': // Prefix: "submitted" + + if l := len("submitted"); len(elem) >= l && elem[0:l] == "submitted" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleActionSubmissionSubmittedRequest([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 + } + + 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 + } + + } + + } + + } + + } + + } + + } + } + s.notFound(w, r) +} + +// Route is route object. +type Route struct { + name string + summary string + operationID string + pathPattern string + count int + args [1]string +} + +// Name returns ogen operation name. +// +// It is guaranteed to be unique and not empty. +func (r Route) Name() string { + return r.name +} + +// Summary returns OpenAPI summary. +func (r Route) Summary() string { + return r.summary +} + +// OperationID returns OpenAPI operationId. +func (r Route) OperationID() string { + return r.operationID +} + +// PathPattern returns OpenAPI path. +func (r Route) PathPattern() string { + return r.pathPattern +} + +// Args returns parsed arguments. +func (r Route) Args() []string { + return r.args[:r.count] +} + +// FindRoute finds Route for given method and path. +// +// Note: this method does not unescape path or handle reserved characters in path properly. Use FindPath instead. +func (s *Server) FindRoute(method, path string) (Route, bool) { + return s.FindPath(method, &url.URL{Path: path}) +} + +// FindPath finds Route for given method and URL. +func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { + var ( + elem = u.Path + args = r.args + ) + if rawPath := u.RawPath; rawPath != "" { + if normalized, ok := uri.NormalizeEscapedPath(rawPath); ok { + elem = normalized + } + defer func() { + for i, arg := range r.args[:r.count] { + if unescaped, err := url.PathUnescape(arg); err == nil { + r.args[i] = unescaped + } + } + }() + } + + elem, ok := s.cutPrefix(elem) + if !ok { + return r, false + } + + // Static code generated router with unwrapped path search. + switch { + default: + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'm': // Prefix: "mapfixes" + + if l := len("mapfixes"); len(elem) >= l && elem[0:l] == "mapfixes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + 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: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + 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 elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "checklist" + + if l := len("checklist"); len(elem) >= l && elem[0:l] == "checklist" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = CreateMapfixAuditCheckListOperation + r.summary = "Validator posts a checklist to the audit log" + r.operationID = "createMapfixAuditCheckList" + r.pathPattern = "/mapfixes/{MapfixID}/checklist" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'e': // Prefix: "error" + + if l := len("error"); len(elem) >= l && elem[0:l] == "error" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = CreateMapfixAuditErrorOperation + r.summary = "Validator posts an error to the audit log" + r.operationID = "createMapfixAuditError" + r.pathPattern = "/mapfixes/{MapfixID}/error" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 's': // Prefix: "status/validator-" + + 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 'r': // Prefix: "request-changes" + + if l := len("request-changes"); len(elem) >= l && elem[0:l] == "request-changes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixRequestChangesOperation + r.summary = "(Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested" + r.operationID = "actionMapfixRequestChanges" + r.pathPattern = "/mapfixes/{MapfixID}/status/validator-request-changes" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 's': // Prefix: "submitted" + + if l := len("submitted"); len(elem) >= l && elem[0:l] == "submitted" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionMapfixSubmittedOperation + r.summary = "(Internal endpoint) Role Validator changes status from Submitting -> Submitted" + r.operationID = "actionMapfixSubmitted" + r.pathPattern = "/mapfixes/{MapfixID}/status/validator-submitted" + 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 + } + + 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 + } + } + + } + + } + + } + + case 'o': // Prefix: "operations/" + + if l := len("operations/"); len(elem) >= l && elem[0:l] == "operations/" { + elem = elem[l:] + } else { + break + } + + // Param: "OperationID" + // 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 '/': // Prefix: "/status/operation-failed" + + if l := len("/status/operation-failed"); len(elem) >= l && elem[0:l] == "/status/operation-failed" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionOperationFailedOperation + r.summary = "(Internal endpoint) Fail an operation and write a StatusMessage" + r.operationID = "actionOperationFailed" + r.pathPattern = "/operations/{OperationID}/status/operation-failed" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 's': // Prefix: "s" + + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "cript" + + if l := len("cript"); len(elem) >= l && elem[0:l] == "cript" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case '-': // Prefix: "-policy" + + if l := len("-policy"); len(elem) >= l && elem[0:l] == "-policy" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = ListScriptPolicyOperation + r.summary = "Get list of script policies" + r.operationID = "listScriptPolicy" + r.pathPattern = "/script-policy" + r.args = args + r.count = 0 + return r, true + case "POST": + r.name = CreateScriptPolicyOperation + r.summary = "Create a new script policy" + r.operationID = "createScriptPolicy" + r.pathPattern = "/script-policy" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 's': // Prefix: "s" + + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "GET": + r.name = ListScriptsOperation + r.summary = "Get list of scripts" + r.operationID = "listScripts" + r.pathPattern = "/scripts" + r.args = args + r.count = 0 + return r, true + case "POST": + r.name = CreateScriptOperation + r.summary = "Create a new script" + r.operationID = "createScript" + r.pathPattern = "/scripts" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + // Param: "ScriptID" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetScriptOperation + r.summary = "Get the specified script by ID" + r.operationID = "getScript" + r.pathPattern = "/scripts/{ScriptID}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + } + + case 'u': // Prefix: "ubmissions" + + if l := len("ubmissions"); len(elem) >= l && elem[0:l] == "ubmissions" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + 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: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + 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 elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "checklist" + + if l := len("checklist"); len(elem) >= l && elem[0:l] == "checklist" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = CreateSubmissionAuditCheckListOperation + r.summary = "Validator posts a checklist to the audit log" + r.operationID = "createSubmissionAuditCheckList" + r.pathPattern = "/submissions/{SubmissionID}/checklist" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'e': // Prefix: "error" + + if l := len("error"); len(elem) >= l && elem[0:l] == "error" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = CreateSubmissionAuditErrorOperation + r.summary = "Validator posts an error to the audit log" + r.operationID = "createSubmissionAuditError" + r.pathPattern = "/submissions/{SubmissionID}/error" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 's': // Prefix: "status/validator-" + + 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 'r': // Prefix: "request-changes" + + if l := len("request-changes"); len(elem) >= l && elem[0:l] == "request-changes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionSubmissionRequestChangesOperation + r.summary = "(Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested" + r.operationID = "actionSubmissionRequestChanges" + r.pathPattern = "/submissions/{SubmissionID}/status/validator-request-changes" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 's': // Prefix: "submitted" + + if l := len("submitted"); len(elem) >= l && elem[0:l] == "submitted" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ActionSubmissionSubmittedOperation + r.summary = "(Internal endpoint) Role Validator changes status from Submitting -> Submitted" + r.operationID = "actionSubmissionSubmitted" + r.pathPattern = "/submissions/{SubmissionID}/status/validator-submitted" + 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 + } + + 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 + } + } + + } + + } + + } + + } + + } + + } + } + return r, false +} diff --git a/pkg/internal/oas_schemas_gen.go b/pkg/internal/oas_schemas_gen.go new file mode 100644 index 0000000..bcca85e --- /dev/null +++ b/pkg/internal/oas_schemas_gen.go @@ -0,0 +1,761 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "fmt" +) + +func (s *ErrorStatusCode) Error() string { + return fmt.Sprintf("code %d: %+v", s.StatusCode, s.Response) +} + +// ActionMapfixAcceptedNoContent is response for ActionMapfixAccepted operation. +type ActionMapfixAcceptedNoContent struct{} + +// ActionMapfixRequestChangesNoContent is response for ActionMapfixRequestChanges operation. +type ActionMapfixRequestChangesNoContent struct{} + +// ActionMapfixSubmittedNoContent is response for ActionMapfixSubmitted operation. +type ActionMapfixSubmittedNoContent struct{} + +// ActionMapfixUploadedNoContent is response for ActionMapfixUploaded operation. +type ActionMapfixUploadedNoContent struct{} + +// ActionMapfixValidatedNoContent is response for ActionMapfixValidated operation. +type ActionMapfixValidatedNoContent struct{} + +// ActionOperationFailedNoContent is response for ActionOperationFailed operation. +type ActionOperationFailedNoContent struct{} + +// ActionSubmissionAcceptedNoContent is response for ActionSubmissionAccepted operation. +type ActionSubmissionAcceptedNoContent struct{} + +// ActionSubmissionRequestChangesNoContent is response for ActionSubmissionRequestChanges operation. +type ActionSubmissionRequestChangesNoContent struct{} + +// ActionSubmissionSubmittedNoContent is response for ActionSubmissionSubmitted operation. +type ActionSubmissionSubmittedNoContent struct{} + +// ActionSubmissionUploadedNoContent is response for ActionSubmissionUploaded operation. +type ActionSubmissionUploadedNoContent struct{} + +// ActionSubmissionValidatedNoContent is response for ActionSubmissionValidated operation. +type ActionSubmissionValidatedNoContent struct{} + +// Ref: #/components/schemas/Check +type Check struct { + Name string `json:"Name"` + Summary string `json:"Summary"` + Passed bool `json:"Passed"` +} + +// GetName returns the value of Name. +func (s *Check) GetName() string { + return s.Name +} + +// GetSummary returns the value of Summary. +func (s *Check) GetSummary() string { + return s.Summary +} + +// GetPassed returns the value of Passed. +func (s *Check) GetPassed() bool { + return s.Passed +} + +// SetName sets the value of Name. +func (s *Check) SetName(val string) { + s.Name = val +} + +// SetSummary sets the value of Summary. +func (s *Check) SetSummary(val string) { + s.Summary = val +} + +// SetPassed sets the value of Passed. +func (s *Check) SetPassed(val bool) { + s.Passed = val +} + +type CheckList []Check + +// CreateMapfixAuditCheckListNoContent is response for CreateMapfixAuditCheckList operation. +type CreateMapfixAuditCheckListNoContent struct{} + +// CreateMapfixAuditErrorNoContent is response for CreateMapfixAuditError operation. +type CreateMapfixAuditErrorNoContent struct{} + +// CreateSubmissionAuditCheckListNoContent is response for CreateSubmissionAuditCheckList operation. +type CreateSubmissionAuditCheckListNoContent struct{} + +// CreateSubmissionAuditErrorNoContent is response for CreateSubmissionAuditError operation. +type CreateSubmissionAuditErrorNoContent struct{} + +// Represents error object. +// Ref: #/components/schemas/Error +type Error struct { + Code int64 `json:"code"` + Message string `json:"message"` +} + +// GetCode returns the value of Code. +func (s *Error) GetCode() int64 { + return s.Code +} + +// GetMessage returns the value of Message. +func (s *Error) GetMessage() string { + return s.Message +} + +// SetCode sets the value of Code. +func (s *Error) SetCode(val int64) { + s.Code = val +} + +// SetMessage sets the value of Message. +func (s *Error) SetMessage(val string) { + s.Message = val +} + +// ErrorStatusCode wraps Error with StatusCode. +type ErrorStatusCode struct { + StatusCode int + Response Error +} + +// GetStatusCode returns the value of StatusCode. +func (s *ErrorStatusCode) GetStatusCode() int { + return s.StatusCode +} + +// GetResponse returns the value of Response. +func (s *ErrorStatusCode) GetResponse() Error { + return s.Response +} + +// SetStatusCode sets the value of StatusCode. +func (s *ErrorStatusCode) SetStatusCode(val int) { + s.StatusCode = val +} + +// SetResponse sets the value of Response. +func (s *ErrorStatusCode) SetResponse(val Error) { + s.Response = 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"` + Description string `json:"Description"` +} + +// 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 +} + +// GetDescription returns the value of Description. +func (s *MapfixCreate) GetDescription() string { + return s.Description +} + +// 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 +} + +// SetDescription sets the value of Description. +func (s *MapfixCreate) SetDescription(val string) { + s.Description = val +} + +// Ref: #/components/schemas/MapfixID +type MapfixID struct { + MapfixID int64 `json:"MapfixID"` +} + +// GetMapfixID returns the value of MapfixID. +func (s *MapfixID) GetMapfixID() int64 { + return s.MapfixID +} + +// SetMapfixID sets the value of MapfixID. +func (s *MapfixID) SetMapfixID(val int64) { + s.MapfixID = val +} + +// NewOptInt32 returns new OptInt32 with value set to v. +func NewOptInt32(v int32) OptInt32 { + return OptInt32{ + Value: v, + Set: true, + } +} + +// OptInt32 is optional int32. +type OptInt32 struct { + Value int32 + Set bool +} + +// IsSet returns true if OptInt32 was set. +func (o OptInt32) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptInt32) Reset() { + var v int32 + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptInt32) SetTo(v int32) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptInt32) Get() (v int32, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptInt32) Or(d int32) int32 { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptInt64 returns new OptInt64 with value set to v. +func NewOptInt64(v int64) OptInt64 { + return OptInt64{ + Value: v, + Set: true, + } +} + +// OptInt64 is optional int64. +type OptInt64 struct { + Value int64 + Set bool +} + +// IsSet returns true if OptInt64 was set. +func (o OptInt64) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptInt64) Reset() { + var v int64 + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptInt64) SetTo(v int64) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptInt64) Get() (v int64, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptInt64) Or(d int64) int64 { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptString returns new OptString with value set to v. +func NewOptString(v string) OptString { + return OptString{ + Value: v, + Set: true, + } +} + +// OptString is optional string. +type OptString struct { + Value string + Set bool +} + +// IsSet returns true if OptString was set. +func (o OptString) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptString) Reset() { + var v string + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptString) SetTo(v string) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptString) Get() (v string, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptString) Or(d string) string { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// Ref: #/components/schemas/Script +type Script struct { + ID int64 `json:"ID"` + Name string `json:"Name"` + Hash string `json:"Hash"` + Source string `json:"Source"` + ResourceType int32 `json:"ResourceType"` + ResourceID int64 `json:"ResourceID"` +} + +// GetID returns the value of ID. +func (s *Script) GetID() int64 { + return s.ID +} + +// GetName returns the value of Name. +func (s *Script) GetName() string { + return s.Name +} + +// GetHash returns the value of Hash. +func (s *Script) GetHash() string { + return s.Hash +} + +// GetSource returns the value of Source. +func (s *Script) GetSource() string { + return s.Source +} + +// GetResourceType returns the value of ResourceType. +func (s *Script) GetResourceType() int32 { + return s.ResourceType +} + +// GetResourceID returns the value of ResourceID. +func (s *Script) GetResourceID() int64 { + return s.ResourceID +} + +// SetID sets the value of ID. +func (s *Script) SetID(val int64) { + s.ID = val +} + +// SetName sets the value of Name. +func (s *Script) SetName(val string) { + s.Name = val +} + +// SetHash sets the value of Hash. +func (s *Script) SetHash(val string) { + s.Hash = val +} + +// SetSource sets the value of Source. +func (s *Script) SetSource(val string) { + s.Source = val +} + +// SetResourceType sets the value of ResourceType. +func (s *Script) SetResourceType(val int32) { + s.ResourceType = val +} + +// SetResourceID sets the value of ResourceID. +func (s *Script) SetResourceID(val int64) { + s.ResourceID = val +} + +// Ref: #/components/schemas/ScriptCreate +type ScriptCreate struct { + Name string `json:"Name"` + Source string `json:"Source"` + ResourceType int32 `json:"ResourceType"` + ResourceID OptInt64 `json:"ResourceID"` +} + +// GetName returns the value of Name. +func (s *ScriptCreate) GetName() string { + return s.Name +} + +// GetSource returns the value of Source. +func (s *ScriptCreate) GetSource() string { + return s.Source +} + +// GetResourceType returns the value of ResourceType. +func (s *ScriptCreate) GetResourceType() int32 { + return s.ResourceType +} + +// GetResourceID returns the value of ResourceID. +func (s *ScriptCreate) GetResourceID() OptInt64 { + return s.ResourceID +} + +// SetName sets the value of Name. +func (s *ScriptCreate) SetName(val string) { + s.Name = val +} + +// SetSource sets the value of Source. +func (s *ScriptCreate) SetSource(val string) { + s.Source = val +} + +// SetResourceType sets the value of ResourceType. +func (s *ScriptCreate) SetResourceType(val int32) { + s.ResourceType = val +} + +// SetResourceID sets the value of ResourceID. +func (s *ScriptCreate) SetResourceID(val OptInt64) { + s.ResourceID = val +} + +// Ref: #/components/schemas/ScriptID +type ScriptID struct { + ScriptID int64 `json:"ScriptID"` +} + +// GetScriptID returns the value of ScriptID. +func (s *ScriptID) GetScriptID() int64 { + return s.ScriptID +} + +// SetScriptID sets the value of ScriptID. +func (s *ScriptID) SetScriptID(val int64) { + s.ScriptID = val +} + +// Ref: #/components/schemas/ScriptPolicy +type ScriptPolicy struct { + ID int64 `json:"ID"` + FromScriptHash string `json:"FromScriptHash"` + ToScriptID int64 `json:"ToScriptID"` + Policy int32 `json:"Policy"` +} + +// GetID returns the value of ID. +func (s *ScriptPolicy) GetID() int64 { + return s.ID +} + +// GetFromScriptHash returns the value of FromScriptHash. +func (s *ScriptPolicy) GetFromScriptHash() string { + return s.FromScriptHash +} + +// GetToScriptID returns the value of ToScriptID. +func (s *ScriptPolicy) GetToScriptID() int64 { + return s.ToScriptID +} + +// GetPolicy returns the value of Policy. +func (s *ScriptPolicy) GetPolicy() int32 { + return s.Policy +} + +// SetID sets the value of ID. +func (s *ScriptPolicy) SetID(val int64) { + s.ID = val +} + +// SetFromScriptHash sets the value of FromScriptHash. +func (s *ScriptPolicy) SetFromScriptHash(val string) { + s.FromScriptHash = val +} + +// SetToScriptID sets the value of ToScriptID. +func (s *ScriptPolicy) SetToScriptID(val int64) { + s.ToScriptID = val +} + +// SetPolicy sets the value of Policy. +func (s *ScriptPolicy) SetPolicy(val int32) { + s.Policy = val +} + +// Ref: #/components/schemas/ScriptPolicyCreate +type ScriptPolicyCreate struct { + FromScriptID int64 `json:"FromScriptID"` + ToScriptID int64 `json:"ToScriptID"` + Policy int32 `json:"Policy"` +} + +// GetFromScriptID returns the value of FromScriptID. +func (s *ScriptPolicyCreate) GetFromScriptID() int64 { + return s.FromScriptID +} + +// GetToScriptID returns the value of ToScriptID. +func (s *ScriptPolicyCreate) GetToScriptID() int64 { + return s.ToScriptID +} + +// GetPolicy returns the value of Policy. +func (s *ScriptPolicyCreate) GetPolicy() int32 { + return s.Policy +} + +// SetFromScriptID sets the value of FromScriptID. +func (s *ScriptPolicyCreate) SetFromScriptID(val int64) { + s.FromScriptID = val +} + +// SetToScriptID sets the value of ToScriptID. +func (s *ScriptPolicyCreate) SetToScriptID(val int64) { + s.ToScriptID = val +} + +// SetPolicy sets the value of Policy. +func (s *ScriptPolicyCreate) SetPolicy(val int32) { + s.Policy = val +} + +// Ref: #/components/schemas/ScriptPolicyID +type ScriptPolicyID struct { + ScriptPolicyID int64 `json:"ScriptPolicyID"` +} + +// GetScriptPolicyID returns the value of ScriptPolicyID. +func (s *ScriptPolicyID) GetScriptPolicyID() int64 { + return s.ScriptPolicyID +} + +// SetScriptPolicyID sets the value of ScriptPolicyID. +func (s *ScriptPolicyID) SetScriptPolicyID(val int64) { + s.ScriptPolicyID = 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"` + Status uint32 `json:"Status"` + Roles uint32 `json:"Roles"` +} + +// 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 +} + +// GetStatus returns the value of Status. +func (s *SubmissionCreate) GetStatus() uint32 { + return s.Status +} + +// GetRoles returns the value of Roles. +func (s *SubmissionCreate) GetRoles() uint32 { + return s.Roles +} + +// 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 +} + +// SetStatus sets the value of Status. +func (s *SubmissionCreate) SetStatus(val uint32) { + s.Status = val +} + +// SetRoles sets the value of Roles. +func (s *SubmissionCreate) SetRoles(val uint32) { + s.Roles = val +} + +// Ref: #/components/schemas/SubmissionID +type SubmissionID struct { + SubmissionID int64 `json:"SubmissionID"` +} + +// GetSubmissionID returns the value of SubmissionID. +func (s *SubmissionID) GetSubmissionID() int64 { + return s.SubmissionID +} + +// SetSubmissionID sets the value of SubmissionID. +func (s *SubmissionID) SetSubmissionID(val int64) { + s.SubmissionID = val +} + +// UpdateMapfixValidatedModelNoContent is response for UpdateMapfixValidatedModel operation. +type UpdateMapfixValidatedModelNoContent struct{} + +// UpdateSubmissionValidatedModelNoContent is response for UpdateSubmissionValidatedModel operation. +type UpdateSubmissionValidatedModelNoContent struct{} diff --git a/pkg/internal/oas_server_gen.go b/pkg/internal/oas_server_gen.go new file mode 100644 index 0000000..58f028f --- /dev/null +++ b/pkg/internal/oas_server_gen.go @@ -0,0 +1,178 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "context" +) + +// Handler handles operations described by OpenAPI v3 specification. +type Handler interface { + // ActionMapfixAccepted implements actionMapfixAccepted operation. + // + // (Internal endpoint) Role Validator changes status from Validating -> Accepted. + // + // POST /mapfixes/{MapfixID}/status/validator-failed + ActionMapfixAccepted(ctx context.Context, params ActionMapfixAcceptedParams) error + // ActionMapfixRequestChanges implements actionMapfixRequestChanges operation. + // + // (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested. + // + // POST /mapfixes/{MapfixID}/status/validator-request-changes + ActionMapfixRequestChanges(ctx context.Context, params ActionMapfixRequestChangesParams) error + // ActionMapfixSubmitted implements actionMapfixSubmitted operation. + // + // (Internal endpoint) Role Validator changes status from Submitting -> Submitted. + // + // POST /mapfixes/{MapfixID}/status/validator-submitted + ActionMapfixSubmitted(ctx context.Context, params ActionMapfixSubmittedParams) error + // ActionMapfixUploaded implements actionMapfixUploaded operation. + // + // (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. + // + // POST /mapfixes/{MapfixID}/status/validator-uploaded + ActionMapfixUploaded(ctx context.Context, params ActionMapfixUploadedParams) error + // ActionMapfixValidated implements actionMapfixValidated operation. + // + // (Internal endpoint) Role Validator changes status from Validating -> Validated. + // + // POST /mapfixes/{MapfixID}/status/validator-validated + ActionMapfixValidated(ctx context.Context, params ActionMapfixValidatedParams) error + // ActionOperationFailed implements actionOperationFailed operation. + // + // (Internal endpoint) Fail an operation and write a StatusMessage. + // + // POST /operations/{OperationID}/status/operation-failed + ActionOperationFailed(ctx context.Context, params ActionOperationFailedParams) error + // ActionSubmissionAccepted implements actionSubmissionAccepted operation. + // + // (Internal endpoint) Role Validator changes status from Validating -> Accepted. + // + // POST /submissions/{SubmissionID}/status/validator-failed + ActionSubmissionAccepted(ctx context.Context, params ActionSubmissionAcceptedParams) error + // ActionSubmissionRequestChanges implements actionSubmissionRequestChanges operation. + // + // (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested. + // + // POST /submissions/{SubmissionID}/status/validator-request-changes + ActionSubmissionRequestChanges(ctx context.Context, params ActionSubmissionRequestChangesParams) error + // ActionSubmissionSubmitted implements actionSubmissionSubmitted operation. + // + // (Internal endpoint) Role Validator changes status from Submitting -> Submitted. + // + // POST /submissions/{SubmissionID}/status/validator-submitted + ActionSubmissionSubmitted(ctx context.Context, params ActionSubmissionSubmittedParams) error + // ActionSubmissionUploaded implements actionSubmissionUploaded operation. + // + // (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. + // + // POST /submissions/{SubmissionID}/status/validator-uploaded + ActionSubmissionUploaded(ctx context.Context, params ActionSubmissionUploadedParams) error + // ActionSubmissionValidated implements actionSubmissionValidated operation. + // + // (Internal endpoint) Role Validator changes status from Validating -> Validated. + // + // 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) (*MapfixID, error) + // CreateMapfixAuditCheckList implements createMapfixAuditCheckList operation. + // + // Validator posts a checklist to the audit log. + // + // POST /mapfixes/{MapfixID}/checklist + CreateMapfixAuditCheckList(ctx context.Context, req CheckList, params CreateMapfixAuditCheckListParams) error + // CreateMapfixAuditError implements createMapfixAuditError operation. + // + // Validator posts an error to the audit log. + // + // POST /mapfixes/{MapfixID}/error + CreateMapfixAuditError(ctx context.Context, params CreateMapfixAuditErrorParams) error + // CreateScript implements createScript operation. + // + // Create a new script. + // + // POST /scripts + CreateScript(ctx context.Context, req *ScriptCreate) (*ScriptID, error) + // CreateScriptPolicy implements createScriptPolicy operation. + // + // Create a new script policy. + // + // POST /script-policy + CreateScriptPolicy(ctx context.Context, req *ScriptPolicyCreate) (*ScriptPolicyID, error) + // CreateSubmission implements createSubmission operation. + // + // Create a new submission. + // + // POST /submissions + CreateSubmission(ctx context.Context, req *SubmissionCreate) (*SubmissionID, error) + // CreateSubmissionAuditCheckList implements createSubmissionAuditCheckList operation. + // + // Validator posts a checklist to the audit log. + // + // POST /submissions/{SubmissionID}/checklist + CreateSubmissionAuditCheckList(ctx context.Context, req CheckList, params CreateSubmissionAuditCheckListParams) error + // CreateSubmissionAuditError implements createSubmissionAuditError operation. + // + // Validator posts an error to the audit log. + // + // POST /submissions/{SubmissionID}/error + CreateSubmissionAuditError(ctx context.Context, params CreateSubmissionAuditErrorParams) error + // GetScript implements getScript operation. + // + // Get the specified script by ID. + // + // GET /scripts/{ScriptID} + GetScript(ctx context.Context, params GetScriptParams) (*Script, error) + // ListScriptPolicy implements listScriptPolicy operation. + // + // Get list of script policies. + // + // GET /script-policy + ListScriptPolicy(ctx context.Context, params ListScriptPolicyParams) ([]ScriptPolicy, error) + // ListScripts implements listScripts operation. + // + // Get list of scripts. + // + // GET /scripts + ListScripts(ctx context.Context, params ListScriptsParams) ([]Script, error) + // UpdateMapfixValidatedModel implements updateMapfixValidatedModel operation. + // + // Update validated model. + // + // POST /mapfixes/{MapfixID}/validated-model + UpdateMapfixValidatedModel(ctx context.Context, params UpdateMapfixValidatedModelParams) error + // UpdateSubmissionValidatedModel implements updateSubmissionValidatedModel operation. + // + // Update validated model. + // + // POST /submissions/{SubmissionID}/validated-model + UpdateSubmissionValidatedModel(ctx context.Context, params UpdateSubmissionValidatedModelParams) error + // NewError creates *ErrorStatusCode from error returned by handler. + // + // Used for common default response. + NewError(ctx context.Context, err error) *ErrorStatusCode +} + +// Server implements http server based on OpenAPI v3 specification and +// calls Handler to handle requests. +type Server struct { + h Handler + baseServer +} + +// NewServer creates new Server. +func NewServer(h Handler, opts ...ServerOption) (*Server, error) { + s, err := newServerConfig(opts...).baseServer() + if err != nil { + return nil, err + } + return &Server{ + h: h, + baseServer: s, + }, nil +} diff --git a/pkg/internal/oas_unimplemented_gen.go b/pkg/internal/oas_unimplemented_gen.go new file mode 100644 index 0000000..6257f15 --- /dev/null +++ b/pkg/internal/oas_unimplemented_gen.go @@ -0,0 +1,238 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "context" + + ht "github.com/ogen-go/ogen/http" +) + +// UnimplementedHandler is no-op Handler which returns http.ErrNotImplemented. +type UnimplementedHandler struct{} + +var _ Handler = UnimplementedHandler{} + +// ActionMapfixAccepted implements actionMapfixAccepted operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Accepted. +// +// POST /mapfixes/{MapfixID}/status/validator-failed +func (UnimplementedHandler) ActionMapfixAccepted(ctx context.Context, params ActionMapfixAcceptedParams) error { + return ht.ErrNotImplemented +} + +// ActionMapfixRequestChanges implements actionMapfixRequestChanges operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested. +// +// POST /mapfixes/{MapfixID}/status/validator-request-changes +func (UnimplementedHandler) ActionMapfixRequestChanges(ctx context.Context, params ActionMapfixRequestChangesParams) error { + return ht.ErrNotImplemented +} + +// ActionMapfixSubmitted implements actionMapfixSubmitted operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> Submitted. +// +// POST /mapfixes/{MapfixID}/status/validator-submitted +func (UnimplementedHandler) ActionMapfixSubmitted(ctx context.Context, params ActionMapfixSubmittedParams) error { + return ht.ErrNotImplemented +} + +// ActionMapfixUploaded implements actionMapfixUploaded operation. +// +// (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. +// +// POST /mapfixes/{MapfixID}/status/validator-uploaded +func (UnimplementedHandler) ActionMapfixUploaded(ctx context.Context, params ActionMapfixUploadedParams) error { + return ht.ErrNotImplemented +} + +// ActionMapfixValidated implements actionMapfixValidated operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Validated. +// +// POST /mapfixes/{MapfixID}/status/validator-validated +func (UnimplementedHandler) ActionMapfixValidated(ctx context.Context, params ActionMapfixValidatedParams) error { + return ht.ErrNotImplemented +} + +// ActionOperationFailed implements actionOperationFailed operation. +// +// (Internal endpoint) Fail an operation and write a StatusMessage. +// +// POST /operations/{OperationID}/status/operation-failed +func (UnimplementedHandler) ActionOperationFailed(ctx context.Context, params ActionOperationFailedParams) error { + return ht.ErrNotImplemented +} + +// ActionSubmissionAccepted implements actionSubmissionAccepted operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Accepted. +// +// POST /submissions/{SubmissionID}/status/validator-failed +func (UnimplementedHandler) ActionSubmissionAccepted(ctx context.Context, params ActionSubmissionAcceptedParams) error { + return ht.ErrNotImplemented +} + +// ActionSubmissionRequestChanges implements actionSubmissionRequestChanges operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> ChangesRequested. +// +// POST /submissions/{SubmissionID}/status/validator-request-changes +func (UnimplementedHandler) ActionSubmissionRequestChanges(ctx context.Context, params ActionSubmissionRequestChangesParams) error { + return ht.ErrNotImplemented +} + +// ActionSubmissionSubmitted implements actionSubmissionSubmitted operation. +// +// (Internal endpoint) Role Validator changes status from Submitting -> Submitted. +// +// POST /submissions/{SubmissionID}/status/validator-submitted +func (UnimplementedHandler) ActionSubmissionSubmitted(ctx context.Context, params ActionSubmissionSubmittedParams) error { + return ht.ErrNotImplemented +} + +// ActionSubmissionUploaded implements actionSubmissionUploaded operation. +// +// (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. +// +// POST /submissions/{SubmissionID}/status/validator-uploaded +func (UnimplementedHandler) ActionSubmissionUploaded(ctx context.Context, params ActionSubmissionUploadedParams) error { + return ht.ErrNotImplemented +} + +// ActionSubmissionValidated implements actionSubmissionValidated operation. +// +// (Internal endpoint) Role Validator changes status from Validating -> Validated. +// +// POST /submissions/{SubmissionID}/status/validator-validated +func (UnimplementedHandler) ActionSubmissionValidated(ctx context.Context, params ActionSubmissionValidatedParams) error { + return ht.ErrNotImplemented +} + +// CreateMapfix implements createMapfix operation. +// +// Create a mapfix. +// +// POST /mapfixes +func (UnimplementedHandler) CreateMapfix(ctx context.Context, req *MapfixCreate) (r *MapfixID, _ error) { + return r, ht.ErrNotImplemented +} + +// CreateMapfixAuditCheckList implements createMapfixAuditCheckList operation. +// +// Validator posts a checklist to the audit log. +// +// POST /mapfixes/{MapfixID}/checklist +func (UnimplementedHandler) CreateMapfixAuditCheckList(ctx context.Context, req CheckList, params CreateMapfixAuditCheckListParams) error { + return ht.ErrNotImplemented +} + +// CreateMapfixAuditError implements createMapfixAuditError operation. +// +// Validator posts an error to the audit log. +// +// POST /mapfixes/{MapfixID}/error +func (UnimplementedHandler) CreateMapfixAuditError(ctx context.Context, params CreateMapfixAuditErrorParams) error { + return ht.ErrNotImplemented +} + +// CreateScript implements createScript operation. +// +// Create a new script. +// +// POST /scripts +func (UnimplementedHandler) CreateScript(ctx context.Context, req *ScriptCreate) (r *ScriptID, _ error) { + return r, ht.ErrNotImplemented +} + +// CreateScriptPolicy implements createScriptPolicy operation. +// +// Create a new script policy. +// +// POST /script-policy +func (UnimplementedHandler) CreateScriptPolicy(ctx context.Context, req *ScriptPolicyCreate) (r *ScriptPolicyID, _ error) { + return r, ht.ErrNotImplemented +} + +// CreateSubmission implements createSubmission operation. +// +// Create a new submission. +// +// POST /submissions +func (UnimplementedHandler) CreateSubmission(ctx context.Context, req *SubmissionCreate) (r *SubmissionID, _ error) { + return r, ht.ErrNotImplemented +} + +// CreateSubmissionAuditCheckList implements createSubmissionAuditCheckList operation. +// +// Validator posts a checklist to the audit log. +// +// POST /submissions/{SubmissionID}/checklist +func (UnimplementedHandler) CreateSubmissionAuditCheckList(ctx context.Context, req CheckList, params CreateSubmissionAuditCheckListParams) error { + return ht.ErrNotImplemented +} + +// CreateSubmissionAuditError implements createSubmissionAuditError operation. +// +// Validator posts an error to the audit log. +// +// POST /submissions/{SubmissionID}/error +func (UnimplementedHandler) CreateSubmissionAuditError(ctx context.Context, params CreateSubmissionAuditErrorParams) error { + return ht.ErrNotImplemented +} + +// GetScript implements getScript operation. +// +// Get the specified script by ID. +// +// GET /scripts/{ScriptID} +func (UnimplementedHandler) GetScript(ctx context.Context, params GetScriptParams) (r *Script, _ error) { + return r, ht.ErrNotImplemented +} + +// ListScriptPolicy implements listScriptPolicy operation. +// +// Get list of script policies. +// +// GET /script-policy +func (UnimplementedHandler) ListScriptPolicy(ctx context.Context, params ListScriptPolicyParams) (r []ScriptPolicy, _ error) { + return r, ht.ErrNotImplemented +} + +// ListScripts implements listScripts operation. +// +// Get list of scripts. +// +// GET /scripts +func (UnimplementedHandler) ListScripts(ctx context.Context, params ListScriptsParams) (r []Script, _ error) { + return r, ht.ErrNotImplemented +} + +// UpdateMapfixValidatedModel implements updateMapfixValidatedModel operation. +// +// Update validated model. +// +// POST /mapfixes/{MapfixID}/validated-model +func (UnimplementedHandler) UpdateMapfixValidatedModel(ctx context.Context, params UpdateMapfixValidatedModelParams) error { + return ht.ErrNotImplemented +} + +// UpdateSubmissionValidatedModel implements updateSubmissionValidatedModel operation. +// +// Update validated model. +// +// POST /submissions/{SubmissionID}/validated-model +func (UnimplementedHandler) UpdateSubmissionValidatedModel(ctx context.Context, params UpdateSubmissionValidatedModelParams) error { + return ht.ErrNotImplemented +} + +// NewError creates *ErrorStatusCode from error returned by handler. +// +// Used for common default response. +func (UnimplementedHandler) NewError(ctx context.Context, err error) (r *ErrorStatusCode) { + r = new(ErrorStatusCode) + return r +} diff --git a/pkg/internal/oas_validators_gen.go b/pkg/internal/oas_validators_gen.go new file mode 100644 index 0000000..2e5d084 --- /dev/null +++ b/pkg/internal/oas_validators_gen.go @@ -0,0 +1,1017 @@ +// Code generated by ogen, DO NOT EDIT. + +package api + +import ( + "fmt" + + "github.com/go-faster/errors" + + "github.com/ogen-go/ogen/validate" +) + +func (s *Check) 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.Name)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Name", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 4096, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(s.Summary)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Summary", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s CheckList) Validate() error { + alias := ([]Check)(s) + if alias == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range alias { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *Error) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.Code)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "code", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ErrorStatusCode) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Response", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *MapfixCreate) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.OperationID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "OperationID", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.AssetOwner)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "AssetOwner", + 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.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 err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.GameID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "GameID", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.AssetID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "AssetID", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.AssetVersion)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "AssetVersion", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.TargetAssetID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "TargetAssetID", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 256, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(s.Description)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Description", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *MapfixID) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.MapfixID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "MapfixID", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *Script) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.ID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ID", + 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.Name)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Name", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 16, + MinLengthSet: true, + MaxLength: 16, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(s.Hash)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Hash", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 1048576, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(s.Source)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Source", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.ResourceType)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ResourceType", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.ResourceID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ResourceID", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ScriptCreate) 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.Name)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Name", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 1048576, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(s.Source)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Source", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.ResourceType)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ResourceType", + Error: err, + }) + } + if err := func() error { + if value, ok := s.ResourceID.Get(); ok { + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(value)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ResourceID", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ScriptID) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.ScriptID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ScriptID", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ScriptPolicy) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.ID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ID", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 16, + MinLengthSet: true, + MaxLength: 16, + MaxLengthSet: true, + Email: false, + Hostname: false, + Regex: nil, + }).Validate(string(s.FromScriptHash)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "FromScriptHash", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.ToScriptID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ToScriptID", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.Policy)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Policy", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ScriptPolicyCreate) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.FromScriptID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "FromScriptID", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.ToScriptID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ToScriptID", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.Policy)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Policy", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ScriptPolicyID) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.ScriptPolicyID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ScriptPolicyID", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *SubmissionCreate) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.OperationID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "OperationID", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.AssetOwner)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "AssetOwner", + 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.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 err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.GameID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "GameID", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.AssetID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "AssetID", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.AssetVersion)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "AssetVersion", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: true, + Max: 9, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.Status)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Status", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *SubmissionID) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + }).Validate(int64(s.SubmissionID)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "SubmissionID", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} diff --git a/pkg/model/audit_event.go b/pkg/model/audit_event.go index b325f4a..f9550bc 100644 --- a/pkg/model/audit_event.go +++ b/pkg/model/audit_event.go @@ -2,12 +2,9 @@ package model import ( "encoding/json" - "math" "time" ) -const ValidatorUserID uint64 = uint64(math.MaxInt64) - type AuditEventType int32 // User clicked "Submit", "Accept" etc diff --git a/pkg/validator_controller/mapfixes.go b/pkg/service_internal/mapfixes.go similarity index 55% rename from pkg/validator_controller/mapfixes.go rename to pkg/service_internal/mapfixes.go index 8eb3607..7c03282 100644 --- a/pkg/validator_controller/mapfixes.go +++ b/pkg/service_internal/mapfixes.go @@ -1,28 +1,16 @@ -package validator_controller +package service_internal import ( "context" "errors" "fmt" - "git.itzana.me/strafesnet/go-grpc/validator" "git.itzana.me/strafesnet/maps-service/pkg/datastore" + internal "git.itzana.me/strafesnet/maps-service/pkg/internal" "git.itzana.me/strafesnet/maps-service/pkg/model" "git.itzana.me/strafesnet/maps-service/pkg/service" ) -type Mapfixes struct { - *validator.UnimplementedValidatorMapfixServiceServer - inner *service.Service -} -func NewMapfixesController( - inner *service.Service, -) Mapfixes { - return Mapfixes{ - inner: inner, - } -} - var( // prevent two mapfixes with same asset id ActiveMapfixStatuses = []model.MapfixStatus{ @@ -46,40 +34,35 @@ var( // Update model following role restrictions. // // POST /mapfixes/{MapfixID}/validated-model -func (svc *Mapfixes) SetValidatedModel(ctx context.Context, params *validator.ValidatedModelRequest) (*validator.NullResponse, error) { - MapfixID := int64(params.ID) +func (svc *Service) UpdateMapfixValidatedModel(ctx context.Context, params internal.UpdateMapfixValidatedModelParams) error { + ValidatedModelID := uint64(params.ValidatedModelID) + ValidatedModelVersion := uint64(params.ValidatedModelVersion) // check if Status is ChangesRequested|Submitted|UnderConstruction update := service.NewMapfixUpdate() - update.SetValidatedAssetID(params.ValidatedModelID) - update.SetValidatedAssetVersion(params.ValidatedModelVersion) + update.SetValidatedAssetID(ValidatedModelID) + update.SetValidatedAssetVersion(ValidatedModelVersion) // DO NOT reset completed when validated model is updated // update.Add("completed", false) - allow_statuses := []model.MapfixStatus{model.MapfixStatusValidating} - err := svc.inner.UpdateMapfixIfStatus(ctx, MapfixID, allow_statuses, update) + err := svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidating}, update) if err != nil { - return nil, err + return err } event_data := model.AuditEventDataChangeValidatedModel{ - ValidatedModelID: params.ValidatedModelID, - ValidatedModelVersion: params.ValidatedModelVersion, + ValidatedModelID: ValidatedModelID, + ValidatedModelVersion: ValidatedModelVersion, } - err = svc.inner.CreateAuditEventChangeValidatedModel( + return svc.inner.CreateAuditEventChangeValidatedModel( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: MapfixID, + ID: params.MapfixID, Type: model.ResourceMapfix, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // ActionMapfixSubmitted invokes actionMapfixSubmitted operation. @@ -87,8 +70,7 @@ func (svc *Mapfixes) SetValidatedModel(ctx context.Context, params *validator.Va // Role Validator changes status from Submitting -> Submitted. // // POST /mapfixes/{MapfixID}/status/validator-submitted -func (svc *Mapfixes) SetStatusSubmitted(ctx context.Context, params *validator.SubmittedRequest) (*validator.NullResponse, error) { - MapfixID := int64(params.ID) +func (svc *Service) ActionMapfixSubmitted(ctx context.Context, params internal.ActionMapfixSubmittedParams) error { // transaction target_status := model.MapfixStatusSubmitted update := service.NewMapfixUpdate() @@ -98,29 +80,24 @@ func (svc *Mapfixes) SetStatusSubmitted(ctx context.Context, params *validator.S update.SetCreator(params.Creator) update.SetGameID(uint32(params.GameID)) allow_statuses := []model.MapfixStatus{model.MapfixStatusSubmitting} - err := svc.inner.UpdateMapfixIfStatus(ctx, MapfixID, allow_statuses, update) + err := svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, allow_statuses, update) if err != nil { - return nil, err + return err } event_data := model.AuditEventDataAction{ TargetStatus: uint32(target_status), } - err = svc.inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: MapfixID, + ID: params.MapfixID, Type: model.ResourceMapfix, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // ActionMapfixRequestChanges implements actionMapfixRequestChanges operation. @@ -128,36 +105,29 @@ func (svc *Mapfixes) SetStatusSubmitted(ctx context.Context, params *validator.S // (Internal endpoint) Role Validator changes status from Submitting -> RequestChanges. // // POST /mapfixes/{MapfixID}/status/validator-request-changes -func (svc *Mapfixes) ActionMapfixRequestChanges(ctx context.Context, params *validator.MapfixID) (*validator.NullResponse, error) { - MapfixID := int64(params.ID) +func (svc *Service) ActionMapfixRequestChanges(ctx context.Context, params internal.ActionMapfixRequestChangesParams) error { // transaction target_status := model.MapfixStatusChangesRequested update := service.NewMapfixUpdate() update.SetStatusID(target_status) - allow_statuses := []model.MapfixStatus{model.MapfixStatusSubmitting} - err := svc.inner.UpdateMapfixIfStatus(ctx, MapfixID, allow_statuses, update) + err := svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusSubmitting}, update) if err != nil { - return nil, err + return err } event_data := model.AuditEventDataAction{ TargetStatus: uint32(target_status), } - err = svc.inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: MapfixID, + ID: params.MapfixID, Type: model.ResourceMapfix, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // ActionMapfixValidate invokes actionMapfixValidate operation. @@ -165,18 +135,11 @@ func (svc *Mapfixes) ActionMapfixRequestChanges(ctx context.Context, params *val // Role Validator changes status from Validating -> Validated. // // POST /mapfixes/{MapfixID}/status/validator-validated -func (svc *Mapfixes) ActionMapfixValidated(ctx context.Context, params *validator.MapfixID) (*validator.NullResponse, error) { - MapfixID := int64(params.ID) +func (svc *Service) ActionMapfixValidated(ctx context.Context, params internal.ActionMapfixValidatedParams) error { // transaction update := service.NewMapfixUpdate() update.SetStatusID(model.MapfixStatusValidated) - allow_statuses := []model.MapfixStatus{model.MapfixStatusValidating} - err := svc.inner.UpdateMapfixIfStatus(ctx, MapfixID, allow_statuses, update) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil + return svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidating}, update) } // ActionMapfixAccepted implements actionMapfixAccepted operation. @@ -184,16 +147,14 @@ func (svc *Mapfixes) ActionMapfixValidated(ctx context.Context, params *validato // (Internal endpoint) Role Validator changes status from Validating -> Accepted. // // POST /mapfixes/{MapfixID}/status/validator-failed -func (svc *Mapfixes) ActionMapfixAccepted(ctx context.Context, params *validator.MapfixID) (*validator.NullResponse, error) { - MapfixID := int64(params.ID) +func (svc *Service) ActionMapfixAccepted(ctx context.Context, params internal.ActionMapfixAcceptedParams) error { // transaction target_status := model.MapfixStatusAcceptedUnvalidated update := service.NewMapfixUpdate() update.SetStatusID(target_status) - allow_statuses := []model.MapfixStatus{model.MapfixStatusValidating} - err := svc.inner.UpdateMapfixIfStatus(ctx, MapfixID, allow_statuses, update) + err := svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusValidating}, update) if err != nil { - return nil, err + return err } // push an action audit event @@ -201,20 +162,15 @@ func (svc *Mapfixes) ActionMapfixAccepted(ctx context.Context, params *validator TargetStatus: uint32(target_status), } - err = svc.inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: MapfixID, + ID: params.MapfixID, Type: model.ResourceMapfix, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // ActionMapfixUploaded implements actionMapfixUploaded operation. @@ -222,36 +178,29 @@ func (svc *Mapfixes) ActionMapfixAccepted(ctx context.Context, params *validator // (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. // // POST /mapfixes/{MapfixID}/status/validator-uploaded -func (svc *Mapfixes) ActionMapfixUploaded(ctx context.Context, params *validator.MapfixID) (*validator.NullResponse, error) { - MapfixID := int64(params.ID) +func (svc *Service) ActionMapfixUploaded(ctx context.Context, params internal.ActionMapfixUploadedParams) error { // transaction target_status := model.MapfixStatusUploaded update := service.NewMapfixUpdate() update.SetStatusID(target_status) - allow_statuses := []model.MapfixStatus{model.MapfixStatusUploading} - err := svc.inner.UpdateMapfixIfStatus(ctx, MapfixID, allow_statuses, update) + err := svc.inner.UpdateMapfixIfStatus(ctx, params.MapfixID, []model.MapfixStatus{model.MapfixStatusUploading}, update) if err != nil { - return nil, err + return err } event_data := model.AuditEventDataAction{ TargetStatus: uint32(target_status), } - err = svc.inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: MapfixID, + ID: params.MapfixID, Type: model.ResourceMapfix, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // CreateMapfixAuditError implements createMapfixAuditError operation. @@ -259,26 +208,20 @@ func (svc *Mapfixes) ActionMapfixUploaded(ctx context.Context, params *validator // Post an error to the audit log // // POST /mapfixes/{MapfixID}/error -func (svc *Mapfixes) CreateMapfixAuditError(ctx context.Context, params *validator.AuditErrorRequest) (*validator.NullResponse, error) { - MapfixID := int64(params.ID) +func (svc *Service) CreateMapfixAuditError(ctx context.Context, params internal.CreateMapfixAuditErrorParams) (error) { event_data := model.AuditEventDataError{ Error: params.ErrorMessage, } - err := svc.inner.CreateAuditEventError( + return svc.inner.CreateAuditEventError( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: MapfixID, + ID: params.MapfixID, Type: model.ResourceMapfix, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // CreateMapfixAuditCheckList implements createMapfixAuditCheckList operation. @@ -286,11 +229,10 @@ func (svc *Mapfixes) CreateMapfixAuditError(ctx context.Context, params *validat // Post a checklist to the audit log // // POST /mapfixes/{MapfixID}/checklist -func (svc *Mapfixes) CreateMapfixAuditCheckList(ctx context.Context, params *validator.AuditChecklistRequest) (*validator.NullResponse, error) { - MapfixID := int64(params.ID) - check_list := make([]model.Check, len(params.CheckList)) - for i, check := range params.CheckList { - check_list[i] = model.Check{ +func (svc *Service) CreateMapfixAuditCheckList(ctx context.Context, check_list internal.CheckList, params internal.CreateMapfixAuditCheckListParams) (error) { + check_list2 := make([]model.Check, len(check_list)) + for i, check := range check_list { + check_list2[i] = model.Check{ Name: check.Name, Summary: check.Summary, Passed: check.Passed, @@ -298,33 +240,41 @@ func (svc *Mapfixes) CreateMapfixAuditCheckList(ctx context.Context, params *val } event_data := model.AuditEventDataCheckList{ - CheckList: check_list, + CheckList: check_list2, } - err := svc.inner.CreateAuditEventCheckList( + return svc.inner.CreateAuditEventCheckList( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: MapfixID, + ID: params.MapfixID, Type: model.ResourceMapfix, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // POST /mapfixes -func (svc *Mapfixes) Create(ctx context.Context, request *validator.MapfixCreate) (*validator.MapfixID, error) { - var Submitter=request.AssetOwner; +func (svc *Service) CreateMapfix(ctx context.Context, request *internal.MapfixCreate) (*internal.MapfixID, error) { + // sanitization + if request.GameID<0|| + request.AssetOwner<0|| + request.AssetID<0|| + request.AssetVersion<0|| + request.TargetAssetID<0{ + return nil, ErrNegativeID + } + var GameID=uint32(request.GameID); + var Submitter=uint64(request.AssetOwner); + var AssetID=uint64(request.AssetID); + var AssetVersion=uint64(request.AssetVersion); + var TargetAssetID=uint64(request.TargetAssetID); + // Check if an active mapfix with the same asset id exists { filter := service.NewMapfixFilter() - filter.SetAssetID(request.AssetID) - filter.SetAssetVersion(request.AssetVersion) + filter.SetAssetID(AssetID) + filter.SetAssetVersion(AssetVersion) filter.SetStatuses(ActiveMapfixStatuses) active_mapfixes, err := svc.inner.ListMapfixes(ctx, filter, model.Page{ Number: 1, @@ -338,8 +288,7 @@ func (svc *Mapfixes) Create(ctx context.Context, request *validator.MapfixCreate } } - OperationID := int32(request.OperationID) - operation, err := svc.inner.GetOperation(ctx, OperationID) + operation, err := svc.inner.GetOperation(ctx, request.OperationID) if err != nil { return nil, err } @@ -354,12 +303,12 @@ func (svc *Mapfixes) Create(ctx context.Context, request *validator.MapfixCreate ID: 0, DisplayName: request.DisplayName, Creator: request.Creator, - GameID: request.GameID, + GameID: GameID, Submitter: Submitter, - AssetID: request.AssetID, - AssetVersion: request.AssetVersion, + AssetID: AssetID, + AssetVersion: AssetVersion, Completed: false, - TargetAssetID: request.TargetAssetID, + TargetAssetID: TargetAssetID, StatusID: model.MapfixStatusUnderConstruction, Description: request.Description, }) @@ -369,12 +318,12 @@ func (svc *Mapfixes) Create(ctx context.Context, request *validator.MapfixCreate // mark the operation as completed and provide the path params := service.NewOperationCompleteParams(fmt.Sprintf("/mapfixes/%d", mapfix.ID)) - err = svc.inner.CompleteOperation(ctx, OperationID, params) + err = svc.inner.CompleteOperation(ctx, request.OperationID, params) if err != nil { return nil, err } - return &validator.MapfixID{ - ID: uint64(mapfix.ID), + return &internal.MapfixID{ + MapfixID: mapfix.ID, }, nil } diff --git a/pkg/service_internal/operations.go b/pkg/service_internal/operations.go new file mode 100644 index 0000000..8b02411 --- /dev/null +++ b/pkg/service_internal/operations.go @@ -0,0 +1,20 @@ +package service_internal + +import ( + "context" + + internal "git.itzana.me/strafesnet/maps-service/pkg/internal" + "git.itzana.me/strafesnet/maps-service/pkg/service" +) + +// ActionOperationFailed implements actionOperationFailed operation. +// +// Fail the specified OperationID with a StatusMessage. +// +// POST /operations/{OperationID}/status/operation-failed +func (svc *Service) ActionOperationFailed(ctx context.Context, params internal.ActionOperationFailedParams) (error) { + fail_params := service.NewOperationFailParams( + params.StatusMessage, + ) + return svc.inner.FailOperation(ctx, params.OperationID, fail_params) +} diff --git a/pkg/service_internal/script_policy.go b/pkg/service_internal/script_policy.go new file mode 100644 index 0000000..6933146 --- /dev/null +++ b/pkg/service_internal/script_policy.go @@ -0,0 +1,80 @@ +package service_internal + +import ( + "context" + + api "git.itzana.me/strafesnet/maps-service/pkg/internal" + "git.itzana.me/strafesnet/maps-service/pkg/model" + "git.itzana.me/strafesnet/maps-service/pkg/service" +) + +// CreateScriptPolicy implements createScriptPolicy operation. +// +// Create a new script policy. +// +// POST /script-policy +func (svc *Service) CreateScriptPolicy(ctx context.Context, req *api.ScriptPolicyCreate) (*api.ScriptPolicyID, error) { + from_script, err := svc.inner.GetScript(ctx, req.FromScriptID) + if err != nil { + return nil, err + } + + // the existence of ToScriptID does not need to be validated because it's checked by a foreign key constraint. + + script, err := svc.inner.CreateScriptPolicy(ctx, model.ScriptPolicy{ + ID: 0, + FromScriptHash: from_script.Hash, + ToScriptID: req.ToScriptID, + Policy: model.Policy(req.Policy), + }) + if err != nil { + return nil, err + } + + return &api.ScriptPolicyID{ + ScriptPolicyID: script.ID, + }, nil +} + +// ListScriptPolicy implements listScriptPolicy operation. +// +// Get list of script policies. +// +// GET /script-policy +func (svc *Service) ListScriptPolicy(ctx context.Context, params api.ListScriptPolicyParams) ([]api.ScriptPolicy, error) { + filter := service.NewScriptPolicyFilter() + + if hash_hex, ok := params.FromScriptHash.Get(); ok{ + hash_parsed, err := model.HashParse(hash_hex) + if err != nil { + return nil, err + } + filter.SetFromScriptHash(int64(hash_parsed)) + } + if to_script_id, to_script_id_ok := params.ToScriptID.Get(); to_script_id_ok{ + filter.SetToScriptID(to_script_id) + } + if policy, policy_ok := params.Policy.Get(); policy_ok{ + filter.SetPolicy(policy) + } + + items, err := svc.inner.ListScriptPolicies(ctx, filter, model.Page{ + Number: params.Page, + Size: params.Limit, + }) + if err != nil { + return nil, err + } + + var resp []api.ScriptPolicy + for _, item := range items { + resp = append(resp, api.ScriptPolicy{ + ID: item.ID, + FromScriptHash: model.HashFormat(uint64(item.FromScriptHash)), + ToScriptID: item.ToScriptID, + Policy: int32(item.Policy), + }) + } + + return resp, nil +} diff --git a/pkg/service_internal/scripts.go b/pkg/service_internal/scripts.go new file mode 100644 index 0000000..dd1acf1 --- /dev/null +++ b/pkg/service_internal/scripts.go @@ -0,0 +1,103 @@ +package service_internal + +import ( + "context" + + api "git.itzana.me/strafesnet/maps-service/pkg/internal" + "git.itzana.me/strafesnet/maps-service/pkg/model" + "git.itzana.me/strafesnet/maps-service/pkg/service" +) + +// CreateScript implements createScript operation. +// +// Create a new script. +// +// POST /scripts +func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*api.ScriptID, error) { + script, err := svc.inner.CreateScript(ctx, model.Script{ + ID: 0, + Name: req.Name, + Hash: int64(model.HashSource(req.Source)), + Source: req.Source, + ResourceType: model.ResourceType(req.ResourceType), + ResourceID: req.ResourceID.Or(0), + }) + if err != nil { + return nil, err + } + + return &api.ScriptID{ + ScriptID: script.ID, + }, nil +} + +// ListScripts implements listScripts operation. +// +// Get list of scripts. +// +// GET /scripts +func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParams) ([]api.Script, error) { + filter := service.NewScriptFilter() + if hash_hex, ok := params.Hash.Get(); ok{ + hash_parsed, err := model.HashParse(hash_hex) + if err != nil { + return nil, err + } + filter.SetHash(int64(hash_parsed)) + } + if name, name_ok := params.Name.Get(); name_ok{ + filter.SetName(name) + } + if source, source_ok := params.Source.Get(); source_ok{ + filter.SetSource(source) + } + if resource_type, resource_type_ok := params.ResourceType.Get(); resource_type_ok{ + filter.SetResourceType(resource_type) + } + if resource_id, resource_id_ok := params.ResourceID.Get(); resource_id_ok{ + filter.SetResourceID(resource_id) + } + + items, err := svc.inner.ListScripts(ctx, filter, model.Page{ + Number: params.Page, + Size: params.Limit, + }) + if err != nil { + return nil, err + } + + var resp []api.Script + for _, item := range items { + resp = append(resp, api.Script{ + ID: item.ID, + Name: item.Name, + Hash: model.HashFormat(uint64(item.Hash)), + Source: item.Source, + ResourceType: int32(item.ResourceType), + ResourceID: item.ResourceID, + }) + } + + return resp, nil +} + +// GetScript implements getScript operation. +// +// Get the specified script by ID. +// +// GET /scripts/{ScriptID} +func (svc *Service) GetScript(ctx context.Context, params api.GetScriptParams) (*api.Script, error) { + script, err := svc.inner.GetScript(ctx, params.ScriptID) + if err != nil { + return nil, err + } + + return &api.Script{ + ID: script.ID, + Name: script.Name, + Hash: model.HashFormat(uint64(script.Hash)), + Source: script.Source, + ResourceType: int32(script.ResourceType), + ResourceID: script.ResourceID, + }, nil +} diff --git a/pkg/service_internal/service_internal.go b/pkg/service_internal/service_internal.go new file mode 100644 index 0000000..7f37c54 --- /dev/null +++ b/pkg/service_internal/service_internal.go @@ -0,0 +1,46 @@ +package service_internal + +import ( + "context" + "errors" + "math" + + "git.itzana.me/strafesnet/maps-service/pkg/datastore" + internal "git.itzana.me/strafesnet/maps-service/pkg/internal" + "git.itzana.me/strafesnet/maps-service/pkg/service" +) + +const ( + ValidtorUserID uint64 = uint64(math.MaxInt64) +) + +var ( + ErrNegativeID = errors.New("A negative ID was provided") +) + +type Service struct { + inner *service.Service +} + +func NewService( + inner *service.Service, +) Service { + return Service{ + inner: inner, + } +} + +// yay duplicate code +func (svc *Service) NewError(ctx context.Context, err error) *internal.ErrorStatusCode { + status := 500 + if errors.Is(err, datastore.ErrNotExist) { + status = 404 + } + return &internal.ErrorStatusCode{ + StatusCode: status, + Response: internal.Error{ + Code: int64(status), + Message: err.Error(), + }, + } +} diff --git a/pkg/validator_controller/submissions.go b/pkg/service_internal/submissions.go similarity index 59% rename from pkg/validator_controller/submissions.go rename to pkg/service_internal/submissions.go index 1a373b3..32b9b95 100644 --- a/pkg/validator_controller/submissions.go +++ b/pkg/service_internal/submissions.go @@ -1,28 +1,16 @@ -package validator_controller +package service_internal import ( "context" "errors" "fmt" - "git.itzana.me/strafesnet/go-grpc/validator" "git.itzana.me/strafesnet/maps-service/pkg/datastore" + internal "git.itzana.me/strafesnet/maps-service/pkg/internal" "git.itzana.me/strafesnet/maps-service/pkg/model" "git.itzana.me/strafesnet/maps-service/pkg/service" ) -type Submissions struct { - *validator.UnimplementedValidatorSubmissionServiceServer - inner *service.Service -} -func NewSubmissionsController( - inner *service.Service, -) Submissions { - return Submissions{ - inner: inner, - } -} - var( // prevent two mapfixes with same asset id ActiveSubmissionStatuses = []model.SubmissionStatus{ @@ -45,40 +33,36 @@ var( // Update model following role restrictions. // // POST /submissions/{SubmissionID}/validated-model -func (svc *Submissions) SetValidatedModel(ctx context.Context, params *validator.ValidatedModelRequest) (*validator.NullResponse, error) { - SubmissionID := int64(params.ID) +func (svc *Service) UpdateSubmissionValidatedModel(ctx context.Context, params internal.UpdateSubmissionValidatedModelParams) error { + ValidatedModelID := uint64(params.ValidatedModelID) + ValidatedModelVersion := uint64(params.ValidatedModelVersion) // check if Status is ChangesRequested|Submitted|UnderConstruction update := service.NewSubmissionUpdate() - update.SetValidatedAssetID(params.ValidatedModelID) - update.SetValidatedAssetVersion(params.ValidatedModelVersion) + update.SetValidatedAssetID(ValidatedModelID) + update.SetValidatedAssetVersion(ValidatedModelVersion) // DO NOT reset completed when validated model is updated // update.Add("completed", false) allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusValidating} - err := svc.inner.UpdateSubmissionIfStatus(ctx, SubmissionID, allowed_statuses, update) + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { - return nil, err + return err } event_data := model.AuditEventDataChangeValidatedModel{ - ValidatedModelID: params.ValidatedModelID, - ValidatedModelVersion: params.ValidatedModelVersion, + ValidatedModelID: ValidatedModelID, + ValidatedModelVersion: ValidatedModelVersion, } - err = svc.inner.CreateAuditEventChangeValidatedModel( + return svc.inner.CreateAuditEventChangeValidatedModel( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: SubmissionID, + ID: params.SubmissionID, Type: model.ResourceSubmission, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // ActionSubmissionSubmitted invokes actionSubmissionSubmitted operation. @@ -86,8 +70,7 @@ func (svc *Submissions) SetValidatedModel(ctx context.Context, params *validator // Role Validator changes status from Submitting -> Submitted. // // POST /submissions/{SubmissionID}/status/validator-submitted -func (svc *Submissions) SetStatusSubmitted(ctx context.Context, params *validator.SubmittedRequest) (*validator.NullResponse, error) { - SubmissionID := int64(params.ID) +func (svc *Service) ActionSubmissionSubmitted(ctx context.Context, params internal.ActionSubmissionSubmittedParams) error { // transaction target_status := model.SubmissionStatusSubmitted update := service.NewSubmissionUpdate() @@ -97,29 +80,24 @@ func (svc *Submissions) SetStatusSubmitted(ctx context.Context, params *validato update.SetCreator(params.Creator) update.SetGameID(uint32(params.GameID)) allowed_statuses := []model.SubmissionStatus{model.SubmissionStatusSubmitting} - err := svc.inner.UpdateSubmissionIfStatus(ctx, SubmissionID, allowed_statuses, update) + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { - return nil, err + return err } event_data := model.AuditEventDataAction{ TargetStatus: uint32(target_status), } - err = svc.inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: SubmissionID, + ID: params.SubmissionID, Type: model.ResourceSubmission, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // ActionSubmissionRequestChanges implements actionSubmissionRequestChanges operation. @@ -127,16 +105,15 @@ func (svc *Submissions) SetStatusSubmitted(ctx context.Context, params *validato // (Internal endpoint) Role Validator changes status from Submitting -> RequestChanges. // // POST /submissions/{SubmissionID}/status/validator-request-changes -func (svc *Submissions) SetStatusRequestChanges(ctx context.Context, params *validator.SubmissionID) (*validator.NullResponse, error) { - SubmissionID := int64(params.ID) +func (svc *Service) ActionSubmissionRequestChanges(ctx context.Context, params internal.ActionSubmissionRequestChangesParams) error { // transaction target_status := model.SubmissionStatusChangesRequested update := service.NewSubmissionUpdate() update.SetStatusID(target_status) allowed_statuses :=[]model.SubmissionStatus{model.SubmissionStatusSubmitting} - err := svc.inner.UpdateSubmissionIfStatus(ctx, SubmissionID, allowed_statuses, update) + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { - return nil, err + return err } // push an action audit event @@ -144,20 +121,15 @@ func (svc *Submissions) SetStatusRequestChanges(ctx context.Context, params *val TargetStatus: uint32(target_status), } - err = svc.inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: SubmissionID, + ID: params.SubmissionID, Type: model.ResourceSubmission, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // ActionSubmissionValidate invokes actionSubmissionValidate operation. @@ -165,36 +137,30 @@ func (svc *Submissions) SetStatusRequestChanges(ctx context.Context, params *val // Role Validator changes status from Validating -> Validated. // // POST /submissions/{SubmissionID}/status/validator-validated -func (svc *Submissions) SetStatusValidated(ctx context.Context, params *validator.SubmissionID) (*validator.NullResponse, error) { - SubmissionID := int64(params.ID) +func (svc *Service) ActionSubmissionValidated(ctx context.Context, params internal.ActionSubmissionValidatedParams) error { // transaction target_status := model.SubmissionStatusValidated update := service.NewSubmissionUpdate() update.SetStatusID(target_status) allowed_statuses :=[]model.SubmissionStatus{model.SubmissionStatusValidating} - err := svc.inner.UpdateSubmissionIfStatus(ctx, SubmissionID, allowed_statuses, update) + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { - return nil, err + return err } event_data := model.AuditEventDataAction{ TargetStatus: uint32(target_status), } - err = svc.inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: SubmissionID, + ID: params.SubmissionID, Type: model.ResourceSubmission, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // ActionSubmissionAccepted implements actionSubmissionAccepted operation. @@ -202,16 +168,15 @@ func (svc *Submissions) SetStatusValidated(ctx context.Context, params *validato // (Internal endpoint) Role Validator changes status from Validating -> Accepted. // // POST /submissions/{SubmissionID}/status/validator-failed -func (svc *Submissions) SetStatusFailed(ctx context.Context, params *validator.SubmissionID) (*validator.NullResponse, error) { - SubmissionID := int64(params.ID) +func (svc *Service) ActionSubmissionAccepted(ctx context.Context, params internal.ActionSubmissionAcceptedParams) error { // transaction target_status := model.SubmissionStatusAcceptedUnvalidated update := service.NewSubmissionUpdate() update.SetStatusID(target_status) allowed_statuses :=[]model.SubmissionStatus{model.SubmissionStatusValidating} - err := svc.inner.UpdateSubmissionIfStatus(ctx, SubmissionID, allowed_statuses, update) + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { - return nil, err + return err } // push an action audit event @@ -219,20 +184,15 @@ func (svc *Submissions) SetStatusFailed(ctx context.Context, params *validator.S TargetStatus: uint32(target_status), } - err = svc.inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: SubmissionID, + ID: params.SubmissionID, Type: model.ResourceSubmission, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // ActionSubmissionUploaded implements actionSubmissionUploaded operation. @@ -240,37 +200,31 @@ func (svc *Submissions) SetStatusFailed(ctx context.Context, params *validator.S // (Internal endpoint) Role Validator changes status from Uploading -> Uploaded. // // POST /submissions/{SubmissionID}/status/validator-uploaded -func (svc *Submissions) SetStatusUploaded(ctx context.Context, params *validator.StatusUploadedRequest) (*validator.NullResponse, error) { - SubmissionID := int64(params.ID) +func (svc *Service) ActionSubmissionUploaded(ctx context.Context, params internal.ActionSubmissionUploadedParams) error { // transaction target_status := model.SubmissionStatusUploaded update := service.NewSubmissionUpdate() update.SetStatusID(target_status) - update.SetUploadedAssetID(params.UploadedAssetID) + update.SetUploadedAssetID(uint64(params.UploadedAssetID)) allowed_statuses :=[]model.SubmissionStatus{model.SubmissionStatusUploading} - err := svc.inner.UpdateSubmissionIfStatus(ctx, SubmissionID, allowed_statuses, update) + err := svc.inner.UpdateSubmissionIfStatus(ctx, params.SubmissionID, allowed_statuses, update) if err != nil { - return nil, err + return err } event_data := model.AuditEventDataAction{ TargetStatus: uint32(target_status), } - err = svc.inner.CreateAuditEventAction( + return svc.inner.CreateAuditEventAction( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: SubmissionID, + ID: params.SubmissionID, Type: model.ResourceSubmission, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // CreateSubmissionAuditError implements createSubmissionAuditError operation. @@ -278,26 +232,20 @@ func (svc *Submissions) SetStatusUploaded(ctx context.Context, params *validator // Post an error to the audit log // // POST /submissions/{SubmissionID}/error -func (svc *Submissions) CreateAuditError(ctx context.Context, params *validator.AuditErrorRequest) (*validator.NullResponse, error) { - SubmissionID := int64(params.ID) +func (svc *Service) CreateSubmissionAuditError(ctx context.Context, params internal.CreateSubmissionAuditErrorParams) (error) { event_data := model.AuditEventDataError{ Error: params.ErrorMessage, } - err := svc.inner.CreateAuditEventError( + return svc.inner.CreateAuditEventError( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: SubmissionID, + ID: params.SubmissionID, Type: model.ResourceSubmission, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // CreateSubmissionAuditCheckList implements createSubmissionAuditCheckList operation. @@ -305,11 +253,10 @@ func (svc *Submissions) CreateAuditError(ctx context.Context, params *validator. // Post a checklist to the audit log // // POST /submissions/{SubmissionID}/checklist -func (svc *Submissions) CreateAuditChecklist(ctx context.Context, params *validator.AuditChecklistRequest) (*validator.NullResponse, error) { - SubmissionID := int64(params.ID) - check_list := make([]model.Check, len(params.CheckList)) - for i, check := range params.CheckList { - check_list[i] = model.Check{ +func (svc *Service) CreateSubmissionAuditCheckList(ctx context.Context, check_list internal.CheckList, params internal.CreateSubmissionAuditCheckListParams) (error) { + check_list2 := make([]model.Check, len(check_list)) + for i, check := range check_list { + check_list2[i] = model.Check{ Name: check.Name, Summary: check.Summary, Passed: check.Passed, @@ -317,36 +264,41 @@ func (svc *Submissions) CreateAuditChecklist(ctx context.Context, params *valida } event_data := model.AuditEventDataCheckList{ - CheckList: check_list, + CheckList: check_list2, } - err := svc.inner.CreateAuditEventCheckList( + return svc.inner.CreateAuditEventCheckList( ctx, - model.ValidatorUserID, + ValidtorUserID, model.Resource{ - ID: SubmissionID, + ID: params.SubmissionID, Type: model.ResourceSubmission, }, event_data, ) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil } // POST /submissions -func (svc *Submissions) Create(ctx context.Context, request *validator.SubmissionCreate) (*validator.SubmissionID, error) { +func (svc *Service) CreateSubmission(ctx context.Context, request *internal.SubmissionCreate) (*internal.SubmissionID, error) { + // sanitization + if request.GameID<0|| + request.AssetOwner<0|| + request.AssetID<0|| + request.AssetVersion<0{ + return nil, ErrNegativeID + } + var GameID=uint32(request.GameID); var Submitter=uint64(request.AssetOwner); + var AssetID=uint64(request.AssetID); + var AssetVersion=uint64(request.AssetVersion); var Status=model.SubmissionStatus(request.Status); var roles=model.Roles(request.Roles); // Check if an active submission with the same asset id exists { filter := service.NewSubmissionFilter() - filter.SetAssetID(request.AssetID) - filter.SetAssetVersion(request.AssetVersion) + filter.SetAssetID(AssetID) + filter.SetAssetVersion(AssetVersion) filter.SetStatuses(ActiveSubmissionStatuses) active_submissions, err := svc.inner.ListSubmissions(ctx, filter, model.Page{ Number: 1, @@ -360,8 +312,7 @@ func (svc *Submissions) Create(ctx context.Context, request *validator.Submissio } } - operation_id := int32(request.OperationID) - operation, err := svc.inner.GetOperation(ctx, operation_id) + operation, err := svc.inner.GetOperation(ctx, request.OperationID) if err != nil { return nil, err } @@ -379,10 +330,10 @@ func (svc *Submissions) Create(ctx context.Context, request *validator.Submissio ID: 0, DisplayName: request.DisplayName, Creator: request.Creator, - GameID: request.GameID, + GameID: GameID, Submitter: Submitter, - AssetID: request.AssetID, - AssetVersion: request.AssetVersion, + AssetID: AssetID, + AssetVersion: AssetVersion, Completed: false, StatusID: Status, }) @@ -392,12 +343,12 @@ func (svc *Submissions) Create(ctx context.Context, request *validator.Submissio // mark the operation as completed and provide the path params := service.NewOperationCompleteParams(fmt.Sprintf("/submissions/%d", submission.ID)) - err = svc.inner.CompleteOperation(ctx, operation_id, params) + err = svc.inner.CompleteOperation(ctx, request.OperationID, params) if err != nil { return nil, err } - return &validator.SubmissionID{ - ID: uint64(submission.ID), + return &internal.SubmissionID{ + SubmissionID: submission.ID, }, nil } diff --git a/pkg/validator_controller/operations.go b/pkg/validator_controller/operations.go deleted file mode 100644 index e95f10b..0000000 --- a/pkg/validator_controller/operations.go +++ /dev/null @@ -1,37 +0,0 @@ -package validator_controller - -import ( - "context" - - "git.itzana.me/strafesnet/go-grpc/validator" - "git.itzana.me/strafesnet/maps-service/pkg/service" -) - -type Operations struct { - *validator.UnimplementedValidatorOperationServiceServer - inner *service.Service -} -func NewOperationsController( - inner *service.Service, -) Operations { - return Operations{ - inner: inner, - } -} - -// ActionOperationFailed implements actionOperationFailed operation. -// -// Fail the specified OperationID with a StatusMessage. -// -// POST /operations/{OperationID}/status/operation-failed -func (svc *Operations) Fail(ctx context.Context, params *validator.OperationFailRequest) (*validator.NullResponse, error) { - fail_params := service.NewOperationFailParams( - params.StatusMessage, - ) - err := svc.inner.FailOperation(ctx, int32(params.OperationID), fail_params) - if err != nil { - return nil, err - } - - return &validator.NullResponse{}, nil -} diff --git a/pkg/validator_controller/script_policy.go b/pkg/validator_controller/script_policy.go deleted file mode 100644 index 77dd8ca..0000000 --- a/pkg/validator_controller/script_policy.go +++ /dev/null @@ -1,89 +0,0 @@ -package validator_controller - -import ( - "context" - - "git.itzana.me/strafesnet/go-grpc/validator" - "git.itzana.me/strafesnet/maps-service/pkg/model" - "git.itzana.me/strafesnet/maps-service/pkg/service" -) - -type ScriptPolicy struct { - *validator.UnimplementedValidatorScriptPolicyServiceServer - inner *service.Service -} -func NewScriptPolicyController( - inner *service.Service, -) ScriptPolicy { - return ScriptPolicy{ - inner: inner, - } -} - -// CreateScriptPolicy implements createScriptPolicy operation. -// -// Create a new script policy. -// -// POST /script-policy -func (svc *ScriptPolicy) Create(ctx context.Context, req *validator.ScriptPolicyCreate) (*validator.ScriptPolicyID, error) { - from_script, err := svc.inner.GetScript(ctx, int64(req.FromScriptID)) - if err != nil { - return nil, err - } - - // the existence of ToScriptID does not need to be validated because it's checked by a foreign key constraint. - - script, err := svc.inner.CreateScriptPolicy(ctx, model.ScriptPolicy{ - ID: 0, - FromScriptHash: from_script.Hash, - ToScriptID: int64(req.ToScriptID), - Policy: model.Policy(req.Policy), - }) - if err != nil { - return nil, err - } - - return &validator.ScriptPolicyID{ - ID: uint64(script.ID), - }, nil -} - -// ListScriptPolicy implements listScriptPolicy operation. -// -// Get list of script policies. -// -// GET /script-policy -func (svc *ScriptPolicy) List(ctx context.Context, params *validator.ScriptPolicyListRequest) (*validator.ScriptPolicyListResponse, error) { - filter := service.NewScriptPolicyFilter() - - if params.Filter.FromScriptHash != nil { - filter.SetFromScriptHash(int64(*params.Filter.FromScriptHash)) - } - if params.Filter.ToScriptID != nil { - filter.SetToScriptID(int64(*params.Filter.ToScriptID)) - } - if params.Filter.Policy != nil { - filter.SetPolicy(int32(*params.Filter.Policy)) - } - - items, err := svc.inner.ListScriptPolicies(ctx, filter, model.Page{ - Number: int32(params.Page.Number), - Size: int32(params.Page.Size), - }) - if err != nil { - return nil, err - } - - resp := validator.ScriptPolicyListResponse{} - resp.ScriptPolicies = make([]*validator.ScriptPolicy, len(items)) - for i, item := range items { - resp.ScriptPolicies[i] = &validator.ScriptPolicy{ - ID: uint64(item.ID), - FromScriptHash: uint64(item.FromScriptHash), - ToScriptID: uint64(item.ToScriptID), - Policy: validator.Policy(int32(item.Policy)), - } - } - - return &resp, nil -} diff --git a/pkg/validator_controller/scripts.go b/pkg/validator_controller/scripts.go deleted file mode 100644 index e75dba4..0000000 --- a/pkg/validator_controller/scripts.go +++ /dev/null @@ -1,119 +0,0 @@ -package validator_controller - -import ( - "context" - - "git.itzana.me/strafesnet/go-grpc/validator" - "git.itzana.me/strafesnet/maps-service/pkg/model" - "git.itzana.me/strafesnet/maps-service/pkg/service" -) - -type Scripts struct { - *validator.UnimplementedValidatorScriptServiceServer - inner *service.Service -} -func NewScriptsController( - inner *service.Service, -) Scripts { - return Scripts{ - inner: inner, - } -} - -// CreateScript implements createScript operation. -// -// Create a new script. -// -// POST /scripts -func (svc *Scripts) Create(ctx context.Context, req *validator.ScriptCreate) (*validator.ScriptID, error) { - ResourceID := int64(0) - if req.ResourceID != nil { - ResourceID = int64(*req.ResourceID) - } - script, err := svc.inner.CreateScript(ctx, model.Script{ - ID: 0, - Name: req.Name, - Hash: int64(model.HashSource(req.Source)), - Source: req.Source, - ResourceType: model.ResourceType(req.ResourceType), - ResourceID: ResourceID, - }) - if err != nil { - return nil, err - } - - return &validator.ScriptID{ - ID: uint64(script.ID), - }, nil -} - -// ListScripts implements listScripts operation. -// -// Get list of scripts. -// -// GET /scripts -func (svc *Scripts) List(ctx context.Context, params *validator.ScriptListRequest) (*validator.ScriptListResponse, error) { - filter := service.NewScriptFilter() - if params.Filter.Hash != nil { - filter.SetHash(int64(*params.Filter.Hash)) - } - if params.Filter.Name != nil { - filter.SetName(*params.Filter.Name) - } - if params.Filter.Source != nil { - filter.SetSource(*params.Filter.Source) - } - if params.Filter.ResourceType != nil { - filter.SetResourceType(int32(*params.Filter.ResourceType)) - } - if params.Filter.ResourceID != nil { - filter.SetResourceID(int64(*params.Filter.ResourceID)) - } - - items, err := svc.inner.ListScripts(ctx, filter, model.Page{ - Number: int32(params.Page.Number), - Size: int32(params.Page.Size), - }) - if err != nil { - return nil, err - } - - resp := validator.ScriptListResponse{} - resp.Scripts = make([]*validator.Script, len(items)) - for i, item := range items { - resource_id := uint64(item.ResourceID) - resp.Scripts[i] = &validator.Script{ - ID: uint64(item.ID), - Name: item.Name, - Hash: uint64(item.Hash), - Source: item.Source, - ResourceType: validator.ResourceType(item.ResourceType), - ResourceID: &resource_id, - } - } - - return &resp, nil -} - -// GetScript implements getScript operation. -// -// Get the specified script by ID. -// -// GET /scripts/{ScriptID} -func (svc *Scripts) Get(ctx context.Context, params *validator.ScriptID) (*validator.Script, error) { - ScriptID := int64(params.ID) - script, err := svc.inner.GetScript(ctx, ScriptID) - if err != nil { - return nil, err - } - - ResourceID := uint64(script.ResourceID) - return &validator.Script{ - ID: uint64(script.ID), - Name: script.Name, - Hash: uint64(script.Hash), - Source: script.Source, - ResourceType: validator.ResourceType(script.ResourceType), - ResourceID: &ResourceID, - }, nil -} diff --git a/validation/Cargo.toml b/validation/Cargo.toml index 9067bb7..c1df8f4 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,9 +1,10 @@ [package] name = "maps-validation" version = "0.1.1" -edition = "2024" +edition = "2021" [dependencies] +submissions-api = { path = "api", features = ["internal"], default-features = false, registry = "strafesnet" } async-nats = "0.42.0" futures = "0.3.31" rbx_asset = { version = "0.4.7", registry = "strafesnet" } @@ -17,5 +18,3 @@ siphasher = "1.0.1" tokio = { version = "1.41.1", features = ["macros", "rt-multi-thread", "signal"] } heck = "0.5.0" lazy-regex = "3.4.1" -rust-grpc = { version = "1.2.1", registry = "strafesnet" } -tonic = "0.13.1" diff --git a/validation/api/Cargo.toml b/validation/api/Cargo.toml index a52749e..e8ce9f7 100644 --- a/validation/api/Cargo.toml +++ b/validation/api/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "submissions-api" version = "0.8.2" -edition = "2024" +edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/maps-service" license = "MIT OR Apache-2.0" @@ -17,3 +17,8 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" serde_repr = "0.1.19" url = "2" + +[features] +default = ["external"] +internal = [] +external = [] diff --git a/validation/api/src/context.rs b/validation/api/src/context.rs index 84be7ac..36476b3 100644 --- a/validation/api/src/context.rs +++ b/validation/api/src/context.rs @@ -33,6 +33,11 @@ impl Context{ self.client.get(url) .send().await } + #[cfg(feature="internal")] + pub async fn post_empty_body(&self,url:impl reqwest::IntoUrl)->Result{ + self.client.post(url) + .send().await + } pub async fn post(&self,url:impl reqwest::IntoUrl,body:impl Into)->Result{ self.client.post(url) .header("Content-Type","application/json") diff --git a/validation/api/src/internal.rs b/validation/api/src/internal.rs new file mode 100644 index 0000000..3041387 --- /dev/null +++ b/validation/api/src/internal.rs @@ -0,0 +1,241 @@ +use crate::types::*; + +#[derive(Clone)] +pub struct Context(crate::context::Context); + +// conditionally include specified query pairs +macro_rules! query_pairs{ + ($url:expr,)=>{ + $url + }; + ($url:expr,$(($param:expr,$value:expr))+)=>{ + { + let mut url=$url; + url.query_pairs_mut() + $(.append_pair($param,$value))*; + url + } + }; +} + +// there are lots of action endpoints and they all follow the same pattern +macro_rules! action{ + ($system:expr,$fname:ident,$config:ident,$config_type:ident,$action:expr,$config_submission_id:expr,$(($param:expr,$value:expr))*)=>{ + pub async fn $fname(&self,$config:$config_type)->Result<(),Error>{ + let url_raw=format!(concat!("{}/",$system,"/{}/",$action),self.0.base_url,$config_submission_id); + let url=query_pairs!(reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?,$(($param,$value))*); + + response_ok( + self.0.post_empty_body(url).await.map_err(Error::Reqwest)? + ).await.map_err(Error::Response)?; + + Ok(()) + } + }; +} +impl Context{ + pub fn new(base_url:String)->reqwest::Result{ + Ok(Self(crate::context::Context::new(base_url,None)?)) + } + pub async fn get_script(&self,config:GetScriptRequest)->Result{ + let url_raw=format!("{}/scripts/{}",self.0.base_url,config.ScriptID.0); + let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?; + + response_ok( + self.0.get(url).await.map_err(Error::Reqwest)? + ).await.map_err(Error::Response)? + .json().await.map_err(Error::ReqwestJson) + } + pub async fn get_scripts(&self,config:GetScriptsRequest<'_>)->Result,Error>{ + let url_raw=format!("{}/scripts",self.0.base_url); + let mut url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?; + + { + let mut query_pairs=url.query_pairs_mut(); + query_pairs.append_pair("Page",config.Page.to_string().as_str()); + query_pairs.append_pair("Limit",config.Limit.to_string().as_str()); + if let Some(name)=config.Name{ + query_pairs.append_pair("Name",name); + } + if let Some(hash)=config.Hash{ + query_pairs.append_pair("Hash",hash); + } + if let Some(source)=config.Source{ + query_pairs.append_pair("Source",source); + } + if let Some(resource_type)=config.ResourceType{ + query_pairs.append_pair("ResourceType",(resource_type as i32).to_string().as_str()); + } + if let Some(ResourceID(resource_id))=config.ResourceID{ + query_pairs.append_pair("ResourceID",resource_id.to_string().as_str()); + } + } + + response_ok( + self.0.get(url).await.map_err(Error::Reqwest)? + ).await.map_err(Error::Response)? + .json().await.map_err(Error::ReqwestJson) + } + pub async fn get_script_from_hash(&self,config:HashRequest<'_>)->Result,ScriptSingleItemError>{ + let scripts=self.get_scripts(GetScriptsRequest{ + Page:1, + Limit:2, + Hash:Some(config.hash), + Name:None, + Source:None, + ResourceType:None, + ResourceID:None, + }).await.map_err(SingleItemError::Other)?; + if 1)->Result{ + let url_raw=format!("{}/scripts",self.0.base_url); + let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?; + + let body=serde_json::to_string(&config).map_err(Error::JSON)?; + + response_ok( + self.0.post(url,body).await.map_err(Error::Reqwest)? + ).await.map_err(Error::Response)? + .json().await.map_err(Error::ReqwestJson) + } + pub async fn get_script_policies(&self,config:GetScriptPoliciesRequest<'_>)->Result,Error>{ + let url_raw=format!("{}/script-policy",self.0.base_url); + let mut url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?; + + { + let mut query_pairs=url.query_pairs_mut(); + query_pairs.append_pair("Page",config.Page.to_string().as_str()); + query_pairs.append_pair("Limit",config.Limit.to_string().as_str()); + if let Some(hash)=config.FromScriptHash{ + query_pairs.append_pair("FromScriptHash",hash); + } + if let Some(script_id)=config.ToScriptID{ + query_pairs.append_pair("ToScriptID",script_id.0.to_string().as_str()); + } + if let Some(policy)=config.Policy{ + query_pairs.append_pair("Policy",(policy as i32).to_string().as_str()); + } + } + + response_ok( + self.0.get(url).await.map_err(Error::Reqwest)? + ).await.map_err(Error::Response)? + .json().await.map_err(Error::ReqwestJson) + } + pub async fn get_script_policy_from_hash(&self,config:HashRequest<'_>)->Result,ScriptPolicySingleItemError>{ + let policies=self.get_script_policies(GetScriptPoliciesRequest{ + Page:1, + Limit:2, + FromScriptHash:Some(config.hash), + ToScriptID:None, + Policy:None, + }).await.map_err(SingleItemError::Other)?; + if 1Result{ + let url_raw=format!("{}/script-policy",self.0.base_url); + let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?; + + let body=serde_json::to_string(&config).map_err(Error::JSON)?; + + response_ok( + self.0.post(url,body).await.map_err(Error::Reqwest)? + ).await.map_err(Error::Response)? + .json().await.map_err(Error::ReqwestJson) + } + pub async fn create_submission(&self,config:CreateSubmissionRequest<'_>)->Result{ + let url_raw=format!("{}/submissions",self.0.base_url); + let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?; + + let body=serde_json::to_string(&config).map_err(Error::JSON)?; + + response_ok( + self.0.post(url,body).await.map_err(Error::Reqwest)? + ).await.map_err(Error::Response)? + .json().await.map_err(Error::ReqwestJson) + } + pub async fn create_submission_audit_check_list(&self,config:CreateSubmissionAuditCheckListRequest<'_>)->Result<(),Error>{ + let url_raw=format!("{}/submissions/{}/checklist",self.0.base_url,config.SubmissionID.0); + let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?; + + let body=serde_json::to_string(&config.CheckList).map_err(Error::JSON)?; + + response_ok( + self.0.post(url,body).await.map_err(Error::Reqwest)? + ).await.map_err(Error::Response)?; + + Ok(()) + } + // simple submission endpoints + action!("submissions",action_submission_request_changes,config,ActionSubmissionRequestChangesRequest,"status/validator-request-changes",config.SubmissionID.0,); + action!("submissions",action_submission_submitted,config,ActionSubmissionSubmittedRequest,"status/validator-submitted",config.SubmissionID.0, + ("ModelVersion",config.ModelVersion.to_string().as_str()) + ("DisplayName",config.DisplayName.as_str()) + ("Creator",config.Creator.as_str()) + ("GameID",(config.GameID as u8).to_string().as_str()) + ); + action!("submissions",action_submission_validated,config,SubmissionID,"status/validator-validated",config.0,); + action!("submissions",update_submission_validated_model,config,UpdateSubmissionModelRequest,"validated-model",config.SubmissionID.0, + ("ValidatedModelID",config.ModelID.to_string().as_str()) + ("ValidatedModelVersion",config.ModelVersion.to_string().as_str()) + ); + action!("submissions",action_submission_uploaded,config,ActionSubmissionUploadedRequest,"status/validator-uploaded",config.SubmissionID.0, + ("UploadedAssetID",config.UploadedAssetID.to_string().as_str()) + ); + action!("submissions",action_submission_accepted,config,ActionSubmissionAcceptedRequest,"status/validator-failed",config.SubmissionID.0,); + action!("submissions",create_submission_audit_error,config,CreateSubmissionAuditErrorRequest,"error",config.SubmissionID.0, + ("ErrorMessage",config.ErrorMessage.as_str()) + ); + pub async fn create_mapfix(&self,config:CreateMapfixRequest<'_>)->Result{ + let url_raw=format!("{}/mapfixes",self.0.base_url); + let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?; + + let body=serde_json::to_string(&config).map_err(Error::JSON)?; + + response_ok( + self.0.post(url,body).await.map_err(Error::Reqwest)? + ).await.map_err(Error::Response)? + .json().await.map_err(Error::ReqwestJson) + } + pub async fn create_mapfix_audit_check_list(&self,config:CreateMapfixAuditCheckListRequest<'_>)->Result<(),Error>{ + let url_raw=format!("{}/mapfixes/{}/checklist",self.0.base_url,config.MapfixID.0); + let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?; + + let body=serde_json::to_string(&config.CheckList).map_err(Error::JSON)?; + + response_ok( + self.0.post(url,body).await.map_err(Error::Reqwest)? + ).await.map_err(Error::Response)?; + + Ok(()) + } + // simple mapfixes endpoints + action!("mapfixes",action_mapfix_request_changes,config,ActionMapfixRequestChangesRequest,"status/validator-request-changes",config.MapfixID.0,); + action!("mapfixes",action_mapfix_submitted,config,ActionMapfixSubmittedRequest,"status/validator-submitted",config.MapfixID.0, + ("ModelVersion",config.ModelVersion.to_string().as_str()) + ("DisplayName",config.DisplayName.as_str()) + ("Creator",config.Creator.as_str()) + ("GameID",(config.GameID as u8).to_string().as_str()) + ); + action!("mapfixes",action_mapfix_validated,config,MapfixID,"status/validator-validated",config.0,); + action!("mapfixes",update_mapfix_validated_model,config,UpdateMapfixModelRequest,"validated-model",config.MapfixID.0, + ("ValidatedModelID",config.ModelID.to_string().as_str()) + ("ValidatedModelVersion",config.ModelVersion.to_string().as_str()) + ); + action!("mapfixes",action_mapfix_uploaded,config,ActionMapfixUploadedRequest,"status/validator-uploaded",config.MapfixID.0,); + action!("mapfixes",action_mapfix_accepted,config,ActionMapfixAcceptedRequest,"status/validator-failed",config.MapfixID.0,); + // simple operation endpoint + action!("operations",action_operation_failed,config,ActionOperationFailedRequest,"status/operation-failed",config.OperationID.0, + ("StatusMessage",config.StatusMessage.as_str()) + ); + action!("mapfixes",create_mapfix_audit_error,config,CreateMapfixAuditErrorRequest,"error",config.MapfixID.0, + ("ErrorMessage",config.ErrorMessage.as_str()) + ); +} diff --git a/validation/api/src/lib.rs b/validation/api/src/lib.rs index 11b351b..fdd1d22 100644 --- a/validation/api/src/lib.rs +++ b/validation/api/src/lib.rs @@ -2,6 +2,11 @@ mod context; pub use context::Cookie; pub mod types; + +#[cfg(feature="internal")] +pub mod internal; + +#[cfg(feature="external")] pub mod external; //lazy reexports diff --git a/validation/src/check.rs b/validation/src/check.rs index bf37214..b4015c4 100644 --- a/validation/src/check.rs +++ b/validation/src/check.rs @@ -4,7 +4,7 @@ use crate::rbx_util::{get_mapinfo,get_root_instance,read_dom,ReadDomError,GameID use heck::{ToSnakeCase,ToTitleCase}; use rbx_dom_weak::Instance; -use rust_grpc::validator::Check; +use submissions_api::types::Check; #[allow(dead_code)] #[derive(Debug)] @@ -640,27 +640,27 @@ impl std::fmt::Display for Duplicates{ macro_rules! passed{ ($name:literal)=>{ Check{ - name:$name.to_owned(), - summary:String::new(), - passed:true, + Name:$name, + Summary:String::new(), + Passed:true, } } } macro_rules! summary{ ($name:literal,$summary:expr)=>{ Check{ - name:$name.to_owned(), - summary:$summary, - passed:false, + Name:$name, + Summary:$summary, + Passed:false, } }; } macro_rules! summary_format{ ($name:literal,$fmt:literal)=>{ Check{ - name:$name.to_owned(), - summary:format!($fmt), - passed:false, + Name:$name, + Summary:format!($fmt), + Passed:false, } }; } @@ -813,7 +813,7 @@ impl MapCheck<'_>{ summary_format!("UnanchoredParts","{count} unanchored {plural}: {context}") } }; - Ok(MapCheckList{checks:vec![ + Ok(MapCheckList{checks:Box::new([ model_class, model_name, display_name, @@ -831,13 +831,13 @@ impl MapCheck<'_>{ missing_wormhole_in, duplicate_wormhole_out, unanchored_parts, - ]}) + ])}) } } #[derive(serde::Serialize)] pub struct MapCheckList{ - pub checks:Vec, + pub checks:Box<[Check;17]>, } pub struct CheckListAndVersion{ diff --git a/validation/src/check_mapfix.rs b/validation/src/check_mapfix.rs index eb2e4e4..ce0e840 100644 --- a/validation/src/check_mapfix.rs +++ b/validation/src/check_mapfix.rs @@ -5,7 +5,7 @@ use crate::nats_types::CheckMapfixRequest; #[derive(Debug)] pub enum Error{ Check(crate::check::Error), - ApiActionMapfixCheck(tonic::Status), + ApiActionMapfixCheck(submissions_api::Error), } impl std::fmt::Display for Error{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ @@ -22,13 +22,13 @@ impl crate::message_handler::MessageHandler{ // update the mapfix depending on the result match check_result{ Ok(CheckListAndVersion{status:Ok(map_info),version})=>{ - self.mapfixes.set_status_submitted( - rust_grpc::validator::SubmittedRequest{ - id:mapfix_id, - model_version:version, - display_name:map_info.display_name, - creator:map_info.creator, - game_id:map_info.game_id as u32, + self.api.action_mapfix_submitted( + submissions_api::types::ActionMapfixSubmittedRequest{ + MapfixID:mapfix_id, + ModelVersion:version, + DisplayName:map_info.display_name, + Creator:map_info.creator, + GameID:map_info.game_id.into(), } ).await.map_err(Error::ApiActionMapfixCheck)?; @@ -36,31 +36,29 @@ impl crate::message_handler::MessageHandler{ return Ok(()); }, // update the mapfix model status to request changes - Ok(CheckListAndVersion{status:Err(check_list),..})=>{ - self.mapfixes.create_audit_checklist( - rust_grpc::validator::AuditChecklistRequest{ - id:mapfix_id, - check_list:check_list.checks, - } - ).await.map_err(Error::ApiActionMapfixCheck)?; - }, + Ok(CheckListAndVersion{status:Err(check_list),..})=>self.api.create_mapfix_audit_check_list( + submissions_api::types::CreateMapfixAuditCheckListRequest{ + MapfixID:mapfix_id, + CheckList:check_list.checks.as_slice(), + } + ).await.map_err(Error::ApiActionMapfixCheck)?, // update the mapfix model status to request changes Err(e)=>{ // log error println!("[check_mapfix] Error: {e}"); - self.mapfixes.create_audit_error( - rust_grpc::validator::AuditErrorRequest{ - id:mapfix_id, - error_message:e.to_string(), + self.api.create_mapfix_audit_error( + submissions_api::types::CreateMapfixAuditErrorRequest{ + MapfixID:mapfix_id, + ErrorMessage:e.to_string(), } ).await.map_err(Error::ApiActionMapfixCheck)?; }, } - self.mapfixes.set_status_request_changes( - rust_grpc::validator::MapfixId{ - id:mapfix_id, + self.api.action_mapfix_request_changes( + submissions_api::types::ActionMapfixRequestChangesRequest{ + MapfixID:mapfix_id, } ).await.map_err(Error::ApiActionMapfixCheck)?; diff --git a/validation/src/check_submission.rs b/validation/src/check_submission.rs index 3ba70f9..7f838b2 100644 --- a/validation/src/check_submission.rs +++ b/validation/src/check_submission.rs @@ -5,7 +5,7 @@ use crate::nats_types::CheckSubmissionRequest; #[derive(Debug)] pub enum Error{ Check(crate::check::Error), - ApiActionSubmissionCheck(tonic::Status), + ApiActionSubmissionCheck(submissions_api::Error), } impl std::fmt::Display for Error{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ @@ -23,13 +23,13 @@ impl crate::message_handler::MessageHandler{ match check_result{ // update the submission model status to submitted Ok(CheckListAndVersion{status:Ok(map_info),version})=>{ - self.submissions.set_status_submitted( - rust_grpc::validator::SubmittedRequest{ - id:submission_id, - model_version:version, - display_name:map_info.display_name, - creator:map_info.creator, - game_id:map_info.game_id as u32, + self.api.action_submission_submitted( + submissions_api::types::ActionSubmissionSubmittedRequest{ + SubmissionID:submission_id, + ModelVersion:version, + DisplayName:map_info.display_name, + Creator:map_info.creator, + GameID:map_info.game_id.into(), } ).await.map_err(Error::ApiActionSubmissionCheck)?; @@ -37,31 +37,29 @@ impl crate::message_handler::MessageHandler{ return Ok(()); }, // update the submission model status to request changes - Ok(CheckListAndVersion{status:Err(check_list),..})=>{ - self.submissions.create_audit_checklist( - rust_grpc::validator::AuditChecklistRequest{ - id:submission_id, - check_list:check_list.checks, + Ok(CheckListAndVersion{status:Err(check_list),..})=>self.api.create_submission_audit_check_list( + submissions_api::types::CreateSubmissionAuditCheckListRequest{ + SubmissionID:submission_id, + CheckList:check_list.checks.as_slice(), } - ).await.map_err(Error::ApiActionSubmissionCheck)?; - }, + ).await.map_err(Error::ApiActionSubmissionCheck)?, // update the submission model status to request changes Err(e)=>{ // log error println!("[check_submission] Error: {e}"); - self.submissions.create_audit_error( - rust_grpc::validator::AuditErrorRequest{ - id:submission_id, - error_message:e.to_string(), + self.api.create_submission_audit_error( + submissions_api::types::CreateSubmissionAuditErrorRequest{ + SubmissionID:submission_id, + ErrorMessage:e.to_string(), } ).await.map_err(Error::ApiActionSubmissionCheck)?; }, } - self.submissions.set_status_request_changes( - rust_grpc::validator::SubmissionId{ - id:submission_id, + self.api.action_submission_request_changes( + submissions_api::types::ActionSubmissionRequestChangesRequest{ + SubmissionID:submission_id, } ).await.map_err(Error::ApiActionSubmissionCheck)?; diff --git a/validation/src/create_mapfix.rs b/validation/src/create_mapfix.rs index 443f694..d697675 100644 --- a/validation/src/create_mapfix.rs +++ b/validation/src/create_mapfix.rs @@ -5,7 +5,7 @@ use crate::create::CreateRequest; #[derive(Debug)] pub enum Error{ Create(crate::create::Error), - ApiActionMapfixCreate(tonic::Status), + ApiActionMapfixCreate(submissions_api::Error), } impl std::fmt::Display for Error{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ @@ -22,22 +22,22 @@ impl crate::message_handler::MessageHandler{ }).await.map_err(Error::Create)?; // call create on api - self.mapfixes.create(rust_grpc::validator::MapfixCreate{ - operation_id:create_info.OperationID, - asset_owner:create_request.AssetOwner, - display_name:create_request.DisplayName.unwrap_or_default(), - creator:create_request.Creator.unwrap_or_default(), + self.api.create_mapfix(submissions_api::types::CreateMapfixRequest{ + OperationID:create_info.OperationID, + AssetOwner:create_request.AssetOwner as i64, + DisplayName:create_request.DisplayName.as_deref().unwrap_or_default(), + Creator:create_request.Creator.as_deref().unwrap_or_default(), // not great TODO: make this great - game_id:create_request.GameID.unwrap_or(crate::rbx_util::GameID::Bhop) as u32, - asset_id:create_info.ModelID, - asset_version:create_request.AssetVersion, - target_asset_id:create_info.TargetAssetID, - description:create_info.Description, + GameID:create_request.GameID.unwrap_or(crate::rbx_util::GameID::Bhop).into(), + AssetID:create_info.ModelID, + AssetVersion:create_request.AssetVersion, + TargetAssetID:create_info.TargetAssetID, + Description:create_info.Description.as_str(), }).await.map_err(Error::ApiActionMapfixCreate)?; Ok(()) } - pub async fn create_mapfix(&self,create_info:CreateMapfixRequest)->Result<(),tonic::Status>{ + pub async fn create_mapfix(&self,create_info:CreateMapfixRequest)->Result<(),submissions_api::Error>{ let operation_id=create_info.OperationID; let create_result=self.create_mapfix_inner(create_info).await; @@ -46,9 +46,9 @@ impl crate::message_handler::MessageHandler{ // log error println!("[create_mapfix] Error: {e}"); - self.operations.fail(rust_grpc::validator::OperationFailRequest{ - operation_id, - status_message:e.to_string(), + self.api.action_operation_failed(submissions_api::types::ActionOperationFailedRequest{ + OperationID:operation_id, + StatusMessage:e.to_string(), }).await?; } diff --git a/validation/src/create_submission.rs b/validation/src/create_submission.rs index e30ec26..807044f 100644 --- a/validation/src/create_submission.rs +++ b/validation/src/create_submission.rs @@ -6,7 +6,7 @@ use crate::rbx_util::GameID; #[derive(Debug)] pub enum Error{ Create(crate::create::Error), - ApiActionSubmissionCreate(tonic::Status), + ApiActionSubmissionCreate(submissions_api::Error), } impl std::fmt::Display for Error{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ @@ -23,35 +23,35 @@ impl crate::message_handler::MessageHandler{ // grab values from submission form, otherwise try to fill blanks from map data let display_name=if create_info.DisplayName.is_empty(){ - create_request.DisplayName.unwrap_or_default() + create_request.DisplayName.as_deref().unwrap_or_default() }else{ - create_info.DisplayName + create_info.DisplayName.as_str() }; let creator=if create_info.Creator.is_empty(){ - create_request.Creator.unwrap_or_default() + create_request.Creator.as_deref().unwrap_or_default() }else{ - create_info.Creator + create_info.Creator.as_str() }; let game_id=create_info.GameID.try_into().ok().or(create_request.GameID).unwrap_or(GameID::Bhop); // call create on api - self.submissions.create(rust_grpc::validator::SubmissionCreate{ - operation_id:create_info.OperationID, - asset_owner:create_request.AssetOwner, - display_name:display_name, - creator:creator, - game_id:game_id as u32, - asset_id:create_info.ModelID, - asset_version:create_request.AssetVersion, - status:create_info.Status, - roles:create_info.Roles, + self.api.create_submission(submissions_api::types::CreateSubmissionRequest{ + OperationID:create_info.OperationID, + AssetOwner:create_request.AssetOwner as i64, + DisplayName:display_name, + Creator:creator, + GameID:game_id.into(), + AssetID:create_info.ModelID, + AssetVersion:create_request.AssetVersion, + Status:create_info.Status, + Roles:create_info.Roles, }).await.map_err(Error::ApiActionSubmissionCreate)?; Ok(()) } - pub async fn create_submission(&self,create_info:CreateSubmissionRequest)->Result<(),tonic::Status>{ + pub async fn create_submission(&self,create_info:CreateSubmissionRequest)->Result<(),submissions_api::Error>{ let operation_id=create_info.OperationID; let create_result=self.create_submission_inner(create_info).await; @@ -60,9 +60,9 @@ impl crate::message_handler::MessageHandler{ // log error println!("[create_submission] Error: {e}"); - self.operations.fail(rust_grpc::validator::OperationFailRequest{ - operation_id:operation_id, - status_message:e.to_string(), + self.api.action_operation_failed(submissions_api::types::ActionOperationFailedRequest{ + OperationID:operation_id, + StatusMessage:e.to_string(), }).await?; } diff --git a/validation/src/grpc/error.rs b/validation/src/grpc/error.rs deleted file mode 100644 index a9ae15f..0000000 --- a/validation/src/grpc/error.rs +++ /dev/null @@ -1,19 +0,0 @@ -use rust_grpc::validator::{ScriptId,ScriptPolicyId}; - -#[derive(Debug)] -#[expect(dead_code)] -pub enum SingleItemError{ - DuplicateItems(Items), - Other(tonic::Status), -} -impl std::fmt::Display for SingleItemError -where - Items:std::fmt::Debug -{ - fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ - write!(f,"{self:?}") - } -} -impl std::error::Error for SingleItemError where Items:std::fmt::Debug{} -pub type ScriptSingleItemError=SingleItemError>; -pub type ScriptPolicySingleItemError=SingleItemError>; diff --git a/validation/src/grpc/mapfixes.rs b/validation/src/grpc/mapfixes.rs deleted file mode 100644 index aeee26e..0000000 --- a/validation/src/grpc/mapfixes.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::endpoint; -use rust_grpc::validator::*; -pub type ValidatorMapfixesServiceClient=rust_grpc::validator::validator_mapfix_service_client::ValidatorMapfixServiceClient; -#[derive(Clone)] -pub struct Service{ - client:ValidatorMapfixesServiceClient, -} -impl Service{ - pub fn new( - client:ValidatorMapfixesServiceClient, - )->Self{ - Self{client} - } - endpoint!(create,MapfixCreate,MapfixId); - endpoint!(create_audit_error,AuditErrorRequest,NullResponse); - endpoint!(create_audit_checklist,AuditChecklistRequest,NullResponse); - endpoint!(set_validated_model,ValidatedModelRequest,NullResponse); - endpoint!(set_status_submitted,SubmittedRequest,NullResponse); - endpoint!(set_status_request_changes,MapfixId,NullResponse); - endpoint!(set_status_validated,MapfixId,NullResponse); - endpoint!(set_status_failed,MapfixId,NullResponse); - endpoint!(set_status_uploaded,MapfixId,NullResponse); -} diff --git a/validation/src/grpc/mod.rs b/validation/src/grpc/mod.rs deleted file mode 100644 index 2fff8c9..0000000 --- a/validation/src/grpc/mod.rs +++ /dev/null @@ -1,17 +0,0 @@ - -pub mod error; - -pub mod mapfixes; -pub mod operations; -pub mod scripts; -pub mod script_policy; -pub mod submissions; - -#[macro_export] -macro_rules! endpoint{ - ($fn:ident,$in:ident,$out:ident)=>{ - pub async fn $fn(&self,request:$in)->Result<$out,tonic::Status>{ - Ok(self.client.clone().$fn(request).await?.into_inner()) - } - }; -} diff --git a/validation/src/grpc/operations.rs b/validation/src/grpc/operations.rs deleted file mode 100644 index 7c21522..0000000 --- a/validation/src/grpc/operations.rs +++ /dev/null @@ -1,15 +0,0 @@ -use crate::endpoint; -use rust_grpc::validator::*; -pub type ValidatorOperationsServiceClient=rust_grpc::validator::validator_operation_service_client::ValidatorOperationServiceClient; -#[derive(Clone)] -pub struct Service{ - client:ValidatorOperationsServiceClient, -} -impl Service{ - pub fn new( - client:ValidatorOperationsServiceClient, - )->Self{ - Self{client} - } - endpoint!(fail,OperationFailRequest,NullResponse); -} diff --git a/validation/src/grpc/script_policy.rs b/validation/src/grpc/script_policy.rs deleted file mode 100644 index fe55d03..0000000 --- a/validation/src/grpc/script_policy.rs +++ /dev/null @@ -1,34 +0,0 @@ -use crate::endpoint; -use crate::grpc::error::ScriptPolicySingleItemError; -use rust_grpc::validator::*; -pub type ValidatorScriptPolicyServiceClient=rust_grpc::validator::validator_script_policy_service_client::ValidatorScriptPolicyServiceClient; -#[derive(Clone)] -pub struct Service{ - client:ValidatorScriptPolicyServiceClient, -} -impl Service{ - pub fn new( - client:ValidatorScriptPolicyServiceClient, - )->Self{ - Self{client} - } - endpoint!(create,ScriptPolicyCreate,ScriptPolicyId); - endpoint!(list,ScriptPolicyListRequest,ScriptPolicyListResponse); - pub async fn get_from_hash(&self,hash:u64)->Result,ScriptPolicySingleItemError>{ - let policies=self.list(ScriptPolicyListRequest{ - filter:Some(ScriptPolicyFilter{ - from_script_hash:Some(hash), - to_script_id:None, - policy:None, - }), - page:Some(Pagination{ - number:1, - size:2, - }), - }).await.map_err(ScriptPolicySingleItemError::Other)?; - if 1; -#[derive(Clone)] -pub struct Service{ - client:ValidatorScriptsServiceClient, -} -impl Service{ - pub fn new( - client:ValidatorScriptsServiceClient, - )->Self{ - Self{client} - } - endpoint!(create,ScriptCreate,ScriptId); - endpoint!(get,ScriptId,Script); - endpoint!(list,ScriptListRequest,ScriptListResponse); - pub async fn get_from_hash(&self,hash:u64)->Result,ScriptSingleItemError>{ - let policies=self.list(ScriptListRequest{ - filter:Some(ScriptFilter{ - hash:Some(hash), - name:None, - source:None, - resource_type:None, - resource_id:None, - }), - page:Some(Pagination{ - number:1, - size:2, - }), - }).await.map_err(ScriptSingleItemError::Other)?; - if 1; -#[derive(Clone)] -pub struct Service{ - client:ValidatorSubmissionsServiceClient, -} -impl Service{ - pub fn new( - client:ValidatorSubmissionsServiceClient, - )->Self{ - Self{client} - } - endpoint!(create,SubmissionCreate,SubmissionId); - endpoint!(create_audit_error,AuditErrorRequest,NullResponse); - endpoint!(create_audit_checklist,AuditChecklistRequest,NullResponse); - endpoint!(set_validated_model,ValidatedModelRequest,NullResponse); - endpoint!(set_status_submitted,SubmittedRequest,NullResponse); - endpoint!(set_status_request_changes,SubmissionId,NullResponse); - endpoint!(set_status_validated,SubmissionId,NullResponse); - endpoint!(set_status_failed,SubmissionId,NullResponse); - endpoint!(set_status_uploaded,StatusUploadedRequest,NullResponse); -} diff --git a/validation/src/main.rs b/validation/src/main.rs index bf3f26f..02d1d3a 100644 --- a/validation/src/main.rs +++ b/validation/src/main.rs @@ -1,12 +1,9 @@ use futures::StreamExt; -mod download; -mod grpc; mod rbx_util; mod message_handler; mod nats_types; -mod types; - +mod download; mod check; mod check_mapfix; mod check_submission; @@ -22,7 +19,7 @@ mod validate_submission; #[allow(dead_code)] #[derive(Debug)] pub enum StartupError{ - API(tonic::transport::Error), + API(submissions_api::ReqwestError), NatsConnect(async_nats::ConnectError), NatsGetStream(async_nats::jetstream::context::GetStreamError), NatsConsumer(async_nats::jetstream::stream::ConsumerError), @@ -57,14 +54,7 @@ async fn main()->Result<(),StartupError>{ // maps-service api let api_host_internal=std::env::var("API_HOST_INTERNAL").expect("API_HOST_INTERNAL env required"); - let (mapfixes,operations,scripts,script_policy,submissions)=tokio::try_join!( - crate::grpc::mapfixes::ValidatorMapfixesServiceClient::connect(api_host_internal.clone()), - crate::grpc::operations::ValidatorOperationsServiceClient::connect(api_host_internal.clone()), - crate::grpc::scripts::ValidatorScriptsServiceClient::connect(api_host_internal.clone()), - crate::grpc::script_policy::ValidatorScriptPolicyServiceClient::connect(api_host_internal.clone()), - crate::grpc::submissions::ValidatorSubmissionsServiceClient::connect(api_host_internal.clone()), - ).map_err(StartupError::API)?; - let message_handler=message_handler::MessageHandler::new(cloud_context,cookie_context,group_id,mapfixes,operations,scripts,script_policy,submissions); + let api=submissions_api::internal::Context::new(api_host_internal).map_err(StartupError::API)?; // nats let nats_host=std::env::var("NATS_HOST").expect("NATS_HOST env required"); @@ -97,12 +87,14 @@ async fn main()->Result<(),StartupError>{ consumer.messages().await.map_err(StartupError::NatsStream) }; - // run futures - let mut messages=nats_fut.await?; + let message_handler=message_handler::MessageHandler::new(cloud_context,cookie_context,group_id,api); // Create a signal listener for SIGTERM let mut sig_term=tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()).expect("Failed to create SIGTERM signal listener"); + // run futures + let mut messages=nats_fut.await?; + // process up to PARALLEL_REQUESTS in parallel let main_loop=async move{ static SEM:tokio::sync::Semaphore=tokio::sync::Semaphore::const_new(PARALLEL_REQUESTS); diff --git a/validation/src/message_handler.rs b/validation/src/message_handler.rs index 4508369..fc30782 100644 --- a/validation/src/message_handler.rs +++ b/validation/src/message_handler.rs @@ -5,8 +5,8 @@ pub enum HandleMessageError{ DoubleAck(async_nats::Error), Json(serde_json::Error), UnknownSubject(String), - CreateMapfix(tonic::Status), - CreateSubmission(tonic::Status), + CreateMapfix(submissions_api::Error), + CreateSubmission(submissions_api::Error), CheckMapfix(crate::check_mapfix::Error), CheckSubmission(crate::check_submission::Error), UploadMapfix(crate::upload_mapfix::Error), @@ -31,11 +31,7 @@ pub struct MessageHandler{ pub(crate) cloud_context:rbx_asset::cloud::Context, pub(crate) cookie_context:rbx_asset::cookie::Context, pub(crate) group_id:Option, - pub(crate) mapfixes:crate::grpc::mapfixes::Service, - pub(crate) operations:crate::grpc::operations::Service, - pub(crate) scripts:crate::grpc::scripts::Service, - pub(crate) script_policy:crate::grpc::script_policy::Service, - pub(crate) submissions:crate::grpc::submissions::Service, + pub(crate) api:submissions_api::internal::Context, } impl MessageHandler{ @@ -43,21 +39,13 @@ impl MessageHandler{ cloud_context:rbx_asset::cloud::Context, cookie_context:rbx_asset::cookie::Context, group_id:Option, - mapfixes:crate::grpc::mapfixes::ValidatorMapfixesServiceClient, - operations:crate::grpc::operations::ValidatorOperationsServiceClient, - scripts:crate::grpc::scripts::ValidatorScriptsServiceClient, - script_policy:crate::grpc::script_policy::ValidatorScriptPolicyServiceClient, - submissions:crate::grpc::submissions::ValidatorSubmissionsServiceClient, + api:submissions_api::internal::Context, )->Self{ Self{ cloud_context, cookie_context, group_id, - mapfixes:crate::grpc::mapfixes::Service::new(mapfixes), - operations:crate::grpc::operations::Service::new(operations), - scripts:crate::grpc::scripts::Service::new(scripts), - script_policy:crate::grpc::script_policy::Service::new(script_policy), - submissions:crate::grpc::submissions::Service::new(submissions), + api, } } pub async fn handle_message_result(&self,message_result:MessageResult)->Result<(),HandleMessageError>{ diff --git a/validation/src/nats_types.rs b/validation/src/nats_types.rs index 2c29cd3..203bef4 100644 --- a/validation/src/nats_types.rs +++ b/validation/src/nats_types.rs @@ -1,3 +1,5 @@ +use submissions_api::types::{SubmissionID,MapfixID,OperationID}; + // These represent the information needed in the nats message // to perform the operation, not necessarily the over-the-wire format @@ -8,7 +10,7 @@ #[derive(serde::Deserialize)] pub struct CreateSubmissionRequest{ // operation_id is passed back in the response message - pub OperationID:u32, + pub OperationID:OperationID, pub ModelID:u64, pub DisplayName:String, pub Creator:String, @@ -21,7 +23,7 @@ pub struct CreateSubmissionRequest{ #[allow(nonstandard_style)] #[derive(serde::Deserialize)] pub struct CreateMapfixRequest{ - pub OperationID:u32, + pub OperationID:OperationID, pub ModelID:u64, pub TargetAssetID:u64, pub Description:String, @@ -30,7 +32,7 @@ pub struct CreateMapfixRequest{ #[allow(nonstandard_style)] #[derive(serde::Deserialize)] pub struct CheckSubmissionRequest{ - pub SubmissionID:u64, + pub SubmissionID:SubmissionID, pub ModelID:u64, pub SkipChecks:bool, } @@ -38,7 +40,7 @@ pub struct CheckSubmissionRequest{ #[allow(nonstandard_style)] #[derive(serde::Deserialize)] pub struct CheckMapfixRequest{ - pub MapfixID:u64, + pub MapfixID:MapfixID, pub ModelID:u64, pub SkipChecks:bool, } @@ -47,7 +49,7 @@ pub struct CheckMapfixRequest{ #[derive(serde::Deserialize)] pub struct ValidateSubmissionRequest{ // submission_id is passed back in the response message - pub SubmissionID:u64, + pub SubmissionID:SubmissionID, pub ModelID:u64, pub ModelVersion:u64, pub ValidatedModelID:Option, @@ -57,7 +59,7 @@ pub struct ValidateSubmissionRequest{ #[derive(serde::Deserialize)] pub struct ValidateMapfixRequest{ // submission_id is passed back in the response message - pub MapfixID:u64, + pub MapfixID:MapfixID, pub ModelID:u64, pub ModelVersion:u64, pub ValidatedModelID:Option, @@ -67,7 +69,7 @@ pub struct ValidateMapfixRequest{ #[allow(nonstandard_style)] #[derive(serde::Deserialize)] pub struct UploadSubmissionRequest{ - pub SubmissionID:u64, + pub SubmissionID:SubmissionID, pub ModelID:u64, pub ModelVersion:u64, pub ModelName:String, @@ -76,7 +78,7 @@ pub struct UploadSubmissionRequest{ #[allow(nonstandard_style)] #[derive(serde::Deserialize)] pub struct UploadMapfixRequest{ - pub MapfixID:u64, + pub MapfixID:MapfixID, pub ModelID:u64, pub ModelVersion:u64, pub TargetAssetID:u64, diff --git a/validation/src/rbx_util.rs b/validation/src/rbx_util.rs index 14297ed..4f4451c 100644 --- a/validation/src/rbx_util.rs +++ b/validation/src/rbx_util.rs @@ -37,7 +37,15 @@ pub enum GameID{ Surf=2, FlyTrials=5, } - +impl From for submissions_api::types::GameID{ + fn from(value:GameID)->Self{ + match value{ + GameID::Bhop=>submissions_api::types::GameID::Bhop, + GameID::Surf=>submissions_api::types::GameID::Surf, + GameID::FlyTrials=>submissions_api::types::GameID::FlyTrials, + } + } +} #[derive(Debug)] pub struct ParseGameIDError; impl std::str::FromStr for GameID{ diff --git a/validation/src/types.rs b/validation/src/types.rs deleted file mode 100644 index afea9c3..0000000 --- a/validation/src/types.rs +++ /dev/null @@ -1,43 +0,0 @@ -use rust_grpc::validator::ResourceType; - -#[derive(Clone,Copy,Debug,Hash,Eq,PartialEq,serde::Serialize,serde::Deserialize)] -pub struct MapfixID(pub(crate)u64); -#[derive(Clone,Copy,Debug,Hash,Eq,PartialEq,serde::Serialize,serde::Deserialize)] -pub struct SubmissionID(pub(crate)u64); -#[derive(Clone,Copy,Debug,Hash,Eq,PartialEq,serde::Serialize,serde::Deserialize)] -pub struct OperationID(pub(crate)u64); -#[derive(Clone,Copy,Debug,Hash,Eq,PartialEq,serde::Serialize,serde::Deserialize)] -pub struct ResourceID(pub(crate)u64); -#[derive(Clone,Copy,Debug,Hash,Eq,PartialEq,serde::Serialize,serde::Deserialize)] -pub struct ScriptID(pub(crate)u64); - -pub struct StupidPolicy(pub(crate)rust_grpc::validator::Policy); -#[derive(Debug)] -pub struct StupidPolicyError; -impl TryFrom for StupidPolicy{ - type Error=StupidPolicyError; - fn try_from(value:i32)->Result{ - Ok(Self(match value{ - 0=>rust_grpc::validator::Policy::None, - 1=>rust_grpc::validator::Policy::Allowed, - 2=>rust_grpc::validator::Policy::Blocked, - 3=>rust_grpc::validator::Policy::Delete, - 4=>rust_grpc::validator::Policy::Replace, - _=>return Err(StupidPolicyError), - })) - } -} - -#[derive(Clone,Copy,Debug)] -pub enum Resource{ - Submission(SubmissionID), - Mapfix(MapfixID), -} -impl Resource{ - pub fn split(self)->(ResourceType,ResourceID){ - match self{ - Resource::Mapfix(MapfixID(mapfix_id))=>(ResourceType::Mapfix,ResourceID(mapfix_id)), - Resource::Submission(SubmissionID(submission_id))=>(ResourceType::Submission,ResourceID(submission_id)), - } - } -} diff --git a/validation/src/upload_mapfix.rs b/validation/src/upload_mapfix.rs index 8e567cd..3e3e8d8 100644 --- a/validation/src/upload_mapfix.rs +++ b/validation/src/upload_mapfix.rs @@ -8,7 +8,7 @@ pub enum Error{ IO(std::io::Error), Json(serde_json::Error), Upload(rbx_asset::cookie::UploadError), - ApiActionMapfixUploaded(tonic::Status), + ApiActionMapfixUploaded(submissions_api::Error), } impl std::fmt::Display for Error{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ @@ -41,8 +41,8 @@ impl crate::message_handler::MessageHandler{ // that's it, the database entry does not need to be changed. // mark mapfix as uploaded, TargetAssetID is unchanged - self.mapfixes.set_status_uploaded(rust_grpc::validator::MapfixId{ - id:upload_info.MapfixID, + self.api.action_mapfix_uploaded(submissions_api::types::ActionMapfixUploadedRequest{ + MapfixID:upload_info.MapfixID, }).await.map_err(Error::ApiActionMapfixUploaded)?; Ok(()) diff --git a/validation/src/upload_submission.rs b/validation/src/upload_submission.rs index 3b6319d..bc07b75 100644 --- a/validation/src/upload_submission.rs +++ b/validation/src/upload_submission.rs @@ -9,7 +9,7 @@ pub enum Error{ Json(serde_json::Error), Create(rbx_asset::cookie::CreateError), SystemTime(std::time::SystemTimeError), - ApiActionSubmissionUploaded(tonic::Status), + ApiActionSubmissionUploaded(submissions_api::Error), } impl std::fmt::Display for Error{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ @@ -39,9 +39,9 @@ impl crate::message_handler::MessageHandler{ },model_data).await.map_err(Error::Create)?; // note the asset id of the created model for later release, and mark the submission as uploaded - self.submissions.set_status_uploaded(rust_grpc::validator::StatusUploadedRequest{ - id:upload_info.SubmissionID, - uploaded_asset_id:upload_response.AssetId, + self.api.action_submission_uploaded(submissions_api::types::ActionSubmissionUploadedRequest{ + SubmissionID:upload_info.SubmissionID, + UploadedAssetID:upload_response.AssetId, }).await.map_err(Error::ApiActionSubmissionUploaded)?; Ok(()) diff --git a/validation/src/validate_mapfix.rs b/validation/src/validate_mapfix.rs index 10cb0ef..bce1639 100644 --- a/validation/src/validate_mapfix.rs +++ b/validation/src/validate_mapfix.rs @@ -3,7 +3,7 @@ use crate::nats_types::ValidateMapfixRequest; #[allow(dead_code)] #[derive(Debug)] pub enum Error{ - ApiActionMapfixValidate(tonic::Status), + ApiActionMapfixValidate(submissions_api::Error), } impl std::fmt::Display for Error{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ @@ -21,24 +21,24 @@ impl crate::message_handler::MessageHandler{ match &validate_result{ Ok(())=>{ // update the mapfix model status to validated - self.mapfixes.set_status_validated(rust_grpc::validator::MapfixId{ - id:mapfix_id, - }).await.map_err(Error::ApiActionMapfixValidate)?; + self.api.action_mapfix_validated( + mapfix_id + ).await.map_err(Error::ApiActionMapfixValidate)?; }, Err(e)=>{ // log error println!("[validate_mapfix] Error: {e}"); - self.mapfixes.create_audit_error( - rust_grpc::validator::AuditErrorRequest{ - id:mapfix_id, - error_message:e.to_string(), + self.api.create_mapfix_audit_error( + submissions_api::types::CreateMapfixAuditErrorRequest{ + MapfixID:mapfix_id, + ErrorMessage:e.to_string(), } ).await.map_err(Error::ApiActionMapfixValidate)?; // update the mapfix model status to accepted - self.mapfixes.set_status_failed(rust_grpc::validator::MapfixId{ - id:mapfix_id, + self.api.action_mapfix_accepted(submissions_api::types::ActionMapfixAcceptedRequest{ + MapfixID:mapfix_id, }).await.map_err(Error::ApiActionMapfixValidate)?; }, } diff --git a/validation/src/validate_submission.rs b/validation/src/validate_submission.rs index 690e71d..000ce41 100644 --- a/validation/src/validate_submission.rs +++ b/validation/src/validate_submission.rs @@ -3,7 +3,7 @@ use crate::nats_types::ValidateSubmissionRequest; #[allow(dead_code)] #[derive(Debug)] pub enum Error{ - ApiActionSubmissionValidate(tonic::Status), + ApiActionSubmissionValidate(submissions_api::Error), } impl std::fmt::Display for Error{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ @@ -21,24 +21,24 @@ impl crate::message_handler::MessageHandler{ match &validate_result{ Ok(())=>{ // update the submission model status to validated - self.submissions.set_status_validated(rust_grpc::validator::SubmissionId{ - id:submission_id, - }).await.map_err(Error::ApiActionSubmissionValidate)?; + self.api.action_submission_validated( + submission_id + ).await.map_err(Error::ApiActionSubmissionValidate)?; }, Err(e)=>{ // log error println!("[validate_submission] Error: {e}"); - self.submissions.create_audit_error( - rust_grpc::validator::AuditErrorRequest{ - id:submission_id, - error_message:e.to_string(), + self.api.create_submission_audit_error( + submissions_api::types::CreateSubmissionAuditErrorRequest{ + SubmissionID:submission_id, + ErrorMessage:e.to_string(), } ).await.map_err(Error::ApiActionSubmissionValidate)?; // update the submission model status to accepted - self.submissions.set_status_failed(rust_grpc::validator::SubmissionId{ - id:submission_id, + self.api.action_submission_accepted(submissions_api::types::ActionSubmissionAcceptedRequest{ + SubmissionID:submission_id, }).await.map_err(Error::ApiActionSubmissionValidate)?; }, } diff --git a/validation/src/validator.rs b/validation/src/validator.rs index 4302fe4..39ffa0c 100644 --- a/validation/src/validator.rs +++ b/validation/src/validator.rs @@ -1,20 +1,33 @@ use futures::TryStreamExt; -use rust_grpc::validator::Policy; +use submissions_api::types::Resource; use crate::download::download_asset_version; use crate::rbx_util::{read_dom,static_ustr,ReadDomError}; -use crate::types::{MapfixID,ScriptID,StupidPolicy,StupidPolicyError,SubmissionID,Resource,ResourceID}; const SCRIPT_CONCURRENCY:usize=16; +enum Policy{ + None, + Allowed, + Blocked, + Delete, + Replace(String), +} + +struct NamePolicy{ + name:String, + policy:Policy, +} + fn source_has_illegal_keywords(source:&str)->bool{ source.contains("getfenv")||source.contains("require") } -fn hash_source(source:&str)->u64{ +fn hash_source(source:&str)->String{ let mut hasher=siphasher::sip::SipHasher::new(); std::hash::Hasher::write(&mut hasher,source.as_bytes()); - std::hash::Hasher::finish(&hasher) + let hash=std::hash::Hasher::finish(&hasher); + format!("{:016x}",hash) } #[allow(dead_code)] @@ -27,18 +40,17 @@ pub enum Error{ submitted:u64, }, ScriptFlaggedIllegalKeyword(String), - ScriptBlocked(Option), - ScriptNotYetReviewed(Option), + ScriptBlocked(Option), + ScriptNotYetReviewed(Option), Download(crate::download::Error), ModelFileDecode(ReadDomError), - ApiGetScriptPolicyFromHash(crate::grpc::error::ScriptPolicySingleItemError), - ApiGetScript(tonic::Status), - StupidPolicy(StupidPolicyError), - ApiCreateScript(tonic::Status), - ApiCreateScriptPolicy(tonic::Status), - ApiGetScriptFromHash(crate::grpc::error::ScriptSingleItemError), - ApiUpdateMapfixModel(tonic::Status), - ApiUpdateSubmissionModel(tonic::Status), + ApiGetScriptPolicyFromHash(submissions_api::types::ScriptPolicySingleItemError), + ApiGetScript(submissions_api::Error), + ApiCreateScript(submissions_api::Error), + ApiCreateScriptPolicy(submissions_api::Error), + ApiGetScriptFromHash(submissions_api::types::ScriptSingleItemError), + ApiUpdateMapfixModel(submissions_api::Error), + ApiUpdateSubmissionModel(submissions_api::Error), ModelFileRootMustHaveOneChild, ModelFileChildRefIsNil, ModelFileEncode(rbx_binary::EncodeError), @@ -66,7 +78,7 @@ impl From for ValidateRequest{ ModelID:value.ModelID, ModelVersion:value.ModelVersion, ValidatedModelID:value.ValidatedModelID, - Resource:Resource::Mapfix(MapfixID(value.MapfixID)), + Resource:Resource::Mapfix(value.MapfixID), } } } @@ -76,27 +88,13 @@ impl From for ValidateRequest{ ModelID:value.ModelID, ModelVersion:value.ModelVersion, ValidatedModelID:value.ValidatedModelID, - Resource:Resource::Submission(SubmissionID(value.SubmissionID)), + Resource:Resource::Submission(value.SubmissionID), } } } impl crate::message_handler::MessageHandler{ pub async fn validate_inner(&self,validate_info:ValidateRequest)->Result<(),Error>{ - - enum OwnedPolicy{ - None, - Allowed, - Blocked, - Delete, - Replace(String), - } - - struct NamePolicy{ - name:String, - policy:OwnedPolicy, - } - // discover asset creator and latest version let info=self.cloud_context.get_asset_info( rbx_asset::cloud::GetAssetLatestRequest{asset_id:validate_info.ModelID} @@ -146,7 +144,7 @@ impl crate::message_handler::MessageHandler{ // policy will be fetched from the database to replace the default policy script_map.insert(source.clone(),NamePolicy{ name:get_partial_path(&dom,script), - policy:OwnedPolicy::None, + policy:Policy::None, }); } } @@ -159,42 +157,40 @@ impl crate::message_handler::MessageHandler{ let hash=hash_source(source.as_str()); // fetch the script policy - let script_policy=self.script_policy.get_from_hash( - hash, - ).await.map_err(Error::ApiGetScriptPolicyFromHash)?; + let script_policy=self.api.get_script_policy_from_hash(submissions_api::types::HashRequest{ + hash:hash.as_str(), + }).await.map_err(Error::ApiGetScriptPolicyFromHash)?; // write the policy to the script_map, fetching the replacement code if necessary if let Some(script_policy)=script_policy{ - *policy=match script_policy.policy.try_into(){ - Ok(StupidPolicy(Policy::None))=>OwnedPolicy::None, - Ok(StupidPolicy(Policy::Allowed))=>OwnedPolicy::Allowed, - Ok(StupidPolicy(Policy::Blocked))=>OwnedPolicy::Blocked, - Ok(StupidPolicy(Policy::Delete))=>OwnedPolicy::Delete, - Ok(StupidPolicy(Policy::Replace))=>{ - let script=self.scripts.get(rust_grpc::validator::ScriptId{ - id:script_policy.to_script_id, + *policy=match script_policy.Policy{ + submissions_api::types::Policy::None=>Policy::None, + submissions_api::types::Policy::Allowed=>Policy::Allowed, + submissions_api::types::Policy::Blocked=>Policy::Blocked, + submissions_api::types::Policy::Delete=>Policy::Delete, + submissions_api::types::Policy::Replace=>{ + let script=self.api.get_script(submissions_api::types::GetScriptRequest{ + ScriptID:script_policy.ToScriptID, }).await.map_err(Error::ApiGetScript)?; - OwnedPolicy::Replace(script.source) + Policy::Replace(script.Source) }, - // WHY DOES PROTOBUF NOT HAVE EMBEDDED ENUMS - Err(e)=>return Err(Error::StupidPolicy(e)), }; }else{ - let (resource_type,ResourceID(resource_id))=validate_info.Resource.split(); + let (resource_type,resource_id)=validate_info.Resource.split(); // upload the script - let script=self.scripts.create(rust_grpc::validator::ScriptCreate{ - name:name.clone(), - source:source.clone(), - resource_type:resource_type as i32, - resource_id:Some(resource_id), + let script=self.api.create_script(submissions_api::types::CreateScriptRequest{ + Name:name.as_str(), + Source:source.as_str(), + ResourceType:resource_type, + ResourceID:Some(resource_id), }).await.map_err(Error::ApiCreateScript)?; // create a None policy (pending review by yours truly) - self.script_policy.create(rust_grpc::validator::ScriptPolicyCreate{ - to_script_id:script.id, - from_script_id:script.id, - policy:rust_grpc::validator::Policy::None as i32, + self.api.create_script_policy(submissions_api::types::CreateScriptPolicyRequest{ + ToScriptID:script.ScriptID, + FromScriptID:script.ScriptID, + Policy:submissions_api::types::Policy::None, }).await.map_err(Error::ApiCreateScriptPolicy)?; } @@ -208,29 +204,29 @@ impl crate::message_handler::MessageHandler{ if let Some(script)=dom.get_by_ref_mut(script_ref){ if let Some(rbx_dom_weak::types::Variant::String(source))=script.properties.get_mut(&source_property){ match script_map.get(source.as_str()).map(|p|&p.policy){ - Some(OwnedPolicy::Blocked)=>{ + Some(Policy::Blocked)=>{ let hash=hash_source(source.as_str()); - let script=self.scripts.get_from_hash( - hash, - ).await.map_err(Error::ApiGetScriptFromHash)?; - return Err(Error::ScriptBlocked(script.map(|s|ScriptID(s.id)))); + let script=self.api.get_script_from_hash(submissions_api::types::HashRequest{ + hash:hash.as_str(), + }).await.map_err(Error::ApiGetScriptFromHash)?; + return Err(Error::ScriptBlocked(script.map(|s|s.ID))); }, None - |Some(OwnedPolicy::None) + |Some(Policy::None) =>{ let hash=hash_source(source.as_str()); - let script=self.scripts.get_from_hash( - hash, - ).await.map_err(Error::ApiGetScriptFromHash)?; - return Err(Error::ScriptNotYetReviewed(script.map(|s|ScriptID(s.id)))); + let script=self.api.get_script_from_hash(submissions_api::types::HashRequest{ + hash:hash.as_str(), + }).await.map_err(Error::ApiGetScriptFromHash)?; + return Err(Error::ScriptNotYetReviewed(script.map(|s|s.ID))); }, - Some(OwnedPolicy::Allowed)=>(), - Some(OwnedPolicy::Delete)=>{ + Some(Policy::Allowed)=>(), + Some(Policy::Delete)=>{ modified=true; // delete script dom.destroy(script_ref); }, - Some(OwnedPolicy::Replace(replacement))=>{ + Some(Policy::Replace(replacement))=>{ modified=true; *source=replacement.clone(); }, @@ -282,20 +278,20 @@ impl crate::message_handler::MessageHandler{ }; match validate_info.Resource{ - Resource::Mapfix(MapfixID(mapfix_id))=>{ + Resource::Mapfix(mapfix_id)=>{ // update the mapfix to use the validated model - self.mapfixes.set_validated_model(rust_grpc::validator::ValidatedModelRequest{ - id:mapfix_id, - validated_model_id, - validated_model_version, + self.api.update_mapfix_validated_model(submissions_api::types::UpdateMapfixModelRequest{ + MapfixID:mapfix_id, + ModelID:validated_model_id, + ModelVersion:validated_model_version, }).await.map_err(Error::ApiUpdateMapfixModel)?; }, - Resource::Submission(SubmissionID(submission_id))=>{ + Resource::Submission(submission_id)=>{ // update the submission to use the validated model - self.submissions.set_validated_model(rust_grpc::validator::ValidatedModelRequest{ - id:submission_id, - validated_model_id, - validated_model_version, + self.api.update_submission_validated_model(submissions_api::types::UpdateSubmissionModelRequest{ + SubmissionID:submission_id, + ModelID:validated_model_id, + ModelVersion:validated_model_version, }).await.map_err(Error::ApiUpdateSubmissionModel)?; }, }