You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.4 KiB
88 lines
2.4 KiB
import { parseAdminAuth } from "@/lib/api/admin-auth-context";
|
|
import { fail, ok } from "@/lib/response";
|
|
import { writeAudit } from "@/modules/audit/service";
|
|
import { AuthError } from "@/modules/auth/errors";
|
|
import {
|
|
updateHostCustomer,
|
|
} from "@/modules/customer/customer-service";
|
|
import type { HostCustomerStatus } from "@/modules/customer/types";
|
|
|
|
type RouteContext = {
|
|
params: Promise<{ customer_id: string }>;
|
|
};
|
|
|
|
export async function PATCH(request: Request, context: RouteContext) {
|
|
let auth;
|
|
try {
|
|
auth = parseAdminAuth(request);
|
|
} catch (error) {
|
|
if (error instanceof AuthError) {
|
|
return fail(error.code, error.message, error.httpStatus);
|
|
}
|
|
throw error;
|
|
}
|
|
|
|
const { customer_id: customerId } = await context.params;
|
|
|
|
let body: unknown;
|
|
try {
|
|
body = await request.json();
|
|
} catch {
|
|
return fail("VALIDATION_FAILED", "请求体格式无效", 400);
|
|
}
|
|
|
|
const payload = body as {
|
|
name?: unknown;
|
|
status?: unknown;
|
|
remark?: unknown;
|
|
embed_password?: unknown;
|
|
};
|
|
|
|
const input: {
|
|
name?: string;
|
|
status?: HostCustomerStatus;
|
|
remark?: string | null;
|
|
embed_password?: string;
|
|
} = {};
|
|
|
|
if (payload.name !== undefined) {
|
|
if (typeof payload.name !== "string") {
|
|
return fail("VALIDATION_FAILED", "客户名称无效", 400);
|
|
}
|
|
input.name = payload.name;
|
|
}
|
|
|
|
if (payload.status !== undefined) {
|
|
if (payload.status !== "active" && payload.status !== "disabled") {
|
|
return fail("VALIDATION_FAILED", "状态无效", 400);
|
|
}
|
|
input.status = payload.status;
|
|
}
|
|
|
|
if (payload.remark !== undefined) {
|
|
input.remark =
|
|
typeof payload.remark === "string" ? payload.remark : null;
|
|
}
|
|
|
|
if (payload.embed_password !== undefined) {
|
|
if (typeof payload.embed_password !== "string") {
|
|
return fail("VALIDATION_FAILED", "演示密码无效", 400);
|
|
}
|
|
input.embed_password = payload.embed_password;
|
|
}
|
|
|
|
try {
|
|
const updated = await updateHostCustomer(customerId, input);
|
|
const auditDetail: Record<string, unknown> = { ...input };
|
|
if (auditDetail.embed_password !== undefined) {
|
|
delete auditDetail.embed_password;
|
|
auditDetail.embed_password_updated = true;
|
|
}
|
|
await writeAudit("customer:update", auth.userId, customerId, auditDetail);
|
|
return ok(updated);
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : "更新客户失败";
|
|
return fail("VALIDATION_FAILED", message, 400);
|
|
}
|
|
}
|