Files
microdao-daarion/docs/internal/architecture/MICRODAO_MULTI_ROOM_BACKEND.md
Apple 3f41d0e0a2 feat: TASK 034-036 - MicroDAO Multi-Room Support
TASK 034: MicroDAO Multi-Room Backend
- Added migration 031_microdao_multi_room.sql
- Extended city_rooms with microdao_id, room_role, is_public, sort_order
- Added CityRoomSummary, MicrodaoRoomsList, MicrodaoRoomUpdate models
- Added get_microdao_rooms, get_microdao_rooms_by_slug functions
- Added attach_room_to_microdao, update_microdao_room functions
- Added API endpoints: GET/POST/PATCH /city/microdao/{slug}/rooms

TASK 035: MicroDAO Multi-Room UI
- Added proxy routes for rooms API
- Extended CityRoomSummary type with multi-room fields
- Added useMicrodaoRooms hook
- Created MicrodaoRoomsSection component with role labels/icons

TASK 036: MicroDAO Room Orchestrator Panel
- Created MicrodaoRoomsAdminPanel component
- Role selector, visibility toggle, set primary button
- Attach existing room form
- Integrated into /microdao/[slug] page
2025-11-29 01:07:15 -08:00

202 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MicroDAO Multi-Room Architecture
**Дата:** 28 листопада 2025
**Статус:** ✅ Реалізовано (TASK 034-036)
## Огляд
Кожен MicroDAO може мати кілька внутрішніх кімнат (Matrix/City rooms), а не лише одну primary room. Це дозволяє організувати різні простори для команди: лобі, командні кімнати, дослідницькі лабораторії, безпека, управління тощо.
---
## 1. Схема БД
### Розширення `city_rooms`
```sql
ALTER TABLE city_rooms
ADD COLUMN IF NOT EXISTS microdao_id uuid,
ADD COLUMN IF NOT EXISTS room_role text,
ADD COLUMN IF NOT EXISTS is_public boolean NOT NULL DEFAULT true,
ADD COLUMN IF NOT EXISTS sort_order integer NOT NULL DEFAULT 100;
CREATE INDEX IF NOT EXISTS idx_city_rooms_microdao_id ON city_rooms(microdao_id);
CREATE INDEX IF NOT EXISTS idx_city_rooms_room_role ON city_rooms(room_role);
```
### Поля
| Поле | Тип | Опис |
|------|-----|------|
| `microdao_id` | UUID | Посилання на MicroDAO, якому належить кімната |
| `room_role` | TEXT | Роль кімнати: `primary`, `lobby`, `team`, `research`, `security`, `governance` |
| `is_public` | BOOLEAN | Чи видима кімната для не-членів MicroDAO |
| `sort_order` | INTEGER | Порядок відображення (менше = вище) |
### Ролі кімнат
| Роль | Опис |
|------|------|
| `primary` | Основна кімната MicroDAO (показується першою, використовується для чату за замовчуванням) |
| `lobby` | Лобі для зустрічей та привітань |
| `team` | Командна кімната для внутрішньої комунікації |
| `research` | Дослідницька лабораторія |
| `security` | Кімната безпеки |
| `governance` | Кімната управління та голосування |
---
## 2. Backend API
### Моделі
```python
class CityRoomSummary(BaseModel):
id: str
slug: str
name: str
matrix_room_id: Optional[str] = None
microdao_id: Optional[str] = None
microdao_slug: Optional[str] = None
room_role: Optional[str] = None
is_public: bool = True
sort_order: int = 100
class MicrodaoRoomsList(BaseModel):
microdao_id: str
microdao_slug: str
rooms: List[CityRoomSummary]
class MicrodaoRoomUpdate(BaseModel):
room_role: Optional[str] = None
is_public: Optional[bool] = None
sort_order: Optional[int] = None
set_primary: Optional[bool] = None
class AttachExistingRoomRequest(BaseModel):
room_id: str
room_role: Optional[str] = None
is_public: bool = True
sort_order: int = 100
```
### Endpoints
| Метод | URL | Опис |
|-------|-----|------|
| GET | `/city/microdao/{slug}/rooms` | Отримати всі кімнати MicroDAO |
| POST | `/city/microdao/{slug}/rooms/attach-existing` | Прив'язати існуючу кімнату |
| PATCH | `/city/microdao/{slug}/rooms/{room_id}` | Оновити налаштування кімнати |
### Приклади
#### GET /city/microdao/daarion-dao/rooms
```json
{
"microdao_id": "uuid-here",
"microdao_slug": "daarion-dao",
"rooms": [
{
"id": "room_leadership_hall",
"slug": "leadership-hall",
"name": "Leadership Hall",
"room_role": "primary",
"is_public": true,
"sort_order": 0
},
{
"id": "room_system_control",
"slug": "system-control",
"name": "System Control",
"room_role": "governance",
"is_public": true,
"sort_order": 10
}
]
}
```
#### PATCH /city/microdao/daarion-dao/rooms/room_system_control
```json
{
"set_primary": true
}
```
---
## 3. Frontend
### Типи
```typescript
interface CityRoomSummary {
id: string;
slug: string;
name: string;
matrix_room_id?: string | null;
microdao_id?: string | null;
microdao_slug?: string | null;
room_role?: string | null;
is_public?: boolean;
sort_order?: number;
}
interface MicrodaoRoomsList {
microdao_id: string;
microdao_slug: string;
rooms: CityRoomSummary[];
}
```
### Hooks
- `useMicrodaoRooms(slug)` — отримати кімнати MicroDAO
### Компоненти
- `MicrodaoRoomsSection` — відображення кімнат з чатами
- `MicrodaoRoomsAdminPanel` — панель керування кімнатами (для оркестратора)
---
## 4. UI Flow
1. **Сторінка MicroDAO** (`/microdao/[slug]`):
- Показує всі кімнати через `MicrodaoRoomsSection`
- Primary room — з вбудованим чатом
- Інші кімнати — як картки з посиланнями
2. **Панель адміністратора** (`MicrodaoRoomsAdminPanel`):
- Видима тільки для оркестратора
- Дозволяє:
- Змінювати роль кімнати
- Встановлювати primary
- Змінювати видимість
- Прив'язувати існуючі кімнати
---
## 5. Міграції
- `migrations/031_microdao_multi_room.sql` — додає поля та індекси
---
## 6. Пов'язані файли
### Backend
- `services/city-service/models_city.py`
- `services/city-service/repo_city.py`
- `services/city-service/routes_city.py`
### Frontend
- `apps/web/src/lib/types/microdao.ts`
- `apps/web/src/hooks/useMicrodao.ts`
- `apps/web/src/components/microdao/MicrodaoRoomsSection.tsx`
- `apps/web/src/components/microdao/MicrodaoRoomsAdminPanel.tsx`
- `apps/web/src/app/api/microdao/[slug]/rooms/route.ts`