1
0
forked from baron/baron-sso

refactor: 보조 이메일 키값을 sub_email로 통일 및 수동 폼 추가 (#917)

- `secondary_emails` 대신 `sub_email`을 키값으로 사용하도록 전면 수정
- 관리자 화면의 수동 사용자 생성(Create) 및 수정(Detail) 폼에 `sub_email` 입력 필드 추가
- CSV 템플릿의 컬럼명을 `sub_email`로 변경
- 백엔드의 Kratos Traits 조회 및 배열 추출 로직을 `sub_email` 기준으로 업데이트
- E2E 테스트(`users_bulk.spec.ts`, `users_bulk_secondary.spec.ts`)에서 `sub_email` 검증하도록 수정 및 통과 확인
This commit is contained in:
2026-05-29 11:07:59 +09:00
parent 00310448e9
commit 62b1938c42
8 changed files with 112 additions and 66 deletions

View File

@@ -58,7 +58,11 @@ import {
import type { UserSchemaField } from "./userSchemaFields";
import { resolvePersonalTenant } from "./utils/personalTenant";
type UserFormValues = UserCreateRequest & { metadata: Record<string, unknown> };
type UserFormValues = UserCreateRequest & {
metadata: Record<string, unknown> & {
sub_email?: string;
};
};
type UserCategory = "hanmac" | "external" | "personal";
type PickerTarget = { kind: "appointment"; index: number };
@@ -161,7 +165,9 @@ function UserCreatePage() {
position: "",
jobTitle: "",
role: "user",
metadata: {},
metadata: {
sub_email: "",
},
},
});
@@ -367,10 +373,22 @@ function UserCreatePage() {
const {
hanmacFamily: _hanmacFamily,
userType: _userType,
sub_email: rawSubEmail,
...formMetadata
} = data.metadata ?? {};
// Parse sub_email
let sub_email: string[] = [];
if (typeof rawSubEmail === "string" && rawSubEmail.trim() !== "") {
sub_email = rawSubEmail
.split(/[;,\n\r\t]/)
.map((e) => e.trim())
.filter((e) => e.includes("@"));
}
const metadata: Record<string, unknown> = {
...formMetadata,
...(sub_email.length > 0 ? { sub_email } : { sub_email: [] }),
};
const payload: UserCreateRequest = {
@@ -580,6 +598,26 @@ function UserCreatePage() {
)}
</div>
<div className="space-y-2">
<Label
htmlFor="sub_email"
className="flex items-center gap-2"
>
{t("ui.admin.users.create.form.sub_email", "보조 이메일")}
<span className="text-[10px] text-muted-foreground font-normal">
( )
</span>
</Label>
<Input
id="sub_email"
placeholder={t(
"ui.admin.users.create.form.sub_email_placeholder",
"sub1@example.com, sub2@test.com",
)}
{...register("metadata.sub_email")}
/>
</div>
<div className="space-y-2">
<div className="flex items-center justify-between">
<Label htmlFor="password">