다크모드
FE 메인테이너 — Organization Owner SignUp
라우트와 화면
- 화면:
src/components/auth/sign-up/SignUpPag.vue - 검증:
src/composables/signUpValidation.js - SignUp request adapter:
src/composables/organizationSignUpRepo.js - Organization 문맥:
src/composables/useAccountContext.js
흐름
validateOrganizationSignUp()이 전체 필드를 검증하고 휴대전화·사업자등록번호를 숫자로 정규화한다.startOrganizationOwnerSignUp()이 adapter 경계에서 vendorsupabase.auth.signUp()을 호출해 이메일 확인 journey를 시작한다. 이 단계는 도메인 account가 생성됐다고 간주하지 않는다.- canonical metadata
create_account_kind=organization_owner는 이메일 확인 완료 후private.create_organization_owner_account()가 Organization·owner membership·Workspace 0을 원자적으로 생성한다. 이 atomic DB command만CreateAccount다. 확인 전에는 public row나 사업자등록번호 선점이 없다. signUp()이 즉시 Auth session을 반환하더라도 IAM SignIn session envelope가 아니므로 업무 API에 사용하지 않는다. 계정 생성 처리가 끝나면 해당 임시 session을 종료하고/auth/sign-in/organization?method=email&sign-up=confirmed에서 Owner 이메일로 다시 로그인한다.- 이메일 확인이 필요하면 확인 안내 화면을 유지하고, 확인 완료 뒤 같은 Owner 이메일 재로그인 흐름을 제공한다.
- 로그인 시 서버의 활성 subscription·entitlement를 다시 읽어
useModuleSubscription을 교체한다. - 활성 subscription이 없으면 임의의 redirect나 브라우저 데모 캐시보다
/onboarding/products를 우선한다.
SignUp public URL·query는 kebab-case sign-up, checkout DB/RPC flowMode 값은 snake_case sign_up을 사용한다.
패스워드는 Auth payload에만 존재하며 public metadata/table에는 저장하지 않는다.
정보 설계
- 항상 노출: 필드명, 필수 여부, 패스워드 조건, 오류, 약관 동의.
- 점진 공개: Organization과 Workspace의 차이는 SSOT
InfoHint패턴으로 제공한다. - 삭제한 입력: Organization Owner 계정에 필요하지 않은 생년월일·성별.
- 삭제한 표면: 계정 생성 폼 아래의 장문 안내 accordion 2개.
회귀 검증
src/composables/__tests__/signUpValidation.spec.jssrc/composables/__tests__/organizationSignUpRepo.spec.jssrc/composables/__tests__/organizationAccountRepo.spec.jssrc/components/auth/sign-up/SignUpPag.spec.jssrc/composables/__tests__/useAccountContext.spec.js
실배포에서는 빈 제출 차단, 이메일 확인 분기, 재로그인 후 Organization 이름 복원, 모바일 390px overflow를 확인한다. 신규 Organization 재로그인에서는 상품 선택 화면 진입과 entitlement 0건도 확인한다.