From 375c5632f663574a6303840bc2c363fd5ed65130 Mon Sep 17 00:00:00 2001 From: hailin Date: Mon, 2 Mar 2026 09:29:51 -0800 Subject: [PATCH] fix: correct all web-admin API endpoint URLs to match backend routes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The web-admin frontend was calling incorrect API paths that didn't match the actual backend service routes through Kong gateway, causing all requests to fail with 404 or route-mismatch errors. URL corrections: - servers: /api/v1/servers → /api/v1/inventory/servers - runbooks: /api/v1/runbooks → /api/v1/ops/runbooks - risk-rules: /api/v1/security/risk-rules → /api/v1/agent/risk-rules - credentials: /api/v1/security/credentials → /api/v1/inventory/credentials - roles: /api/v1/security/roles → /api/v1/auth/roles - permissions: /api/v1/security/permissions → /api/v1/auth/permissions - tenants: /api/v1/tenants → /api/v1/admin/tenants - communication: /api/v1/communication → /api/v1/comm Co-Authored-By: Claude Opus 4.6 --- .../use-cases/runbooks/create-runbook.ts | 2 +- .../use-cases/runbooks/delete-runbook.ts | 2 +- .../use-cases/runbooks/test-runbook.ts | 2 +- .../use-cases/runbooks/update-runbook.ts | 2 +- .../use-cases/security/manage-credentials.ts | 8 +++--- .../use-cases/security/manage-permissions.ts | 6 ++--- .../use-cases/security/manage-risk-rules.ts | 8 +++--- .../use-cases/servers/add-server.ts | 2 +- .../use-cases/servers/remove-server.ts | 2 +- .../use-cases/servers/update-server.ts | 2 +- .../api-communication.repository.ts | 22 ++++++++-------- .../repositories/api-runbook.repository.ts | 14 +++++----- .../repositories/api-security.repository.ts | 26 +++++++++---------- .../repositories/api-server.repository.ts | 10 +++---- .../repositories/api-tenant.repository.ts | 10 +++---- .../stores/redux/slices/risk-rules.slice.ts | 8 +++--- 16 files changed, 63 insertions(+), 63 deletions(-) diff --git a/it0-web-admin/src/application/use-cases/runbooks/create-runbook.ts b/it0-web-admin/src/application/use-cases/runbooks/create-runbook.ts index e0a3ecc..987147c 100644 --- a/it0-web-admin/src/application/use-cases/runbooks/create-runbook.ts +++ b/it0-web-admin/src/application/use-cases/runbooks/create-runbook.ts @@ -3,7 +3,7 @@ import type { CreateRunbookDto } from '@/application/dto/runbook.dto'; import type { Runbook } from '@/domain/entities/runbook'; export async function createRunbook(data: CreateRunbookDto): Promise { - return apiClient('/api/v1/runbooks', { + return apiClient('/api/v1/ops/runbooks', { method: 'POST', body: data, }); diff --git a/it0-web-admin/src/application/use-cases/runbooks/delete-runbook.ts b/it0-web-admin/src/application/use-cases/runbooks/delete-runbook.ts index f1c499c..3d66369 100644 --- a/it0-web-admin/src/application/use-cases/runbooks/delete-runbook.ts +++ b/it0-web-admin/src/application/use-cases/runbooks/delete-runbook.ts @@ -1,7 +1,7 @@ import { apiClient } from '@/infrastructure/api/api-client'; export async function deleteRunbook(id: string): Promise { - await apiClient(`/api/v1/runbooks/${id}`, { + await apiClient(`/api/v1/ops/runbooks/${id}`, { method: 'DELETE', }); } diff --git a/it0-web-admin/src/application/use-cases/runbooks/test-runbook.ts b/it0-web-admin/src/application/use-cases/runbooks/test-runbook.ts index f98aaec..0282248 100644 --- a/it0-web-admin/src/application/use-cases/runbooks/test-runbook.ts +++ b/it0-web-admin/src/application/use-cases/runbooks/test-runbook.ts @@ -2,7 +2,7 @@ import { apiClient } from '@/infrastructure/api/api-client'; import type { RunbookExecution } from '@/domain/entities/runbook'; export async function testRunbook(id: string): Promise { - return apiClient(`/api/v1/runbooks/${id}/execute`, { + return apiClient(`/api/v1/ops/runbooks/${id}/execute`, { method: 'POST', body: { dryRun: true }, }); diff --git a/it0-web-admin/src/application/use-cases/runbooks/update-runbook.ts b/it0-web-admin/src/application/use-cases/runbooks/update-runbook.ts index e4e4d45..3bae450 100644 --- a/it0-web-admin/src/application/use-cases/runbooks/update-runbook.ts +++ b/it0-web-admin/src/application/use-cases/runbooks/update-runbook.ts @@ -3,7 +3,7 @@ import type { UpdateRunbookDto } from '@/application/dto/runbook.dto'; import type { Runbook } from '@/domain/entities/runbook'; export async function updateRunbook(id: string, data: UpdateRunbookDto): Promise { - return apiClient(`/api/v1/runbooks/${id}`, { + return apiClient(`/api/v1/ops/runbooks/${id}`, { method: 'PUT', body: data, }); diff --git a/it0-web-admin/src/application/use-cases/security/manage-credentials.ts b/it0-web-admin/src/application/use-cases/security/manage-credentials.ts index 709fdb0..0589f12 100644 --- a/it0-web-admin/src/application/use-cases/security/manage-credentials.ts +++ b/it0-web-admin/src/application/use-cases/security/manage-credentials.ts @@ -3,27 +3,27 @@ import type { Credential } from '@/domain/entities/credential'; export async function listCredentials(params?: Record): Promise { const query = params ? '?' + new URLSearchParams(params).toString() : ''; - return apiClient(`/api/v1/security/credentials${query}`); + return apiClient(`/api/v1/inventory/credentials${query}`); } export async function createCredential( credential: Omit, ): Promise { - return apiClient('/api/v1/security/credentials', { + return apiClient('/api/v1/inventory/credentials', { method: 'POST', body: credential, }); } export async function updateCredential(id: string, data: Partial): Promise { - return apiClient(`/api/v1/security/credentials/${id}`, { + return apiClient(`/api/v1/inventory/credentials/${id}`, { method: 'PUT', body: data, }); } export async function deleteCredential(id: string): Promise { - await apiClient(`/api/v1/security/credentials/${id}`, { + await apiClient(`/api/v1/inventory/credentials/${id}`, { method: 'DELETE', }); } diff --git a/it0-web-admin/src/application/use-cases/security/manage-permissions.ts b/it0-web-admin/src/application/use-cases/security/manage-permissions.ts index c26557a..3a49618 100644 --- a/it0-web-admin/src/application/use-cases/security/manage-permissions.ts +++ b/it0-web-admin/src/application/use-cases/security/manage-permissions.ts @@ -7,16 +7,16 @@ export interface PermissionMatrix { } export async function getPermissionMatrix(): Promise { - return apiClient('/api/v1/security/permissions/matrix'); + return apiClient('/api/v1/auth/permissions/matrix'); } export async function updateRolePermissions(roleId: string, permissions: string[]): Promise { - await apiClient(`/api/v1/security/permissions/roles/${roleId}`, { + await apiClient(`/api/v1/auth/roles/${roleId}/permissions`, { method: 'PUT', body: { permissions }, }); } export async function listRoles(): Promise { - return apiClient('/api/v1/security/roles'); + return apiClient('/api/v1/auth/roles'); } diff --git a/it0-web-admin/src/application/use-cases/security/manage-risk-rules.ts b/it0-web-admin/src/application/use-cases/security/manage-risk-rules.ts index 36f9f47..2b77bf1 100644 --- a/it0-web-admin/src/application/use-cases/security/manage-risk-rules.ts +++ b/it0-web-admin/src/application/use-cases/security/manage-risk-rules.ts @@ -3,27 +3,27 @@ import type { RiskRule } from '@/domain/entities/risk-rule'; export async function listRiskRules(params?: Record): Promise { const query = params ? '?' + new URLSearchParams(params).toString() : ''; - return apiClient(`/api/v1/security/risk-rules${query}`); + return apiClient(`/api/v1/agent/risk-rules${query}`); } export async function createRiskRule( rule: Omit, ): Promise { - return apiClient('/api/v1/security/risk-rules', { + return apiClient('/api/v1/agent/risk-rules', { method: 'POST', body: rule, }); } export async function updateRiskRule(id: string, data: Partial): Promise { - return apiClient(`/api/v1/security/risk-rules/${id}`, { + return apiClient(`/api/v1/agent/risk-rules/${id}`, { method: 'PUT', body: data, }); } export async function deleteRiskRule(id: string): Promise { - await apiClient(`/api/v1/security/risk-rules/${id}`, { + await apiClient(`/api/v1/agent/risk-rules/${id}`, { method: 'DELETE', }); } diff --git a/it0-web-admin/src/application/use-cases/servers/add-server.ts b/it0-web-admin/src/application/use-cases/servers/add-server.ts index 9e2d605..6f4b289 100644 --- a/it0-web-admin/src/application/use-cases/servers/add-server.ts +++ b/it0-web-admin/src/application/use-cases/servers/add-server.ts @@ -3,7 +3,7 @@ import type { CreateServerDto } from '@/application/dto/server.dto'; import type { Server } from '@/domain/entities/server'; export async function addServer(data: CreateServerDto): Promise { - return apiClient('/api/v1/servers', { + return apiClient('/api/v1/inventory/servers', { method: 'POST', body: data, }); diff --git a/it0-web-admin/src/application/use-cases/servers/remove-server.ts b/it0-web-admin/src/application/use-cases/servers/remove-server.ts index d88e683..f9a756b 100644 --- a/it0-web-admin/src/application/use-cases/servers/remove-server.ts +++ b/it0-web-admin/src/application/use-cases/servers/remove-server.ts @@ -1,7 +1,7 @@ import { apiClient } from '@/infrastructure/api/api-client'; export async function removeServer(id: string): Promise { - await apiClient(`/api/v1/servers/${id}`, { + await apiClient(`/api/v1/inventory/servers/${id}`, { method: 'DELETE', }); } diff --git a/it0-web-admin/src/application/use-cases/servers/update-server.ts b/it0-web-admin/src/application/use-cases/servers/update-server.ts index 59aba53..b96ab8f 100644 --- a/it0-web-admin/src/application/use-cases/servers/update-server.ts +++ b/it0-web-admin/src/application/use-cases/servers/update-server.ts @@ -3,7 +3,7 @@ import type { UpdateServerDto } from '@/application/dto/server.dto'; import type { Server } from '@/domain/entities/server'; export async function updateServer(id: string, data: UpdateServerDto): Promise { - return apiClient(`/api/v1/servers/${id}`, { + return apiClient(`/api/v1/inventory/servers/${id}`, { method: 'PUT', body: data, }); diff --git a/it0-web-admin/src/infrastructure/repositories/api-communication.repository.ts b/it0-web-admin/src/infrastructure/repositories/api-communication.repository.ts index 338723c..09be102 100644 --- a/it0-web-admin/src/infrastructure/repositories/api-communication.repository.ts +++ b/it0-web-admin/src/infrastructure/repositories/api-communication.repository.ts @@ -6,64 +6,64 @@ import type { EscalationPolicy } from '@/domain/entities/escalation-policy'; export const apiCommunicationRepository: CommunicationRepository = { async listContacts(params) { const query = params ? '?' + new URLSearchParams(params).toString() : ''; - return apiClient(`/api/v1/communication/contacts${query}`); + return apiClient(`/api/v1/comm/contacts${query}`); }, async getContactById(id) { - return apiClient(`/api/v1/communication/contacts/${id}`); + return apiClient(`/api/v1/comm/contacts/${id}`); }, async createContact(contact) { - return apiClient('/api/v1/communication/contacts', { + return apiClient('/api/v1/comm/contacts', { method: 'POST', body: contact, }); }, async updateContact(id, data) { - return apiClient(`/api/v1/communication/contacts/${id}`, { + return apiClient(`/api/v1/comm/contacts/${id}`, { method: 'PUT', body: data, }); }, async removeContact(id) { - await apiClient(`/api/v1/communication/contacts/${id}`, { + await apiClient(`/api/v1/comm/contacts/${id}`, { method: 'DELETE', }); }, async listEscalationPolicies(params) { const query = params ? '?' + new URLSearchParams(params).toString() : ''; - return apiClient(`/api/v1/communication/escalation-policies${query}`); + return apiClient(`/api/v1/comm/escalation-policies${query}`); }, async getEscalationPolicyById(id) { - return apiClient(`/api/v1/communication/escalation-policies/${id}`); + return apiClient(`/api/v1/comm/escalation-policies/${id}`); }, async createEscalationPolicy(policy) { - return apiClient('/api/v1/communication/escalation-policies', { + return apiClient('/api/v1/comm/escalation-policies', { method: 'POST', body: policy, }); }, async updateEscalationPolicy(id, data) { - return apiClient(`/api/v1/communication/escalation-policies/${id}`, { + return apiClient(`/api/v1/comm/escalation-policies/${id}`, { method: 'PUT', body: data, }); }, async removeEscalationPolicy(id) { - await apiClient(`/api/v1/communication/escalation-policies/${id}`, { + await apiClient(`/api/v1/comm/escalation-policies/${id}`, { method: 'DELETE', }); }, async sendTestMessage(channelType, contactId) { - await apiClient('/api/v1/communication/test-message', { + await apiClient('/api/v1/comm/test-message', { method: 'POST', body: { channelType, contactId }, }); diff --git a/it0-web-admin/src/infrastructure/repositories/api-runbook.repository.ts b/it0-web-admin/src/infrastructure/repositories/api-runbook.repository.ts index 5673f28..8cd0b48 100644 --- a/it0-web-admin/src/infrastructure/repositories/api-runbook.repository.ts +++ b/it0-web-admin/src/infrastructure/repositories/api-runbook.repository.ts @@ -4,40 +4,40 @@ import type { Runbook, RunbookExecution } from '@/domain/entities/runbook'; export const apiRunbookRepository: RunbookRepository = { async list() { - return apiClient('/api/v1/runbooks'); + return apiClient('/api/v1/ops/runbooks'); }, async getById(id) { - return apiClient(`/api/v1/runbooks/${id}`); + return apiClient(`/api/v1/ops/runbooks/${id}`); }, async create(runbook) { - return apiClient('/api/v1/runbooks', { + return apiClient('/api/v1/ops/runbooks', { method: 'POST', body: runbook, }); }, async update(id, data) { - return apiClient(`/api/v1/runbooks/${id}`, { + return apiClient(`/api/v1/ops/runbooks/${id}`, { method: 'PUT', body: data, }); }, async remove(id) { - await apiClient(`/api/v1/runbooks/${id}`, { + await apiClient(`/api/v1/ops/runbooks/${id}`, { method: 'DELETE', }); }, async execute(id) { - return apiClient(`/api/v1/runbooks/${id}/execute`, { + return apiClient(`/api/v1/ops/runbooks/${id}/execute`, { method: 'POST', }); }, async getExecutions(id) { - return apiClient(`/api/v1/runbooks/${id}/executions`); + return apiClient(`/api/v1/ops/runbooks/${id}/executions`); }, }; diff --git a/it0-web-admin/src/infrastructure/repositories/api-security.repository.ts b/it0-web-admin/src/infrastructure/repositories/api-security.repository.ts index 40c623d..b88eba6 100644 --- a/it0-web-admin/src/infrastructure/repositories/api-security.repository.ts +++ b/it0-web-admin/src/infrastructure/repositories/api-security.repository.ts @@ -7,72 +7,72 @@ import type { Role } from '@/domain/entities/role'; export const apiSecurityRepository: SecurityRepository = { async listRiskRules(params) { const query = params ? '?' + new URLSearchParams(params).toString() : ''; - return apiClient(`/api/v1/security/risk-rules${query}`); + return apiClient(`/api/v1/agent/risk-rules${query}`); }, async getRiskRuleById(id) { - return apiClient(`/api/v1/security/risk-rules/${id}`); + return apiClient(`/api/v1/agent/risk-rules/${id}`); }, async createRiskRule(rule) { - return apiClient('/api/v1/security/risk-rules', { + return apiClient('/api/v1/agent/risk-rules', { method: 'POST', body: rule, }); }, async updateRiskRule(id, data) { - return apiClient(`/api/v1/security/risk-rules/${id}`, { + return apiClient(`/api/v1/agent/risk-rules/${id}`, { method: 'PUT', body: data, }); }, async removeRiskRule(id) { - await apiClient(`/api/v1/security/risk-rules/${id}`, { + await apiClient(`/api/v1/agent/risk-rules/${id}`, { method: 'DELETE', }); }, async listCredentials(params) { const query = params ? '?' + new URLSearchParams(params).toString() : ''; - return apiClient(`/api/v1/security/credentials${query}`); + return apiClient(`/api/v1/inventory/credentials${query}`); }, async getCredentialById(id) { - return apiClient(`/api/v1/security/credentials/${id}`); + return apiClient(`/api/v1/inventory/credentials/${id}`); }, async createCredential(credential) { - return apiClient('/api/v1/security/credentials', { + return apiClient('/api/v1/inventory/credentials', { method: 'POST', body: credential, }); }, async updateCredential(id, data) { - return apiClient(`/api/v1/security/credentials/${id}`, { + return apiClient(`/api/v1/inventory/credentials/${id}`, { method: 'PUT', body: data, }); }, async removeCredential(id) { - await apiClient(`/api/v1/security/credentials/${id}`, { + await apiClient(`/api/v1/inventory/credentials/${id}`, { method: 'DELETE', }); }, async listRoles() { - return apiClient('/api/v1/security/roles'); + return apiClient('/api/v1/auth/roles'); }, async getPermissionMatrix() { - return apiClient<{ roles: Role[]; allPermissions: string[] }>('/api/v1/security/permissions/matrix'); + return apiClient<{ roles: Role[]; allPermissions: string[] }>('/api/v1/auth/permissions/matrix'); }, async updateRolePermissions(roleId, permissions) { - await apiClient(`/api/v1/security/permissions/roles/${roleId}`, { + await apiClient(`/api/v1/auth/roles/${roleId}/permissions`, { method: 'PUT', body: { permissions }, }); diff --git a/it0-web-admin/src/infrastructure/repositories/api-server.repository.ts b/it0-web-admin/src/infrastructure/repositories/api-server.repository.ts index a587940..d242a14 100644 --- a/it0-web-admin/src/infrastructure/repositories/api-server.repository.ts +++ b/it0-web-admin/src/infrastructure/repositories/api-server.repository.ts @@ -5,29 +5,29 @@ import type { Server } from '@/domain/entities/server'; export const apiServerRepository: ServerRepository = { async list(params) { const query = params ? '?' + new URLSearchParams(params).toString() : ''; - return apiClient(`/api/v1/servers${query}`); + return apiClient(`/api/v1/inventory/servers${query}`); }, async getById(id) { - return apiClient(`/api/v1/servers/${id}`); + return apiClient(`/api/v1/inventory/servers/${id}`); }, async create(server) { - return apiClient('/api/v1/servers', { + return apiClient('/api/v1/inventory/servers', { method: 'POST', body: server, }); }, async update(id, data) { - return apiClient(`/api/v1/servers/${id}`, { + return apiClient(`/api/v1/inventory/servers/${id}`, { method: 'PUT', body: data, }); }, async remove(id) { - await apiClient(`/api/v1/servers/${id}`, { + await apiClient(`/api/v1/inventory/servers/${id}`, { method: 'DELETE', }); }, diff --git a/it0-web-admin/src/infrastructure/repositories/api-tenant.repository.ts b/it0-web-admin/src/infrastructure/repositories/api-tenant.repository.ts index 43ae83c..2384c6d 100644 --- a/it0-web-admin/src/infrastructure/repositories/api-tenant.repository.ts +++ b/it0-web-admin/src/infrastructure/repositories/api-tenant.repository.ts @@ -12,29 +12,29 @@ export interface TenantRepository { export const apiTenantRepository: TenantRepository = { async list(params) { const query = params ? '?' + new URLSearchParams(params).toString() : ''; - return apiClient(`/api/v1/tenants${query}`); + return apiClient(`/api/v1/admin/tenants${query}`); }, async getById(id) { - return apiClient(`/api/v1/tenants/${id}`); + return apiClient(`/api/v1/admin/tenants/${id}`); }, async create(tenant) { - return apiClient('/api/v1/tenants', { + return apiClient('/api/v1/admin/tenants', { method: 'POST', body: tenant, }); }, async update(id, data) { - return apiClient(`/api/v1/tenants/${id}`, { + return apiClient(`/api/v1/admin/tenants/${id}`, { method: 'PUT', body: data, }); }, async remove(id) { - await apiClient(`/api/v1/tenants/${id}`, { + await apiClient(`/api/v1/admin/tenants/${id}`, { method: 'DELETE', }); }, diff --git a/it0-web-admin/src/stores/redux/slices/risk-rules.slice.ts b/it0-web-admin/src/stores/redux/slices/risk-rules.slice.ts index 203cab9..bd98d75 100644 --- a/it0-web-admin/src/stores/redux/slices/risk-rules.slice.ts +++ b/it0-web-admin/src/stores/redux/slices/risk-rules.slice.ts @@ -20,14 +20,14 @@ export const fetchRiskRules = createAsyncThunk( 'riskRules/fetchAll', async (params?: Record) => { const query = params ? '?' + new URLSearchParams(params).toString() : ''; - return apiClient(`/api/v1/security/risk-rules${query}`); + return apiClient(`/api/v1/agent/risk-rules${query}`); }, ); export const addRiskRule = createAsyncThunk( 'riskRules/add', async (rule: Omit) => { - return apiClient('/api/v1/security/risk-rules', { + return apiClient('/api/v1/agent/risk-rules', { method: 'POST', body: rule, }); @@ -37,7 +37,7 @@ export const addRiskRule = createAsyncThunk( export const editRiskRule = createAsyncThunk( 'riskRules/edit', async ({ id, data }: { id: string; data: Partial }) => { - return apiClient(`/api/v1/security/risk-rules/${id}`, { + return apiClient(`/api/v1/agent/risk-rules/${id}`, { method: 'PUT', body: data, }); @@ -47,7 +47,7 @@ export const editRiskRule = createAsyncThunk( export const removeRiskRule = createAsyncThunk( 'riskRules/remove', async (id: string) => { - await apiClient(`/api/v1/security/risk-rules/${id}`, { + await apiClient(`/api/v1/agent/risk-rules/${id}`, { method: 'DELETE', }); return id;