# Workspace Service

# Workspace Service (Port 8006) {#workspace-service-port-8006}


The **workspace-service** manages workspaces, projects, and team members with full tenant isolation.


## Database {#database}


**Database:** `workspace_db`

| Table | Purpose |
|-------|---------|
| `workspaces` | Workspace definitions |
| `projects` | Projects within workspaces |
| `members` | Workspace member associations |


## API Endpoints {#api-endpoints}


| Method | Path | Purpose |
|--------|------|---------|
| GET | `/workspaces` | List workspaces |
| POST | `/workspaces` | Create workspace |
| GET | `/workspaces/{id}` | Get workspace |
| PUT | `/workspaces/{id}` | Update workspace |
| DELETE | `/workspaces/{id}` | Delete workspace |
| GET | `/projects` | List projects |
| POST | `/projects` | Create project |
| GET | `/members` | List members |
| POST | `/members` | Add member |
| DELETE | `/members/{id}` | Remove member |


## Tenant Isolation {#tenant-isolation}


Every workspace is scoped to a tenant. The `X-Tenant-ID` header is required:

```python
async def list_workspaces(request: Request):
    tenant_id = request.state.tenant_id
    query = select(Workspace).where(Workspace.tenant_id == tenant_id)
    result = await db.execute(query)
    return result.scalars().all()
```


## Multi-Tenancy {#multi-tenancy}


```python
# Workspace service uses shared database with tenant_id column
# All queries must filter by tenant_id
async def get_workspace(workspace_id: str, tenant_id: str):
    query = select(Workspace).where(
        Workspace.id == workspace_id,
        Workspace.tenant_id == tenant_id
    )
    return await db.execute(query)
```
