@llm-dev-ops/agentics-cli 1.4.87 → 1.4.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/api_gateway.test.d.ts +1 -0
- package/dist/__tests__/api_gateway.test.js +50 -0
- package/dist/__tests__/domain_enterprise_solution.test.d.ts +1 -0
- package/dist/__tests__/domain_enterprise_solution.test.js +50 -0
- package/dist/__tests__/health.test.d.ts +1 -0
- package/dist/__tests__/health.test.js +19 -0
- package/dist/__tests__/monitoring_alerts.test.d.ts +1 -0
- package/dist/__tests__/monitoring_alerts.test.js +50 -0
- package/dist/__tests__/ongoing_regular_stakeholder.test.d.ts +1 -0
- package/dist/__tests__/ongoing_regular_stakeholder.test.js +50 -0
- package/dist/__tests__/re_evaluate_risk.test.d.ts +1 -0
- package/dist/__tests__/re_evaluate_risk.test.js +50 -0
- package/dist/__tests__/recommendation.test.d.ts +1 -0
- package/dist/__tests__/recommendation.test.js +50 -0
- package/dist/__tests__/risk_mitigation_plan.test.d.ts +1 -0
- package/dist/__tests__/risk_mitigation_plan.test.js +50 -0
- package/dist/__tests__/scoped_pilot_reduce.test.d.ts +1 -0
- package/dist/__tests__/scoped_pilot_reduce.test.js +50 -0
- package/dist/__tests__/target_enterprise_system.test.d.ts +1 -0
- package/dist/__tests__/target_enterprise_system.test.js +50 -0
- package/dist/__tests__/underwriting.test.d.ts +1 -0
- package/dist/__tests__/underwriting.test.js +50 -0
- package/dist/api-gateway/infra/api-gateway-adapter.d.ts +27 -0
- package/dist/api-gateway/infra/api-gateway-adapter.js +54 -0
- package/dist/api-gateway/ports/api-gateway.d.ts +26 -0
- package/dist/api-gateway/ports/api-gateway.js +2 -0
- package/dist/contracts/contract-validation.d.ts +11 -0
- package/dist/contracts/contract-validation.js +21 -0
- package/dist/domain-enterprise-solution/infra/api-gateway-seam-adapter.d.ts +21 -0
- package/dist/domain-enterprise-solution/infra/api-gateway-seam-adapter.js +42 -0
- package/dist/domain-enterprise-solution/infra/domain-enterprise-solution-adapter.d.ts +25 -0
- package/dist/domain-enterprise-solution/infra/domain-enterprise-solution-adapter.js +47 -0
- package/dist/domain-enterprise-solution/ports/api-gateway-seam.d.ts +20 -0
- package/dist/domain-enterprise-solution/ports/api-gateway-seam.js +2 -0
- package/dist/domain-enterprise-solution/ports/domain-enterprise-solution.d.ts +24 -0
- package/dist/domain-enterprise-solution/ports/domain-enterprise-solution.js +2 -0
- package/dist/enterprise/index.d.ts +15 -0
- package/dist/enterprise/index.js +16 -0
- package/dist/erp-client/client.d.ts +42 -0
- package/dist/erp-client/client.js +235 -0
- package/dist/erp-client/mapper.d.ts +9 -0
- package/dist/erp-client/mapper.js +116 -0
- package/dist/erp-client/retry.d.ts +17 -0
- package/dist/erp-client/retry.js +74 -0
- package/dist/erp-client/types.d.ts +155 -0
- package/dist/erp-client/types.js +2 -0
- package/dist/infra/clients.d.ts +27 -0
- package/dist/infra/clients.js +16 -0
- package/dist/infra/connection-pool.d.ts +16 -0
- package/dist/infra/connection-pool.js +13 -0
- package/dist/infra/iam-helper.d.ts +1 -0
- package/dist/infra/iam-helper.js +138 -0
- package/dist/infra/telemetry.d.ts +26 -0
- package/dist/infra/telemetry.js +39 -0
- package/dist/monitoring-alerts/infra/monitoring-alerts-adapter.d.ts +25 -0
- package/dist/monitoring-alerts/infra/monitoring-alerts-adapter.js +47 -0
- package/dist/monitoring-alerts/ports/monitoring-alerts.d.ts +24 -0
- package/dist/monitoring-alerts/ports/monitoring-alerts.js +2 -0
- package/dist/ongoing-regular-stakeholder/infra/ongoing-regular-stakeholder-adapter.d.ts +25 -0
- package/dist/ongoing-regular-stakeholder/infra/ongoing-regular-stakeholder-adapter.js +47 -0
- package/dist/ongoing-regular-stakeholder/ports/ongoing-regular-stakeholder.d.ts +24 -0
- package/dist/ongoing-regular-stakeholder/ports/ongoing-regular-stakeholder.js +2 -0
- package/dist/pipeline/phase2/phase2-coordinator.d.ts.map +1 -1
- package/dist/pipeline/phase2/phase2-coordinator.js +7 -3
- package/dist/pipeline/phase2/phase2-coordinator.js.map +1 -1
- package/dist/pipeline/ruflo-phase-executor.js +1 -1
- package/dist/pipeline/ruflo-phase-executor.js.map +1 -1
- package/dist/re-evaluate-risk/infra/re-evaluate-risk-adapter.d.ts +25 -0
- package/dist/re-evaluate-risk/infra/re-evaluate-risk-adapter.js +47 -0
- package/dist/re-evaluate-risk/ports/re-evaluate-risk.d.ts +24 -0
- package/dist/re-evaluate-risk/ports/re-evaluate-risk.js +2 -0
- package/dist/recommendation/infra/recommendation-adapter.d.ts +25 -0
- package/dist/recommendation/infra/recommendation-adapter.js +47 -0
- package/dist/recommendation/ports/recommendation.d.ts +24 -0
- package/dist/recommendation/ports/recommendation.js +2 -0
- package/dist/risk-mitigation-plan/infra/risk-mitigation-plan-adapter.d.ts +25 -0
- package/dist/risk-mitigation-plan/infra/risk-mitigation-plan-adapter.js +47 -0
- package/dist/risk-mitigation-plan/ports/risk-mitigation-plan.d.ts +24 -0
- package/dist/risk-mitigation-plan/ports/risk-mitigation-plan.js +2 -0
- package/dist/scoped-pilot-reduce/infra/scoped-pilot-reduce-adapter.d.ts +25 -0
- package/dist/scoped-pilot-reduce/infra/scoped-pilot-reduce-adapter.js +47 -0
- package/dist/scoped-pilot-reduce/ports/scoped-pilot-reduce.d.ts +24 -0
- package/dist/scoped-pilot-reduce/ports/scoped-pilot-reduce.js +2 -0
- package/dist/server/dependencies.d.ts +178 -0
- package/dist/server/dependencies.js +321 -0
- package/dist/server/health.d.ts +2 -0
- package/dist/server/health.js +9 -0
- package/dist/server/main.d.ts +1 -0
- package/dist/server/main.js +21 -0
- package/dist/server/middleware.d.ts +4 -0
- package/dist/server/middleware.js +106 -0
- package/dist/server/routes.d.ts +5 -0
- package/dist/server/routes.js +1100 -0
- package/dist/server/schemas.d.ts +217 -0
- package/dist/server/schemas.js +185 -0
- package/dist/target-enterprise-system/infra/target-enterprise-system-adapter.d.ts +25 -0
- package/dist/target-enterprise-system/infra/target-enterprise-system-adapter.js +47 -0
- package/dist/target-enterprise-system/ports/target-enterprise-system.d.ts +24 -0
- package/dist/target-enterprise-system/ports/target-enterprise-system.js +2 -0
- package/dist/underwriting/infra/underwriting-adapter.d.ts +25 -0
- package/dist/underwriting/infra/underwriting-adapter.js +47 -0
- package/dist/underwriting/ports/underwriting.d.ts +24 -0
- package/dist/underwriting/ports/underwriting.js +2 -0
- package/docs/ecosystem.graph.json +295 -214
- package/package.json +1 -1
|
@@ -0,0 +1,1100 @@
|
|
|
1
|
+
// Generated by Phase 4 pipeline — do not edit manually
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { correlationMiddleware, iamMiddleware, loggingMiddleware } from './middleware.js';
|
|
4
|
+
import { healthRouter } from './health.js';
|
|
5
|
+
import { createDependencies } from './dependencies.js';
|
|
6
|
+
import { InforClient } from '../erp-client/client.js';
|
|
7
|
+
import { ManageDomainEnterpriseSchema, QueryDomainEnterpriseSchema, GetDomainEnterpriseSolutionSchema, GetDomainEnterpriseSolutionByIdSchema, ManageMonitoringAlertsSchema, QueryMonitoringAlertsSchema, GetMonitoringAlertsSchema, GetMonitoringAlertsByIdSchema, ManageOngoingRegularSchema, QueryOngoingRegularSchema, GetOngoingRegularStakeholderSchema, GetOngoingRegularStakeholderByIdSchema, ManageRiskMitigationSchema, QueryRiskMitigationSchema, GetRiskMitigationPlanSchema, GetRiskMitigationPlanByIdSchema, ManageTargetEnterpriseSchema, QueryTargetEnterpriseSchema, GetManageTargetEnterpriseSchema, GetQueryTargetEnterpriseSchema, GetTargetEnterpriseSystemSchema, GetTargetEnterpriseSystemByIdSchema, ManageUnderwritingSchema, QueryUnderwritingSchema, ListUnderwritingSchema, GetUnderwritingByIdSchema, ManageScopedPilotSchema, QueryScopedPilotSchema, GetScopedPilotReduceSchema, GetScopedPilotReduceByIdSchema, ManageReEvaluateSchema, QueryReEvaluateSchema, GetReEvaluateRiskSchema, GetReEvaluateRiskByIdSchema, ManageRecommendationSchema, QueryRecommendationSchema, ListRecommendationSchema, GetRecommendationByIdSchema, RouteRequestsSchema, AuthenticateSchema, RateLimitSchema, GetApiGatewaySchema, GetApiGatewayByIdSchema, } from './schemas.js';
|
|
8
|
+
function validationError(correlationId, issues) {
|
|
9
|
+
return { error: { code: 'VALIDATION_ERROR', message: 'Request validation failed', details: issues }, correlationId };
|
|
10
|
+
}
|
|
11
|
+
function serverError(correlationId, message) {
|
|
12
|
+
return { error: { code: 'INTERNAL_ERROR', message }, correlationId };
|
|
13
|
+
}
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// DI Bootstrap
|
|
16
|
+
// ============================================================================
|
|
17
|
+
const dbClient = {
|
|
18
|
+
async query(sql, params) {
|
|
19
|
+
void sql;
|
|
20
|
+
void params;
|
|
21
|
+
return [];
|
|
22
|
+
},
|
|
23
|
+
async execute(sql, params) {
|
|
24
|
+
void sql;
|
|
25
|
+
void params;
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const erpClient = {
|
|
29
|
+
async invoke(operation, data) {
|
|
30
|
+
void operation;
|
|
31
|
+
void data;
|
|
32
|
+
return {};
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
const deps = createDependencies(dbClient, erpClient);
|
|
36
|
+
// InforClient ACL client with governance enforcement
|
|
37
|
+
const governanceConfig = {
|
|
38
|
+
read_only: (process.env.ERP_READ_ONLY ?? 'true') === 'true',
|
|
39
|
+
audit_enabled: true,
|
|
40
|
+
pii_redaction: true,
|
|
41
|
+
max_tokens_per_request: 4096,
|
|
42
|
+
};
|
|
43
|
+
const erpClientInstance = new InforClient({
|
|
44
|
+
baseUrl: process.env.INFOR_BASE_URL ?? 'https://infor.example.com',
|
|
45
|
+
serviceAccountEmail: process.env.INFOR_SA_EMAIL ?? 'infor-sa@project.iam.gserviceaccount.com',
|
|
46
|
+
governance: governanceConfig,
|
|
47
|
+
audit: {
|
|
48
|
+
async log(entityType, entityId, action, actor, payload) {
|
|
49
|
+
await deps.audit.log(entityType, entityId, action, actor, payload);
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// App & Middleware
|
|
55
|
+
// ============================================================================
|
|
56
|
+
const app = new Hono();
|
|
57
|
+
app.use('*', correlationMiddleware);
|
|
58
|
+
app.use('*', iamMiddleware);
|
|
59
|
+
app.use('*', loggingMiddleware);
|
|
60
|
+
app.route('/health', healthRouter);
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Bounded Context: DomainEnterpriseSolution
|
|
63
|
+
// ============================================================================
|
|
64
|
+
app.post('/api/v1/domain-enterprise-solution/manage-domain-enterprise', async (c) => {
|
|
65
|
+
const correlationId = c.get('correlationId');
|
|
66
|
+
const startTime = Date.now();
|
|
67
|
+
try {
|
|
68
|
+
const body = await c.req.json();
|
|
69
|
+
const parsed = ManageDomainEnterpriseSchema.safeParse(body);
|
|
70
|
+
if (!parsed.success) {
|
|
71
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
72
|
+
}
|
|
73
|
+
const result = await deps.domainEnterpriseSolutionPort.execute('ManageDomainEnterprise', parsed.data);
|
|
74
|
+
await deps.audit.log('domain-enterprise-solution', result?.id ?? correlationId, 'manage-domain-enterprise', correlationId, parsed.data);
|
|
75
|
+
return c.json({
|
|
76
|
+
correlationId,
|
|
77
|
+
status: 'completed',
|
|
78
|
+
data: result,
|
|
79
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
80
|
+
}, 201);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
84
|
+
return c.json(serverError(correlationId, message), 500);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
app.post('/api/v1/domain-enterprise-solution/query-domain-enterprise', async (c) => {
|
|
88
|
+
const correlationId = c.get('correlationId');
|
|
89
|
+
const startTime = Date.now();
|
|
90
|
+
try {
|
|
91
|
+
const body = await c.req.json();
|
|
92
|
+
const parsed = QueryDomainEnterpriseSchema.safeParse(body);
|
|
93
|
+
if (!parsed.success) {
|
|
94
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
95
|
+
}
|
|
96
|
+
const result = await deps.domainEnterpriseSolutionPort.execute('QueryDomainEnterprise', parsed.data);
|
|
97
|
+
await deps.audit.log('domain-enterprise-solution', result?.id ?? correlationId, 'query-domain-enterprise', correlationId, parsed.data);
|
|
98
|
+
return c.json({
|
|
99
|
+
correlationId,
|
|
100
|
+
status: 'completed',
|
|
101
|
+
data: result,
|
|
102
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
103
|
+
}, 201);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
107
|
+
return c.json(serverError(correlationId, message), 500);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
app.get('/api/v1/domain-enterprise-solution/get-domain-enterprise-solution', async (c) => {
|
|
111
|
+
const correlationId = c.get('correlationId');
|
|
112
|
+
const startTime = Date.now();
|
|
113
|
+
try {
|
|
114
|
+
const params = c.req.query();
|
|
115
|
+
const parsed = GetDomainEnterpriseSolutionSchema.safeParse(params);
|
|
116
|
+
if (!parsed.success) {
|
|
117
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
118
|
+
}
|
|
119
|
+
const result = await deps.domainEnterpriseSolutionPort.query('GetDomainEnterpriseSolution', parsed.data);
|
|
120
|
+
return c.json({
|
|
121
|
+
correlationId,
|
|
122
|
+
status: 'ok',
|
|
123
|
+
data: result.rows,
|
|
124
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
125
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
126
|
+
}, 200);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
130
|
+
return c.json(serverError(correlationId, message), 500);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
app.get('/api/v1/domain-enterprise-solution/get-domain-enterprise-solution-by-id', async (c) => {
|
|
134
|
+
const correlationId = c.get('correlationId');
|
|
135
|
+
const startTime = Date.now();
|
|
136
|
+
try {
|
|
137
|
+
const params = c.req.query();
|
|
138
|
+
const parsed = GetDomainEnterpriseSolutionByIdSchema.safeParse(params);
|
|
139
|
+
if (!parsed.success) {
|
|
140
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
141
|
+
}
|
|
142
|
+
const result = await deps.domainEnterpriseSolutionPort.query('GetDomainEnterpriseSolutionById', parsed.data);
|
|
143
|
+
return c.json({
|
|
144
|
+
correlationId,
|
|
145
|
+
status: 'ok',
|
|
146
|
+
data: result.rows,
|
|
147
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
148
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
149
|
+
}, 200);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
153
|
+
return c.json(serverError(correlationId, message), 500);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// ============================================================================
|
|
157
|
+
// Bounded Context: MonitoringAlerts
|
|
158
|
+
// ============================================================================
|
|
159
|
+
app.post('/api/v1/monitoring-alerts/manage-monitoring-alerts', async (c) => {
|
|
160
|
+
const correlationId = c.get('correlationId');
|
|
161
|
+
const startTime = Date.now();
|
|
162
|
+
try {
|
|
163
|
+
const body = await c.req.json();
|
|
164
|
+
const parsed = ManageMonitoringAlertsSchema.safeParse(body);
|
|
165
|
+
if (!parsed.success) {
|
|
166
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
167
|
+
}
|
|
168
|
+
const result = await deps.monitoringAlertsPort.execute('ManageMonitoringAlerts', parsed.data);
|
|
169
|
+
await deps.audit.log('monitoring-alerts', result?.id ?? correlationId, 'manage-monitoring-alerts', correlationId, parsed.data);
|
|
170
|
+
return c.json({
|
|
171
|
+
correlationId,
|
|
172
|
+
status: 'completed',
|
|
173
|
+
data: result,
|
|
174
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
175
|
+
}, 201);
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
179
|
+
return c.json(serverError(correlationId, message), 500);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
app.post('/api/v1/monitoring-alerts/query-monitoring-alerts', async (c) => {
|
|
183
|
+
const correlationId = c.get('correlationId');
|
|
184
|
+
const startTime = Date.now();
|
|
185
|
+
try {
|
|
186
|
+
const body = await c.req.json();
|
|
187
|
+
const parsed = QueryMonitoringAlertsSchema.safeParse(body);
|
|
188
|
+
if (!parsed.success) {
|
|
189
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
190
|
+
}
|
|
191
|
+
const result = await deps.monitoringAlertsPort.execute('QueryMonitoringAlerts', parsed.data);
|
|
192
|
+
await deps.audit.log('monitoring-alerts', result?.id ?? correlationId, 'query-monitoring-alerts', correlationId, parsed.data);
|
|
193
|
+
return c.json({
|
|
194
|
+
correlationId,
|
|
195
|
+
status: 'completed',
|
|
196
|
+
data: result,
|
|
197
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
198
|
+
}, 201);
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
202
|
+
return c.json(serverError(correlationId, message), 500);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
app.get('/api/v1/monitoring-alerts/get-monitoring-alerts', async (c) => {
|
|
206
|
+
const correlationId = c.get('correlationId');
|
|
207
|
+
const startTime = Date.now();
|
|
208
|
+
try {
|
|
209
|
+
const params = c.req.query();
|
|
210
|
+
const parsed = GetMonitoringAlertsSchema.safeParse(params);
|
|
211
|
+
if (!parsed.success) {
|
|
212
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
213
|
+
}
|
|
214
|
+
const result = await deps.monitoringAlertsPort.query('GetMonitoringAlerts', parsed.data);
|
|
215
|
+
return c.json({
|
|
216
|
+
correlationId,
|
|
217
|
+
status: 'ok',
|
|
218
|
+
data: result.rows,
|
|
219
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
220
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
221
|
+
}, 200);
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
225
|
+
return c.json(serverError(correlationId, message), 500);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
app.get('/api/v1/monitoring-alerts/get-monitoring-alerts-by-id', async (c) => {
|
|
229
|
+
const correlationId = c.get('correlationId');
|
|
230
|
+
const startTime = Date.now();
|
|
231
|
+
try {
|
|
232
|
+
const params = c.req.query();
|
|
233
|
+
const parsed = GetMonitoringAlertsByIdSchema.safeParse(params);
|
|
234
|
+
if (!parsed.success) {
|
|
235
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
236
|
+
}
|
|
237
|
+
const result = await deps.monitoringAlertsPort.query('GetMonitoringAlertsById', parsed.data);
|
|
238
|
+
return c.json({
|
|
239
|
+
correlationId,
|
|
240
|
+
status: 'ok',
|
|
241
|
+
data: result.rows,
|
|
242
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
243
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
244
|
+
}, 200);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
248
|
+
return c.json(serverError(correlationId, message), 500);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
// ============================================================================
|
|
252
|
+
// Bounded Context: OngoingRegularStakeholder
|
|
253
|
+
// ============================================================================
|
|
254
|
+
app.post('/api/v1/ongoing-regular-stakeholder/manage-ongoing-regular', async (c) => {
|
|
255
|
+
const correlationId = c.get('correlationId');
|
|
256
|
+
const startTime = Date.now();
|
|
257
|
+
try {
|
|
258
|
+
const body = await c.req.json();
|
|
259
|
+
const parsed = ManageOngoingRegularSchema.safeParse(body);
|
|
260
|
+
if (!parsed.success) {
|
|
261
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
262
|
+
}
|
|
263
|
+
const result = await deps.ongoingRegularStakeholderPort.execute('ManageOngoingRegular', parsed.data);
|
|
264
|
+
await deps.audit.log('ongoing-regular-stakeholder', result?.id ?? correlationId, 'manage-ongoing-regular', correlationId, parsed.data);
|
|
265
|
+
return c.json({
|
|
266
|
+
correlationId,
|
|
267
|
+
status: 'completed',
|
|
268
|
+
data: result,
|
|
269
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
270
|
+
}, 201);
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
274
|
+
return c.json(serverError(correlationId, message), 500);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
app.post('/api/v1/ongoing-regular-stakeholder/query-ongoing-regular', async (c) => {
|
|
278
|
+
const correlationId = c.get('correlationId');
|
|
279
|
+
const startTime = Date.now();
|
|
280
|
+
try {
|
|
281
|
+
const body = await c.req.json();
|
|
282
|
+
const parsed = QueryOngoingRegularSchema.safeParse(body);
|
|
283
|
+
if (!parsed.success) {
|
|
284
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
285
|
+
}
|
|
286
|
+
const result = await deps.ongoingRegularStakeholderPort.execute('QueryOngoingRegular', parsed.data);
|
|
287
|
+
await deps.audit.log('ongoing-regular-stakeholder', result?.id ?? correlationId, 'query-ongoing-regular', correlationId, parsed.data);
|
|
288
|
+
return c.json({
|
|
289
|
+
correlationId,
|
|
290
|
+
status: 'completed',
|
|
291
|
+
data: result,
|
|
292
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
293
|
+
}, 201);
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
297
|
+
return c.json(serverError(correlationId, message), 500);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
app.get('/api/v1/ongoing-regular-stakeholder/get-ongoing-regular-stakeholder', async (c) => {
|
|
301
|
+
const correlationId = c.get('correlationId');
|
|
302
|
+
const startTime = Date.now();
|
|
303
|
+
try {
|
|
304
|
+
const params = c.req.query();
|
|
305
|
+
const parsed = GetOngoingRegularStakeholderSchema.safeParse(params);
|
|
306
|
+
if (!parsed.success) {
|
|
307
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
308
|
+
}
|
|
309
|
+
const result = await deps.ongoingRegularStakeholderPort.query('GetOngoingRegularStakeholder', parsed.data);
|
|
310
|
+
return c.json({
|
|
311
|
+
correlationId,
|
|
312
|
+
status: 'ok',
|
|
313
|
+
data: result.rows,
|
|
314
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
315
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
316
|
+
}, 200);
|
|
317
|
+
}
|
|
318
|
+
catch (err) {
|
|
319
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
320
|
+
return c.json(serverError(correlationId, message), 500);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
app.get('/api/v1/ongoing-regular-stakeholder/get-ongoing-regular-stakeholder-by-id', async (c) => {
|
|
324
|
+
const correlationId = c.get('correlationId');
|
|
325
|
+
const startTime = Date.now();
|
|
326
|
+
try {
|
|
327
|
+
const params = c.req.query();
|
|
328
|
+
const parsed = GetOngoingRegularStakeholderByIdSchema.safeParse(params);
|
|
329
|
+
if (!parsed.success) {
|
|
330
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
331
|
+
}
|
|
332
|
+
const result = await deps.ongoingRegularStakeholderPort.query('GetOngoingRegularStakeholderById', parsed.data);
|
|
333
|
+
return c.json({
|
|
334
|
+
correlationId,
|
|
335
|
+
status: 'ok',
|
|
336
|
+
data: result.rows,
|
|
337
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
338
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
339
|
+
}, 200);
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
343
|
+
return c.json(serverError(correlationId, message), 500);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
// ============================================================================
|
|
347
|
+
// Bounded Context: RiskMitigationPlan
|
|
348
|
+
// ============================================================================
|
|
349
|
+
app.post('/api/v1/risk-mitigation-plan/manage-risk-mitigation', async (c) => {
|
|
350
|
+
const correlationId = c.get('correlationId');
|
|
351
|
+
const startTime = Date.now();
|
|
352
|
+
try {
|
|
353
|
+
const body = await c.req.json();
|
|
354
|
+
const parsed = ManageRiskMitigationSchema.safeParse(body);
|
|
355
|
+
if (!parsed.success) {
|
|
356
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
357
|
+
}
|
|
358
|
+
const result = await deps.riskMitigationPlanPort.execute('ManageRiskMitigation', parsed.data);
|
|
359
|
+
await deps.audit.log('risk-mitigation-plan', result?.id ?? correlationId, 'manage-risk-mitigation', correlationId, parsed.data);
|
|
360
|
+
return c.json({
|
|
361
|
+
correlationId,
|
|
362
|
+
status: 'completed',
|
|
363
|
+
data: result,
|
|
364
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
365
|
+
}, 201);
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
369
|
+
return c.json(serverError(correlationId, message), 500);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
app.post('/api/v1/risk-mitigation-plan/query-risk-mitigation', async (c) => {
|
|
373
|
+
const correlationId = c.get('correlationId');
|
|
374
|
+
const startTime = Date.now();
|
|
375
|
+
try {
|
|
376
|
+
const body = await c.req.json();
|
|
377
|
+
const parsed = QueryRiskMitigationSchema.safeParse(body);
|
|
378
|
+
if (!parsed.success) {
|
|
379
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
380
|
+
}
|
|
381
|
+
const result = await deps.riskMitigationPlanPort.execute('QueryRiskMitigation', parsed.data);
|
|
382
|
+
await deps.audit.log('risk-mitigation-plan', result?.id ?? correlationId, 'query-risk-mitigation', correlationId, parsed.data);
|
|
383
|
+
return c.json({
|
|
384
|
+
correlationId,
|
|
385
|
+
status: 'completed',
|
|
386
|
+
data: result,
|
|
387
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
388
|
+
}, 201);
|
|
389
|
+
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
392
|
+
return c.json(serverError(correlationId, message), 500);
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
app.get('/api/v1/risk-mitigation-plan/get-risk-mitigation-plan', async (c) => {
|
|
396
|
+
const correlationId = c.get('correlationId');
|
|
397
|
+
const startTime = Date.now();
|
|
398
|
+
try {
|
|
399
|
+
const params = c.req.query();
|
|
400
|
+
const parsed = GetRiskMitigationPlanSchema.safeParse(params);
|
|
401
|
+
if (!parsed.success) {
|
|
402
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
403
|
+
}
|
|
404
|
+
const result = await deps.riskMitigationPlanPort.query('GetRiskMitigationPlan', parsed.data);
|
|
405
|
+
return c.json({
|
|
406
|
+
correlationId,
|
|
407
|
+
status: 'ok',
|
|
408
|
+
data: result.rows,
|
|
409
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
410
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
411
|
+
}, 200);
|
|
412
|
+
}
|
|
413
|
+
catch (err) {
|
|
414
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
415
|
+
return c.json(serverError(correlationId, message), 500);
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
app.get('/api/v1/risk-mitigation-plan/get-risk-mitigation-plan-by-id', async (c) => {
|
|
419
|
+
const correlationId = c.get('correlationId');
|
|
420
|
+
const startTime = Date.now();
|
|
421
|
+
try {
|
|
422
|
+
const params = c.req.query();
|
|
423
|
+
const parsed = GetRiskMitigationPlanByIdSchema.safeParse(params);
|
|
424
|
+
if (!parsed.success) {
|
|
425
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
426
|
+
}
|
|
427
|
+
const result = await deps.riskMitigationPlanPort.query('GetRiskMitigationPlanById', parsed.data);
|
|
428
|
+
return c.json({
|
|
429
|
+
correlationId,
|
|
430
|
+
status: 'ok',
|
|
431
|
+
data: result.rows,
|
|
432
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
433
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
434
|
+
}, 200);
|
|
435
|
+
}
|
|
436
|
+
catch (err) {
|
|
437
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
438
|
+
return c.json(serverError(correlationId, message), 500);
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
// ============================================================================
|
|
442
|
+
// Bounded Context: TargetEnterpriseSystem
|
|
443
|
+
// ============================================================================
|
|
444
|
+
app.post('/api/v1/target-enterprise-system/manage-target-enterprise', async (c) => {
|
|
445
|
+
const correlationId = c.get('correlationId');
|
|
446
|
+
const startTime = Date.now();
|
|
447
|
+
try {
|
|
448
|
+
const body = await c.req.json();
|
|
449
|
+
const parsed = ManageTargetEnterpriseSchema.safeParse(body);
|
|
450
|
+
if (!parsed.success) {
|
|
451
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
452
|
+
}
|
|
453
|
+
const result = await deps.targetEnterpriseSystemPort.execute('ManageTargetEnterprise', parsed.data);
|
|
454
|
+
await deps.audit.log('target-enterprise-system', result?.id ?? correlationId, 'manage-target-enterprise', correlationId, parsed.data);
|
|
455
|
+
return c.json({
|
|
456
|
+
correlationId,
|
|
457
|
+
status: 'completed',
|
|
458
|
+
data: result,
|
|
459
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
460
|
+
}, 201);
|
|
461
|
+
}
|
|
462
|
+
catch (err) {
|
|
463
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
464
|
+
return c.json(serverError(correlationId, message), 500);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
app.post('/api/v1/target-enterprise-system/query-target-enterprise', async (c) => {
|
|
468
|
+
const correlationId = c.get('correlationId');
|
|
469
|
+
const startTime = Date.now();
|
|
470
|
+
try {
|
|
471
|
+
const body = await c.req.json();
|
|
472
|
+
const parsed = QueryTargetEnterpriseSchema.safeParse(body);
|
|
473
|
+
if (!parsed.success) {
|
|
474
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
475
|
+
}
|
|
476
|
+
const result = await deps.targetEnterpriseSystemPort.execute('QueryTargetEnterprise', parsed.data);
|
|
477
|
+
await deps.audit.log('target-enterprise-system', result?.id ?? correlationId, 'query-target-enterprise', correlationId, parsed.data);
|
|
478
|
+
return c.json({
|
|
479
|
+
correlationId,
|
|
480
|
+
status: 'completed',
|
|
481
|
+
data: result,
|
|
482
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
483
|
+
}, 201);
|
|
484
|
+
}
|
|
485
|
+
catch (err) {
|
|
486
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
487
|
+
return c.json(serverError(correlationId, message), 500);
|
|
488
|
+
}
|
|
489
|
+
});
|
|
490
|
+
app.get('/api/v1/target-enterprise-system/get-manage-target-enterprise', async (c) => {
|
|
491
|
+
const correlationId = c.get('correlationId');
|
|
492
|
+
const startTime = Date.now();
|
|
493
|
+
try {
|
|
494
|
+
const params = c.req.query();
|
|
495
|
+
const parsed = GetManageTargetEnterpriseSchema.safeParse(params);
|
|
496
|
+
if (!parsed.success) {
|
|
497
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
498
|
+
}
|
|
499
|
+
const result = await deps.targetEnterpriseSystemPort.query('GetManageTargetEnterprise', parsed.data);
|
|
500
|
+
return c.json({
|
|
501
|
+
correlationId,
|
|
502
|
+
status: 'ok',
|
|
503
|
+
data: result.rows,
|
|
504
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
505
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
506
|
+
}, 200);
|
|
507
|
+
}
|
|
508
|
+
catch (err) {
|
|
509
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
510
|
+
return c.json(serverError(correlationId, message), 500);
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
app.get('/api/v1/target-enterprise-system/get-query-target-enterprise', async (c) => {
|
|
514
|
+
const correlationId = c.get('correlationId');
|
|
515
|
+
const startTime = Date.now();
|
|
516
|
+
try {
|
|
517
|
+
const params = c.req.query();
|
|
518
|
+
const parsed = GetQueryTargetEnterpriseSchema.safeParse(params);
|
|
519
|
+
if (!parsed.success) {
|
|
520
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
521
|
+
}
|
|
522
|
+
const result = await deps.targetEnterpriseSystemPort.query('GetQueryTargetEnterprise', parsed.data);
|
|
523
|
+
return c.json({
|
|
524
|
+
correlationId,
|
|
525
|
+
status: 'ok',
|
|
526
|
+
data: result.rows,
|
|
527
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
528
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
529
|
+
}, 200);
|
|
530
|
+
}
|
|
531
|
+
catch (err) {
|
|
532
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
533
|
+
return c.json(serverError(correlationId, message), 500);
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
app.get('/api/v1/target-enterprise-system/get-target-enterprise-system', async (c) => {
|
|
537
|
+
const correlationId = c.get('correlationId');
|
|
538
|
+
const startTime = Date.now();
|
|
539
|
+
try {
|
|
540
|
+
const params = c.req.query();
|
|
541
|
+
const parsed = GetTargetEnterpriseSystemSchema.safeParse(params);
|
|
542
|
+
if (!parsed.success) {
|
|
543
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
544
|
+
}
|
|
545
|
+
const result = await deps.targetEnterpriseSystemPort.query('GetTargetEnterpriseSystem', parsed.data);
|
|
546
|
+
return c.json({
|
|
547
|
+
correlationId,
|
|
548
|
+
status: 'ok',
|
|
549
|
+
data: result.rows,
|
|
550
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
551
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
552
|
+
}, 200);
|
|
553
|
+
}
|
|
554
|
+
catch (err) {
|
|
555
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
556
|
+
return c.json(serverError(correlationId, message), 500);
|
|
557
|
+
}
|
|
558
|
+
});
|
|
559
|
+
app.get('/api/v1/target-enterprise-system/get-target-enterprise-system-by-id', async (c) => {
|
|
560
|
+
const correlationId = c.get('correlationId');
|
|
561
|
+
const startTime = Date.now();
|
|
562
|
+
try {
|
|
563
|
+
const params = c.req.query();
|
|
564
|
+
const parsed = GetTargetEnterpriseSystemByIdSchema.safeParse(params);
|
|
565
|
+
if (!parsed.success) {
|
|
566
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
567
|
+
}
|
|
568
|
+
const result = await deps.targetEnterpriseSystemPort.query('GetTargetEnterpriseSystemById', parsed.data);
|
|
569
|
+
return c.json({
|
|
570
|
+
correlationId,
|
|
571
|
+
status: 'ok',
|
|
572
|
+
data: result.rows,
|
|
573
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
574
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
575
|
+
}, 200);
|
|
576
|
+
}
|
|
577
|
+
catch (err) {
|
|
578
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
579
|
+
return c.json(serverError(correlationId, message), 500);
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
// ============================================================================
|
|
583
|
+
// Bounded Context: Underwriting
|
|
584
|
+
// ============================================================================
|
|
585
|
+
app.post('/api/v1/underwriting/manage-underwriting', async (c) => {
|
|
586
|
+
const correlationId = c.get('correlationId');
|
|
587
|
+
const startTime = Date.now();
|
|
588
|
+
try {
|
|
589
|
+
const body = await c.req.json();
|
|
590
|
+
const parsed = ManageUnderwritingSchema.safeParse(body);
|
|
591
|
+
if (!parsed.success) {
|
|
592
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
593
|
+
}
|
|
594
|
+
const result = await deps.underwritingPort.execute('ManageUnderwriting', parsed.data);
|
|
595
|
+
await deps.audit.log('underwriting', result?.id ?? correlationId, 'manage-underwriting', correlationId, parsed.data);
|
|
596
|
+
return c.json({
|
|
597
|
+
correlationId,
|
|
598
|
+
status: 'completed',
|
|
599
|
+
data: result,
|
|
600
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
601
|
+
}, 201);
|
|
602
|
+
}
|
|
603
|
+
catch (err) {
|
|
604
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
605
|
+
return c.json(serverError(correlationId, message), 500);
|
|
606
|
+
}
|
|
607
|
+
});
|
|
608
|
+
app.post('/api/v1/underwriting/query-underwriting', async (c) => {
|
|
609
|
+
const correlationId = c.get('correlationId');
|
|
610
|
+
const startTime = Date.now();
|
|
611
|
+
try {
|
|
612
|
+
const body = await c.req.json();
|
|
613
|
+
const parsed = QueryUnderwritingSchema.safeParse(body);
|
|
614
|
+
if (!parsed.success) {
|
|
615
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
616
|
+
}
|
|
617
|
+
const result = await deps.underwritingPort.execute('QueryUnderwriting', parsed.data);
|
|
618
|
+
await deps.audit.log('underwriting', result?.id ?? correlationId, 'query-underwriting', correlationId, parsed.data);
|
|
619
|
+
return c.json({
|
|
620
|
+
correlationId,
|
|
621
|
+
status: 'completed',
|
|
622
|
+
data: result,
|
|
623
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
624
|
+
}, 201);
|
|
625
|
+
}
|
|
626
|
+
catch (err) {
|
|
627
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
628
|
+
return c.json(serverError(correlationId, message), 500);
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
app.get('/api/v1/underwriting/list-underwriting', async (c) => {
|
|
632
|
+
const correlationId = c.get('correlationId');
|
|
633
|
+
const startTime = Date.now();
|
|
634
|
+
try {
|
|
635
|
+
const params = c.req.query();
|
|
636
|
+
const parsed = ListUnderwritingSchema.safeParse(params);
|
|
637
|
+
if (!parsed.success) {
|
|
638
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
639
|
+
}
|
|
640
|
+
const result = await deps.underwritingPort.query('ListUnderwriting', parsed.data);
|
|
641
|
+
return c.json({
|
|
642
|
+
correlationId,
|
|
643
|
+
status: 'ok',
|
|
644
|
+
data: result.rows,
|
|
645
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
646
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
647
|
+
}, 200);
|
|
648
|
+
}
|
|
649
|
+
catch (err) {
|
|
650
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
651
|
+
return c.json(serverError(correlationId, message), 500);
|
|
652
|
+
}
|
|
653
|
+
});
|
|
654
|
+
app.get('/api/v1/underwriting/get-underwriting-by-id', async (c) => {
|
|
655
|
+
const correlationId = c.get('correlationId');
|
|
656
|
+
const startTime = Date.now();
|
|
657
|
+
try {
|
|
658
|
+
const params = c.req.query();
|
|
659
|
+
const parsed = GetUnderwritingByIdSchema.safeParse(params);
|
|
660
|
+
if (!parsed.success) {
|
|
661
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
662
|
+
}
|
|
663
|
+
const result = await deps.underwritingPort.query('GetUnderwritingById', parsed.data);
|
|
664
|
+
return c.json({
|
|
665
|
+
correlationId,
|
|
666
|
+
status: 'ok',
|
|
667
|
+
data: result.rows,
|
|
668
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
669
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
670
|
+
}, 200);
|
|
671
|
+
}
|
|
672
|
+
catch (err) {
|
|
673
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
674
|
+
return c.json(serverError(correlationId, message), 500);
|
|
675
|
+
}
|
|
676
|
+
});
|
|
677
|
+
// ============================================================================
|
|
678
|
+
// Bounded Context: ScopedPilotReduce
|
|
679
|
+
// ============================================================================
|
|
680
|
+
app.post('/api/v1/scoped-pilot-reduce/manage-scoped-pilot', async (c) => {
|
|
681
|
+
const correlationId = c.get('correlationId');
|
|
682
|
+
const startTime = Date.now();
|
|
683
|
+
try {
|
|
684
|
+
const body = await c.req.json();
|
|
685
|
+
const parsed = ManageScopedPilotSchema.safeParse(body);
|
|
686
|
+
if (!parsed.success) {
|
|
687
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
688
|
+
}
|
|
689
|
+
const result = await deps.scopedPilotReducePort.execute('ManageScopedPilot', parsed.data);
|
|
690
|
+
await deps.audit.log('scoped-pilot-reduce', result?.id ?? correlationId, 'manage-scoped-pilot', correlationId, parsed.data);
|
|
691
|
+
return c.json({
|
|
692
|
+
correlationId,
|
|
693
|
+
status: 'completed',
|
|
694
|
+
data: result,
|
|
695
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
696
|
+
}, 201);
|
|
697
|
+
}
|
|
698
|
+
catch (err) {
|
|
699
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
700
|
+
return c.json(serverError(correlationId, message), 500);
|
|
701
|
+
}
|
|
702
|
+
});
|
|
703
|
+
app.post('/api/v1/scoped-pilot-reduce/query-scoped-pilot', async (c) => {
|
|
704
|
+
const correlationId = c.get('correlationId');
|
|
705
|
+
const startTime = Date.now();
|
|
706
|
+
try {
|
|
707
|
+
const body = await c.req.json();
|
|
708
|
+
const parsed = QueryScopedPilotSchema.safeParse(body);
|
|
709
|
+
if (!parsed.success) {
|
|
710
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
711
|
+
}
|
|
712
|
+
const result = await deps.scopedPilotReducePort.execute('QueryScopedPilot', parsed.data);
|
|
713
|
+
await deps.audit.log('scoped-pilot-reduce', result?.id ?? correlationId, 'query-scoped-pilot', correlationId, parsed.data);
|
|
714
|
+
return c.json({
|
|
715
|
+
correlationId,
|
|
716
|
+
status: 'completed',
|
|
717
|
+
data: result,
|
|
718
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
719
|
+
}, 201);
|
|
720
|
+
}
|
|
721
|
+
catch (err) {
|
|
722
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
723
|
+
return c.json(serverError(correlationId, message), 500);
|
|
724
|
+
}
|
|
725
|
+
});
|
|
726
|
+
app.get('/api/v1/scoped-pilot-reduce/get-scoped-pilot-reduce', async (c) => {
|
|
727
|
+
const correlationId = c.get('correlationId');
|
|
728
|
+
const startTime = Date.now();
|
|
729
|
+
try {
|
|
730
|
+
const params = c.req.query();
|
|
731
|
+
const parsed = GetScopedPilotReduceSchema.safeParse(params);
|
|
732
|
+
if (!parsed.success) {
|
|
733
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
734
|
+
}
|
|
735
|
+
const result = await deps.scopedPilotReducePort.query('GetScopedPilotReduce', parsed.data);
|
|
736
|
+
return c.json({
|
|
737
|
+
correlationId,
|
|
738
|
+
status: 'ok',
|
|
739
|
+
data: result.rows,
|
|
740
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
741
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
742
|
+
}, 200);
|
|
743
|
+
}
|
|
744
|
+
catch (err) {
|
|
745
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
746
|
+
return c.json(serverError(correlationId, message), 500);
|
|
747
|
+
}
|
|
748
|
+
});
|
|
749
|
+
app.get('/api/v1/scoped-pilot-reduce/get-scoped-pilot-reduce-by-id', async (c) => {
|
|
750
|
+
const correlationId = c.get('correlationId');
|
|
751
|
+
const startTime = Date.now();
|
|
752
|
+
try {
|
|
753
|
+
const params = c.req.query();
|
|
754
|
+
const parsed = GetScopedPilotReduceByIdSchema.safeParse(params);
|
|
755
|
+
if (!parsed.success) {
|
|
756
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
757
|
+
}
|
|
758
|
+
const result = await deps.scopedPilotReducePort.query('GetScopedPilotReduceById', parsed.data);
|
|
759
|
+
return c.json({
|
|
760
|
+
correlationId,
|
|
761
|
+
status: 'ok',
|
|
762
|
+
data: result.rows,
|
|
763
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
764
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
765
|
+
}, 200);
|
|
766
|
+
}
|
|
767
|
+
catch (err) {
|
|
768
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
769
|
+
return c.json(serverError(correlationId, message), 500);
|
|
770
|
+
}
|
|
771
|
+
});
|
|
772
|
+
// ============================================================================
|
|
773
|
+
// Bounded Context: ReEvaluateRisk
|
|
774
|
+
// ============================================================================
|
|
775
|
+
app.post('/api/v1/re-evaluate-risk/manage-re-evaluate', async (c) => {
|
|
776
|
+
const correlationId = c.get('correlationId');
|
|
777
|
+
const startTime = Date.now();
|
|
778
|
+
try {
|
|
779
|
+
const body = await c.req.json();
|
|
780
|
+
const parsed = ManageReEvaluateSchema.safeParse(body);
|
|
781
|
+
if (!parsed.success) {
|
|
782
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
783
|
+
}
|
|
784
|
+
const result = await deps.reEvaluateRiskPort.execute('ManageReEvaluate', parsed.data);
|
|
785
|
+
await deps.audit.log('re-evaluate-risk', result?.id ?? correlationId, 'manage-re-evaluate', correlationId, parsed.data);
|
|
786
|
+
return c.json({
|
|
787
|
+
correlationId,
|
|
788
|
+
status: 'completed',
|
|
789
|
+
data: result,
|
|
790
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
791
|
+
}, 201);
|
|
792
|
+
}
|
|
793
|
+
catch (err) {
|
|
794
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
795
|
+
return c.json(serverError(correlationId, message), 500);
|
|
796
|
+
}
|
|
797
|
+
});
|
|
798
|
+
app.post('/api/v1/re-evaluate-risk/query-re-evaluate', async (c) => {
|
|
799
|
+
const correlationId = c.get('correlationId');
|
|
800
|
+
const startTime = Date.now();
|
|
801
|
+
try {
|
|
802
|
+
const body = await c.req.json();
|
|
803
|
+
const parsed = QueryReEvaluateSchema.safeParse(body);
|
|
804
|
+
if (!parsed.success) {
|
|
805
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
806
|
+
}
|
|
807
|
+
const result = await deps.reEvaluateRiskPort.execute('QueryReEvaluate', parsed.data);
|
|
808
|
+
await deps.audit.log('re-evaluate-risk', result?.id ?? correlationId, 'query-re-evaluate', correlationId, parsed.data);
|
|
809
|
+
return c.json({
|
|
810
|
+
correlationId,
|
|
811
|
+
status: 'completed',
|
|
812
|
+
data: result,
|
|
813
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
814
|
+
}, 201);
|
|
815
|
+
}
|
|
816
|
+
catch (err) {
|
|
817
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
818
|
+
return c.json(serverError(correlationId, message), 500);
|
|
819
|
+
}
|
|
820
|
+
});
|
|
821
|
+
app.get('/api/v1/re-evaluate-risk/get-re-evaluate-risk', async (c) => {
|
|
822
|
+
const correlationId = c.get('correlationId');
|
|
823
|
+
const startTime = Date.now();
|
|
824
|
+
try {
|
|
825
|
+
const params = c.req.query();
|
|
826
|
+
const parsed = GetReEvaluateRiskSchema.safeParse(params);
|
|
827
|
+
if (!parsed.success) {
|
|
828
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
829
|
+
}
|
|
830
|
+
const result = await deps.reEvaluateRiskPort.query('GetReEvaluateRisk', parsed.data);
|
|
831
|
+
return c.json({
|
|
832
|
+
correlationId,
|
|
833
|
+
status: 'ok',
|
|
834
|
+
data: result.rows,
|
|
835
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
836
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
837
|
+
}, 200);
|
|
838
|
+
}
|
|
839
|
+
catch (err) {
|
|
840
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
841
|
+
return c.json(serverError(correlationId, message), 500);
|
|
842
|
+
}
|
|
843
|
+
});
|
|
844
|
+
app.get('/api/v1/re-evaluate-risk/get-re-evaluate-risk-by-id', async (c) => {
|
|
845
|
+
const correlationId = c.get('correlationId');
|
|
846
|
+
const startTime = Date.now();
|
|
847
|
+
try {
|
|
848
|
+
const params = c.req.query();
|
|
849
|
+
const parsed = GetReEvaluateRiskByIdSchema.safeParse(params);
|
|
850
|
+
if (!parsed.success) {
|
|
851
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
852
|
+
}
|
|
853
|
+
const result = await deps.reEvaluateRiskPort.query('GetReEvaluateRiskById', parsed.data);
|
|
854
|
+
return c.json({
|
|
855
|
+
correlationId,
|
|
856
|
+
status: 'ok',
|
|
857
|
+
data: result.rows,
|
|
858
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
859
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
860
|
+
}, 200);
|
|
861
|
+
}
|
|
862
|
+
catch (err) {
|
|
863
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
864
|
+
return c.json(serverError(correlationId, message), 500);
|
|
865
|
+
}
|
|
866
|
+
});
|
|
867
|
+
// ============================================================================
|
|
868
|
+
// Bounded Context: Recommendation
|
|
869
|
+
// ============================================================================
|
|
870
|
+
app.post('/api/v1/recommendation/manage-recommendation', async (c) => {
|
|
871
|
+
const correlationId = c.get('correlationId');
|
|
872
|
+
const startTime = Date.now();
|
|
873
|
+
try {
|
|
874
|
+
const body = await c.req.json();
|
|
875
|
+
const parsed = ManageRecommendationSchema.safeParse(body);
|
|
876
|
+
if (!parsed.success) {
|
|
877
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
878
|
+
}
|
|
879
|
+
const result = await deps.recommendationPort.execute('ManageRecommendation', parsed.data);
|
|
880
|
+
await deps.audit.log('recommendation', result?.id ?? correlationId, 'manage-recommendation', correlationId, parsed.data);
|
|
881
|
+
return c.json({
|
|
882
|
+
correlationId,
|
|
883
|
+
status: 'completed',
|
|
884
|
+
data: result,
|
|
885
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
886
|
+
}, 201);
|
|
887
|
+
}
|
|
888
|
+
catch (err) {
|
|
889
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
890
|
+
return c.json(serverError(correlationId, message), 500);
|
|
891
|
+
}
|
|
892
|
+
});
|
|
893
|
+
app.post('/api/v1/recommendation/query-recommendation', async (c) => {
|
|
894
|
+
const correlationId = c.get('correlationId');
|
|
895
|
+
const startTime = Date.now();
|
|
896
|
+
try {
|
|
897
|
+
const body = await c.req.json();
|
|
898
|
+
const parsed = QueryRecommendationSchema.safeParse(body);
|
|
899
|
+
if (!parsed.success) {
|
|
900
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
901
|
+
}
|
|
902
|
+
const result = await deps.recommendationPort.execute('QueryRecommendation', parsed.data);
|
|
903
|
+
await deps.audit.log('recommendation', result?.id ?? correlationId, 'query-recommendation', correlationId, parsed.data);
|
|
904
|
+
return c.json({
|
|
905
|
+
correlationId,
|
|
906
|
+
status: 'completed',
|
|
907
|
+
data: result,
|
|
908
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
909
|
+
}, 201);
|
|
910
|
+
}
|
|
911
|
+
catch (err) {
|
|
912
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
913
|
+
return c.json(serverError(correlationId, message), 500);
|
|
914
|
+
}
|
|
915
|
+
});
|
|
916
|
+
app.get('/api/v1/recommendation/list-recommendation', async (c) => {
|
|
917
|
+
const correlationId = c.get('correlationId');
|
|
918
|
+
const startTime = Date.now();
|
|
919
|
+
try {
|
|
920
|
+
const params = c.req.query();
|
|
921
|
+
const parsed = ListRecommendationSchema.safeParse(params);
|
|
922
|
+
if (!parsed.success) {
|
|
923
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
924
|
+
}
|
|
925
|
+
const result = await deps.recommendationPort.query('ListRecommendation', parsed.data);
|
|
926
|
+
return c.json({
|
|
927
|
+
correlationId,
|
|
928
|
+
status: 'ok',
|
|
929
|
+
data: result.rows,
|
|
930
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
931
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
932
|
+
}, 200);
|
|
933
|
+
}
|
|
934
|
+
catch (err) {
|
|
935
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
936
|
+
return c.json(serverError(correlationId, message), 500);
|
|
937
|
+
}
|
|
938
|
+
});
|
|
939
|
+
app.get('/api/v1/recommendation/get-recommendation-by-id', async (c) => {
|
|
940
|
+
const correlationId = c.get('correlationId');
|
|
941
|
+
const startTime = Date.now();
|
|
942
|
+
try {
|
|
943
|
+
const params = c.req.query();
|
|
944
|
+
const parsed = GetRecommendationByIdSchema.safeParse(params);
|
|
945
|
+
if (!parsed.success) {
|
|
946
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
947
|
+
}
|
|
948
|
+
const result = await deps.recommendationPort.query('GetRecommendationById', parsed.data);
|
|
949
|
+
return c.json({
|
|
950
|
+
correlationId,
|
|
951
|
+
status: 'ok',
|
|
952
|
+
data: result.rows,
|
|
953
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
954
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
955
|
+
}, 200);
|
|
956
|
+
}
|
|
957
|
+
catch (err) {
|
|
958
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
959
|
+
return c.json(serverError(correlationId, message), 500);
|
|
960
|
+
}
|
|
961
|
+
});
|
|
962
|
+
// ============================================================================
|
|
963
|
+
// Bounded Context: ApiGateway
|
|
964
|
+
// ============================================================================
|
|
965
|
+
app.post('/api/v1/api-gateway/route-requests', async (c) => {
|
|
966
|
+
const correlationId = c.get('correlationId');
|
|
967
|
+
const startTime = Date.now();
|
|
968
|
+
try {
|
|
969
|
+
const body = await c.req.json();
|
|
970
|
+
const parsed = RouteRequestsSchema.safeParse(body);
|
|
971
|
+
if (!parsed.success) {
|
|
972
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
973
|
+
}
|
|
974
|
+
const result = await deps.apiGatewayPort.execute('RouteRequests', parsed.data);
|
|
975
|
+
await deps.audit.log('api-gateway', result?.id ?? correlationId, 'route-requests', correlationId, parsed.data);
|
|
976
|
+
return c.json({
|
|
977
|
+
correlationId,
|
|
978
|
+
status: 'completed',
|
|
979
|
+
data: result,
|
|
980
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
981
|
+
}, 201);
|
|
982
|
+
}
|
|
983
|
+
catch (err) {
|
|
984
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
985
|
+
return c.json(serverError(correlationId, message), 500);
|
|
986
|
+
}
|
|
987
|
+
});
|
|
988
|
+
app.post('/api/v1/api-gateway/authenticate', async (c) => {
|
|
989
|
+
const correlationId = c.get('correlationId');
|
|
990
|
+
const startTime = Date.now();
|
|
991
|
+
try {
|
|
992
|
+
const body = await c.req.json();
|
|
993
|
+
const parsed = AuthenticateSchema.safeParse(body);
|
|
994
|
+
if (!parsed.success) {
|
|
995
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
996
|
+
}
|
|
997
|
+
const result = await deps.apiGatewayPort.execute('Authenticate', parsed.data);
|
|
998
|
+
await deps.audit.log('api-gateway', result?.id ?? correlationId, 'authenticate', correlationId, parsed.data);
|
|
999
|
+
return c.json({
|
|
1000
|
+
correlationId,
|
|
1001
|
+
status: 'completed',
|
|
1002
|
+
data: result,
|
|
1003
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
1004
|
+
}, 201);
|
|
1005
|
+
}
|
|
1006
|
+
catch (err) {
|
|
1007
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
1008
|
+
return c.json(serverError(correlationId, message), 500);
|
|
1009
|
+
}
|
|
1010
|
+
});
|
|
1011
|
+
app.post('/api/v1/api-gateway/rate-limit', async (c) => {
|
|
1012
|
+
const correlationId = c.get('correlationId');
|
|
1013
|
+
const startTime = Date.now();
|
|
1014
|
+
try {
|
|
1015
|
+
const body = await c.req.json();
|
|
1016
|
+
const parsed = RateLimitSchema.safeParse(body);
|
|
1017
|
+
if (!parsed.success) {
|
|
1018
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
1019
|
+
}
|
|
1020
|
+
const result = await deps.apiGatewayPort.execute('RateLimit', parsed.data);
|
|
1021
|
+
await deps.audit.log('api-gateway', result?.id ?? correlationId, 'rate-limit', correlationId, parsed.data);
|
|
1022
|
+
return c.json({
|
|
1023
|
+
correlationId,
|
|
1024
|
+
status: 'completed',
|
|
1025
|
+
data: result,
|
|
1026
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
1027
|
+
}, 201);
|
|
1028
|
+
}
|
|
1029
|
+
catch (err) {
|
|
1030
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
1031
|
+
return c.json(serverError(correlationId, message), 500);
|
|
1032
|
+
}
|
|
1033
|
+
});
|
|
1034
|
+
app.get('/api/v1/api-gateway/get-api-gateway', async (c) => {
|
|
1035
|
+
const correlationId = c.get('correlationId');
|
|
1036
|
+
const startTime = Date.now();
|
|
1037
|
+
try {
|
|
1038
|
+
const params = c.req.query();
|
|
1039
|
+
const parsed = GetApiGatewaySchema.safeParse(params);
|
|
1040
|
+
if (!parsed.success) {
|
|
1041
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
1042
|
+
}
|
|
1043
|
+
const result = await deps.apiGatewayPort.query('GetApiGateway', parsed.data);
|
|
1044
|
+
return c.json({
|
|
1045
|
+
correlationId,
|
|
1046
|
+
status: 'ok',
|
|
1047
|
+
data: result.rows,
|
|
1048
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
1049
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
1050
|
+
}, 200);
|
|
1051
|
+
}
|
|
1052
|
+
catch (err) {
|
|
1053
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
1054
|
+
return c.json(serverError(correlationId, message), 500);
|
|
1055
|
+
}
|
|
1056
|
+
});
|
|
1057
|
+
app.get('/api/v1/api-gateway/get-api-gateway-by-id', async (c) => {
|
|
1058
|
+
const correlationId = c.get('correlationId');
|
|
1059
|
+
const startTime = Date.now();
|
|
1060
|
+
try {
|
|
1061
|
+
const params = c.req.query();
|
|
1062
|
+
const parsed = GetApiGatewayByIdSchema.safeParse(params);
|
|
1063
|
+
if (!parsed.success) {
|
|
1064
|
+
return c.json(validationError(correlationId, parsed.error.issues), 400);
|
|
1065
|
+
}
|
|
1066
|
+
const result = await deps.apiGatewayPort.query('GetApiGatewayById', parsed.data);
|
|
1067
|
+
return c.json({
|
|
1068
|
+
correlationId,
|
|
1069
|
+
status: 'ok',
|
|
1070
|
+
data: result.rows,
|
|
1071
|
+
pagination: { limit: parsed.data.limit ?? 50, offset: parsed.data.offset ?? 0, total: result.total },
|
|
1072
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
1073
|
+
}, 200);
|
|
1074
|
+
}
|
|
1075
|
+
catch (err) {
|
|
1076
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
1077
|
+
return c.json(serverError(correlationId, message), 500);
|
|
1078
|
+
}
|
|
1079
|
+
});
|
|
1080
|
+
// ============================================================================
|
|
1081
|
+
// GET /api/v1/erp/sync-status — ERP sync queue and circuit breaker
|
|
1082
|
+
// ============================================================================
|
|
1083
|
+
app.get('/api/v1/erp/sync-status', async (c) => {
|
|
1084
|
+
const correlationId = c.get('correlationId');
|
|
1085
|
+
const startTime = Date.now();
|
|
1086
|
+
try {
|
|
1087
|
+
const status = erpClientInstance.getSyncStatus();
|
|
1088
|
+
return c.json({
|
|
1089
|
+
correlationId,
|
|
1090
|
+
status: 'ok',
|
|
1091
|
+
data: status,
|
|
1092
|
+
metadata: { response_time_ms: Date.now() - startTime },
|
|
1093
|
+
}, 200);
|
|
1094
|
+
}
|
|
1095
|
+
catch (err) {
|
|
1096
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
1097
|
+
return c.json(serverError(correlationId, message), 500);
|
|
1098
|
+
}
|
|
1099
|
+
});
|
|
1100
|
+
export { app, erpClientInstance };
|