From a443f030c051894ff574992d38dacd884064e11b Mon Sep 17 00:00:00 2001 From: Hermes Date: Sat, 3 Oct 2026 21:52:14 -0700 Subject: [PATCH] P7 integration: mount network routers (people/access/invites/lifecycle/groups/resources/wizard) with shared stores + lazy lifecycle proxy --- dashcaddy-api/src/app.js | 81 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/dashcaddy-api/src/app.js b/dashcaddy-api/src/app.js index 963d462..3372ac0 100644 --- a/dashcaddy-api/src/app.js +++ b/dashcaddy-api/src/app.js @@ -81,6 +81,14 @@ const containerRoutes = require('../routes/containers'); const serviceRoutes = require('../routes/services'); const tailscaleRoutes = require('../routes/tailscale'); const tailscaleAdminRoutes = require('../routes/tailscale-admin'); + +const networkPeopleRoutes = require('../routes/network-people'); +const networkAccessRoutes = require('../routes/network-access'); +const networkInvitesRoutes = require('../routes/network-invites'); +const networkLifecycleRoutes = require('../routes/network-lifecycle'); +const networkGroupsRoutes = require('../routes/network-groups'); +const networkResourcesRoutes = require('../routes/network-resources'); +const networkWizardRoutes = require('../routes/network-wizard'); const sitesRoutes = require('../routes/sites'); const credentialsRoutes = require('../routes/credentials'); const arrRoutes = require('../routes/arr'); @@ -702,6 +710,79 @@ async function createApp() { log: ctx.log, logError: ctx.logError, })); + + // ── P7 Private Network mounts (DC-140..DC-152) ────────────────────────── + // Shared stores; providers self-register via src/network/index.js when the + // registry is required (tailscale + wireguard). + require('./network/index'); + const { getActiveProvider } = require('./network/registry'); + const p7PeopleStore = require('./security/network-people-store').createPeopleStore({ log: ctx.log }); + const p7AccessStore = require('./security/network-access-store').createNetworkAccessStore({ log: ctx.log }); + const p7ResourcesStore = require('./security/network-resources').createResourcesStore({ log: ctx.log }); + const p7GroupsService = require('./security/network-groups').createGroupsService({ + peopleStore: p7PeopleStore, accessStore: p7AccessStore, log: ctx.log, + }); + const p7LifecycleModule = require('./network/lifecycle'); + const p7LifecycleProxy = { + blockPerson: async (id) => p7GetLifecycle().blockPerson(id), + unblockPerson: async (id) => p7GetLifecycle().unblockPerson(id), + removePerson: async (id) => p7GetLifecycle().removePerson(id), + revokeDevice: async (pid, did) => p7GetLifecycle().revokeDevice(pid, did), + }; + let p7LifecycleInstance = null; + function p7GetLifecycle() { + if (!p7LifecycleInstance) { + p7LifecycleInstance = p7LifecycleModule.createNetworkLifecycle({ + provider: getActiveProvider(), + peopleStore: p7PeopleStore, + accessStore: p7AccessStore, + logger: ctx.log, + }); + } + return p7LifecycleInstance; + } + + apiRouter.use('/network/people', networkPeopleRoutes({ + peopleStore: p7PeopleStore, + networkRegistry: { getActiveProvider }, + asyncHandler: ctx.asyncHandler, + log: ctx.log, + })); + apiRouter.use('/network/access', networkAccessRoutes({ + accessStore: p7AccessStore, + asyncHandler: ctx.asyncHandler, + log: ctx.log, + })); + apiRouter.use('/network/invites', networkInvitesRoutes({ + networkRegistry: { getActiveProvider }, + asyncHandler: ctx.asyncHandler, + log: ctx.log, + })); + apiRouter.use('/network', networkLifecycleRoutes({ + lifecycle: p7LifecycleProxy, + asyncHandler: ctx.asyncHandler, + log: ctx.log, + })); + apiRouter.use('/network/groups', networkGroupsRoutes({ + groupsService: p7GroupsService, + peopleStore: p7PeopleStore, + accessStore: p7AccessStore, + asyncHandler: ctx.asyncHandler, + log: ctx.log, + })); + apiRouter.use('/network/resources', networkResourcesRoutes({ + resourcesStore: p7ResourcesStore, + asyncHandler: ctx.asyncHandler, + log: ctx.log, + })); + apiRouter.use('/network/wizard', networkWizardRoutes({ + registry: { getActiveProvider }, + peopleStore: p7PeopleStore, + accessStore: p7AccessStore, + asyncHandler: ctx.asyncHandler, + log: ctx.log, + })); + // ── end P7 mounts ─────────────────────────────────────────────────────── apiRouter.use(sitesRoutes({ asyncHandler: ctx.asyncHandler, ok: ctx.ok,