feat(households): hane seçici, ayarlar, admin hane yönetimi ve hane-yok sayfası
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,7 +7,9 @@ import { tr } from "@/i18n/tr";
|
||||
import { fail, ok, type ActionResult } from "@/lib/action-result";
|
||||
import { getAuth } from "@/lib/auth";
|
||||
import { authErrorCode } from "@/lib/auth-errors";
|
||||
import { writeAudit } from "@/lib/audit";
|
||||
import { getActionUser } from "@/lib/dal";
|
||||
import { removeAllMembershipsOfUser } from "@/features/households/service";
|
||||
import { storedEmail } from "@/shared/account-email";
|
||||
import { systemRoleSchema, type SystemRole } from "@/shared/schemas/common";
|
||||
import {
|
||||
@@ -102,8 +104,9 @@ export async function createUserAction(input: unknown): Promise<ActionResult> {
|
||||
const parsed = userCreateSchema.safeParse(input);
|
||||
if (!parsed.success) return fail(t.errors.checkFields);
|
||||
const v = parsed.data;
|
||||
let createdId = "";
|
||||
try {
|
||||
await ctx.api.createUser({
|
||||
const created = await ctx.api.createUser({
|
||||
headers: ctx.headers,
|
||||
body: {
|
||||
name: v.name,
|
||||
@@ -113,9 +116,17 @@ export async function createUserAction(input: unknown): Promise<ActionResult> {
|
||||
data: { username: v.username },
|
||||
},
|
||||
});
|
||||
createdId = created.user.id;
|
||||
} catch (error) {
|
||||
return mapAuthError(error);
|
||||
}
|
||||
await writeAudit({
|
||||
action: "user.create",
|
||||
actorId: ctx.actor.id,
|
||||
targetType: "user",
|
||||
targetId: createdId,
|
||||
diff: { username: v.username, role: v.role },
|
||||
});
|
||||
revalidatePath(PATH);
|
||||
return ok(undefined);
|
||||
}
|
||||
@@ -148,6 +159,13 @@ export async function updateUserAction(userId: unknown, input: unknown): Promise
|
||||
} catch (error) {
|
||||
return mapAuthError(error);
|
||||
}
|
||||
await writeAudit({
|
||||
action: "user.update",
|
||||
actorId: ctx.actor.id,
|
||||
targetType: "user",
|
||||
targetId: target.id,
|
||||
diff: { name: v.name, username: v.username, role: v.role },
|
||||
});
|
||||
revalidatePath(PATH);
|
||||
return ok(undefined);
|
||||
}
|
||||
@@ -167,6 +185,13 @@ export async function setRoleAction(userId: unknown, role: unknown): Promise<Act
|
||||
} catch (error) {
|
||||
return mapAuthError(error);
|
||||
}
|
||||
await writeAudit({
|
||||
action: "user.role",
|
||||
actorId: ctx.actor.id,
|
||||
targetType: "user",
|
||||
targetId: target.id,
|
||||
diff: { role: { from: target.role, to: r.data } },
|
||||
});
|
||||
revalidatePath(PATH);
|
||||
return ok(undefined);
|
||||
}
|
||||
@@ -191,6 +216,12 @@ export async function setPasswordAction(userId: unknown, input: unknown): Promis
|
||||
} catch (error) {
|
||||
return mapAuthError(error);
|
||||
}
|
||||
await writeAudit({
|
||||
action: "user.password.reset",
|
||||
actorId: ctx.actor.id,
|
||||
targetType: "user",
|
||||
targetId: target.id,
|
||||
});
|
||||
return ok(undefined);
|
||||
}
|
||||
|
||||
@@ -213,6 +244,13 @@ export async function banUserAction(userId: unknown, input: unknown): Promise<Ac
|
||||
} catch (error) {
|
||||
return mapAuthError(error);
|
||||
}
|
||||
await writeAudit({
|
||||
action: "user.ban",
|
||||
actorId: ctx.actor.id,
|
||||
targetType: "user",
|
||||
targetId: target.id,
|
||||
diff: { reason: parsed.data.reason ?? null },
|
||||
});
|
||||
revalidatePath(PATH);
|
||||
return ok(undefined);
|
||||
}
|
||||
@@ -227,6 +265,12 @@ export async function unbanUserAction(userId: unknown): Promise<ActionResult> {
|
||||
} catch (error) {
|
||||
return mapAuthError(error);
|
||||
}
|
||||
await writeAudit({
|
||||
action: "user.unban",
|
||||
actorId: ctx.actor.id,
|
||||
targetType: "user",
|
||||
targetId: id.data,
|
||||
});
|
||||
revalidatePath(PATH);
|
||||
return ok(undefined);
|
||||
}
|
||||
@@ -245,6 +289,14 @@ export async function removeUserAction(userId: unknown): Promise<ActionResult> {
|
||||
} catch (error) {
|
||||
return mapAuthError(error);
|
||||
}
|
||||
const removedMemberships = await removeAllMembershipsOfUser(target.id);
|
||||
await writeAudit({
|
||||
action: "user.remove",
|
||||
actorId: ctx.actor.id,
|
||||
targetType: "user",
|
||||
targetId: target.id,
|
||||
diff: { name: target.name, removedMemberships },
|
||||
});
|
||||
revalidatePath(PATH);
|
||||
return ok(undefined);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user