42 lines
1.9 KiB
Markdown
42 lines
1.9 KiB
Markdown
# Copilot Instructions — Fiddy (External DB)
|
||
|
||
## Authority
|
||
- **Source of truth:** `PROJECT_INSTRUCTIONS.md` (repo root). If conflict, follow it.
|
||
- **Bugfix work:** follow `DEBUGGING_INSTRUCTIONS.md` (repo root).
|
||
- Keep this file short: it’s a guide for Copilot behavior, not the full spec.
|
||
|
||
## High-level behavior
|
||
- Make the **smallest change** that resolves the bug or request.
|
||
- **Scan the repo first** for existing patterns (don’t invent files/endpoints unless necessary).
|
||
- Respect layering: **route → server service → client wrapper → hook → UI**.
|
||
- Keep diffs tight; avoid large refactors unless required.
|
||
|
||
## Hard rules (do not violate)
|
||
- External DB: `DATABASE_URL` points to on-prem Postgres (NOT a container).
|
||
- No cron/worker jobs.
|
||
- Server-side RBAC only; client checks are UX only.
|
||
- Never log secrets, receipt bytes, or full invite codes (invite codes = **last4 only**).
|
||
- Entries list endpoints must never return receipt bytes.
|
||
|
||
## Architecture quick map (follow existing patterns)
|
||
- API routes: `app/api/**/route.ts` (thin parse/validate + call service)
|
||
- Server services: `lib/server/*` (DB + authz, must include `import "server-only";`)
|
||
- Client wrappers: `lib/client/*` (typed fetch + error normalization, credentials included)
|
||
- Hooks: `hooks/use-*.ts` (UI-facing API layer; components avoid raw `fetch()`)
|
||
|
||
## API conventions
|
||
- Prefer error shape: `{ error: { code, message }, request_id? }`
|
||
- Validate input at the route boundary; authorize in services.
|
||
|
||
## Next.js dynamic route params (required)
|
||
- In `app/api/**/[param]/route.ts`, treat `context.params` as async:
|
||
- `const { id } = await context.params;`
|
||
|
||
## Tests
|
||
- When changing API behavior, add/update tests.
|
||
- Prefer including negative cases: unauthorized / not-a-member / invalid input.
|
||
|
||
## UI expectations
|
||
- Dark mode, minimal, mobile-first.
|
||
- Navbar layout: left nav dropdown, middle group selector, right user menu.
|