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 19:38:33 +02:00
committed by GitHub
parent 02f82a2054
commit f0d9af3a18
23 changed files with 163 additions and 131 deletions
+2 -2
View File
@@ -29,7 +29,7 @@ type CreateUserOption struct {
// Whether the user has restricted access privileges
Restricted *bool `json:"restricted"`
// User visibility level: public, limited, or private
Visibility UserVisibility `json:"visibility" binding:"In(,public,limited,private)"`
Visibility VisibilityString `json:"visibility" binding:"In(,public,limited,private)"`
// For explicitly setting the user creation timestamp. Useful when users are
// migrated from other systems. When omitted, the user's creation timestamp
@@ -78,5 +78,5 @@ type EditUserOption struct {
// Whether the user has restricted access privileges
Restricted *bool `json:"restricted"`
// User visibility level: public, limited, or private
Visibility UserVisibility `json:"visibility" binding:"In(,public,limited,private)"`
Visibility VisibilityString `json:"visibility" binding:"In(,public,limited,private)"`
}
+3 -3
View File
@@ -22,7 +22,7 @@ type Organization struct {
// The location of the organization
Location string `json:"location"`
// The visibility level of the organization (public, limited, private)
Visibility UserVisibility `json:"visibility"`
Visibility VisibilityString `json:"visibility"`
// Whether repository administrators can change team access
RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access"`
// username of the organization
@@ -60,7 +60,7 @@ type CreateOrgOption struct {
// The location of the organization
Location string `json:"location" binding:"MaxSize(50)"`
// possible values are `public` (default), `limited` or `private`
Visibility UserVisibility `json:"visibility" binding:"In(,public,limited,private)"`
Visibility VisibilityString `json:"visibility" binding:"In(,public,limited,private)"`
// Whether repository administrators can change team access
RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access"`
}
@@ -78,7 +78,7 @@ type EditOrgOption struct {
// The location of the organization
Location *string `json:"location" binding:"MaxSize(50)"`
// possible values are `public`, `limited` or `private`
Visibility *UserVisibility `json:"visibility" binding:"In(,public,limited,private)"`
Visibility *VisibilityString `json:"visibility" binding:"In(,public,limited,private)"`
// Whether repository administrators can change team access
RepoAdminChangeTeamAccess *bool `json:"repo_admin_change_team_access"`
}
+1 -1
View File
@@ -51,7 +51,7 @@ type User struct {
// the user's description
Description string `json:"description"`
// User visibility level option: public, limited, private
Visibility UserVisibility `json:"visibility"`
Visibility VisibilityString `json:"visibility"`
// user counts
Followers int `json:"followers_count"`
+16 -16
View File
@@ -18,10 +18,10 @@ const (
)
// VisibilityModes is a map of Visibility types
var VisibilityModes = map[string]VisibleType{
"public": VisibleTypePublic,
"limited": VisibleTypeLimited,
"private": VisibleTypePrivate,
var VisibilityModes = map[VisibilityString]VisibleType{
VisibilityStringPublic: VisibleTypePublic,
VisibilityStringLimited: VisibleTypeLimited,
VisibilityStringPrivate: VisibleTypePrivate,
}
// IsPublic returns true if VisibleType is public
@@ -43,27 +43,27 @@ func (vt VisibleType) IsPrivate() bool {
func (vt VisibleType) String() string {
for k, v := range VisibilityModes {
if vt == v {
return k
return string(k)
}
}
return ""
}
// ExtractKeysFromMapString provides a slice of keys from map
func ExtractKeysFromMapString(in map[string]VisibleType) (keys []string) {
for k := range in {
keys = append(keys, k)
// VisibilityModeKeys returns the visibility mode names (public, limited, private)
func VisibilityModeKeys() (keys []string) {
for k := range VisibilityModes {
keys = append(keys, string(k))
}
return keys
}
// UserVisibility defines the visibility level of a user or organization as
// rendered in API payloads. The DB representation is VisibleType (int).
// swagger:enum UserVisibility
type UserVisibility string
// VisibilityString defines the visibility level of a user/organization/team as
// rendered in API and config payloads. The DB representation is VisibleType (int).
// swagger:enum VisibilityString
type VisibilityString string
const (
UserVisibilityPublic UserVisibility = "public"
UserVisibilityLimited UserVisibility = "limited"
UserVisibilityPrivate UserVisibility = "private"
VisibilityStringPublic VisibilityString = "public"
VisibilityStringLimited VisibilityString = "limited"
VisibilityStringPrivate VisibilityString = "private"
)