fix(portal): 토큰 DEFAULT·UNIQUE 인덱스 보장 + 메일 제목 이스케이프 제거

- contact_requests.public_token: 인라인 UNIQUE 제거, 백필 UPDATE 직후 SET DEFAULT + CREATE UNIQUE INDEX IF NOT EXISTS 패턴으로 교체 (라이브 DB 멱등성 보장)
- quotes.public_token: ADD COLUMN IF NOT EXISTS + SET DEFAULT + 백필 UPDATE + CREATE UNIQUE INDEX IF NOT EXISTS 4줄 구조로 교체 (인라인 UNIQUE NO-OP 문제 해소)
- sendQuoteSentEmail / sendQuoteDecisionEmail subject에서 escapeHtml() 제거 — 메일 제목은 평문, HTML 본문 이스케이프는 유지

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 01:29:36 +09:00
parent f7d26c4c3f
commit 146836f56b
2 changed files with 8 additions and 6 deletions

View File

@@ -37,7 +37,7 @@ export async function sendQuoteSentEmail(opts: {
await resend().emails.send({
from: FROM,
to: [clientEmail],
subject: `[쟁승메이드] 견적서가 도착했습니다 — ${escapeHtml(quoteTitle)}`,
subject: `[쟁승메이드] 견적서가 도착했습니다 — ${quoteTitle}`,
html: `
<h2>견적서를 보내드립니다</h2>
<p>${escapeHtml(clientName)}님, 요청하신 건의 견적서가 준비되었습니다.</p>
@@ -57,7 +57,7 @@ export async function sendQuoteDecisionEmail(opts: {
await resend().emails.send({
from: FROM,
to: [ADMIN_EMAIL],
subject: `[쟁승메이드] 견적 ${label}${escapeHtml(quoteTitle)}`,
subject: `[쟁승메이드] 견적 ${label}${quoteTitle}`,
html: `
<h2>고객이 견적을 ${label}했습니다</h2>
<p>견적: ${escapeHtml(quoteTitle)} / 고객: ${escapeHtml(clientName)}</p>