feat: initial swagger support

This commit is contained in:
Derrick Hammer 2024-02-07 17:39:18 -05:00
parent d13c15212c
commit be92e036f3
Signed by: pcfreak30
GPG Key ID: C997C339BE476FF2
4 changed files with 953 additions and 45 deletions

View File

@ -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)),
}
}

883
api/s5/swagger.yaml Normal file
View File

@ -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: []

12
go.mod
View File

@ -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

70
go.sum
View File

@ -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=