e3e9635a5f
* feat: add customizable contact double opt-in flow * test: add double opt-in service coverage * fix: address review comments for double opt-in PR - Make pending status conditional on doubleOptInEnabled flag - Backfill legacy unsubscribeReason for reliable pending detection - Add doubleOptInContent to contact book listing select - Fix duplicate toast on DOI editor subject save failure - Harden searchParams parsing against string[] values - Make default DOI template use link mark for clickable URL - Make public API create+update atomic via transaction - Prevent contact upsert failure when DOI email send fails - Fix empty string template variable replacement Co-authored-by: opencode <opencode@anthropic.com> * fix: harden double opt-in confirmation safeguards Preserve explicit unsubscribe intent in DOI flows and prevent confirmation links from re-subscribing opted-out contacts. Also sanitize subscribe-page error messaging and use timing-safe hash comparison for link verification. * ui stuff * fix: require doubleOptInUrl in double opt-in templates * feat: add configurable from address for double opt-in emails * feat: add resend confirmation flow for pending contacts * fix: move subscribe confirmation to explicit POST flow * test: add contact book public API endpoint coverage * docs: add double opt-in documentation and update OpenAPI spec Add a user guide for the double opt-in feature covering setup, contact statuses, email customization, template variables, and best practices. Update the OpenAPI spec to include doubleOptIn fields in all contactBook request/response schemas. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: opencode <opencode@anthropic.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2.6 KiB
2.6 KiB
Repository Guidelines
Project Structure & Module Organization
- apps/web: Next.js app (primary product). Uses Prisma, TRPC, Tailwind.
- apps/marketing: Public marketing site (Next.js, static export).
- apps/docs: Mintlify docs content.
- apps/smtp-server: SMTP proxy/server (TypeScript → tsup build).
- packages/*: Shared libraries (email-editor, ui, eslint-config, tailwind-config, typescript-config, sdk).
- docker/: Dev/compose files; .env* at repo root define configuration.
Build, Test, and Development Commands
pnpm i: Install workspace deps (Node >= 20).pnpm dev: Turbo dev for all relevant apps (loads.env).pnpm start:web:local: Run onlyapps/weblocally on port 3000.pnpm build: Turbo build across the monorepo.pnpm dx/pnpm dx:up/pnpm dx:down: Spin up/down local infra via Docker Compose, then run migrations.- Database (apps/web filter):
pnpm db:generate|db:migrate-dev|db:push|db:studio. - Never run migrations unless users explicitly asked
Coding Style & Naming Conventions
- Files: React components PascalCase (e.g.,
AppSideBar.tsx); folders kebab/lowercase. - Paths (web): use alias
~/for src imports (e.g.,import { x } from "~/utils/x"). - NEVER USE DYNAMIC IMPORTS. ALWAYS IMPORT ON THE TOP
Rules
- Prefer to use trpc alway unless asked otherwise
Testing Guidelines
- Web testing is configured with Vitest in
apps/web; add tests when changes impact logic, APIs, or behavior. - Prefer targeted suites first:
pnpm test:web:unit,pnpm test:web:trpc,pnpm test:web:api; usepnpm test:webfor default non-integration coverage. - Test file conventions:
*.unit.test.ts,*.trpc.test.ts,*.api.test.ts,*.integration.test.ts. - Integration tests require infra and env (
RUN_INTEGRATION=truewith Postgres/Redis available). Root commandspnpm test:web:allandpnpm test:web:integration:fullauto-manage infra lifecycle. - Use
pnpm test:infra:up/pnpm test:infra:downwhen running targeted integration commands manually. pnpm test:web:integration:fullandtest:integration:preparerun Prisma migrations (prisma migrate deploy); never run these unless the user explicitly asks.- Test defaults are cloud mode (
NEXT_PUBLIC_IS_CLOUD=true); keep new tests compatible with cloud behavior unless the task says otherwise.
Commit & Pull Request Guidelines
- Prefer Conventional Commits (
feat:,fix:,chore:,docs:). Git history shows frequent feat/fix usage. - PRs must include: clear description, linked issues, screenshots for UI changes, migration notes, and verification steps.
- never run build,migration commands unless asked for