mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-06-22 14:38:30 -04:00
[API] Forgejo API /api/forgejo/v1
(cherry picked from commit20b5669269
) (cherry picked from commit1574643a6a
) Update semantic version according to specification (cherry picked from commit22510f4130
) Mise à jour de 'Makefile' (cherry picked from commitc3d85d8409
) (cherry picked from commit5ea2309851
) (cherry picked from commitec5217b9d1
) (cherry picked from commit14f08e364b
) (cherry picked from commitb4465c67b8
) [API] [SEMVER] replace number with version (cherry picked from commitfba48e6497
) (cherry picked from commit532ec5d878
) [API] [SEMVER] [v1.20] less is replaced by css (cherry picked from commit01ca3a4f42
) (cherry picked from commit1d928c3ab2
) (cherry picked from commita39dc804cd
) Conflicts: webpack.config.js (cherry picked from commitadc68578b3
) (cherry picked from commit9b8d98475f
) (cherry picked from commit2516103974
) (cherry picked from commit18e6287963
) (cherry picked from commite9694e67ab
) (cherry picked from commita9763edaf0
) (cherry picked from commite2b550f4fb
) (cherry picked from commit2edac36701
) [API] Forgejo API /api/forgejo/v1 (squash) Update semver as v1.20 is entering release candidate mode (cherry picked from commit4995098ec3
) (cherry picked from commit578ccfdd27
) (cherry picked from commit1bf6ac0952
) (cherry picked from commit2fe16b2bfe
) (cherry picked from commit7cd9d027ee
) (cherry picked from commiteaed4be2ae
) (cherry picked from commitcc94f3115f
) (cherry picked from commitd7a77e35cc
) (cherry picked from commitcd8eb68ab7
) (cherry picked from commit68487ac95f
) (cherry picked from commit616dceb565
) (cherry picked from commit545fe5975b
) (cherry picked from commitc042cf8eda
) (cherry picked from commitae5e5a7468
) (cherry picked from commit8034ef5fa2
) (cherry picked from commitaaf0293034
) (cherry picked from commitdaafa8ce58
) (cherry picked from commit7ca3681d3e
) (cherry picked from commit39f72cba71
) (cherry picked from commit60a5917130
) (cherry picked from commit4853bd9e16
) [API] Move forgejo api file (squash) - Move the file to accommodatefaa28b5a44
(cherry picked from commitbce89351d2
) (cherry picked from commit11ae7f6e85
) (cherry picked from commit25e96cfcb2
) (cherry picked from commit6d8d19b391
) (cherry picked from commit5afc5c454b
) (cherry picked from commit86d07b4c24
) (cherry picked from commite54d869fda
) (cherry picked from commitab31ef1bba
) (cherry picked from commit511cbca2f3
) (cherry picked from commit333916fea8
) (cherry picked from commit3802bcd7c9
) (cherry picked from commit5d0fa034f7
) (cherry picked from commitd15627aa0d
) (cherry picked from commitba0b21b930
) (cherry picked from commit39ade66aac
)
This commit is contained in:
parent
b331492829
commit
c3985f05e8
14 changed files with 398 additions and 2 deletions
16
routers/api/forgejo/v1/api.go
Normal file
16
routers/api/forgejo/v1/api.go
Normal file
|
@ -0,0 +1,16 @@
|
|||
// Copyright 2023 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1
|
||||
|
||||
import (
|
||||
"code.gitea.io/gitea/modules/web"
|
||||
)
|
||||
|
||||
func Routes() *web.Route {
|
||||
m := web.NewRoute()
|
||||
forgejo := NewForgejo()
|
||||
m.Get("", Root)
|
||||
m.Get("/version", forgejo.GetVersion)
|
||||
return m
|
||||
}
|
24
routers/api/forgejo/v1/forgejo.go
Normal file
24
routers/api/forgejo/v1/forgejo.go
Normal file
|
@ -0,0 +1,24 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"code.gitea.io/gitea/modules/json"
|
||||
)
|
||||
|
||||
type Forgejo struct{}
|
||||
|
||||
var _ ServerInterface = &Forgejo{}
|
||||
|
||||
func NewForgejo() *Forgejo {
|
||||
return &Forgejo{}
|
||||
}
|
||||
|
||||
var ForgejoVersion = "development"
|
||||
|
||||
func (f *Forgejo) GetVersion(w http.ResponseWriter, r *http.Request) {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
_ = json.NewEncoder(w).Encode(Version{&ForgejoVersion})
|
||||
}
|
167
routers/api/forgejo/v1/generated.go
Normal file
167
routers/api/forgejo/v1/generated.go
Normal file
|
@ -0,0 +1,167 @@
|
|||
// Package v1 provides primitives to interact with the openapi HTTP API.
|
||||
//
|
||||
// Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT.
|
||||
package v1
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
)
|
||||
|
||||
// Version defines model for Version.
|
||||
type Version struct {
|
||||
Version *string `json:"version,omitempty"`
|
||||
}
|
||||
|
||||
// ServerInterface represents all server handlers.
|
||||
type ServerInterface interface {
|
||||
// API version
|
||||
// (GET /version)
|
||||
GetVersion(w http.ResponseWriter, r *http.Request)
|
||||
}
|
||||
|
||||
// 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
|
||||
|
||||
// GetVersion operation middleware
|
||||
func (siw *ServerInterfaceWrapper) GetVersion(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
|
||||
var handler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
siw.Handler.GetVersion(w, r)
|
||||
})
|
||||
|
||||
for _, middleware := range siw.HandlerMiddlewares {
|
||||
handler = middleware(handler)
|
||||
}
|
||||
|
||||
handler.ServeHTTP(w, r.WithContext(ctx))
|
||||
}
|
||||
|
||||
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 UnmarshallingParamError struct {
|
||||
ParamName string
|
||||
Err error
|
||||
}
|
||||
|
||||
func (e *UnmarshallingParamError) Error() string {
|
||||
return fmt.Sprintf("Error unmarshalling parameter %s as JSON: %s", e.ParamName, e.Err.Error())
|
||||
}
|
||||
|
||||
func (e *UnmarshallingParamError) 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+"/version", wrapper.GetVersion)
|
||||
})
|
||||
|
||||
return r
|
||||
}
|
14
routers/api/forgejo/v1/root.go
Normal file
14
routers/api/forgejo/v1/root.go
Normal file
|
@ -0,0 +1,14 @@
|
|||
// Copyright The Forgejo Authors.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func Root(w http.ResponseWriter, r *http.Request) {
|
||||
// https://www.rfc-editor.org/rfc/rfc8631
|
||||
w.Header().Set("Link", "</assets/forgejo/api.v1.yml>; rel=\"service-desc\"")
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}
|
|
@ -27,6 +27,7 @@ import (
|
|||
"code.gitea.io/gitea/modules/translation"
|
||||
"code.gitea.io/gitea/modules/web"
|
||||
actions_router "code.gitea.io/gitea/routers/api/actions"
|
||||
forgejo "code.gitea.io/gitea/routers/api/forgejo/v1"
|
||||
packages_router "code.gitea.io/gitea/routers/api/packages"
|
||||
apiv1 "code.gitea.io/gitea/routers/api/v1"
|
||||
"code.gitea.io/gitea/routers/common"
|
||||
|
@ -178,6 +179,7 @@ func NormalRoutes() *web.Route {
|
|||
|
||||
r.Mount("/", web_routers.Routes())
|
||||
r.Mount("/api/v1", apiv1.Routes())
|
||||
r.Mount("/api/forgejo/v1", forgejo.Routes())
|
||||
r.Mount("/api/internal", private.Routes())
|
||||
|
||||
r.Post("/-/fetch-redirect", common.FetchRedirectDelegate)
|
||||
|
|
19
routers/web/misc/swagger-forgejo.go
Normal file
19
routers/web/misc/swagger-forgejo.go
Normal file
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2017 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package misc
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"code.gitea.io/gitea/modules/base"
|
||||
"code.gitea.io/gitea/modules/context"
|
||||
)
|
||||
|
||||
// tplSwagger swagger page template
|
||||
const tplForgejoSwagger base.TplName = "swagger/forgejo-ui"
|
||||
|
||||
func SwaggerForgejo(ctx *context.Context) {
|
||||
ctx.Data["APIVersion"] = "v1"
|
||||
ctx.HTML(http.StatusOK, tplForgejoSwagger)
|
||||
}
|
|
@ -277,6 +277,7 @@ func Routes() *web.Route {
|
|||
if setting.API.EnableSwagger {
|
||||
// Note: The route is here but no in API routes because it renders a web page
|
||||
routes.Get("/api/swagger", append(mid, misc.Swagger)...) // Render V1 by default
|
||||
routes.Get("/api/forgejo/swagger", append(mid, misc.SwaggerForgejo)...)
|
||||
}
|
||||
|
||||
// TODO: These really seem like things that could be folded into Contexter or as helper functions
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue