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:
2026-11-05 02:35:01 +03:00
parent de91f2505a
commit 3644e081b1
21 changed files with 1427 additions and 29 deletions
+53 -1
View File
@@ -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);
}