add openapi

This commit is contained in:
schreifuchs 2024-11-12 22:12:41 +01:00
parent 438490754b
commit f5013e5f9e
8 changed files with 1379 additions and 1 deletions

BIN
.readme/IMG_1375.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 MiB

View File

@ -2,4 +2,10 @@
simple object storage
![concept](./IMG_1375.jpeg)
![concept](./.readme/IMG_1375.jpeg)
## Modes
- Standalone
- Head
- StorageNode

1040
api/server.gen.go Normal file

File diff suppressed because it is too large Load Diff

22
go.mod Normal file
View File

@ -0,0 +1,22 @@
module git.schreifuchs.ch/schreifuchs/warehouse
go 1.23.2
require (
github.com/getkin/kin-openapi v0.128.0
github.com/gorilla/mux v1.8.0
github.com/oapi-codegen/runtime v1.1.1
)
require (
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/google/uuid v1.5.0 // indirect
github.com/invopop/yaml v0.3.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/perimeterx/marshmallow v1.1.5 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

52
go.sum Normal file
View File

@ -0,0 +1,52 @@
github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/getkin/kin-openapi v0.128.0 h1:jqq3D9vC9pPq1dGcOCv7yOp1DaEe7c/T1vzcLbITSp4=
github.com/getkin/kin-openapi v0.128.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
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/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso=
github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA=
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/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
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/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro=
github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s=
github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
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/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

251
openapi/openapi.yml Normal file
View File

@ -0,0 +1,251 @@
openapi: 3.0.3
info:
title: Object Storage API
description: API for managing objects in an object storage service.
version: 1.0.0
contact:
name: API Support
email: support@example.com
servers:
- url: https://api.example.com/v1
paths:
/buckets:
get:
summary: List all buckets
description: Retrieve a paginated list of all buckets in the object storage.
parameters:
- name: limit
in: query
schema:
type: integer
default: 10
description: The maximum number of items to return
- name: offset
in: query
schema:
type: integer
default: 0
description: The number of items to skip before starting to collect the result set
responses:
'200':
description: A paginated list of buckets.
content:
application/json:
schema:
type: object
properties:
total:
type: integer
description: Total number of buckets available
limit:
type: integer
description: Maximum number of items returned in the response
offset:
type: integer
description: Number of items skipped before starting the response
items:
type: array
items:
$ref: '#/components/schemas/Bucket'
'500':
description: Server error
post:
summary: Create a new bucket
description: Create a new bucket to store objects.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: Name of the bucket to be created
example: my-new-bucket
responses:
'201':
description: Bucket created successfully
'400':
description: Bad request
'409':
description: Bucket already exists
/buckets/{bucketName}:
delete:
summary: Delete a bucket
description: Delete a bucket and all its objects.
parameters:
- name: bucketName
in: path
required: true
schema:
type: string
description: The name of the bucket to delete
responses:
'204':
description: Bucket deleted successfully
'404':
description: Bucket not found
'500':
description: Server error
/buckets/{bucketName}/objects:
get:
summary: List objects in a bucket
description: Retrieve a paginated list of objects within a specified bucket.
parameters:
- name: bucketName
in: path
required: true
schema:
type: string
description: The name of the bucket
- name: limit
in: query
schema:
type: integer
default: 10
description: The maximum number of items to return
- name: offset
in: query
schema:
type: integer
default: 0
description: The number of items to skip before starting to collect the result set
responses:
'200':
description: A paginated list of objects in the bucket.
content:
application/json:
schema:
type: object
properties:
total:
type: integer
description: Total number of objects available in the bucket
limit:
type: integer
description: Maximum number of items returned in the response
offset:
type: integer
description: Number of items skipped before starting the response
items:
type: array
items:
$ref: '#/components/schemas/Object'
'404':
description: Bucket not found
/buckets/{bucketName}/objects/{objectKey}:
get:
summary: Get object
description: Retrieve an object from the specified bucket.
parameters:
- name: bucketName
in: path
required: true
schema:
type: string
description: The name of the bucket
- name: objectKey
in: path
required: true
schema:
type: string
description: The key (identifier) of the object
responses:
'200':
description: The requested object data
content:
application/octet-stream:
schema:
type: string
format: binary
'404':
description: Bucket or object not found
put:
summary: Upload an object
description: Upload a new object or overwrite an existing one in the specified bucket.
parameters:
- name: bucketName
in: path
required: true
schema:
type: string
description: The name of the bucket
- name: objectKey
in: path
required: true
schema:
type: string
description: The key (identifier) for the object
requestBody:
required: true
content:
application/octet-stream:
schema:
type: string
format: binary
responses:
'201':
description: Object uploaded successfully
'400':
description: Invalid object data
'500':
description: Server error
delete:
summary: Delete an object
description: Delete an object from the specified bucket.
parameters:
- name: bucketName
in: path
required: true
schema:
type: string
description: The name of the bucket
- name: objectKey
in: path
required: true
schema:
type: string
description: The key (identifier) of the object
responses:
'204':
description: Object deleted successfully
'404':
description: Bucket or object not found
'500':
description: Server error
components:
schemas:
Bucket:
type: object
properties:
name:
type: string
description: The name of the bucket
created_at:
type: string
format: date-time
description: Creation timestamp of the bucket
Object:
type: object
properties:
key:
type: string
description: The key (identifier) of the object
size:
type: integer
description: The size of the object in bytes
last_modified:
type: string
format: date-time
description: The last modified timestamp of the object

7
openapi/server.cfg.yml Normal file
View File

@ -0,0 +1,7 @@
package: api
output: api/server.gen.go
generate:
embedded-spec: true
strict-server: true
models: true
gorilla-server: true