68f85f3736
- 첫 로그인 비번 강제 변경 (RUN_082): FORCE_PASSWORD_CHANGE 컬럼, ForcePasswordChangeGuardFilter, /auth/change-password API + 페이지 - 테넌트 일관성 가드: TenantConsistencyGuardFilter 로 JWT.company_code ↔ 서브도메인 company_code 대조, CompanyResolver 가 (db_name, company_code) 동시 반환 - 회사 관리 확장 (RUN_083 audit log, RUN_084 lifecycle 컬럼): CompanyAdmin/Members/Templates/Lifecycle/AuditLog 서비스 + CompanyMgmtController + SuperAdminGuard - 회사 관리 UI: CompanyAccordionRow 탭화 + 모달 4종 (AdminInfo/Deactivate/Delete/RecopyTemplates) + AuditLogDrawer + csvExport - 프로비저닝 마법사: force_password_change 토글 반영 - 프론트 인증: storage 이벤트 멀티탭 동기화, 403 errorCode (PASSWORD_CHANGE_REQUIRED / CROSS_TENANT_REJECTED / TENANT_NOT_RESOLVED) 전역 리다이렉트 - 기타: StartupSchemaMigrator, OS별 도커 기동 스크립트, CLAUDE.md 트래킹 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.3 KiB
2.3 KiB
084 마이그레이션 — COMPANY_MNG 라이프사이클 컬럼 추가
작성일: 2026-04-24 작성자: gbpark 관련: 회사 관리 화면 비활성화/템플릿 트래킹 기능
목적
회사 관리 화면의 "비활성화 + 템플릿 탭 + 라이프사이클 이벤트" 지원을 위해
COMPANY_MNG 에 메타 필드 3 개 추가.
추가 컬럼
| 컬럼 | 타입 | 기본값 | 용도 |
|---|---|---|---|
INSTALLED_GROUPS |
JSONB |
'[]'::jsonb |
프로비저닝 시 설치된 TableGroup id 배열 (예: ["SCREEN","CONTROL","BATCH","DASHBOARD"]). 템플릿 탭 렌더에 사용 |
DEACTIVATED_AT |
TIMESTAMP |
NULL |
DB_STATUS='suspended' 가 된 시각. 재활성화 시 NULL 로 리셋 |
DEACTIVATION_REASON |
VARCHAR(200) |
NULL |
SUPER_ADMIN 이 입력한 비활성화 사유 (감사 로그와 별개로 COMPANY_MNG 에도 즉시 조회용) |
SQL
-- 084: 회사 라이프사이클 메타 컬럼
ALTER TABLE COMPANY_MNG
ADD COLUMN IF NOT EXISTS INSTALLED_GROUPS JSONB DEFAULT '[]'::jsonb,
ADD COLUMN IF NOT EXISTS DEACTIVATED_AT TIMESTAMP,
ADD COLUMN IF NOT EXISTS DEACTIVATION_REASON VARCHAR(200);
실행 (메타 DB 만)
psql -h 183.99.177.40 -U postgres -d invyone <<'SQL'
ALTER TABLE COMPANY_MNG
ADD COLUMN IF NOT EXISTS INSTALLED_GROUPS JSONB DEFAULT '[]'::jsonb,
ADD COLUMN IF NOT EXISTS DEACTIVATED_AT TIMESTAMP,
ADD COLUMN IF NOT EXISTS DEACTIVATION_REASON VARCHAR(200);
SQL
기존 회사 row 백필 (선택)
기존에 이미 프로비저닝된 회사 row 는 INSTALLED_GROUPS 가 빈 배열로 남음.
프로비저닝 로직이 지금은 선택 그룹 정보를 버리므로 소급 복원 불가 → 빈 배열 유지.
템플릿 탭은 "정보 없음" 으로 표시.
정확한 값이 필요하면 TableGroup.values() 의 required=true 3개(SCREEN, CONTROL, BATCH) 는
모든 회사에 필수로 들어갔으므로 최소 백필 가능:
UPDATE COMPANY_MNG
SET INSTALLED_GROUPS = '["SCREEN","CONTROL","BATCH"]'::jsonb
WHERE INSTALLED_GROUPS = '[]'::jsonb
AND DB_STATUS = 'active';
롤백
ALTER TABLE COMPANY_MNG
DROP COLUMN IF EXISTS INSTALLED_GROUPS,
DROP COLUMN IF EXISTS DEACTIVATED_AT,
DROP COLUMN IF EXISTS DEACTIVATION_REASON;