255 lines
7.4 KiB
Markdown
255 lines
7.4 KiB
Markdown
# Mosaic Stack API
|
|
|
|
The Mosaic Stack API is a NestJS-based backend service providing REST endpoints and WebSocket support for the Mosaic productivity platform.
|
|
|
|
## Overview
|
|
|
|
The API serves as the central backend for:
|
|
- **Task Management** - Create, update, track tasks with filtering and sorting
|
|
- **Event Management** - Calendar events and scheduling
|
|
- **Project Management** - Organize work into projects
|
|
- **Knowledge Base** - Wiki-style documentation with markdown support and wiki-linking
|
|
- **Ideas** - Quick capture and organization of ideas
|
|
- **Domains** - Categorize work across different domains
|
|
- **Personalities** - AI personality configurations for the Ollama integration
|
|
- **Widgets & Layouts** - Dashboard customization
|
|
- **Activity Logging** - Track all user actions
|
|
- **WebSocket Events** - Real-time updates for tasks, events, and projects
|
|
|
|
## Available Modules
|
|
|
|
| Module | Base Path | Description |
|
|
|--------|-----------|-------------|
|
|
| **Tasks** | `/api/tasks` | CRUD operations for tasks with filtering |
|
|
| **Events** | `/api/events` | Calendar events and scheduling |
|
|
| **Projects** | `/api/projects` | Project management |
|
|
| **Knowledge** | `/api/knowledge/entries` | Wiki entries with markdown support |
|
|
| **Knowledge Tags** | `/api/knowledge/tags` | Tag management for knowledge entries |
|
|
| **Ideas** | `/api/ideas` | Quick capture and idea management |
|
|
| **Domains** | `/api/domains` | Domain categorization |
|
|
| **Personalities** | `/api/personalities` | AI personality configurations |
|
|
| **Widgets** | `/api/widgets` | Dashboard widget data |
|
|
| **Layouts** | `/api/layouts` | Dashboard layout configuration |
|
|
| **Ollama** | `/api/ollama` | LLM integration (generate, chat, embed) |
|
|
| **Users** | `/api/users/me/preferences` | User preferences |
|
|
|
|
### Health Check
|
|
|
|
- `GET /` - API health check
|
|
- `GET /health` - Detailed health status including database connectivity
|
|
|
|
## Authentication
|
|
|
|
The API uses **BetterAuth** for authentication with the following features:
|
|
|
|
### Authentication Flow
|
|
|
|
1. **Email/Password** - Users can sign up and log in with email and password
|
|
2. **Session Tokens** - BetterAuth generates session tokens with configurable expiration
|
|
|
|
### Guards
|
|
|
|
The API uses a layered guard system:
|
|
|
|
| Guard | Purpose | Applies To |
|
|
|-------|---------|------------|
|
|
| **AuthGuard** | Verifies user authentication via Bearer token | Most protected endpoints |
|
|
| **WorkspaceGuard** | Validates workspace membership and sets Row-Level Security (RLS) context | Workspace-scoped resources |
|
|
| **PermissionGuard** | Enforces role-based access control | Admin operations |
|
|
|
|
### Workspace Roles
|
|
|
|
- **OWNER** - Full control over workspace
|
|
- **ADMIN** - Administrative functions (can delete content, manage members)
|
|
- **MEMBER** - Standard access (create/edit content)
|
|
- **GUEST** - Read-only access
|
|
|
|
### Permission Levels
|
|
|
|
Used with `@RequirePermission()` decorator:
|
|
|
|
```typescript
|
|
Permission.WORKSPACE_OWNER // Requires OWNER role
|
|
Permission.WORKSPACE_ADMIN // Requires ADMIN or OWNER
|
|
Permission.WORKSPACE_MEMBER // Requires MEMBER, ADMIN, or OWNER
|
|
Permission.WORKSPACE_ANY // Any authenticated member including GUEST
|
|
```
|
|
|
|
### Providing Workspace Context
|
|
|
|
Workspace ID can be provided via:
|
|
1. **Header**: `X-Workspace-Id: <workspace-id>` (highest priority)
|
|
2. **URL Parameter**: `:workspaceId`
|
|
3. **Request Body**: `workspaceId` field
|
|
|
|
### Example: Protected Controller
|
|
|
|
```typescript
|
|
@Controller('tasks')
|
|
@UseGuards(AuthGuard, WorkspaceGuard, PermissionGuard)
|
|
export class TasksController {
|
|
@Post()
|
|
@RequirePermission(Permission.WORKSPACE_MEMBER)
|
|
async create(@Body() dto: CreateTaskDto, @Workspace() workspaceId: string) {
|
|
// workspaceId is verified and RLS context is set
|
|
}
|
|
}
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
| Variable | Description | Default |
|
|
|----------|-------------|---------|
|
|
| `PORT` | API server port | `3001` |
|
|
| `DATABASE_URL` | PostgreSQL connection string | Required |
|
|
| `NODE_ENV` | Environment (`development`, `production`) | - |
|
|
| `NEXT_PUBLIC_APP_URL` | Frontend application URL (for CORS) | `http://localhost:3000` |
|
|
| `WEB_URL` | WebSocket CORS origin | `http://localhost:3000` |
|
|
|
|
## Running Locally
|
|
|
|
### Prerequisites
|
|
|
|
- Node.js 18+
|
|
- PostgreSQL database
|
|
- pnpm workspace (part of Mosaic Stack monorepo)
|
|
|
|
### Setup
|
|
|
|
1. **Install dependencies:**
|
|
```bash
|
|
pnpm install
|
|
```
|
|
|
|
2. **Set up environment variables:**
|
|
```bash
|
|
cp .env.example .env # If available
|
|
# Edit .env with your DATABASE_URL
|
|
```
|
|
|
|
3. **Generate Prisma client:**
|
|
```bash
|
|
pnpm prisma:generate
|
|
```
|
|
|
|
4. **Run database migrations:**
|
|
```bash
|
|
pnpm prisma:migrate
|
|
```
|
|
|
|
5. **Seed the database (optional):**
|
|
```bash
|
|
pnpm prisma:seed
|
|
```
|
|
|
|
### Development
|
|
|
|
```bash
|
|
pnpm dev
|
|
```
|
|
|
|
The API will start on `http://localhost:3001`
|
|
|
|
### Production Build
|
|
|
|
```bash
|
|
pnpm build
|
|
pnpm start:prod
|
|
```
|
|
|
|
### Database Management
|
|
|
|
```bash
|
|
# Open Prisma Studio
|
|
pnpm prisma:studio
|
|
|
|
# Reset database (dev only)
|
|
pnpm prisma:reset
|
|
|
|
# Run migrations in production
|
|
pnpm prisma:migrate:prod
|
|
```
|
|
|
|
## API Documentation
|
|
|
|
The API does not currently include Swagger/OpenAPI documentation. Instead:
|
|
|
|
- **Controller files** contain detailed JSDoc comments describing each endpoint
|
|
- **DTO classes** define request/response schemas with class-validator decorators
|
|
- Refer to the controller source files in `src/` for endpoint details
|
|
|
|
### Example: Reading an Endpoint
|
|
|
|
```typescript
|
|
// src/tasks/tasks.controller.ts
|
|
|
|
/**
|
|
* POST /api/tasks
|
|
* Create a new task
|
|
* Requires: MEMBER role or higher
|
|
*/
|
|
@Post()
|
|
@RequirePermission(Permission.WORKSPACE_MEMBER)
|
|
async create(@Body() createTaskDto: CreateTaskDto, @Workspace() workspaceId: string) {
|
|
return this.tasksService.create(workspaceId, user.id, createTaskDto);
|
|
}
|
|
```
|
|
|
|
## WebSocket Support
|
|
|
|
The API provides real-time updates via WebSocket. Clients receive notifications for:
|
|
|
|
- `task:created` - New task created
|
|
- `task:updated` - Task modified
|
|
- `task:deleted` - Task removed
|
|
- `event:created` - New event created
|
|
- `event:updated` - Event modified
|
|
- `event:deleted` - Event removed
|
|
- `project:updated` - Project modified
|
|
|
|
Clients join workspace-specific rooms for scoped updates.
|
|
|
|
## Testing
|
|
|
|
```bash
|
|
# Run unit tests
|
|
pnpm test
|
|
|
|
# Run tests with coverage
|
|
pnpm test:coverage
|
|
|
|
# Run e2e tests
|
|
pnpm test:e2e
|
|
|
|
# Watch mode
|
|
pnpm test:watch
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
src/
|
|
├── activity/ # Activity logging
|
|
├── auth/ # Authentication (BetterAuth config, guards)
|
|
├── common/ # Shared decorators and guards
|
|
├── database/ # Database module
|
|
├── domains/ # Domain management
|
|
├── events/ # Event management
|
|
├── filters/ # Global exception filters
|
|
├── ideas/ # Idea capture and management
|
|
├── knowledge/ # Knowledge base (entries, tags, markdown)
|
|
├── layouts/ # Dashboard layouts
|
|
├── lib/ # Utility functions
|
|
├── ollama/ # LLM integration
|
|
├── personalities/ # AI personality configurations
|
|
├── prisma/ # Prisma service
|
|
├── projects/ # Project management
|
|
├── tasks/ # Task management
|
|
├── users/ # User preferences
|
|
├── widgets/ # Dashboard widgets
|
|
├── websocket/ # WebSocket gateway
|
|
├── app.controller.ts # Root controller (health check)
|
|
├── app.module.ts # Root module
|
|
└── main.ts # Application bootstrap
|
|
```
|