| … | … | @@ -68,14 +68,12 @@ async function getNamespace (server, name) { |
| 68 | 68 | } |
| 69 | 69 | |
| 70 | 70 | /** |
| 71 | | * Write: route to the backend that owns the group |
| 71 | * Write: always prefer shared MetadataBase (replicates to peers). |
| 72 | * Fall back to local manager only if shared registry unavailable. |
| 72 | 73 | */ |
| 73 | 74 | async function getBackendFor (server, name) { |
| 74 | 75 | const { namespaceManager, namespaceRegistry } = server.namespaceData |
| 75 | | if (namespaceRegistry) { |
| 76 | | const shared = await namespaceRegistry.get(name) |
| 77 | | if (shared) return namespaceRegistry |
| 78 | | } |
| 76 | if (namespaceRegistry) return namespaceRegistry |
| 79 | 77 | return namespaceManager |
| 80 | 78 | } |
| 81 | 79 | |
| … | … | @@ -305,7 +303,7 @@ async function handleGetNamespace (req, res, server) { |
| 305 | 303 | } |
| 306 | 304 | |
| 307 | 305 | async function handleCreateNamespace (req, res, server) { |
| 308 | | const { namespaceManager } = server.namespaceData |
| 306 | const { namespaceManager, namespaceRegistry } = server.namespaceData |
| 309 | 307 | try { |
| 310 | 308 | const body = await readJson(req) |
| 311 | 309 | const { name, type, displayName, description } = body |
| … | … | @@ -315,7 +313,9 @@ async function handleCreateNamespace (req, res, server) { |
| 315 | 313 | return |
| 316 | 314 | } |
| 317 | 315 | |
| 318 | | const result = await namespaceManager.create(name, type || 'group', { |
| 316 | // Write to shared MetadataBase when available (replicates to peers) |
| 317 | const backend = namespaceRegistry || namespaceManager |
| 318 | const result = await backend.create(name, type || 'group', { |
| 319 | 319 | displayName, |
| 320 | 320 | description |
| 321 | 321 | }) |
| … | … | @@ -331,20 +331,11 @@ async function handleReconsolidate (req, res, server) { |
| 331 | 331 | const { namespaceManager, namespaceRegistry } = server.namespaceData |
| 332 | 332 | const { repos } = server.repoData |
| 333 | 333 | try { |
| 334 | | const results = { local: null, shared: null } |
| 335 | | |
| 336 | | // Reconsolidate local groups |
| 337 | | if (namespaceManager && namespaceManager.reconsolidateGroups) { |
| 338 | | results.local = await namespaceManager.reconsolidateGroups(repos || []) |
| 339 | | } |
| 340 | | |
| 341 | | // Reconsolidate shared groups |
| 342 | | if (namespaceRegistry && namespaceRegistry.reconsolidateGroups) { |
| 343 | | results.shared = await namespaceRegistry.reconsolidateGroups(repos || []) |
| 344 | | } |
| 345 | | |
| 346 | | console.log('[Groups] Reconsolidated:', results) |
| 347 | | json(res, { success: true, ...results }) |
| 334 | // Prefer shared MetadataBase for reconsolidation (replicates to peers) |
| 335 | const backend = namespaceRegistry || namespaceManager |
| 336 | const result = await backend.reconsolidateGroups(repos || []) |
| 337 | console.log('[Groups] Reconsolidated:', result) |
| 338 | json(res, { success: true, ...result }) |
| 348 | 339 | } catch (err) { |
| 349 | 340 | console.error('[API] Reconsolidate error:', err) |
| 350 | 341 | json(res, { error: err.message }, 500) |