From a407a1381aee07314357ee37088127f328704b98 Mon Sep 17 00:00:00 2001 From: x3 Date: Tue, 22 Sep 2026 13:33:22 +0200 Subject: [PATCH] docs: setup, hosting, API, architecture and roadmap - SETUP: local dev guide (env vars, DB migrate, backend/frontend, troubleshooting) - HOSTING: bare-metal guide (systemd + Nginx + TLS + backups) and Docker Compose guide (deploy, reverse proxy, updates, backup/restore) - API: REST contract with curl examples and Socket.IO event protocol - ARCHITECTURE: stack, data model, auth model, realtime design, theming - ROADMAP: webapp MVP/next steps plus Tauri desktop clients for Windows, macOS and Linux with release-binary plan --- docs/API.md | 77 +++++++++++++++++++++ docs/ARCHITECTURE.md | 48 ++++++++++++++ docs/HOSTING.md | 155 +++++++++++++++++++++++++++++++++++++++++++ docs/ROADMAP.md | 60 +++++++++++++++++ docs/SETUP.md | 73 ++++++++++++++++++++ 5 files changed, 413 insertions(+) create mode 100644 docs/API.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/HOSTING.md create mode 100644 docs/ROADMAP.md create mode 100644 docs/SETUP.md diff --git a/docs/API.md b/docs/API.md new file mode 100644 index 0000000..9deea8e --- /dev/null +++ b/docs/API.md @@ -0,0 +1,77 @@ +# API Reference + +Base URL: `http://localhost:3000/api`. Auth: `Authorization: Bearer `. + +## Auth + +### POST /auth/register +```json +{ "email": "a@example.com", "name": "Ada", "password": "secret123" } +``` +-> `201 { user, token }`. Errors: `400` validation, `409` email taken. + +### POST /auth/login +```json +{ "email": "a@example.com", "password": "secret123" } +``` +-> `200 { user, token }`. Errors: `401` invalid credentials. + +### GET /auth/me +-> `200 { user }`. + +```bash +curl -X POST localhost:3000/api/auth/register \ + -H 'Content-Type: application/json' \ + -d '{"email":"a@example.com","name":"Ada","password":"secret123"}' +``` + +## Workspaces + +| Method | Path | Role | Description | +|--------|------|------|-------------| +| GET | `/workspaces` | member | List my workspaces | +| POST | `/workspaces` | any logged-in | Create workspace (caller becomes owner) | +| GET | `/workspaces/:id` | viewer+ | Get workspace | +| PATCH | `/workspaces/:id` | admin+ | Rename | +| DELETE | `/workspaces/:id` | owner | Delete | +| GET | `/workspaces/:id/members` | viewer+ | List members | +| POST | `/workspaces/:id/members` | admin+ | Invite `{email, role}` (role: admin/member/viewer) | +| PATCH | `/workspaces/:id/members/:userId` | admin+ | Change role | +| DELETE | `/workspaces/:id/members/:userId` | admin+ | Remove member | + +Roles rank: `viewer < member < admin < owner`. Viewers read only. + +## Pages + +| Method | Path | Description | +|--------|------|-------------| +| GET | `/pages/by-workspace/:workspaceId` | List pages (flat, client builds tree) | +| POST | `/pages` | Create `{workspace_id, parent_id?, title?}` (member+) | +| GET | `/pages/:id` | Get page + comments | +| PATCH | `/pages/:id` | Update title/icon/cover/content/position/parent/archive (member+) | +| DELETE | `/pages/:id` | Delete incl. children via FK cascade | +| GET | `/pages/search/query?q=&workspace_id=` | Title search | +| POST | `/pages/:id/comments` | Add comment `{body}` | +| DELETE | `/pages/:pageId/comments/:commentId` | Delete (author or admin+) | + +Content fields: `content_json` (TipTap JSON), `content_html` (rendered HTML). + +## Users + +- `GET /users/search?email=` — lookup for invites (auth required). + +## Health + +- `GET /health` -> `{ok:true, db:'up'}` or `503 {ok:false, db:'down'}`. + +## Real-time (Socket.IO) + +Connect: `io(url, { auth: { token } })`. + +- `page:join { pageId }` — join room; server checks workspace membership. +- `page:edit { pageId, content_json, content_html }` — persist + broadcast to others. + Viewers are ignored server-side. +- `typing { pageId, name }` — broadcast typing indicator. +- Server events: `page:updated { page, from? }`, `page:deleted { id }`, + `comment:added { comment }`, `presence:update { members: [{userId,email,name}] }`, + `error:message { error }`. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..58f2a3d --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,48 @@ +# Architecture + +## Stack + +- **Frontend:** Vue 3 (Composition API + `