feat(member): 档案修改与空壳删除
可改 name/remark;key_count=0 时硬删,名下有 key 仅可停用。PATCH 扩档案字段并落审计。
This commit is contained in:
@@ -36,6 +36,10 @@ export const ERR = {
|
||||
errorBody("key_already_registered", "这枚 key 已经登记过", { key_id }),
|
||||
member_name_taken: () =>
|
||||
errorBody("member_name_taken", "成员名称已被占用"),
|
||||
member_has_keys: (key_count: number) =>
|
||||
errorBody("member_has_keys", `名下仍有 ${key_count} 枚 key,只能停用`, {
|
||||
fields: { key_count: String(key_count) },
|
||||
}),
|
||||
upstream_unreachable: () =>
|
||||
errorBody("upstream_unreachable", "上游站点暂时不可达,请稍后重试"),
|
||||
not_found: () => errorBody("not_found", "请求的资源不存在"),
|
||||
|
||||
@@ -115,7 +115,9 @@ export const createMemberBody = z.object({
|
||||
});
|
||||
|
||||
export const patchMemberBody = z.object({
|
||||
status: z.enum(["active", "disabled"]),
|
||||
name: z.string().min(1).max(64).optional(),
|
||||
remark: z.string().optional(),
|
||||
status: z.enum(["active", "disabled"]).optional(),
|
||||
});
|
||||
|
||||
export const memberWithToken = z.object({
|
||||
|
||||
@@ -138,10 +138,12 @@ export type AuditAction =
|
||||
| "payment.update"
|
||||
| "payment.delete"
|
||||
| "member.create"
|
||||
| "member.update"
|
||||
| "member.enable"
|
||||
| "member.disable"
|
||||
| "member.token_issue"
|
||||
| "member.token_reissue"
|
||||
| "member.delete"
|
||||
| "account.password_change"
|
||||
| "account.init";
|
||||
|
||||
|
||||
@@ -294,6 +294,23 @@ export function createRepos(db: Db) {
|
||||
.returning();
|
||||
return row!;
|
||||
},
|
||||
async updateProfile(
|
||||
id: number,
|
||||
values: { name?: string; remark?: string },
|
||||
): Promise<MemberRow> {
|
||||
const patch: { name?: string; remark?: string } = {};
|
||||
if (values.name !== undefined) patch.name = values.name;
|
||||
if (values.remark !== undefined) patch.remark = values.remark;
|
||||
const [row] = await db
|
||||
.update(members)
|
||||
.set(patch)
|
||||
.where(eq(members.id, id))
|
||||
.returning();
|
||||
return row!;
|
||||
},
|
||||
async deleteById(id: number): Promise<void> {
|
||||
await db.delete(members).where(eq(members.id, id));
|
||||
},
|
||||
async reissueToken(
|
||||
id: number,
|
||||
token_hash: string,
|
||||
|
||||
Reference in New Issue
Block a user