merge: integrate WP6-01 dependency for TASK-WP6-04

# Conflicts:
#	apps/web/src/admin-models.tsx
#	apps/web/src/admin-users.tsx
#	apps/web/src/main.tsx
#	package.json
#	scripts/lib/openapi.mjs
This commit is contained in:
suyx
2026-08-04 11:00:24 +08:00
16 changed files with 1759 additions and 18 deletions
+33
View File
@@ -10,6 +10,7 @@ import {
AccountProfileUpdateResponseSchema,
AccountSettingsResponseSchema,
AdminAuthenticatedUserSchema,
AdminOverviewResponseSchema,
AdminCreditParamsSchema,
AdminLoginCompleteRequestSchema,
AdminLoginCompleteResponseSchema,
@@ -110,6 +111,7 @@ import {
type BootstrapResponse,
type AdminLoginCompleteRequest,
type AdminLoginSendRequest,
type AdminOverviewResponse,
type AccountDeletionCompleteRequest,
type AccountProfileUpdateRequest,
type AdminCreditParams,
@@ -196,6 +198,7 @@ const defaultBootstrap: BootstrapResponse = {
};
export interface CreateAppOptions {
adminOverview?: () => AdminOverviewResponse | Promise<AdminOverviewResponse>;
amap?: AmapAdapter;
assetReleases?: AssetReleaseReader;
bootstrap?: () => BootstrapResponse | Promise<BootstrapResponse>;
@@ -713,6 +716,7 @@ export async function createApp(options: CreateAppOptions = {}) {
AdminLoginCompleteRequestSchema,
AdminLoginCompleteResponseSchema,
AdminSessionResponseSchema,
AdminOverviewResponseSchema,
CreditSummarySchema,
CreditEntryTypeSchema,
CreditEntryStatusSchema,
@@ -1453,6 +1457,35 @@ export async function createApp(options: CreateAppOptions = {}) {
},
);
app.get(
"/api/v1/admin/overview",
{
schema: {
operationId: "getAdminOverview",
response: {
200: Type.Ref(AdminOverviewResponseSchema),
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.adminOverview) return reply.code(503).send(null);
try {
return await options.adminOverview();
} catch {
return reply.code(503).send(null);
}
},
);
app.post(
"/api/v1/auth/login/send",
{