app.rinda.ai/knowledge-base?tab=email-templates 화면에 적용된 기능의 코드 기반 분석
진입·목록 조회 → 빌더/AI 스텝 생성 → 일괄 저장 → 그룹 삭제까지의 4개 핵심 흐름.
KnowledgeBasePage lazy load → useWorkspaceEmailTemplatesGrouped →
GET /api/v1/email-templates/workspace/:id/grouped → assertWorkspaceMatch(cross-workspace 차단) →
국가/소스별 그룹화 후 카드 렌더. 템플릿이 없으면 빈 상태 + "새 템플릿 만들기".
PresetGallery(4/6/8 스텝) + PresetPreviewDrawer →
각 스텝 BuilderStepEditor에서 "AI 생성" → POST /generate-step →
AI가 { subject, bodyHtml, bodyText } 반환 → 필드 자동 채움.
useCreateBulkEmailTemplates → POST /bulk-create →
서버가 stepOrder=i+1, totalSteps=len, createdBy 부여 →
다중 행 INSERT → 캐시 invalidate → 목록 자동 refetch + 성공 토스트.
useDeleteEmailTemplateGroup → DELETE /api/v1/email-templates/bulk →
DELETE WHERE id IN (...) → 캐시 invalidate → refetch + 삭제 토스트.
전부 inline macro workspaceAuth: true (default-deny IAM · ADR-0001).
| Method | Path | 역할 |
|---|---|---|
| POST | /generate | 시장별 AI 템플릿 일괄 생성 (productId·targetCountry·language·stepCount) |
| POST | /generate-step | 단일 스텝 AI 콘텐츠 생성 |
| POST | /bulk-create | 수동 다중 스텝 템플릿 일괄 생성 |
| GET | /workspace/:id/grouped | 국가/소스별 그룹화 조회 |
| GET | /search | 필터 검색 (헤더 workspace만 신뢰 · cross-workspace enum 방지) |
| POST / PUT / DELETE | / · /:id | 단건 생성·수정·삭제 |
| DELETE | /bulk | 그룹(다중 id) 일괄 삭제 |
| PUT | /admin/.../bulk/category·shared | 어드민 카테고리·공유 상태 일괄 변경 |
| 파일 | 역할 |
|---|---|
pages/knowledge-base/index.tsx | knowledge-base 페이지 · 탭 라우팅 · prefetch |
pages/settings/email-templates/EmailTemplateSettings.tsx | 탭 컨테이너 · 목록/생성/편집 모드 관리 |
.../EmailTemplateList.tsx | 그룹 카드 목록 · 빈 상태 · 편집/삭제 액션 |
.../EmailTemplateBuilder.tsx | 생성/편집 폼 · AI 스텝 생성 |
.../BuilderStepList · BuilderStepEditor.tsx | 스텝 목록/편집 (stepType·subject·body) |
.../PresetGallery · PresetPreviewDrawer.tsx | 4/6/8 스텝 전략 프리셋 |
lib/api/hooks/email-templates.ts | TanStack Query 후크 · 캐시 키 |
lib/api/services/email-templates.ts | API 클라이언트 |
lib/api/types/email-template.ts | 타입 정의 |
| 파일 | 역할 |
|---|---|
routes/email-templates.routes.ts | CRUD + AI 생성 라우트 (workspaceAuth) |
services/email-template.service.ts | 비즈니스 로직 (그룹화·필터·bulk) |
services/email-template-generation.service.ts | AI 다중 스텝 생성 |
db/schema/email-templates.ts | Drizzle 스키마 |
email_templatesPostgresUUIDv7 PK · workspace cascade delete · 다중 스텝을 행 단위로 저장.
| 컬럼 | 타입 | 설명 |
|---|---|---|
id | uuid | PK (uuidv7) |
workspaceId | uuid | 워크스페이스 (cascade) |
name / subject | varchar | 템플릿명 / 제목 |
bodyText / bodyHtml | text | 평문 / HTML 본문 |
source | varchar(20) | ai_generated · manual |
targetCountry / language | varchar | 대상 국가 / 언어 |
stepType | varchar(50) | 스텝 전략 (initial_contact 등) |
stepOrder / totalSteps | integer | 스텝 순서 / 총 스텝 수 (4·6·8) |
category / isShared | varchar / bool | 카테고리 / 공유 여부 |
variables | jsonb | 플레이스홀더 |
인덱스: workspaceId, createdBy, category, name, (workspaceId, targetCountry), (workspaceId, source)
name으로 그룹화된다.
생성은 프리셋(4/6/8 스텝) → 스텝별 AI 생성 → bulk-create 일괄 저장 흐름이고,
조회·삭제는 모두 그룹 단위로 동작한다. 모든 라우트가 workspaceAuth default-deny로
cross-workspace 접근을 차단한다. SSOT는 email_templates 테이블 한 곳.