- {{svg "octicon-list-unordered" 16}} {{ctx.Locale.Tr "repo.settings.metadata"}} -
-+ {{svg "octicon-broadcast" 16}} Update Server +
+Serve update feeds from releases and show the Licenses tab for optional key management.
+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")}} -
Serve update feeds from releases and show the Licenses tab for optional key management.
+