| … | … | @@ -69,6 +69,7 @@ export function registerAdminApiRoutes(router) { |
| 69 | 69 | // Repository import/delete endpoints |
| 70 | 70 | router.post('/api/admin/repos/scan', requireAdmin, handleScanRepos) |
| 71 | 71 | router.post('/api/admin/repos/import', requireAdmin, handleImportRepo) |
| 72 | router.patch('/api/admin/repos/:name', requireAdmin, handleUpdateRepo) |
| 72 | 73 | router.delete('/api/admin/repos/:repoName', requireAdmin, handleDeleteRepo) |
| 73 | 74 | |
| 74 | 75 | // P2P identity replication |
| … | … | @@ -886,6 +887,36 @@ async function handleImportRepo(req, res, server) { |
| 886 | 887 | } |
| 887 | 888 | } |
| 888 | 889 | |
| 890 | /** |
| 891 | * Update a repository's settings (visibility, category, etc.) |
| 892 | */ |
| 893 | async function handleUpdateRepo(req, res, server) { |
| 894 | const { repoRegistry } = server.repoData |
| 895 | try { |
| 896 | const name = req.params.name |
| 897 | const updates = await readJson(req) |
| 898 | |
| 899 | const existing = await repoRegistry.getRepo(name) |
| 900 | if (!existing) { |
| 901 | notFound(res, 'Repository not found: ' + name) |
| 902 | return |
| 903 | } |
| 904 | |
| 905 | // Apply allowed updates |
| 906 | if (updates.visibility) existing.visibility = updates.visibility |
| 907 | if (updates.category !== undefined) existing.category = updates.category |
| 908 | |
| 909 | // Write back to registry |
| 910 | await repoRegistry.registry.put(`repo:${name}`, existing) |
| 911 | |
| 912 | console.log('[Admin API] Updated repo:', name, updates) |
| 913 | json(res, { ok: true, repo: { name, visibility: existing.visibility, category: existing.category } }) |
| 914 | } catch (err) { |
| 915 | console.error('[Admin API] Update repo error:', err) |
| 916 | json(res, { error: err.message }, 500) |
| 917 | } |
| 918 | } |
| 919 | |
| 889 | 920 | /** |
| 890 | 921 | * Delete a repository from the registry (and optionally the bare repo on disk) |
| 891 | 922 | */ |