enhance(ui): use OpenAPI 3.0 spec in API viewer, add spec buttons (#38478)

Follow-ups from https://github.com/go-gitea/gitea/pull/37038:

- Render the OpenAPI 3.0 spec in the API viewer, it is richer than the
Swagger 2.0 rendering
- Replace the back link with gitea-styled buttons to view both specs and
return to Gitea, flowing above swagger-ui on viewports where they would
overlap the title
- Key `VisibilityModes` by the string enum type, now named
`VisibilityString`, removing the `string()` casts at API call sites
- Drop the raw visibility strings from the `Service` settings struct in
favor of the typed mode fields, which also removes the org default
visibility row from the admin config page
- Fix two pre-existing issues surfaced in review: an invalid
`DEFAULT_USER_VISIBILITY` was silently accepted as public, and the org
visibility error message showed the enum zero value instead of the
submitted input

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
silverwind
2026-07-16 17:38:33 +00:00
committed by GitHub
co-authored by wxiaoguang
parent 02f82a2054
commit f0d9af3a18
23 changed files with 163 additions and 131 deletions
-2
View File
@@ -155,8 +155,6 @@
<dt>{{ctx.Locale.Tr "admin.config.default_allow_only_contributors_to_track_time"}}</dt>
<dd>{{svg (Iif .Service.DefaultAllowOnlyContributorsToTrackTime "octicon-check" "octicon-x")}}</dd>
{{end}}
<dt>{{ctx.Locale.Tr "admin.config.default_visibility_organization"}}</dt>
<dd>{{.Service.DefaultOrgVisibility}}</dd>
<dt>{{ctx.Locale.Tr "admin.config.no_reply_address"}}</dt>
<dd>{{if .Service.NoReplyAddress}}{{.Service.NoReplyAddress}}{{else}}-{{end}}</dd>
+7 -3
View File
@@ -4,13 +4,17 @@
{{ctx.HeadMetaContentSecurityPolicy}}
<title>Gitea API</title>
<link rel="stylesheet" href="{{ctx.CurrentWebTheme.PublicAssetURI}}">
{{/* HINT: SWAGGER-CSS-IMPORT: load swagger styles ahead to avoid flicker (e.g. the swagger-back-link) */}}
{{/* HINT: SWAGGER-CSS-IMPORT: load swagger styles ahead to avoid flicker (e.g. the swagger-page-links) */}}
{{AssetCSSLinks "web_src/js/swagger.ts" "web_src/css/swagger-standalone.css"}}
</head>
<body>
{{/* TODO: add Help & Glossary to help users understand the API, and explain some concepts like "Owner" */}}
<a class="swagger-back-link" href="{{AppSubUrl}}/">{{svg "octicon-reply"}}{{ctx.Locale.Tr "return_to_gitea"}}</a>
<div id="swagger-ui" data-source="{{AppSubUrl}}/swagger.v1.json"></div>
<div class="swagger-page-links">
<a href="{{AppSubUrl}}/openapi3.v1.json" target="_blank">{{svg "octicon-file-code"}}OpenAPI JSON</a>
<a href="{{AppSubUrl}}/swagger.v1.json" target="_blank">{{svg "octicon-file-code"}}Swagger JSON</a>
<a href="{{AppSubUrl}}/">{{svg "octicon-reply"}}{{ctx.Locale.Tr "return_to_gitea"}}</a>
</div>
<div id="swagger-ui" data-source="{{AppSubUrl}}/openapi3.v1.json"></div>
<footer class="page-footer"></footer>
{{ctx.ScriptImport "web_src/js/swagger.ts" "module"}}
</body>
+6 -6
View File
@@ -24561,7 +24561,7 @@
"limited",
"private"
],
"x-go-enum-desc": "public UserVisibilityPublic\nlimited UserVisibilityLimited\nprivate UserVisibilityPrivate",
"x-go-enum-desc": "public VisibilityStringPublic\nlimited VisibilityStringLimited\nprivate VisibilityStringPrivate",
"x-go-name": "Visibility"
},
"website": {
@@ -25131,7 +25131,7 @@
"limited",
"private"
],
"x-go-enum-desc": "public UserVisibilityPublic\nlimited UserVisibilityLimited\nprivate UserVisibilityPrivate",
"x-go-enum-desc": "public VisibilityStringPublic\nlimited VisibilityStringLimited\nprivate VisibilityStringPrivate",
"x-go-name": "Visibility"
}
},
@@ -25833,7 +25833,7 @@
"limited",
"private"
],
"x-go-enum-desc": "public UserVisibilityPublic\nlimited UserVisibilityLimited\nprivate UserVisibilityPrivate",
"x-go-enum-desc": "public VisibilityStringPublic\nlimited VisibilityStringLimited\nprivate VisibilityStringPrivate",
"x-go-name": "Visibility"
},
"website": {
@@ -26375,7 +26375,7 @@
"limited",
"private"
],
"x-go-enum-desc": "public UserVisibilityPublic\nlimited UserVisibilityLimited\nprivate UserVisibilityPrivate",
"x-go-enum-desc": "public VisibilityStringPublic\nlimited VisibilityStringLimited\nprivate VisibilityStringPrivate",
"x-go-name": "Visibility"
},
"website": {
@@ -28227,7 +28227,7 @@
"limited",
"private"
],
"x-go-enum-desc": "public UserVisibilityPublic\nlimited UserVisibilityLimited\nprivate UserVisibilityPrivate",
"x-go-enum-desc": "public VisibilityStringPublic\nlimited VisibilityStringLimited\nprivate VisibilityStringPrivate",
"x-go-name": "Visibility"
},
"website": {
@@ -30590,7 +30590,7 @@
"limited",
"private"
],
"x-go-enum-desc": "public UserVisibilityPublic\nlimited UserVisibilityLimited\nprivate UserVisibilityPrivate",
"x-go-enum-desc": "public VisibilityStringPublic\nlimited VisibilityStringLimited\nprivate VisibilityStringPrivate",
"x-go-name": "Visibility"
},
"website": {
+7 -7
View File
@@ -4304,7 +4304,7 @@
"visibility": {
"allOf": [
{
"$ref": "#/components/schemas/UserVisibility"
"$ref": "#/components/schemas/VisibilityString"
}
],
"description": "possible values are `public` (default), `limited` or `private`"
@@ -4845,7 +4845,7 @@
"visibility": {
"allOf": [
{
"$ref": "#/components/schemas/UserVisibility"
"$ref": "#/components/schemas/VisibilityString"
}
],
"description": "User visibility level: public, limited, or private"
@@ -5549,7 +5549,7 @@
"visibility": {
"allOf": [
{
"$ref": "#/components/schemas/UserVisibility"
"$ref": "#/components/schemas/VisibilityString"
}
],
"description": "possible values are `public`, `limited` or `private`"
@@ -6075,7 +6075,7 @@
"visibility": {
"allOf": [
{
"$ref": "#/components/schemas/UserVisibility"
"$ref": "#/components/schemas/VisibilityString"
}
],
"description": "User visibility level: public, limited, or private"
@@ -7949,7 +7949,7 @@
"visibility": {
"allOf": [
{
"$ref": "#/components/schemas/UserVisibility"
"$ref": "#/components/schemas/VisibilityString"
}
],
"description": "The visibility level of the organization (public, limited, private)"
@@ -10343,7 +10343,7 @@
"visibility": {
"allOf": [
{
"$ref": "#/components/schemas/UserVisibility"
"$ref": "#/components/schemas/VisibilityString"
}
],
"description": "User visibility level option: public, limited, private"
@@ -10496,7 +10496,7 @@
"type": "object",
"x-go-package": "gitea.dev/modules/structs"
},
"UserVisibility": {
"VisibilityString": {
"enum": [
"public",
"limited",