Frontend:
- apps/web (Vite+TS, TanStack Router/Query, shadcn/ui @cfdm/ui base-nova)
- 10 страниц в routes/_auth/, Recharts через shadcn Chart, lucide-react
- формы на RHF + Zod (FormSheet/FormField)
- удалены Tabler, Chart.js, react-router-dom
Backend (параллельный трек):
- apps/api (Fastify 5 + Drizzle + better-sqlite3)
- packages/db: Drizzle-схема и repositories по сущностям
- packages/shared: Zod-контракты
- роуты с валидацией и единым форматом ошибок { error: { code, message } }
- sync/backup — заглушки 501 (billmanager-адаптеры переносятся отдельно)
- legacy Express оставлен как runtime по умолчанию (RUNTIME=express)
Infra:
- Dockerfile multi-stage под pnpm workspaces
- .dockerignore и docker-compose обновлены под monorepo
Rules:
- удалены нерелевантные правила (rust, cloudflare, server/frontend-conventions)
- project-structure.mdc и AGENTS.md переписаны под monorepo
- frontend-shadcn.mdc, shadcn-ui-production.mdc, sqlite.mdc обновлены
Co-authored-by: Cursor <cursoragent@cursor.com>
44 lines
1.3 KiB
Plaintext
44 lines
1.3 KiB
Plaintext
---
|
|
description: Fastify API — слои, плагины, контракт ошибок
|
|
globs: apps/api/**/*
|
|
alwaysApply: false
|
|
---
|
|
|
|
# Backend Fastify
|
|
|
|
Стек: **Node.js 22**, **Fastify 5**, `@fastify/*` plugins, `@cfdm/shared`, `@cfdm/db`.
|
|
|
|
MCP — [`backend-mcp.mdc`](backend-mcp.mdc).
|
|
|
|
## Слои
|
|
|
|
```
|
|
routes/ → services/ → @cfdm/db (repositories)
|
|
↘ lib/cf-client.ts
|
|
```
|
|
|
|
- Routes — тонкие Fastify plugins (`fastify-plugin`)
|
|
- **Запрещено:** SQL в routes, `fetch` к CF вне `cf-client`
|
|
|
|
## Плагины (официальные)
|
|
|
|
`@fastify/jwt`, `@fastify/cors`, `@fastify/sensible`, `@fastify/static`, `@fastify/helmet`, `@fastify/rate-limit`, `@fastify/type-provider-zod`, `fastify-plugin`
|
|
|
|
## Ошибки
|
|
|
|
Формат: `{ error: { code, message } }`
|
|
|
|
Коды: `NOT_FOUND`, `VALIDATION_ERROR`, `UNAUTHORIZED`, `FORBIDDEN`, `CONFLICT`, `CLOUDFLARE_ERROR`, `INTERNAL_ERROR`
|
|
|
|
## Правила
|
|
|
|
- Zod schemas только из `@cfdm/shared`
|
|
- `db.transaction()` для multi-step writes
|
|
- Операции >2s → async job (`sync_jobs` + `p-queue`)
|
|
- Env через Zod в `config.ts`; prod fail-fast на dev `JWT_SECRET`
|
|
- TypeScript strict; `function` для handlers/services
|
|
|
|
## API + UI
|
|
|
|
[`backend-api-ui.mdc`](backend-api-ui.mdc)
|