Files
sentryagent-idp/src/routes/credentials.ts
SentryAgent.ai Developer d3530285b9 feat: Phase 1 MVP — complete AgentIdP implementation
Implements all P0 features per OpenSpec change phase-1-mvp-implementation:
- Agent Registry Service (CRUD) — full lifecycle management
- OAuth 2.0 Token Service (Client Credentials flow)
- Credential Management (generate, rotate, revoke)
- Immutable Audit Log Service

Tech: Node.js 18+, TypeScript 5.3+ strict, Express 4.18+, PostgreSQL 14+, Redis 7+
Standards: OpenAPI 3.0 specs, DRY/SOLID, zero `any` types
Quality: 18 unit test suites, 244 tests passing, 97%+ coverage
OpenAPI: 4 complete specs (14 endpoints total)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 09:14:41 +00:00

39 lines
1.7 KiB
TypeScript

/**
* Credential Management routes for SentryAgent.ai AgentIdP.
* All routes are under /agents/:agentId/credentials with auth and rateLimit middleware.
*/
import { Router } from 'express';
import { CredentialController } from '../controllers/CredentialController.js';
import { authMiddleware } from '../middleware/auth.js';
import { rateLimitMiddleware } from '../middleware/rateLimit.js';
import { asyncHandler } from '../utils/asyncHandler.js';
/**
* Creates and returns the Express router for credential management endpoints.
* This router is mounted at /agents — the :agentId param is part of the path.
*
* @param credentialController - The credential controller instance.
* @returns Configured Express router.
*/
export function createCredentialsRouter(credentialController: CredentialController): Router {
const router = Router({ mergeParams: true });
router.use(asyncHandler(authMiddleware));
router.use(asyncHandler(rateLimitMiddleware));
// POST /agents/:agentId/credentials — Generate new credentials
router.post('/', asyncHandler(credentialController.generateCredential.bind(credentialController)));
// GET /agents/:agentId/credentials — List credentials
router.get('/', asyncHandler(credentialController.listCredentials.bind(credentialController)));
// POST /agents/:agentId/credentials/:credentialId/rotate — Rotate a credential
router.post('/:credentialId/rotate', asyncHandler(credentialController.rotateCredential.bind(credentialController)));
// DELETE /agents/:agentId/credentials/:credentialId — Revoke a credential
router.delete('/:credentialId', asyncHandler(credentialController.revokeCredential.bind(credentialController)));
return router;
}