232 lines
4.4 KiB
Markdown
232 lines
4.4 KiB
Markdown
# CollabTable Server
|
|||
|
|
|
||
|
|
A collaborative list management server built with Node.js, Express, TypeScript, and SQLite.
|
||
|
|
|
||
|
|
## Features
|
||
|
|
|
||
|
|
- RESTful API for managing lists, fields, items, and values
|
||
|
|
- Real-time synchronization support
|
||
|
|
- SQLite database with Sequelize ORM
|
||
|
|
- Dockerized deployment with persistent storage
|
||
|
|
- TypeScript for type safety
|
||
|
|
|
||
|
|
## Prerequisites
|
||
|
|
|
||
|
|
- Docker and Docker Compose
|
||
|
|
- Or Node.js 20+ (for local development)
|
||
|
|
|
||
|
|
## Quick Start with Docker
|
||
|
|
|
||
|
|
1. Clone the repository
|
||
|
|
2. Navigate to the server directory:
|
||
|
|
```bash
|
||
|
|
cd CollabTableServer
|
||
|
|
```
|
||
|
|
|
||
|
|
3. Copy the example environment file:
|
||
|
|
```bash
|
||
|
|
cp .env.example .env
|
||
|
|
```
|
||
|
|
|
||
|
|
4. Start the services:
|
||
|
|
```bash
|
||
|
|
docker-compose up -d
|
||
|
|
```
|
||
|
|
|
||
|
|
The server will be available at `http://localhost:3000`
|
||
|
|
|
||
|
|
**Important:** The SQLite database is stored in a Docker volume named `sqlite_data`, which persists across container restarts and rebuilds.
|
||
|
|
|
||
|
|
## Local Development
|
||
|
|
|
||
|
|
1. Install dependencies:
|
||
|
|
```bash
|
||
|
|
npm install
|
||
|
|
```
|
||
|
|
|
||
|
|
2. Create a `.env` file:
|
||
|
|
```bash
|
||
|
|
cp .env.example .env
|
||
|
|
```
|
||
|
|
|
||
|
|
3. Update the database path in `.env` if needed:
|
||
|
|
```
|
||
|
|
DB_PATH=./data/collabtable.db
|
||
|
|
```
|
||
|
|
|
||
|
|
4. Start the development server:
|
||
|
|
```bash
|
||
|
|
npm run dev
|
||
|
|
```
|
||
|
|
|
||
|
|
## API Endpoints
|
||
|
|
|
||
|
|
### Lists
|
||
|
|
- `GET /api/lists` - Get all lists
|
||
|
|
- `GET /api/lists/:id` - Get a specific list
|
||
|
|
- `POST /api/lists` - Create a new list
|
||
|
|
- `PUT /api/lists/:id` - Update a list
|
||
|
|
- `DELETE /api/lists/:id` - Delete a list (soft delete)
|
||
|
|
|
||
|
|
### Fields
|
||
|
|
- `GET /api/fields/list/:listId` - Get all fields for a list
|
||
|
|
- `POST /api/fields` - Create a new field
|
||
|
|
- `PUT /api/fields/:id` - Update a field
|
||
|
|
- `DELETE /api/fields/:id` - Delete a field (soft delete)
|
||
|
|
|
||
|
|
### Items
|
||
|
|
- `GET /api/items/list/:listId` - Get all items for a list
|
||
|
|
- `GET /api/items/:itemId/values` - Get all values for an item
|
||
|
|
- `POST /api/items` - Create a new item
|
||
|
|
- `POST /api/items/values` - Create/update an item value
|
||
|
|
- `PUT /api/items/:id` - Update an item
|
||
|
|
- `DELETE /api/items/:id` - Delete an item (soft delete)
|
||
|
|
|
||
|
|
### Sync
|
||
|
|
- `POST /api/sync` - Synchronize data between client and server
|
||
|
|
|
||
|
|
### Health Check
|
||
|
|
- `GET /health` - Check server health
|
||
|
|
|
||
|
|
## Data Models
|
||
|
|
|
||
|
|
### List
|
||
|
|
```typescript
|
||
|
|
{
|
||
|
|
id: string;
|
||
|
|
name: string;
|
||
|
|
createdAt: number;
|
||
|
|
updatedAt: number;
|
||
|
|
isDeleted: boolean;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Field
|
||
|
|
```typescript
|
||
|
|
{
|
||
|
|
id: string;
|
||
|
|
listId: string;
|
||
|
|
name: string;
|
||
|
|
order: number;
|
||
|
|
createdAt: number;
|
||
|
|
updatedAt: number;
|
||
|
|
isDeleted: boolean;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Item
|
||
|
|
```typescript
|
||
|
|
{
|
||
|
|
id: string;
|
||
|
|
listId: string;
|
||
|
|
createdAt: number;
|
||
|
|
updatedAt: number;
|
||
|
|
isDeleted: boolean;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### ItemValue
|
||
|
|
```typescript
|
||
|
|
{
|
||
|
|
id: string;
|
||
|
|
itemId: string;
|
||
|
|
fieldId: string;
|
||
|
|
value: string;
|
||
|
|
updatedAt: number;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Sync Protocol
|
||
|
|
|
||
|
|
The sync endpoint accepts a POST request with the following structure:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"lastSyncTimestamp": 1234567890,
|
||
|
|
"lists": [...],
|
||
|
|
"fields": [...],
|
||
|
|
"items": [...],
|
||
|
|
"itemValues": [...]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
The server responds with:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"lists": [...],
|
||
|
|
"fields": [...],
|
||
|
|
"items": [...],
|
||
|
|
"itemValues": [...],
|
||
|
|
"serverTimestamp": 1234567890
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
The sync process:
|
||
|
|
1. Client sends all local changes since the last sync
|
||
|
|
2. Server saves the client's changes
|
||
|
|
3. Server returns all changes made on the server since the client's last sync
|
||
|
|
4. Client applies the server's changes locally
|
||
|
|
|
||
|
|
## Building for Production
|
||
|
|
|
||
|
|
Build the TypeScript code:
|
||
|
|
```bash
|
||
|
|
npm run build
|
||
|
|
```
|
||
|
|
|
||
|
|
Start the production server:
|
||
|
|
```bash
|
||
|
|
npm start
|
||
|
|
```
|
||
|
|
|
||
|
|
## Docker Commands
|
||
|
|
|
||
|
|
Start services:
|
||
|
|
```bash
|
||
|
|
docker-compose up -d
|
||
|
|
```
|
||
|
|
|
||
|
|
Stop services:
|
||
|
|
```bash
|
||
|
|
docker-compose down
|
||
|
|
```
|
||
|
|
|
||
|
|
View logs:
|
||
|
|
```bash
|
||
|
|
docker-compose logs -f
|
||
|
|
```
|
||
|
|
|
||
|
|
Rebuild and restart:
|
||
|
|
```bash
|
||
|
|
docker-compose up -d --build
|
||
|
|
```
|
||
|
|
|
||
|
|
## Environment Variables
|
||
|
|
|
||
|
|
- `PORT` - Server port (default: 3000)
|
||
|
|
- `DB_PATH` - Path to SQLite database file (default: /data/collabtable.db)
|
||
|
|
- `NODE_ENV` - Environment (development/production)
|
||
|
|
|
||
|
|
## Data Persistence
|
||
|
|
|
||
|
|
The SQLite database file is stored in a Docker volume, ensuring data persists across:
|
||
|
|
- Container restarts
|
||
|
|
- Container recreation
|
||
|
|
- Docker Compose down/up cycles
|
||
|
|
|
||
|
|
To backup your data:
|
||
|
|
```bash
|
||
|
|
docker cp collabtable-server:/data/collabtable.db ./backup.db
|
||
|
|
```
|
||
|
|
|
||
|
|
To restore data:
|
||
|
|
```bash
|
||
|
|
docker cp ./backup.db collabtable-server:/data/collabtable.db
|
||
|
|
docker-compose restart
|
||
|
|
```
|
||
|
|
|
||
|
|
## License
|
||
|
|
|
||
|
|
MIT
|