diff --git a/routers/web/repo/setting/licensing.go b/routers/web/repo/setting/licensing.go index 708cae4794..8cab32ec45 100644 --- a/routers/web/repo/setting/licensing.go +++ b/routers/web/repo/setting/licensing.go @@ -9,10 +9,10 @@ import ( // LicensingSettings redirects to the manifest page where licensing is now consolidated. func LicensingSettings(ctx *context.Context) { - ctx.Redirect(ctx.Repo.RepoLink + "/settings/manifest") + ctx.Redirect(ctx.Repo.RepoLink + "/settings/metadata") } // LicensingSettingsPost redirects POST to the manifest page. func LicensingSettingsPost(ctx *context.Context) { - ctx.Redirect(ctx.Repo.RepoLink + "/settings/manifest") + ctx.Redirect(ctx.Repo.RepoLink + "/settings/metadata") } diff --git a/routers/web/repo/setting/metadata.go b/routers/web/repo/setting/metadata.go index bb571dbcdf..9f98359303 100644 --- a/routers/web/repo/setting/metadata.go +++ b/routers/web/repo/setting/metadata.go @@ -9,20 +9,48 @@ import ( "net/http" issues_model "code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/issues" + repo_model "code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/repo" + updateserver_model "code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/updateserver" + "code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/log" "code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/templates" "code.mokoconsulting.tech/MokoConsulting/MokoGitea/services/context" ) const tplSettingsMetadata templates.TplName = "repo/settings/metadata" -// Metadata displays the repo metadata page (repo-scoped custom field values). +// Metadata displays the consolidated metadata page: +// project identity (manifest), update server config, and repo-scoped custom fields. func Metadata(ctx *context.Context) { - ctx.Data["Title"] = ctx.Tr("repo.settings.metadata") + ctx.Data["Title"] = "Metadata" ctx.Data["PageIsSettingsMetadata"] = true - ownerID := ctx.Repo.Repository.OwnerID repoID := ctx.Repo.Repository.ID + ownerID := ctx.Repo.Repository.OwnerID + // Load manifest (project identity). + manifest, err := repo_model.GetRepoManifest(ctx, repoID) + if err != nil { + ctx.ServerError("GetRepoManifest", err) + return + } + if manifest == nil { + manifest = tryMigrateManifestXML(ctx) + } + if manifest == nil { + manifest = &repo_model.RepoManifest{ + RepoID: repoID, + Name: ctx.Repo.Repository.Name, + Org: ctx.Repo.Repository.OwnerName, + Description: ctx.Repo.Repository.Description, + } + } + ctx.Data["Manifest"] = manifest + + // Load update server config. + repoCfg, _ := updateserver_model.GetRepoConfig(ctx, repoID) + ctx.Data["RepoUpdateConfig"] = repoCfg + + // Load repo-scoped custom fields. fields, _ := issues_model.GetCustomFieldsByOwner(ctx, ownerID, issues_model.CustomFieldScopeRepo) ctx.Data["CustomFieldDefs"] = fields @@ -45,8 +73,55 @@ func Metadata(ctx *context.Context) { ctx.HTML(http.StatusOK, tplSettingsMetadata) } -// MetadataPost saves repo-scoped custom field values. +// MetadataPost routes to the correct sub-handler based on the action param. func MetadataPost(ctx *context.Context) { + switch ctx.FormString("action") { + case "manifest": + saveManifest(ctx) + case "updateserver": + saveLicensingSettings(ctx) + case "customfields": + saveCustomFields(ctx) + default: + saveManifest(ctx) + } +} + +func saveManifest(ctx *context.Context) { + manifest := &repo_model.RepoManifest{ + RepoID: ctx.Repo.Repository.ID, + Name: ctx.FormString("name"), + Org: ctx.FormString("org"), + Description: ctx.Repo.Repository.Description, + Version: ctx.FormString("version"), + LicenseSPDX: ctx.FormString("license_spdx"), + LicenseName: ctx.FormString("license_name"), + VersionPrefix: ctx.FormString("version_prefix"), + ElementName: ctx.FormString("element_name"), + Platform: ctx.FormString("platform"), + StandardsVersion: ctx.FormString("standards_version"), + StandardsSource: ctx.FormString("standards_source"), + DisplayName: ctx.FormString("display_name"), + Maintainer: ctx.FormString("maintainer"), + MaintainerURL: ctx.FormString("maintainer_url"), + InfoURL: ctx.FormString("info_url"), + TargetVersion: ctx.FormString("target_version"), + PHPMinimum: ctx.FormString("php_minimum"), + Language: ctx.FormString("language"), + PackageType: ctx.FormString("package_type"), + EntryPoint: ctx.FormString("entry_point"), + } + + if err := repo_model.CreateOrUpdateRepoManifest(ctx, manifest); err != nil { + ctx.ServerError("CreateOrUpdateRepoManifest", err) + return + } + + ctx.Flash.Success("Project identity saved") + ctx.Redirect(ctx.Repo.RepoLink + "/settings/metadata") +} + +func saveCustomFields(ctx *context.Context) { repoID := ctx.Repo.Repository.ID ownerID := ctx.Repo.Repository.OwnerID @@ -59,6 +134,45 @@ func MetadataPost(ctx *context.Context) { } } - ctx.Flash.Success(ctx.Tr("repo.settings.metadata_saved")) + ctx.Flash.Success("Custom fields saved") + ctx.Redirect(ctx.Repo.RepoLink + "/settings/metadata") +} + +// saveLicensingSettings handles the update server form. +func saveLicensingSettings(ctx *context.Context) { + repo := ctx.Repo.Repository + + updatePlatform := ctx.FormString("update_platform") + if updatePlatform == "" { + updatePlatform = "joomla" + } + + enabled := ctx.FormString("enable_licensing") == "on" + + if !enabled { + if err := updateserver_model.DeleteRepoConfig(ctx, repo.ID); err != nil { + log.Error("DeleteRepoConfig: %v", err) + } + } else { + updateCfg := &updateserver_model.UpdateStreamConfig{ + OwnerID: repo.OwnerID, + RepoID: repo.ID, + Platform: updatePlatform, + LicensingEnabled: true, + RequireKey: ctx.FormString("require_update_key") == "on", + DownloadGating: ctx.FormString("download_gating"), + FeedVisibility: ctx.FormString("feed_visibility"), + SupportURL: ctx.FormString("support_url"), + StreamMode: "joomla", + } + + if err := updateserver_model.SaveConfig(ctx, updateCfg); err != nil { + log.Error("SaveConfig: %v", err) + ctx.ServerError("SaveConfig", err) + return + } + } + + ctx.Flash.Success("Update server settings saved") ctx.Redirect(ctx.Repo.RepoLink + "/settings/metadata") } diff --git a/routers/web/web.go b/routers/web/web.go index 37fcc8dbdd..a841479a90 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1229,9 +1229,9 @@ func registerWebRoutes(m *web.Router, webAuth *AuthMiddleware) { m.Group("", func() { m.Combo("/advanced").Get(repo_setting.AdvancedSettings).Post(web.Bind(forms.RepoSettingForm{}), repo_setting.SettingsPost) }, repo_setting.SettingsCtxData) - m.Combo("/licensing").Get(repo_setting.LicensingSettings).Post(repo_setting.LicensingSettingsPost) - m.Combo("/manifest").Get(repo_setting.ManifestSettings).Post(repo_setting.ManifestSettingsPost) m.Combo("/metadata").Get(repo_setting.Metadata).Post(repo_setting.MetadataPost) + m.Combo("/manifest").Get(repo_setting.LicensingSettings).Post(repo_setting.LicensingSettingsPost) // redirect to metadata + m.Combo("/licensing").Get(repo_setting.LicensingSettings).Post(repo_setting.LicensingSettingsPost) // redirect to metadata m.Group("/security", func() { m.Combo("").Get(repo_setting.SecuritySettings).Post(repo_setting.SecuritySettingsPost) m.Post("/scan", repo_setting.SecurityScanNow) diff --git a/templates/repo/settings/metadata.tmpl b/templates/repo/settings/metadata.tmpl index 896c7cc942..8bed79cb4f 100644 --- a/templates/repo/settings/metadata.tmpl +++ b/templates/repo/settings/metadata.tmpl @@ -1,49 +1,253 @@ -{{template "repo/settings/layout_head" (dict "pageClass" "repository settings metadata")}} -
-

- {{svg "octicon-list-unordered" 16}} {{ctx.Locale.Tr "repo.settings.metadata"}} -

-
- {{if .CustomFieldDefs}} -
- {{.CsrfTokenHtml}} - {{$values := .CustomFieldValues}} - {{$options := .CustomFieldOptions}} - {{range .CustomFieldDefs}} - {{$currentVal := index $values .ID}} -
- - {{if .Options}} - {{$opts := index $options .ID}} - - {{else if eq (printf "%s" .FieldType) "checkbox"}} -
- - -
- {{else if eq (printf "%s" .FieldType) "number"}} - - {{else if eq (printf "%s" .FieldType) "url"}} - - {{else if eq (printf "%s" .FieldType) "date"}} - - {{else}} - - {{end}} -
+{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings metadata")}} +

+ {{svg "octicon-file-code" 16}} Project Identity +

+
+ + {{.CsrfTokenHtml}} + +
+
+ {{if eq .Manifest.Platform "joomla"}} + + + {{else}} + + {{end}} -
- -
- - {{else}} -

{{ctx.Locale.Tr "repo.settings.metadata_empty"}}

- {{end}} +
+
+ + +
-
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
Governance
+
+
+ + +
+
+ + +
+
+ + +
+
+ + {{if or (eq .Manifest.Platform "joomla") (eq .Manifest.Platform "wordpress") (eq .Manifest.Platform "dolibarr")}} +
Distribution
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ {{if or (eq .Manifest.Platform "joomla") (eq .Manifest.Platform "wordpress")}} +
+
+ + +
+
+ + +
+
+ {{end}} + {{end}} + +
Build
+
+
+ + +
+ {{if eq .Manifest.Platform "joomla"}} +
+ + +
+
+ + +
+ {{end}} +
+ + +
+
+ + + +
+ +{{if .LicensingEnabled}} +

+ {{svg "octicon-broadcast" 16}} Update Server +

+
+
+ {{.CsrfTokenHtml}} + +
+
+ + +
+

Serve update feeds from releases and show the Licenses tab for optional key management.

+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + {{if and .RepoUpdateConfig (ne .RepoUpdateConfig.Platform "joomla") (ne .RepoUpdateConfig.Platform "both") (ne .RepoUpdateConfig.Platform "")}} +
+
+ + +
+
+ {{end}} + +
+ + +
+ +
+ +
+
+
+{{end}} + +{{if .CustomFieldDefs}} +

+ {{svg "octicon-list-unordered" 16}} Custom Fields +

+
+
+ {{.CsrfTokenHtml}} + {{$values := .CustomFieldValues}} + {{$options := .CustomFieldOptions}} + {{range .CustomFieldDefs}} + {{$currentVal := index $values .ID}} +
+ + {{if .Options}} + {{$opts := index $options .ID}} + + {{else if eq (printf "%s" .FieldType) "checkbox"}} +
+ + +
+ {{else if eq (printf "%s" .FieldType) "number"}} + + {{else if eq (printf "%s" .FieldType) "url"}} + + {{else if eq (printf "%s" .FieldType) "date"}} + + {{else}} + + {{end}} +
+ {{end}} +
+ +
+
+
+{{end}} + {{template "repo/settings/layout_footer" .}} diff --git a/templates/repo/settings/navbar.tmpl b/templates/repo/settings/navbar.tmpl index f50991036d..b42b21ba1c 100644 --- a/templates/repo/settings/navbar.tmpl +++ b/templates/repo/settings/navbar.tmpl @@ -7,11 +7,8 @@ {{svg "octicon-tools"}} {{ctx.Locale.Tr "repo.settings.advanced_settings"}} - - {{svg "octicon-file-code"}} {{ctx.Locale.Tr "repo.settings.manifest"}} - - {{svg "octicon-list-unordered"}} {{ctx.Locale.Tr "repo.settings.metadata"}} + {{svg "octicon-file-code"}} Metadata {{svg "octicon-shield"}} {{ctx.Locale.Tr "repo.settings.security"}}