diff --git a/api/s5/s5.go b/api/s5/s5.go index 0681e58..cbf49e5 100644 --- a/api/s5/s5.go +++ b/api/s5/s5.go @@ -3,6 +3,7 @@ package s5 import ( "context" "crypto/ed25519" + _ "embed" "fmt" "git.lumeweb.com/LumeWeb/portal/account" "git.lumeweb.com/LumeWeb/portal/api/middleware" @@ -10,6 +11,8 @@ import ( protoRegistry "git.lumeweb.com/LumeWeb/portal/protocols/registry" "git.lumeweb.com/LumeWeb/portal/protocols/s5" "git.lumeweb.com/LumeWeb/portal/storage" + "github.com/flowchartsman/swaggerui" + "github.com/getkin/kin-openapi/openapi3" "github.com/rs/cors" "github.com/spf13/viper" "go.sia.tech/jape" @@ -22,6 +25,9 @@ var ( _ registry.API = (*S5API)(nil) ) +//go:embed swagger.yaml +var spec []byte + type S5API struct { config *viper.Viper identity ed25519.PrivateKey @@ -107,8 +113,32 @@ func getRoutes(s *S5API) map[string]jape.Handler { tusCors := BuildTusCors() + loader := openapi3.NewLoader() + doc, err := loader.LoadFromData(spec) + if err != nil { + panic(err) + } + + if err = doc.Validate(loader.Context); err != nil { + panic(err) + } + + jsonDoc, err := doc.MarshalJSON() + + if err != nil { + panic(err) + } + wrappedTusHandler := middleware.ApplyMiddlewares(tusOptionsHandler, tusCors, middleware.AuthMiddleware(s.identity, s.accounts)) + swaggerHandler := func(c jape.Context) { + swaggerui.Handler(jsonDoc).ServeHTTP(c.ResponseWriter, c.Request) + } + + swaggerStripPrefix := func(h http.Handler) http.Handler { + return http.StripPrefix("/swagger", h) + } + return map[string]jape.Handler{ // Account API "GET /s5/account/register": s.httpHandler.AccountRegisterChallenge, @@ -149,6 +179,9 @@ func getRoutes(s *S5API) map[string]jape.Handler { "GET /s5/registry": middleware.ApplyMiddlewares(s.httpHandler.RegistryQuery, middleware.AuthMiddleware(s.identity, s.accounts)), "POST /s5/registry": middleware.ApplyMiddlewares(s.httpHandler.RegistrySet, middleware.AuthMiddleware(s.identity, s.accounts)), "GET /s5/registry/subscription": middleware.ApplyMiddlewares(s.httpHandler.RegistrySubscription, middleware.AuthMiddleware(s.identity, s.accounts)), + + "GET /swagger": middleware.ApplyMiddlewares(swaggerHandler, middleware.AdaptMiddleware(swaggerStripPrefix)), + "GET /swagger/swagger_spec": middleware.ApplyMiddlewares(swaggerHandler, middleware.AdaptMiddleware(swaggerStripPrefix)), } } diff --git a/api/s5/swagger.yaml b/api/s5/swagger.yaml new file mode 100644 index 0000000..716e083 --- /dev/null +++ b/api/s5/swagger.yaml @@ -0,0 +1,883 @@ +openapi: 3.0.0 +info: + title: S5 Storage API + version: "1.0" +paths: + # Account API + /s5/account/register: + get: + summary: Initiate account registration + security: [] + parameters: + - name: pubKey + description: Public key of the account + in: query + required: true + schema: + type: string + responses: + '200': + description: Registration challenge + post: + summary: Complete account registration + security: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AccountRegisterRequest' + responses: + '201': + description: Account created + /s5/account/login: + get: + summary: Initiate account login + security: [] + parameters: + - name: pubKey + description: Public key of the account + in: query + required: true + schema: + type: string + responses: + '200': + description: Login challenge + post: + summary: Complete account login + security: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AccountLoginRequest' + responses: + '200': + description: Login successful + /s5/account: + get: + summary: Retrieve account information + responses: + '200': + description: Account information + /s5/account/stats: + get: + summary: Retrieve account statistics + responses: + '200': + description: Account statistics + content: + application/json: + schema: + $ref: "#/components/schemas/AccountStatsResponse" + /s5/account/pins.bin: + get: + summary: Retrieve account pins + responses: + '200': + description: Account pins + + # Upload API + /s5/upload: + post: + summary: Upload a small file + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + application/octet-stream: + schema: + type: string + format: binary + responses: + '200': + description: File uploaded + '500': + description: Error uploading file + /s5/upload/directory: + post: + summary: Upload a directory + description: > + This endpoint accepts multiple files in a multipart/form-data request. + Each file can be uploaded under its own field name, which the server will process dynamically. + The endpoint also accepts additional query parameters such as `tryfiles` and `errorpages` to configure the upload behavior. + parameters: + - name: tryFiles + in: query + required: true + schema: + $ref: '#/components/schemas/UploadRequestTryFiles' + - name: errorPages + in: query + required: true + schema: + $ref: '#/components/schemas/UploadRequestErrorPages' + - name: name + in: query + required: true + schema: + type: string + requestBody: + content: + multipart/form-data: + schema: + type: object + additionalProperties: + type: string + format: binary + + responses: + '201': + description: Directory uploaded + + # Tus API + /s5/upload/tus: + post: + summary: TUS Upload + description: > + An empty POST request is used to create a new upload resource. The + Upload-Length header indicates the size of the entire upload in bytes. + If the Creation With Upload extension is available, the Client MAY include + parts of the upload in the initial Creation request + parameters: + - name: Content-Length + in: header + description: Must be 0 for creation extension. May be a positive number for + Creation With Upload extension. + schema: + type: integer + - name: Upload-Length + in: header + schema: + $ref: "#/components/schemas/Upload-Length" + - name: Tus-Resumable + in: header + schema: + $ref: "#/components/schemas/Tus-Resumable" + - name: Upload-Metadata + in: header + description: Added by the Creation extension. The Upload-Metadata request + and response header MUST consist of one or more comma-separated key-value + pairs. The key and value MUST be separated by a space. The key MUST NOT + contain spaces and commas and MUST NOT be empty. The key SHOULD be ASCII + encoded and the value MUST be Base64 encoded. All keys MUST be unique. The + value MAY be empty. In these cases, the space, which would normally separate + the key and the value, MAY be left out. Since metadata can contain arbitrary + binary values, Servers SHOULD carefully validate metadata values or sanitize + them before using them as header values to avoid header smuggling. + schema: + type: string + - name: Upload-Concat + in: header + description: Added by the Concatenation extension. The Upload-Concat request + and response header MUST be set in both partial and final upload creation + requests. It indicates whether the upload is either a partial or final upload. + If the upload is a partial one, the header value MUST be partial. In the + case of a final upload, its value MUST be final followed by a semicolon + and a space-separated list of partial upload URLs that will be concatenated. + The partial uploads URLs MAY be absolute or relative and MUST NOT contain + spaces as defined in RFC 3986. + schema: + type: string + - name: Upload-Defer-Length + in: header + description: Added by the Creation Defer Length extension. The Upload-Defer-Length + request and response header indicates that the size of the upload is not + known currently and will be transferred later. Its value MUST be 1. If the + length of an upload is not deferred, this header MUST be omitted. + schema: + type: integer + enum: + - 1 + - name: Upload-Offset + in: header + schema: + $ref: "#/components/schemas/Upload-Offset" + - name: Upload-Checksum + in: header + schema: + $ref: "#/components/schemas/Upload-Checksum" + requestBody: + description: (Possibly partial) content of the file. Required if Content-Length > 0. + required: false + content: + application/offset+octet-stream: + schema: + type: string + format: binary + responses: + 201: + description: Created + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + Upload-Offset: + schema: + $ref: "#/components/schemas/Upload-Offset" + Upload-Expires: + description: Added by the Creation With Upload Extension in combination + with the expiration extension. The Upload-Expires response header + indicates the time after which the unfinished upload expires. A Server + MAY wish to remove incomplete uploads after a given period of time + to prevent abandoned uploads from taking up extra storage. The Client + SHOULD use this header to determine if an upload is still valid before + attempting to resume the upload. This header MUST be included in every + PATCH response if the upload is going to expire. If the expiration + is known at the creation, the Upload-Expires header MUST be included + in the response to the initial POST request. Its value MAY change + over time. If a Client does attempt to resume an upload which has + since been removed by the Server, the Server SHOULD respond with the + 404 Not Found or 410 Gone status. The latter one SHOULD be used if + the Server is keeping track of expired uploads. In both cases the + Client SHOULD start a new upload. The value of the Upload-Expires + header MUST be in RFC 7231 datetime format. + schema: + type: string + Location: + description: Url of the created resource. + schema: + type: string + 400: + description: Added by the Creation With Upload Extension in combination + with the checksum extension. The checksum algorithm is not supported by + the server + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 412: + description: Precondition Failed + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + Tus-Version: + schema: + $ref: "#/components/schemas/Tus-Version" + 413: + description: If the length of the upload exceeds the maximum, which MAY + be specified using the Tus-Max-Size header, the Server MUST respond with + the 413 Request Entity Too Large status. + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 415: + description: Added by the Creation With Upload Extension. Content-Type was + not application/offset+octet-stream + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 460: + description: Added by the Creation With Upload Extension in combination + with the checksum extension. Checksums mismatch + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + options: + summary: Request to gather information about the Server's current configuration + description: An OPTIONS request MAY be used to gather information about the + Server's current configuration. A successful response indicated by the 204 + No Content or 200 OK status MUST contain the Tus-Version header. It MAY include + the Tus-Extension and Tus-Max-Size headers. + responses: + 200: + description: Success + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + Tus-Checksum-Algorithm: + schema: + $ref: "#/components/schemas/Tus-Checksum-Algorithm" + Tus-Version: + schema: + $ref: "#/components/schemas/Tus-Version" + Tus-Max-Size: + schema: + $ref: "#/components/schemas/Tus-Max-Size" + Tus-Extension: + schema: + $ref: "#/components/schemas/Tus-Extension" + 204: + description: Success + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + Tus-Checksum-Algorithm: + schema: + $ref: "#/components/schemas/Tus-Checksum-Algorithm" + Tus-Version: + schema: + $ref: "#/components/schemas/Tus-Version" + Tus-Max-Size: + schema: + $ref: "#/components/schemas/Tus-Max-Size" + Tus-Extension: + schema: + $ref: "#/components/schemas/Tus-Extension" + /s5/upload/tus/{id}: + delete: + summary: Added by the Termination extension. + description: When receiving a DELETE request for an existing upload the Server + SHOULD free associated resources and MUST respond with the 204 No Content + status confirming that the upload was terminated. For all future requests + to this URL, the Server SHOULD respond with the 404 Not Found or 410 Gone + status. + operationId: FilesDelete + parameters: + - name: id + in: path + required: true + schema: + type: string + - name: Tus-Resumable + in: header + required: true + schema: + $ref: "#/components/schemas/Tus-Resumable" + responses: + 204: + description: Upload was terminated + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 412: + description: Precondition Failed + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + Tus-Version: + schema: + $ref: "#/components/schemas/Tus-Version" + head: + summary: Used to determine the offset at which the upload should be continued. + description: Used to determine the offset at which the upload should be continued. + operationId: FilesHead + parameters: + - name: id + in: path + required: true + schema: + type: string + - name: Tus-Resumable + in: header + required: true + schema: + $ref: "#/components/schemas/Tus-Resumable" + responses: + 200: + description: Returns offset + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + Cache-Control: + schema: + type: string + enum: + - no-store + Upload-Offset: + schema: + $ref: "#/components/schemas/Upload-Offset" + Upload-Length: + schema: + $ref: "#/components/schemas/Upload-Length" + 403: + description: If the resource is not found, the Server SHOULD return either + the 404 Not Found, 410 Gone or 403 Forbidden status without the Upload-Offset + header. + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 404: + description: If the resource is not found, the Server SHOULD return either + the 404 Not Found, 410 Gone or 403 Forbidden status without the Upload-Offset + header. + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 410: + description: If the resource is not found, the Server SHOULD return either + the 404 Not Found, 410 Gone or 403 Forbidden status without the Upload-Offset + header. + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 412: + description: Precondition Failed + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + Tus-Version: + schema: + $ref: "#/components/schemas/Tus-Version" + patch: + summary: Used to resume the upload + description: 'The Server SHOULD accept PATCH requests against any upload URL + and apply the bytes contained in the message at the given offset specified + by the Upload-Offset header. All PATCH requests MUST use Content-Type: application/offset+octet-stream, + otherwise the server SHOULD return a 415 Unsupported Media Type status.' + operationId: FilePatch + parameters: + - name: id + in: path + required: true + schema: + type: string + - name: Tus-Resumable + in: header + required: true + schema: + $ref: "#/components/schemas/Tus-Resumable" + - name: Content-Length + in: header + description: Length of the body of this request + required: true + schema: + type: integer + - name: Upload-Offset + in: header + required: true + schema: + $ref: "#/components/schemas/Upload-Offset" + - name: Upload-Checksum + in: header + schema: + $ref: "#/components/schemas/Upload-Checksum" + requestBody: + description: Remaining (possibly partial) content of the file. Required if Content-Length > 0. + required: false + content: + application/offset+octet-stream: + schema: + type: string + format: binary + responses: + 204: + description: Upload offset was updated + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + Upload-Offset: + schema: + $ref: "#/components/schemas/Tus-Resumable" + Upload-Expires: + description: Added by the expiration extension. The Upload-Expires response + header indicates the time after which the unfinished upload expires. + A Server MAY wish to remove incomplete uploads after a given period + of time to prevent abandoned uploads from taking up extra storage. + The Client SHOULD use this header to determine if an upload is still + valid before attempting to resume the upload. This header MUST be + included in every PATCH response if the upload is going to expire. + If the expiration is known at the creation, the Upload-Expires header + MUST be included in the response to the initial POST request. Its + value MAY change over time. If a Client does attempt to resume an + upload which has since been removed by the Server, the Server SHOULD + respond with the 404 Not Found or 410 Gone status. The latter one + SHOULD be used if the Server is keeping track of expired uploads. + In both cases the Client SHOULD start a new upload. The value of the + Upload-Expires header MUST be in RFC 7231 datetime format. + schema: + type: string + 400: + description: Added by the checksum extension. The checksum algorithm is + not supported by the server + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 403: + description: In the concatenation extension, the Server MUST respond with + the 403 Forbidden status to PATCH requests against a final upload URL + and MUST NOT modify the final or its partial uploads. + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 404: + description: PATCH request against a non-existent resource + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 409: + description: PATCH request with Upload-Offset unequal to the offset of the resource on the server. The Upload-Offset header's value MUST be equal to the current offset of the resource. + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 410: + description: PATCH request against a non-existent resource + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 412: + description: Precondition Failed + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + Tus-Version: + schema: + $ref: "#/components/schemas/Tus-Version" + 415: + description: Content-Type was not application/offset+octet-stream + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + 460: + description: Added by the checksum extension. Checksums mismatch + headers: + Tus-Resumable: + schema: + $ref: "#/components/schemas/Tus-Resumable" + + # Download API + /s5/blob/{cid}: + get: + summary: Retrieve a blob + responses: + '302': + description: Redirecting to discovered blob url + /s5/metadata/{cid}: + get: + summary: Retrieve file metadata + description: > + * Resolvers are currently not supported + + * Raw files don't have metadata + responses: + '200': + description: File metadata + content: + application/json: + schema: + type: object + /s5/download/{cid}: + get: + summary: Download a file + responses: + '200': + description: File content + content: + application/octet-stream: + schema: + type: string + format: binary + + # Pins API + /s5/pin/{cid}: + post: + summary: Pin a file + responses: + '204': + description: File pinned + /s5/delete/{cid}: + delete: + summary: Delete a file. This will only unpin it from the account, and potentially delete it later if there are no more global pins. + responses: + '204': + description: File deleted + + # Debug API + /s5/debug/download_urls/{cid}: + get: + summary: Retrieve download URLs + parameters: + - name: hash + in: query + required: true + schema: + type: string + description: This is base64 url encoded + - name: kinds + in: query + required: false + schema: + type: string + description: This is a comma separated list of kinds, which are integer identifiers. + responses: + '200': + description: Download URLs + content: + text/plain: + schema: + type: string + /s5/debug/storage_locations/{hash}: + get: + summary: Retrieve storage locations + responses: + '200': + description: Storage locations + content: + application/json: + schema: + $ref: '#/components/schemas/DebugStorageLocationsResponse' + # Registry API + /s5/registry: + get: + summary: Retrieve a registry entry + parameters: + - name: pk + description: Public key of the registry entry + in: query + required: true + schema: + type: string + responses: + '200': + description: Registry entry + content: + application/json: + schema: + $ref: '#/components/schemas/RegistryQueryResponse' + post: + summary: Create or update a registry entry + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RegistrySetRequest' + responses: + '200': + description: Registry entry set + /s5/registry/subscription: + post: + summary: Listen for websocket updates for a given registry entry + requestBody: + content: + text/plain: + schema: + nullable: true + responses: + '200': + description: Success +components: + schemas: + AccountRegisterChallengeResponse: + type: object + properties: + challenge: + type: string + AccountRegisterRequest: + type: object + properties: + pubkey: + type: string + description: This is base64 url encoded + required: true + response: + type: string + description: This is base64 url encoded + required: true + signature: + type: string + description: This is base64 url encoded + required: true + email: + type: string + required: false + AccountLoginChallengeResponse: + type: object + properties: + challenge: + type: string + description: This is base64 url encoded + AccountLoginRequest: + type: object + properties: + pubkey: + type: string + description: This is base64 url encoded + response: + type: string + description: This is base64 url encoded + signature: + type: string + description: This is base64 url encoded + BasicUploadResponse: + type: object + properties: + CID: + type: string + UploadRequestTryFiles: + type: array + items: + type: string + UploadRequestErrorPages: + type: object + additionalProperties: + type: string + description: > + Object keys are expected to be string representations of integers (e.g., "404", "500"), + with their values being strings. Due to limitations in the OpenAPI Specification, + this pattern cannot be enforced through the schema and should be validated at runtime. + AccountStats: + type: object + properties: + total: + $ref: '#/components/schemas/AccountStatsTotal' + AccountStatsTotal: + type: object + properties: + usedStorage: + type: integer + AccountTier: + type: object + properties: + id: + type: integer + name: + type: string + uploadBandwidth: + type: integer + storageLimit: + type: integer + scopes: + type: array + additionalProperties: true + AccountInfoResponse: + type: object + properties: + email: + type: string + quotaExceeded: + type: boolean + emailConfirmed: + type: boolean + isRestricted: + type: boolean + tier: + $ref: '#/components/schemas/AccountTier' + AccountStatsResponse: + allOf: + - $ref: "#/components/schemas/AccountInfoResponse" + - type: object + properties: + stats: + $ref: "#/components/schemas/AccountStats" + RegistryQueryResponse: + type: object + properties: + pk: + type: string + revision: + type: integer + data: + type: string + signature: + type: string + RegistrySetRequest: + type: object + properties: + pk: + type: string + revision: + type: integer + data: + type: string + signature: + type: string + DebugStorageLocationsResponse: + type: object + properties: + locations: + type: array + items: + $ref: '#/components/schemas/DebugStorageLocation' + DebugStorageLocation: + type: object + properties: + location: + type: integer + parts: + type: array + items: + type: string + expiry: + type: integer + nodeId: + type: string + score: + type: integer + Tus-Resumable: + type: string + enum: + - 1.0.0 + description: Protocol version + Tus-Version: + description: The Tus-Version response header MUST be a comma-separated + list of protocol versions supported by the Server. The list MUST be + sorted by Server's preference where the first one is the most preferred + one. + type: string + Tus-Extension: + description: The Tus-Extension response header MUST be a comma-separated + list of the extensions supported by the Server. If no extensions are + supported, the Tus-Extension header MUST be omitted. + type: string + Tus-Max-Size: + description: The Tus-Max-Size response header MUST be a non-negative + integer indicating the maximum allowed size of an entire upload in + bytes. The Server SHOULD set this header if there is a known hard + limit. + type: integer + Upload-Length: + description: The Upload-Length request and response header indicates the size + of the entire upload in bytes. The value MUST be a non-negative integer. + In the concatenation extension, the Client MUST NOT include the Upload-Length + header in the final upload creation + type: integer + Upload-Offset: + description: The Upload-Offset request and response header indicates + a byte offset within a resource. The value MUST be a non-negative + integer. + type: integer + + Tus-Checksum-Algorithm: + description: Added by the checksum extension. The Tus-Checksum-Algorithm + response header MUST be a comma-separated list of the checksum algorithms + supported by the server. + type: string + Upload-Checksum: + description: Added by the checksum extension. The Upload-Checksum request + header contains information about the checksum of the current body payload. + The header MUST consist of the name of the used checksum algorithm and the + Base64 encoded checksum separated by a space. + type: string + securitySchemes: + BearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + CookieAuth: + type: apiKey + in: cookie + name: s5-auth-token + QueryAuth: + type: apiKey + in: query + name: s5-auth-token +security: + - BearerAuth: [] + - CookieAuth: [] + - QueryAuth: [] diff --git a/go.mod b/go.mod index b79ad9f..555a4b3 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,8 @@ require ( github.com/aws/aws-sdk-go-v2/credentials v1.16.13 github.com/aws/aws-sdk-go-v2/service/s3 v1.47.7 github.com/casbin/casbin/v2 v2.81.0 + github.com/flowchartsman/swaggerui v0.0.0-20221017034628-909ed4f3701b + github.com/getkin/kin-openapi v0.123.0 github.com/go-co-op/gocron/v2 v2.2.0 github.com/go-resty/resty/v2 v2.11.0 github.com/golang-jwt/jwt/v5 v5.2.0 @@ -19,6 +21,7 @@ require ( github.com/julienschmidt/httprouter v1.3.0 github.com/rs/cors v1.10.1 github.com/samber/lo v1.39.0 + github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.18.2 github.com/tus/tusd/v2 v2.2.3-0.20240125123123-9080d351525d github.com/vmihailenco/msgpack/v5 v5.4.1 @@ -57,24 +60,31 @@ require ( github.com/dchest/threefish v0.0.0-20120919164726-3ecf4c494abf // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-openapi/jsonpointer v0.20.2 // indirect + github.com/go-openapi/swag v0.22.8 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hbollon/go-edlib v1.6.0 // indirect + github.com/invopop/yaml v0.2.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/jonboulle/clockwork v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/klauspost/reedsolomon v1.12.0 // indirect github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect github.com/olebedev/emitter v0.0.0-20230411050614-349169dec2ba // indirect github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/prometheus/client_golang v1.18.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.45.0 // indirect @@ -85,8 +95,8 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.6.0 // indirect + github.com/ugorji/go v1.1.4 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect gitlab.com/NebulousLabs/bolt v1.4.4 // indirect gitlab.com/NebulousLabs/encoding v0.0.0-20200604091946-456c3dc907fe // indirect diff --git a/go.sum b/go.sum index 1fd83da..12462b2 100644 --- a/go.sum +++ b/go.sum @@ -1,44 +1,4 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240129071614-722f1300727f h1:rSEt0R+3kG71jCgxBfeO7APxCUwPL4sovGOf27G1wHE= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240129071614-722f1300727f/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240129192610-57ab0f36f9f0 h1:1iCFNVwqLs/acU8PaMS2Td5zLYdSoynkQZ0q1qmPksE= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240129192610-57ab0f36f9f0/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240129193340-ca41aee2456f h1:rFYR85aREhWZYLyVX6TSq3Bw/1GMH/Rw2o/zZDTBH8U= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240129193340-ca41aee2456f/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130015217-3b3a50e41973 h1:DyDimSxffiuizDvqj6LfyyGcRLrkDX3bTAMsq5Po5Jc= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130015217-3b3a50e41973/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130020357-0ee96599f18d h1:3DLZr9LvZmyLK8wpw//sgG+F3wVu7uXVzn0TM2+f8jM= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130020357-0ee96599f18d/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130023829-bd08d75da4f2 h1:sC0Rjc8JBXPmFZPJT6c2LdhJuvwfNnLMqqJ6IQnAR4w= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130023829-bd08d75da4f2/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130032546-af58aac985cf h1:mq1JcwSKJgsg0NFaPlHLwU4/+x3wlcyoyZjTiorbPUA= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130032546-af58aac985cf/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130033105-b49dd976b59e h1:tZPLQ9RRWBnv1qCpuXMLpdnufo++FY6mU80aznn/UZg= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130033105-b49dd976b59e/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130033540-ff134ece14ba h1:+QH80v1zi3c/EhN76QoMeNuE+jGQ79r6AKagjqX5Xz0= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130033540-ff134ece14ba/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130033852-f2d2193fc259 h1:uhZxPqsozvFWh+C7zmUDIR8Yaj9UdFOrvwVynFHHz/Y= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130033852-f2d2193fc259/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130053131-a51e3430e1a7 h1:mje77qVjaCrFeSkana35dTve+6mzaFIaZLZYB9vEurM= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130053131-a51e3430e1a7/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130191337-df3f7e24bb75 h1:qF1mDMrhW/5LjFAzEz8/tgNHDimgML84Goj1OrbDf7E= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130191337-df3f7e24bb75/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130191616-2201b5cb0771 h1:bfS4zaHVSggZ/HlKgphcfb/n59Am3IrQZZy0qhtxJLA= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130191616-2201b5cb0771/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130191657-8914bada60eb h1:k6Z59d37kjdRwB08U7oJHG4XZnhiPt46R37PXByN5X4= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130191657-8914bada60eb/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130204600-9919ad72da16 h1:gZw77T/wKIctDLXkT0sZtufVwMLTmZjKPPXEXIrvqBE= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130204600-9919ad72da16/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130210041-5a2e28fabab3 h1:Pmle1De067EXUB+QT2ut+eJgX8N27INb8gPsXKLmJKs= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130210041-5a2e28fabab3/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130210722-7cc5621a1069 h1:djXp7r6i+E1AIyRm9RSsDPxxYlfFpeV7w1dxOuqUCIg= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130210722-7cc5621a1069/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130215413-5350eda27e77 h1:jBABSSTqSZho8VzPBnpPw5Vej6oLe0yediZQrbOpnTY= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130215413-5350eda27e77/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130220905-881e19d569fa h1:+786ooAO9zrFYIfOXFwpR4gOn3nlAjdY24L6Tlc0pbM= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130220905-881e19d569fa/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130222606-5079db4f03e6 h1:v/GH477nPqZnKUek8jc/xPa05cP7ihC9N/2GsXDNI7E= -git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240130222606-5079db4f03e6/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240201012059-dfeb8b29a8e4 h1:yUv0uhdPvE2pnYdhNMk3r3rs7tTP+frRLtycZozZCG8= git.lumeweb.com/LumeWeb/libs5-go v0.0.0-20240201012059-dfeb8b29a8e4/go.mod h1:1fftK3db+qKZhPxijPSlORciLf5y5t8Ozok59ifx6T8= github.com/Acconut/go-httptest-recorder v1.0.0 h1:TAv2dfnqp/l+SUvIaMAUK4GeN4+wqb6KZsFFFTGhoJg= @@ -46,8 +6,8 @@ github.com/Acconut/go-httptest-recorder v1.0.0/go.mod h1:CwQyhTH1kq/gLyWiRieo7c0 github.com/AfterShip/email-verifier v1.4.0 h1:DoQplvVFVhZUfS5fPiVnmCQDr5i1tv+ivUV0TFd2AZo= github.com/AfterShip/email-verifier v1.4.0/go.mod h1:JNPV1KZpTq4TArmss1NAOJsTD8JRa/ZElbCAJCEgikg= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/LumeWeb/jape v0.0.0-20240120100641-741feb3baf8a h1:gFOgDjyw7Y3zdU68SPdy+iNFV00wcPvFofBHeeFN9y0= -github.com/LumeWeb/jape v0.0.0-20240120100641-741feb3baf8a/go.mod h1:4QqmBB+t3W7cNplXPj++ZqpoUb2PeiS66RLpXmEGap4= +github.com/LumeWeb/jape v0.0.0-20240204004049-ed792e7631cd h1:DHP7nn0Dg0I0WADOwBu2zR+p3mKgrU8h7HZ5OnyI/Q8= +github.com/LumeWeb/jape v0.0.0-20240204004049-ed792e7631cd/go.mod h1:4QqmBB+t3W7cNplXPj++ZqpoUb2PeiS66RLpXmEGap4= github.com/LumeWeb/tusd/v2 v2.2.3-0.20240125144205-3615bc502881 h1:Uf/6x6NmEMZAmIBFSYgcI5xMvdAcHPPrz1Z/luQ4Hp0= github.com/LumeWeb/tusd/v2 v2.2.3-0.20240125144205-3615bc502881/go.mod h1:VM+hjvXWOM/OEsp9aXtTOLM1T/o2hrjXhC5PLiD8fbE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -126,6 +86,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/flowchartsman/swaggerui v0.0.0-20221017034628-909ed4f3701b h1:oy54yVy300Db264NfQCJubZHpJOl+SoT6udALQdFbSI= +github.com/flowchartsman/swaggerui v0.0.0-20221017034628-909ed4f3701b/go.mod h1:/RJwPD5L4xWgCbqQ1L5cB12ndgfKKT54n9cZFf+8pus= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -133,6 +95,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8= +github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-co-op/gocron/v2 v2.2.0 h1:yJBOoKTYJQ7DSGBSM6vL01jJA2rEQi3wYvWg8DTJf40= github.com/go-co-op/gocron/v2 v2.2.0/go.mod h1:0MfNAXEchzeSH1vtkZrTAcSMWqyL435kL6CA4b0bjrg= @@ -141,12 +105,18 @@ github.com/go-gormigrate/gormigrate/v2 v2.1.1/go.mod h1:L7nJ620PFDKei9QOhJzqA8kR github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw= +github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI= github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= @@ -184,6 +154,8 @@ github.com/hbollon/go-edlib v1.6.0 h1:ga7AwwVIvP8mHm9GsPueC0d71cfRU/52hmPJ7Tprv4 github.com/hbollon/go-edlib v1.6.0/go.mod h1:wnt6o6EIVEzUfgbUZY7BerzQ2uvzp354qmS2xaLkrhM= github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf/go.mod h1:hyb9oH7vZsitZCiBt0ZvifOrB+qc8PS5IiilCIb87rg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= +github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -191,6 +163,8 @@ github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -217,6 +191,8 @@ github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LE github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -226,6 +202,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= @@ -244,6 +222,8 @@ github.com/olebedev/emitter v0.0.0-20230411050614-349169dec2ba/go.mod h1:eT2/Pcs github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -270,8 +250,8 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -317,6 +297,7 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/vbauerster/mpb/v5 v5.0.3/go.mod h1:h3YxU5CSr8rZP4Q3xZPVB3jJLhWPou63lHEdr9ytH4Y= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= @@ -514,6 +495,7 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=