feat: add admin state and diagnostics (TASK-WP6-05)
Dada P0-A isolated Windows CI / validate-and-package (push) Successful in 12m4s

This commit is contained in:
suyx
2026-08-04 01:51:35 +08:00
parent 19212cc1b6
commit 5041dc03c3
15 changed files with 1374 additions and 8 deletions
+63
View File
@@ -10,7 +10,9 @@ import {
AccountProfileUpdateResponseSchema,
AccountSettingsResponseSchema,
AdminAuthenticatedUserSchema,
AdminDiagnosticsResponseSchema,
AdminOverviewResponseSchema,
AdminServicesStorageResponseSchema,
AdminCreditParamsSchema,
AdminLoginCompleteRequestSchema,
AdminLoginCompleteResponseSchema,
@@ -112,6 +114,8 @@ import {
type AdminLoginCompleteRequest,
type AdminLoginSendRequest,
type AdminOverviewResponse,
type AdminDiagnosticsResponse,
type AdminServicesStorageResponse,
type AccountDeletionCompleteRequest,
type AccountProfileUpdateRequest,
type AdminCreditParams,
@@ -180,6 +184,7 @@ import type { RecentAssetService } from "./recent-assets.js";
import type { AmapAdapter } from "./amap-adapter.js";
import { ModelConfigurationError } from "./model-configuration.js";
import type { ModelConfigurationService } from "./model-configuration.js";
import { assertSafeAdminDiagnostics, assertSafeAdminServicesStorage } from "./admin-state.js";
const defaultBootstrap: BootstrapResponse = {
app_version: "0.0.0",
@@ -194,7 +199,9 @@ const defaultBootstrap: BootstrapResponse = {
};
export interface CreateAppOptions {
adminDiagnostics?: () => AdminDiagnosticsResponse | Promise<AdminDiagnosticsResponse>;
adminOverview?: () => AdminOverviewResponse | Promise<AdminOverviewResponse>;
adminServicesStorage?: () => AdminServicesStorageResponse | Promise<AdminServicesStorageResponse>;
amap?: AmapAdapter;
assetReleases?: AssetReleaseReader;
bootstrap?: () => BootstrapResponse | Promise<BootstrapResponse>;
@@ -692,6 +699,8 @@ export async function createApp(options: CreateAppOptions = {}) {
AdminLoginCompleteResponseSchema,
AdminSessionResponseSchema,
AdminOverviewResponseSchema,
AdminServicesStorageResponseSchema,
AdminDiagnosticsResponseSchema,
CreditSummarySchema,
CreditEntryTypeSchema,
CreditEntryStatusSchema,
@@ -1236,6 +1245,60 @@ export async function createApp(options: CreateAppOptions = {}) {
},
);
app.get(
"/api/v1/admin/services-storage",
{
schema: {
operationId: "getAdminServicesStorage",
response: {
200: Type.Ref(AdminServicesStorageResponseSchema),
401: Type.Ref(ErrorEnvelopeSchema),
503: Type.Null(),
},
tags: ["Admin Operations"],
},
},
async (request, reply) => {
if (!options.registration) return reply.code(503).send(null);
const token = cookieValue(headerValue(request.headers.cookie), adminSessionCookieName);
const session = token ? options.registration.readAdminSession(token) : undefined;
if (!session) return reply.code(401).send(createErrorEnvelope({ code: "AUTH_SESSION_INVALID", correlationId: request.id }));
if (!options.adminServicesStorage) return reply.code(503).send(null);
try {
return assertSafeAdminServicesStorage(await options.adminServicesStorage());
} catch {
return reply.code(503).send(null);
}
},
);
app.get(
"/api/v1/admin/diagnostics",
{
schema: {
operationId: "getAdminDiagnostics",
response: {
200: Type.Ref(AdminDiagnosticsResponseSchema),
401: Type.Ref(ErrorEnvelopeSchema),
503: Type.Null(),
},
tags: ["Admin Operations"],
},
},
async (request, reply) => {
if (!options.registration) return reply.code(503).send(null);
const token = cookieValue(headerValue(request.headers.cookie), adminSessionCookieName);
const session = token ? options.registration.readAdminSession(token) : undefined;
if (!session) return reply.code(401).send(createErrorEnvelope({ code: "AUTH_SESSION_INVALID", correlationId: request.id }));
if (!options.adminDiagnostics) return reply.code(503).send(null);
try {
return assertSafeAdminDiagnostics(await options.adminDiagnostics());
} catch {
return reply.code(503).send(null);
}
},
);
app.post(
"/api/v1/auth/login/send",
{