データベース(メール)
メールテンプレートと送信ログの 2 テーブル。
email_templates
概要
候補者へ送るメールのテンプレート。project_id が NULL のものはシステム共通テンプレートとして全プロジェクトから参照できる。
テーブル定義
| 論理名 | 物理名 | カラム名 | データ型 | 主キー | リレーション | ユニーク | NULL許可 | デフォルト値 | 備考 |
|---|---|---|---|---|---|---|---|---|---|
| メールテンプレート | email_templates |
id |
integer | ◯ | auto-increment | ||||
project_id |
integer | projects:id (cascade) | ◯ | NULL ならシステム共通 | |||||
type |
template_type | invitation / reminder / confirmation / cancellation |
|||||||
name |
varchar(255) | テンプレート名 | |||||||
subject |
varchar(500) | 件名(プレースホルダ可) | |||||||
body |
text | 本文(プレースホルダ可) | |||||||
created_at |
timestamp | now() |
|||||||
updated_at |
timestamp | now() |
リレーション
project_id→projects.id(onDelete: cascade)。NULL 許容- 子テーブル:
email_logs.template_id(外部キー制約なし)
インデックス
- 主キー (
id) - INDEX:
idx_et_project_type(project_id,type)
注記
subject/bodyには{{candidate_name}}{{project_name}}のようなプレースホルダを埋め込める- システム共通テンプレートは
GET /api/v1/email-templates、プロジェクト個別はGET /api/v1/projects/{projectId}/email-templatesで取得する - テンプレートの種別(
type)は 4 値。同一プロジェクト内で同じ種別を複数持てる(一意制約なし)
email_logs
概要
送信済みメールの記録。テンプレートが後から変更・削除されても当時の内容が追えるよう、件名と本文を実体としてコピー保存する。
テーブル定義
| 論理名 | 物理名 | カラム名 | データ型 | 主キー | リレーション | ユニーク | NULL許可 | デフォルト値 | 備考 |
|---|---|---|---|---|---|---|---|---|---|
| メール送信ログ | email_logs |
id |
integer | ◯ | auto-increment | ||||
project_candidate_id |
integer | project_candidates:id (cascade) | 宛先の候補者 | ||||||
template_id |
integer | email_templates:id(論理) | ◯ | 使用テンプレート | |||||
subject |
varchar(500) | 差し込み後の件名 | |||||||
body |
text | 差し込み後の本文 | |||||||
sent_at |
timestamp | now() |
送信日時 | ||||||
status |
email_status | 'sent' |
sent / delivered / bounced / failed |
||||||
sent_by |
integer | users:id(論理) | 送信操作を行ったユーザー |
リレーション
project_candidate_id→project_candidates.id(onDelete: cascade)template_id→email_templates.id:Drizzle のrelations()上でのみ定義されており、DB レベルの外部キー制約は張られていないsent_by→users.id:同上
インデックス
- 主キー (
id) - INDEX:
idx_el_project_candidate(project_candidate_id) - INDEX:
idx_el_sent_at(sent_at)
注記
subject/bodyはプレースホルダ差し込み後の内容。テンプレートを後から変えても過去の送信内容は変わらないtemplate_idに外部キー制約がないため、テンプレート削除後もログは残る(値は残るが参照先が存在しなくなる)statusの既定はsent。delivered/bouncedへの更新は現状 API では行っていないPROTOTYPE_MODE=trueの間は実際の送信が行われないが、ログの記録有無はservices/email.tsの実装に従う- 候補者ごとの送信履歴は
GET /projects/{id}/candidates/{cid}/email-logs、プロジェクト全体はGET /projects/{id}/emails/logsで取得する