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
This commit is contained in:
201
docs/internal/architecture/MICRODAO_MULTI_ROOM_BACKEND.md
Normal file
201
docs/internal/architecture/MICRODAO_MULTI_ROOM_BACKEND.md
Normal file
@@ -0,0 +1,201 @@
|
||||
# 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`
|
||||
|
||||
Reference in New Issue
Block a user