docs(21-01): complete chat foundation plan — schema, types, service, routes
- 24 tests passing (service + routes) - 9 new files created, 6 modified - Requirements HIST-01, HIST-05, HIST-06, CHAT-04, CHAT-05, CHAT-06 marked complete Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
parent
5c969bb9da
commit
252dc9a814
1 changed files with 105 additions and 0 deletions
105
.planning/phases/21-chat-foundation/21-01-SUMMARY.md
Normal file
105
.planning/phases/21-chat-foundation/21-01-SUMMARY.md
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
---
|
||||
phase: 21-chat-foundation
|
||||
plan: 01
|
||||
subsystem: chat-api
|
||||
tags: [db-schema, rest-api, drizzle, service-layer, tdd]
|
||||
dependency_graph:
|
||||
requires: []
|
||||
provides:
|
||||
- chat_conversations Drizzle table and migration
|
||||
- chat_messages Drizzle table and migration
|
||||
- ChatConversation and ChatMessage TypeScript interfaces
|
||||
- createConversationSchema, updateConversationSchema, createMessageSchema Zod validators
|
||||
- chatService factory with full CRUD
|
||||
- chatRoutes factory with 11 REST endpoints
|
||||
affects:
|
||||
- packages/db (new schema tables)
|
||||
- packages/shared (new types + validators)
|
||||
- server (new service + routes + app mounting)
|
||||
tech_stack:
|
||||
added:
|
||||
- Drizzle ORM schema for chat_conversations and chat_messages
|
||||
patterns:
|
||||
- Factory function service pattern (chatService(db))
|
||||
- Factory function route pattern (chatRoutes(db))
|
||||
- Cursor-based pagination (updatedAt DESC)
|
||||
- Auto-title on first message (idempotent: WHERE title IS NULL)
|
||||
key_files:
|
||||
created:
|
||||
- packages/db/src/schema/chat_conversations.ts
|
||||
- packages/db/src/schema/chat_messages.ts
|
||||
- packages/db/src/migrations/0047_fixed_johnny_storm.sql
|
||||
- packages/shared/src/types/chat.ts
|
||||
- packages/shared/src/validators/chat.ts
|
||||
- server/src/services/chat.ts
|
||||
- server/src/routes/chat.ts
|
||||
- server/src/__tests__/chat-service.test.ts
|
||||
- server/src/__tests__/chat-routes.test.ts
|
||||
modified:
|
||||
- packages/db/src/schema/index.ts
|
||||
- packages/shared/src/index.ts
|
||||
- packages/shared/src/types/index.ts
|
||||
- packages/shared/src/validators/index.ts
|
||||
- server/src/routes/index.ts
|
||||
- server/src/app.ts
|
||||
decisions:
|
||||
- "Used isNull(chatConversations.title) with AND condition for idempotent title-setting on first message"
|
||||
- "listConversations fetches limit+1 to determine hasMore without extra COUNT query"
|
||||
- "addMessage reads conversation after insert to check title IS NULL — keeps update idempotent"
|
||||
metrics:
|
||||
duration_minutes: 4
|
||||
completed_date: "2026-04-01"
|
||||
tasks_completed: 2
|
||||
files_created: 9
|
||||
files_modified: 6
|
||||
---
|
||||
|
||||
# Phase 21 Plan 01: Chat Foundation — DB Schema, Types, Service, Routes Summary
|
||||
|
||||
**One-liner:** PostgreSQL chat schema with Drizzle ORM, Zod validators, cursor-paginated service, and 11-endpoint REST API — all TDD, 24 tests passing.
|
||||
|
||||
## What Was Built
|
||||
|
||||
Two new Drizzle schema tables (`chat_conversations`, `chat_messages`) with a generated migration (0047), shared TypeScript interfaces and Zod validators in `@paperclipai/shared`, a `chatService` factory with full CRUD including auto-title on first message and cursor-based pagination, and `chatRoutes` factory with 11 REST endpoints mounted in `app.ts`.
|
||||
|
||||
## Tasks Completed
|
||||
|
||||
| Task | Description | Commit |
|
||||
|------|-------------|--------|
|
||||
| 1 | DB schema, shared types, validators, service + service tests | 0152d958 |
|
||||
| 2 | REST API routes and route tests | 22547a9c |
|
||||
|
||||
## Test Results
|
||||
|
||||
- `chat-service.test.ts`: 12 tests, all passing
|
||||
- `chat-routes.test.ts`: 12 tests, all passing
|
||||
- Total: 24 tests, 0 failures
|
||||
|
||||
## API Endpoints
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
| GET | /api/companies/:companyId/conversations | List conversations (cursor paginated) |
|
||||
| POST | /api/companies/:companyId/conversations | Create conversation |
|
||||
| GET | /api/conversations/:id | Get conversation |
|
||||
| PATCH | /api/conversations/:id | Update conversation title |
|
||||
| DELETE | /api/conversations/:id | Soft delete conversation |
|
||||
| POST | /api/conversations/:id/archive | Archive conversation |
|
||||
| POST | /api/conversations/:id/unarchive | Unarchive conversation |
|
||||
| POST | /api/conversations/:id/pin | Pin conversation |
|
||||
| POST | /api/conversations/:id/unpin | Unpin conversation |
|
||||
| GET | /api/conversations/:id/messages | List messages (cursor paginated) |
|
||||
| POST | /api/conversations/:id/messages | Add message (auto-sets title if null) |
|
||||
|
||||
## Deviations from Plan
|
||||
|
||||
None — plan executed exactly as written.
|
||||
|
||||
## Known Stubs
|
||||
|
||||
None — all service methods are fully implemented with real Drizzle ORM calls.
|
||||
|
||||
## Self-Check: PASSED
|
||||
|
||||
- All 8 created files found on disk
|
||||
- Commits 0152d958 and 22547a9c verified in git log
|
||||
Loading…
Add table
Reference in a new issue