mirror of
https://github.com/navidrome/navidrome.git
synced 2026-10-21 08:47:16 +02:00
390 lines
12 KiB
Go
390 lines
12 KiB
Go
|
|
// Package apiv1 provides primitives to interact with the openapi HTTP API.
|
||
|
|
//
|
||
|
|
// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.8.0 DO NOT EDIT.
|
||
|
|
package apiv1
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"context"
|
||
|
|
"encoding/json"
|
||
|
|
"fmt"
|
||
|
|
"net/http"
|
||
|
|
|
||
|
|
"github.com/go-chi/chi/v5"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Defines values for ProblemCode.
|
||
|
|
const (
|
||
|
|
ProblemCodeForbidden ProblemCode = "forbidden"
|
||
|
|
ProblemCodeInternal ProblemCode = "internal"
|
||
|
|
ProblemCodeMethodNotAllowed ProblemCode = "method_not_allowed"
|
||
|
|
ProblemCodeNotFound ProblemCode = "not_found"
|
||
|
|
ProblemCodeUnauthorized ProblemCode = "unauthorized"
|
||
|
|
ProblemCodeUnavailable ProblemCode = "unavailable"
|
||
|
|
ProblemCodeValidation ProblemCode = "validation"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Valid indicates whether the value is a known member of the ProblemCode enum.
|
||
|
|
func (e ProblemCode) Valid() bool {
|
||
|
|
switch e {
|
||
|
|
case ProblemCodeForbidden:
|
||
|
|
return true
|
||
|
|
case ProblemCodeInternal:
|
||
|
|
return true
|
||
|
|
case ProblemCodeMethodNotAllowed:
|
||
|
|
return true
|
||
|
|
case ProblemCodeNotFound:
|
||
|
|
return true
|
||
|
|
case ProblemCodeUnauthorized:
|
||
|
|
return true
|
||
|
|
case ProblemCodeUnavailable:
|
||
|
|
return true
|
||
|
|
case ProblemCodeValidation:
|
||
|
|
return true
|
||
|
|
default:
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Defines values for ServerInfoLoginMethods.
|
||
|
|
const (
|
||
|
|
ServerInfoLoginMethodsPassword ServerInfoLoginMethods = "password"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Valid indicates whether the value is a known member of the ServerInfoLoginMethods enum.
|
||
|
|
func (e ServerInfoLoginMethods) Valid() bool {
|
||
|
|
switch e {
|
||
|
|
case ServerInfoLoginMethodsPassword:
|
||
|
|
return true
|
||
|
|
default:
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Problem RFC 9457 problem details, returned for every 4xx and 5xx response.
|
||
|
|
type Problem struct {
|
||
|
|
// Code Machine-readable error code, and the value clients switch on. New codes may be added.
|
||
|
|
Code ProblemCode `json:"code"`
|
||
|
|
|
||
|
|
// Detail Human-readable explanation specific to this occurrence. Omitted for internal errors.
|
||
|
|
Detail *string `json:"detail,omitempty"`
|
||
|
|
|
||
|
|
// Errors Per-field failures. Present only when `code` is `validation`.
|
||
|
|
Errors *[]ValidationError `json:"errors,omitempty"`
|
||
|
|
|
||
|
|
// Status HTTP status code of this response.
|
||
|
|
Status int `json:"status"`
|
||
|
|
|
||
|
|
// Title Short human-readable summary, the same for all occurrences of this problem type.
|
||
|
|
Title string `json:"title"`
|
||
|
|
|
||
|
|
// Type URI reference identifying the problem type. Omitted while the problem carries no semantics
|
||
|
|
// beyond its HTTP status code, which RFC 9457 defines as `about:blank`. Problems with their
|
||
|
|
// own semantics get their own URI; switch on `code` instead.
|
||
|
|
Type *string `json:"type,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ProblemCode Machine-readable error code, and the value clients switch on. New codes may be added.
|
||
|
|
type ProblemCode string
|
||
|
|
|
||
|
|
// ServerInfo Public server description. Everything an add-server screen needs before login.
|
||
|
|
type ServerInfo struct {
|
||
|
|
// LoginMethods Login methods this server accepts. New methods may be added; clients ignore values they do not recognise.
|
||
|
|
LoginMethods []ServerInfoLoginMethods `json:"loginMethods"`
|
||
|
|
|
||
|
|
// Name Human-readable server product name.
|
||
|
|
Name string `json:"name"`
|
||
|
|
|
||
|
|
// ServerVersion Version of the running server build.
|
||
|
|
ServerVersion string `json:"serverVersion"`
|
||
|
|
|
||
|
|
// SetupRequired True until the first admin user has been created.
|
||
|
|
SetupRequired bool `json:"setupRequired"`
|
||
|
|
|
||
|
|
// SpecVersion Version of the OpenAPI document this server implements.
|
||
|
|
SpecVersion string `json:"specVersion"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ServerInfoLoginMethods defines model for ServerInfo.LoginMethods.
|
||
|
|
type ServerInfoLoginMethods string
|
||
|
|
|
||
|
|
// ValidationError One field-level validation failure.
|
||
|
|
type ValidationError struct {
|
||
|
|
// Field Name of the offending query parameter, path parameter, or body field (dotted for nested).
|
||
|
|
Field string `json:"field"`
|
||
|
|
|
||
|
|
// Message Why the value was rejected.
|
||
|
|
Message string `json:"message"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// InternalError RFC 9457 problem details, returned for every 4xx and 5xx response.
|
||
|
|
type InternalError = Problem
|
||
|
|
|
||
|
|
// ServerInterface represents all server handlers.
|
||
|
|
type ServerInterface interface {
|
||
|
|
// GetServerInfo Describe the server
|
||
|
|
// (GET /server)
|
||
|
|
GetServerInfo(w http.ResponseWriter, r *http.Request)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Unimplemented server implementation that returns http.StatusNotImplemented for each endpoint.
|
||
|
|
|
||
|
|
type Unimplemented struct{}
|
||
|
|
|
||
|
|
// GetServerInfo Describe the server
|
||
|
|
// (GET /server)
|
||
|
|
func (_ Unimplemented) GetServerInfo(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.WriteHeader(http.StatusNotImplemented)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ServerInterfaceWrapper converts contexts to parameters.
|
||
|
|
type ServerInterfaceWrapper struct {
|
||
|
|
Handler ServerInterface
|
||
|
|
HandlerMiddlewares []MiddlewareFunc
|
||
|
|
ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error)
|
||
|
|
}
|
||
|
|
|
||
|
|
type MiddlewareFunc func(http.Handler) http.Handler
|
||
|
|
|
||
|
|
// GetServerInfo operation middleware
|
||
|
|
func (siw *ServerInterfaceWrapper) GetServerInfo(w http.ResponseWriter, r *http.Request) {
|
||
|
|
|
||
|
|
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
siw.Handler.GetServerInfo(w, r)
|
||
|
|
}))
|
||
|
|
|
||
|
|
for _, middleware := range siw.HandlerMiddlewares {
|
||
|
|
handler = middleware(handler)
|
||
|
|
}
|
||
|
|
|
||
|
|
handler.ServeHTTP(w, r)
|
||
|
|
}
|
||
|
|
|
||
|
|
type UnescapedCookieParamError struct {
|
||
|
|
ParamName string
|
||
|
|
Err error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *UnescapedCookieParamError) Error() string {
|
||
|
|
return fmt.Sprintf("error unescaping cookie parameter '%s'", e.ParamName)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *UnescapedCookieParamError) Unwrap() error {
|
||
|
|
return e.Err
|
||
|
|
}
|
||
|
|
|
||
|
|
type UnmarshalingParamError struct {
|
||
|
|
ParamName string
|
||
|
|
Err error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *UnmarshalingParamError) Error() string {
|
||
|
|
return fmt.Sprintf("Error unmarshaling parameter %s as JSON: %s", e.ParamName, e.Err.Error())
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *UnmarshalingParamError) Unwrap() error {
|
||
|
|
return e.Err
|
||
|
|
}
|
||
|
|
|
||
|
|
type RequiredParamError struct {
|
||
|
|
ParamName string
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *RequiredParamError) Error() string {
|
||
|
|
return fmt.Sprintf("Query argument %s is required, but not found", e.ParamName)
|
||
|
|
}
|
||
|
|
|
||
|
|
type RequiredHeaderError struct {
|
||
|
|
ParamName string
|
||
|
|
Err error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *RequiredHeaderError) Error() string {
|
||
|
|
return fmt.Sprintf("Header parameter %s is required, but not found", e.ParamName)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *RequiredHeaderError) Unwrap() error {
|
||
|
|
return e.Err
|
||
|
|
}
|
||
|
|
|
||
|
|
type InvalidParamFormatError struct {
|
||
|
|
ParamName string
|
||
|
|
Err error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *InvalidParamFormatError) Error() string {
|
||
|
|
return fmt.Sprintf("Invalid format for parameter %s: %s", e.ParamName, e.Err.Error())
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *InvalidParamFormatError) Unwrap() error {
|
||
|
|
return e.Err
|
||
|
|
}
|
||
|
|
|
||
|
|
type TooManyValuesForParamError struct {
|
||
|
|
ParamName string
|
||
|
|
Count int
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *TooManyValuesForParamError) Error() string {
|
||
|
|
return fmt.Sprintf("Expected one value for %s, got %d", e.ParamName, e.Count)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Handler creates http.Handler with routing matching OpenAPI spec.
|
||
|
|
func Handler(si ServerInterface) http.Handler {
|
||
|
|
return HandlerWithOptions(si, ChiServerOptions{})
|
||
|
|
}
|
||
|
|
|
||
|
|
type ChiServerOptions struct {
|
||
|
|
BaseURL string
|
||
|
|
BaseRouter chi.Router
|
||
|
|
Middlewares []MiddlewareFunc
|
||
|
|
ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error)
|
||
|
|
}
|
||
|
|
|
||
|
|
// HandlerFromMux creates http.Handler with routing matching OpenAPI spec based on the provided mux.
|
||
|
|
func HandlerFromMux(si ServerInterface, r chi.Router) http.Handler {
|
||
|
|
return HandlerWithOptions(si, ChiServerOptions{
|
||
|
|
BaseRouter: r,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
func HandlerFromMuxWithBaseURL(si ServerInterface, r chi.Router, baseURL string) http.Handler {
|
||
|
|
return HandlerWithOptions(si, ChiServerOptions{
|
||
|
|
BaseURL: baseURL,
|
||
|
|
BaseRouter: r,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// HandlerWithOptions creates http.Handler with additional options
|
||
|
|
func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handler {
|
||
|
|
r := options.BaseRouter
|
||
|
|
|
||
|
|
if r == nil {
|
||
|
|
r = chi.NewRouter()
|
||
|
|
}
|
||
|
|
if options.ErrorHandlerFunc == nil {
|
||
|
|
options.ErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) {
|
||
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
wrapper := ServerInterfaceWrapper{
|
||
|
|
Handler: si,
|
||
|
|
HandlerMiddlewares: options.Middlewares,
|
||
|
|
ErrorHandlerFunc: options.ErrorHandlerFunc,
|
||
|
|
}
|
||
|
|
|
||
|
|
r.Group(func(r chi.Router) {
|
||
|
|
r.Get(options.BaseURL+"/server", wrapper.GetServerInfo)
|
||
|
|
})
|
||
|
|
|
||
|
|
return r
|
||
|
|
}
|
||
|
|
|
||
|
|
type InternalErrorApplicationProblemPlusJSONResponse Problem
|
||
|
|
|
||
|
|
type GetServerInfoRequestObject struct {
|
||
|
|
}
|
||
|
|
|
||
|
|
type GetServerInfoResponseObject interface {
|
||
|
|
VisitGetServerInfoResponse(w http.ResponseWriter) error
|
||
|
|
}
|
||
|
|
|
||
|
|
type GetServerInfo200JSONResponse ServerInfo
|
||
|
|
|
||
|
|
func (response GetServerInfo200JSONResponse) VisitGetServerInfoResponse(w http.ResponseWriter) error {
|
||
|
|
|
||
|
|
var buf bytes.Buffer
|
||
|
|
if err := json.NewEncoder(&buf).Encode(response); err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
w.WriteHeader(200)
|
||
|
|
_, err := buf.WriteTo(w)
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
type GetServerInfo500ApplicationProblemPlusJSONResponse struct {
|
||
|
|
InternalErrorApplicationProblemPlusJSONResponse
|
||
|
|
}
|
||
|
|
|
||
|
|
func (response GetServerInfo500ApplicationProblemPlusJSONResponse) VisitGetServerInfoResponse(w http.ResponseWriter) error {
|
||
|
|
|
||
|
|
var buf bytes.Buffer
|
||
|
|
if err := json.NewEncoder(&buf).Encode(response); err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
w.Header().Set("Content-Type", "application/problem+json")
|
||
|
|
w.WriteHeader(500)
|
||
|
|
_, err := buf.WriteTo(w)
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
// StrictServerInterface represents all server handlers.
|
||
|
|
type StrictServerInterface interface {
|
||
|
|
// GetServerInfo Describe the server
|
||
|
|
// (GET /server)
|
||
|
|
GetServerInfo(ctx context.Context, request GetServerInfoRequestObject) (GetServerInfoResponseObject, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
type StrictHandlerFunc func(ctx context.Context, w http.ResponseWriter, r *http.Request, request any) (any, error)
|
||
|
|
type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc
|
||
|
|
|
||
|
|
type StrictHTTPServerOptions struct {
|
||
|
|
RequestErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error)
|
||
|
|
ResponseErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error)
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface {
|
||
|
|
return &strictHandler{ssi: ssi, middlewares: middlewares, options: StrictHTTPServerOptions{
|
||
|
|
RequestErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) {
|
||
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||
|
|
},
|
||
|
|
ResponseErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) {
|
||
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
|
},
|
||
|
|
}}
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewStrictHandlerWithOptions(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc, options StrictHTTPServerOptions) ServerInterface {
|
||
|
|
if options.RequestErrorHandlerFunc == nil {
|
||
|
|
options.RequestErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) {
|
||
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if options.ResponseErrorHandlerFunc == nil {
|
||
|
|
options.ResponseErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) {
|
||
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return &strictHandler{ssi: ssi, middlewares: middlewares, options: options}
|
||
|
|
}
|
||
|
|
|
||
|
|
type strictHandler struct {
|
||
|
|
ssi StrictServerInterface
|
||
|
|
middlewares []StrictMiddlewareFunc
|
||
|
|
options StrictHTTPServerOptions
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetServerInfo operation middleware
|
||
|
|
func (sh *strictHandler) GetServerInfo(w http.ResponseWriter, r *http.Request) {
|
||
|
|
var request GetServerInfoRequestObject
|
||
|
|
|
||
|
|
handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) {
|
||
|
|
return sh.ssi.GetServerInfo(ctx, request.(GetServerInfoRequestObject))
|
||
|
|
}
|
||
|
|
for _, middleware := range sh.middlewares {
|
||
|
|
handler = middleware(handler, "GetServerInfo")
|
||
|
|
}
|
||
|
|
|
||
|
|
response, err := handler(r.Context(), w, r, request)
|
||
|
|
|
||
|
|
if err != nil {
|
||
|
|
sh.options.ResponseErrorHandlerFunc(w, r, err)
|
||
|
|
} else if validResponse, ok := response.(GetServerInfoResponseObject); ok {
|
||
|
|
if err := validResponse.VisitGetServerInfoResponse(w); err != nil {
|
||
|
|
sh.options.ResponseErrorHandlerFunc(w, r, err)
|
||
|
|
}
|
||
|
|
} else if response != nil {
|
||
|
|
sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response))
|
||
|
|
}
|
||
|
|
}
|