Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/reminder-worker/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ interface Env {
APP_URL: string
}

const NOTIFICATION_QUEUE = 'todo-notifications'
const NOTIFICATION_QUEUE = 'kanban-notifications'
const RETRY_DELAY_SECONDS = 60

export default {
Expand Down
14 changes: 7 additions & 7 deletions apps/reminder-worker/wrangler.jsonc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "../../node_modules/wrangler/config-schema.json",
"name": "todo-reminder-worker",
"name": "kanban-reminder-worker",
"main": "src/index.ts",
"compatibility_date": "2026-01-01",
"vars": {
Expand All @@ -14,7 +14,7 @@
"d1_databases": [
{
"binding": "DB",
"database_name": "todo-db",
"database_name": "kanban-db",
"database_id": "replace-with-production-database-id",
"migrations_dir": "../../packages/db/migrations",
},
Expand All @@ -23,22 +23,22 @@
"producers": [
{
"binding": "REMINDER_QUEUE",
"queue": "todo-reminders",
"queue": "kanban-reminders",
},
],
"consumers": [
{
"queue": "todo-reminders",
"queue": "kanban-reminders",
"max_batch_size": 10,
"max_retries": 3,
// A mail that still fails after its retries is kept here instead of being dropped.
"dead_letter_queue": "todo-mail-dead-letter",
"dead_letter_queue": "kanban-mail-dead-letter",
},
{
"queue": "todo-notifications",
"queue": "kanban-notifications",
"max_batch_size": 10,
"max_retries": 3,
"dead_letter_queue": "todo-mail-dead-letter",
"dead_letter_queue": "kanban-mail-dead-letter",
},
],
},
Expand Down
16 changes: 8 additions & 8 deletions apps/web/wrangler.jsonc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "../../node_modules/wrangler/config-schema.json",
"name": "todo-web",
"name": "kanban-web",
"main": "dist/server/server.js",
"compatibility_date": "2026-01-01",
"compatibility_flags": ["nodejs_compat"],
Expand All @@ -11,23 +11,23 @@
"d1_databases": [
{
"binding": "DB",
"database_name": "todo-db",
"database_name": "kanban-db",
"database_id": "replace-with-production-database-id",
"migrations_dir": "../../packages/db/migrations",
},
],
"r2_buckets": [
{
"binding": "FILES",
"bucket_name": "todo-files",
"bucket_name": "kanban-files",
},
],
"queues": {
// Mails to send (for example "a task was shared with you"). The reminder worker sends them.
"producers": [
{
"binding": "NOTIFICATION_QUEUE",
"queue": "todo-notifications",
"queue": "kanban-notifications",
},
],
},
Expand All @@ -51,26 +51,26 @@
// not inherited by an environment, so each one is written out again. See docs/deploy.md.
"env": {
"preview": {
"name": "todo-web-preview",
"name": "kanban-web-preview",
"d1_databases": [
{
"binding": "DB",
"database_name": "todo-db-preview",
"database_name": "kanban-db-preview",
"database_id": "replace-with-preview-database-id",
"migrations_dir": "../../packages/db/migrations",
},
],
"r2_buckets": [
{
"binding": "FILES",
"bucket_name": "todo-files-preview",
"bucket_name": "kanban-files-preview",
},
],
"queues": {
"producers": [
{
"binding": "NOTIFICATION_QUEUE",
"queue": "todo-notifications-preview",
"queue": "kanban-notifications-preview",
},
],
},
Expand Down
24 changes: 12 additions & 12 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@

Cloudflare 上で動く Web アプリ (TanStack Start) と、メール送信用のワーカー (リマインド、共有の通知) の 2 つの Worker で構成する。ブランチや PR の動作確認用に、Web アプリのプレビュー用の Worker もある ([デプロイとプレビュー](deploy.md))。

図は大まかなもので、共有の通知用のキュー (`todo-notifications`) などは描いていない。
図は大まかなもので、共有の通知用のキュー (`kanban-notifications`) などは描いていない。

## コンポーネント

| コンポーネント | 役割 | 状態 |
| -------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| Workers (`apps/web`) | 画面、タスク API、認証 | 実装済み → [Web アプリ仕様](web-app.md) |
| Workers (`apps/reminder-worker`) | cron で起動してリマインドを Queues に積み、リマインドと共有の通知のメールを送る | 実装済み。送信の設定は [#8](https://github.com/tknkaa/todo-app/issues/8) → [ワーカー仕様](worker.md) |
| D1 | ユーザー、セッション、タスク (本文、順番を含む)、添付のメタデータ、共有と招待の保存 | 実装済み → [テーブル定義](database.md) |
| Cron Triggers | リマインド Worker を 15 分ごとに起動 | 実装済み |
| Queues | メールの送信キュー (リマインド用の `todo-reminders` と、共有の通知用の `todo-notifications`) | 実装済み |
| Resend | リマインドと共有の通知のメールの送信 | コードあり。API キーとドメインの設定は未了 |
| R2 | タスクのファイル添付 | 実装済み (`FILES`) → [Web アプリ仕様](web-app.md) |
| Durable Objects | 共有したタスクの変更をリアルタイムに通知 (WebSocket) | 実装済み (`COLLABORATION`) → [Web アプリ仕様](web-app.md) |
| コンポーネント | 役割 | 状態 |
| -------------------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
| Workers (`apps/web`) | 画面、タスク API、認証 | 実装済み → [Web アプリ仕様](web-app.md) |
| Workers (`apps/reminder-worker`) | cron で起動してリマインドを Queues に積み、リマインドと共有の通知のメールを送る | 実装済み。送信の設定は [#8](https://github.com/tknkaa/todo-app/issues/8) → [ワーカー仕様](worker.md) |
| D1 | ユーザー、セッション、タスク (本文、順番を含む)、添付のメタデータ、共有と招待の保存 | 実装済み → [テーブル定義](database.md) |
| Cron Triggers | リマインド Worker を 15 分ごとに起動 | 実装済み |
| Queues | メールの送信キュー (リマインド用の `kanban-reminders` と、共有の通知用の `kanban-notifications`) | 実装済み |
| Resend | リマインドと共有の通知のメールの送信 | コードあり。API キーとドメインの設定は未了 |
| R2 | タスクのファイル添付 | 実装済み (`FILES`) → [Web アプリ仕様](web-app.md) |
| Durable Objects | 共有したタスクの変更をリアルタイムに通知 (WebSocket) | 実装済み (`COLLABORATION`) → [Web アプリ仕様](web-app.md) |

## リポジトリ構成

Expand All @@ -41,7 +41,7 @@ docs/ このドキュメント

- **タスク操作:** ブラウザ → `apps/web` の `/api/tasks` → D1。リクエストごとにセッションを確認し、ログインしていなければ 401 を返す。
- **リアルタイム通知:** タスクの変更後、`apps/web` が、そのタスクを見られる全員の Durable Object に通知する。各ブラウザは WebSocket でつながり、通知を受けると一覧を取得し直す。
- **共有の通知メール:** タスクを共有すると、`apps/web` が `todo-notifications` に積み、`reminder-worker` が Resend で送る。アカウントがない相手は招待として保存され、アカウントを作ると共有される。
- **共有の通知メール:** タスクを共有すると、`apps/web` が `kanban-notifications` に積み、`reminder-worker` が Resend で送る。アカウントがない相手は招待として保存され、アカウントを作ると共有される。
- **リマインド:** Cron → `reminder-worker` が D1 から対象タスクを検索 → Queues に投入 → 同じ Worker のコンシューマが Resend でメール送信。

## ドキュメント一覧
Expand Down
2 changes: 1 addition & 1 deletion docs/database.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,4 +147,4 @@ Cloudflare D1 (SQLite)。スキーマは `packages/db/src/schema.ts` (Drizzle)
just sql "select * from tasks"
```

`just` が使えない場合は、`apps/web` で `pnpm exec wrangler d1 execute todo-db --local --persist-to .wrangler/state-drizzle-baseline --command "..."` を実行する。
`just` が使えない場合は、`apps/web` で `pnpm exec wrangler d1 execute kanban-db --local --persist-to .wrangler/state-drizzle-baseline --command "..."` を実行する。
Loading
Loading