diff --git a/backend/src/__tests__/fleet.test.ts b/backend/src/__tests__/fleet.test.ts index 7cadb06e..5efe8080 100644 --- a/backend/src/__tests__/fleet.test.ts +++ b/backend/src/__tests__/fleet.test.ts @@ -205,6 +205,22 @@ describe('Fleet tier gating', () => { .set('Authorization', authHeader); expect(res.body.code).not.toBe('PAID_REQUIRED'); }); + + it('GET /api/fleet/node/:nodeId/stacks is accessible on community tier', async () => { + mockTier('community'); + const res = await request(app) + .get('/api/fleet/node/1/stacks') + .set('Authorization', authHeader); + expect(res.body.code).not.toBe('PAID_REQUIRED'); + }); + + it('GET /api/fleet/node/:nodeId/stacks/:stackName/containers is accessible on community tier', async () => { + mockTier('community'); + const res = await request(app) + .get('/api/fleet/node/1/stacks/db-compose/containers') + .set('Authorization', authHeader); + expect(res.body.code).not.toBe('PAID_REQUIRED'); + }); }); // ─── Update Endpoint Input Validation ─── diff --git a/backend/src/routes/fleet.ts b/backend/src/routes/fleet.ts index 65a1465c..6a535d63 100644 --- a/backend/src/routes/fleet.ts +++ b/backend/src/routes/fleet.ts @@ -595,8 +595,6 @@ fleetRouter.get('/configuration', authMiddleware, async (req: Request, res: Resp }); fleetRouter.get('/node/:nodeId/stacks', authMiddleware, async (req: Request, res: Response): Promise => { - if (!requirePaid(req, res)) return; - try { const nodeId = parseIntParam(req, res, 'nodeId', 'node ID'); if (nodeId === null) return; @@ -635,8 +633,6 @@ fleetRouter.get('/node/:nodeId/stacks', authMiddleware, async (req: Request, res }); fleetRouter.get('/node/:nodeId/stacks/:stackName/containers', authMiddleware, async (req: Request, res: Response): Promise => { - if (!requirePaid(req, res)) return; - try { const nodeId = parseIntParam(req, res, 'nodeId', 'node ID'); if (nodeId === null) return; diff --git a/docs/openapi.yaml b/docs/openapi.yaml index a49ce759..346a92b8 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -1888,7 +1888,7 @@ paths: operationId: getFleetNodeStacks tags: [Fleet] summary: List stacks on a fleet node - description: Returns stack names from a specific fleet node. Requires Skipper or Admiral license. + description: Returns stack names from a specific fleet node. parameters: - name: nodeId in: path @@ -1928,7 +1928,7 @@ paths: operationId: getFleetNodeStackContainers tags: [Fleet] summary: List containers in a fleet node stack - description: Returns containers for a specific stack on a specific fleet node. Requires Skipper or Admiral license. + description: Returns containers for a specific stack on a specific fleet node. parameters: - name: nodeId in: path