コンテンツにスキップ

データベース(メール)

メールテンプレートと送信ログの 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 で取得する