feat: initial swagger support
This commit is contained in:
parent
d13c15212c
commit
be92e036f3
33
api/s5/s5.go
33
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)),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
12
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
|
||||
|
|
70
go.sum
70
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=
|
||||
|
|
Loading…
Reference in New Issue