feat: spaces redesign, model selector, auth fixes

Spaces:
- Perplexity-like UI with collaboration features
- Space detail page with threads/members tabs
- Invite members via email, role management
- New space creation with icon/color picker

Model selector:
- Added Ollama client for free Auto model
- GooSeek 1.0 via Timeweb (tariff-based)
- Frontend model dropdown in ChatInput

Auth & Infrastructure:
- Fixed auth-svc missing from Dockerfile.all
- Removed duplicate ratelimit_tiered.go (conflict)
- Added Redis to api-gateway for rate limiting
- Fixed Next.js proxy for local development

UI improvements:
- Redesigned login button in sidebar (gradient)
- Settings page with tabs (account/billing/prefs)
- Auth pages visual refresh

Made-with: Cursor
This commit is contained in:
home
2026-02-28 02:30:05 +03:00
parent a0e3748dde
commit e6b9cfc60a
33 changed files with 2940 additions and 810 deletions

View File

@@ -1,144 +1,141 @@
# Недоделки — начать отсюда
## Последнее исправление (28.02.2026)
### Fix: auth-svc не собирался в Docker
- Добавлена строка сборки `auth-svc` в `Dockerfile.all`
- Удалён дубликат `ratelimit_tiered.go` (конфликт типов с Redis-версией)
- Добавлен REDIS_URL в api-gateway для rate limiting
- Пересоздан тестовый пользователь через API
---
## Последнее изменение (28.02.2026)
**Создан полный UI для авторизации:**
- Модальные окна login/register
- Страницы /login, /register, /forgot-password, /reset-password
- UserMenu в сайдбаре
- AuthContext для управления состоянием
## Сделано (полностью)
**Обновлён дизайн страниц авторизации:**
### 1. Auth UI (NEW)
### Сделано (полностью)
**Новые файлы:**
#### Страницы авторизации в стиле сайта
- `/login` — переделана с градиентным фоном, фирменным логотипом, анимациями
- `/register` — аналогично, единый стиль с login
- `/forgot-password`сброс пароля в новом дизайне
- `/reset-password` — установка нового пароля в новом дизайне
**API клиент:**
- `backend/webui/src/lib/auth.ts` — функции для работы с auth API, хранение токенов
Изменения:
- `bg-gradient-main` вместо простого `bg-base`
- Фирменный логотип GooSeek (font-black italic + иконка Sparkles)
- Gradient blur декорации на фоне
- Карточка с градиентной рамкой и backdrop-blur
- Анимации появления (framer-motion)
- Footer с копирайтом
**Контекст:**
- `backend/webui/src/lib/contexts/AuthContext.tsx` — React контекст для auth состояния
---
**Компоненты:**
- `backend/webui/src/components/auth/AuthModal.tsx` — модальное окно
- `backend/webui/src/components/auth/LoginForm.tsx` — форма входа
- `backend/webui/src/components/auth/RegisterForm.tsx` — форма регистрации
- `backend/webui/src/components/auth/ForgotPasswordForm.tsx`сброс пароля
- `backend/webui/src/components/auth/UserMenu.tsx` — меню пользователя
- `backend/webui/src/components/auth/index.ts` — экспорты
**Ранее: Spaces как у Perplexity + коллаборация:**
**Страницы:**
- `backend/webui/src/app/(auth)/login/page.tsx`
- `backend/webui/src/app/(auth)/register/page.tsx`
- `backend/webui/src/app/(auth)/forgot-password/page.tsx`
- `backend/webui/src/app/(auth)/reset-password/page.tsx`
- `backend/webui/src/app/(auth)/layout.tsx`
### Сделано (полностью)
**Интеграция:**
- `providers.tsx` — добавлен AuthProvider и AuthModal
- `Sidebar.tsx` — кнопки входа/регистрации для гостей, профиль для авторизованных
#### 1. Backend - Space Members
- Добавлена таблица `space_members` (space_id, user_id, role)
- Добавлена таблица `space_invites` (приглашения по токену)
- Методы: `GetMembers`, `AddMember`, `RemoveMember`, `IsMember`
- Методы: `CreateInvite`, `GetInviteByToken`, `DeleteInvite`
- Обновлён `GetByMemberID` - возвращает пространства где пользователь участник
**Функционал:**
- Модальные окна для быстрого входа без перехода на страницу
- Отдельные страницы для полноценного входа
- Валидация паролей в реальном времени
- Показ/скрытие пароля
- Запоминание пользователя
- Сброс пароля по email
- Автоматический refresh токенов
- Отображение tier (Free/Pro/Business)
#### 2. Frontend - Types & API
- Добавлены типы: `SpaceMember`, `SpaceInvite`
- Обновлён тип `Space` с полями `members`, `memberCount`, `userId`
- API методы: `fetchSpaceMembers`, `inviteToSpace`, `removeSpaceMember`, `acceptSpaceInvite`, `fetchSpaceThreads`
### 2. Auth Service (Backend)
#### 3. Страница /spaces - Новый дизайн
- Карточки пространств с градиентным фоном
- Показывает: название, описание, кол-во участников, кол-во тредов
- Аватары участников на карточке
- Поиск по пространствам
- Требует авторизации
**Файлы:**
- `backend/internal/auth/types.go`
- `backend/internal/auth/repository.go`
- `backend/cmd/auth-svc/main.go`
#### 4. Страница /spaces/[id] - Детали пространства
- Заголовок с названием и описанием
- Табы: Треды / Участники
- Список тредов пространства с датами
- Список участников с ролями (owner/admin/member)
- Кнопка "Начать новый тред"
- Модалка приглашения участников по email
- Удаление участников (для admin/owner)
**Эндпоинты:**
| Method | Path | Описание |
|--------|------|----------|
| POST | `/api/v1/auth/register` | Регистрация |
| POST | `/api/v1/auth/login` | Вход |
| POST | `/api/v1/auth/refresh` | Обновление токена |
| POST | `/api/v1/auth/logout` | Выход |
| POST | `/api/v1/auth/logout-all` | Выход со всех устройств |
| GET | `/api/v1/auth/validate` | Валидация токена |
| GET | `/api/v1/auth/me` | Профиль |
| PUT | `/api/v1/auth/me` | Обновить профиль |
| POST | `/api/v1/auth/change-password` | Смена пароля |
| POST | `/api/v1/auth/forgot-password` | Запрос сброса |
| POST | `/api/v1/auth/reset-password` | Сброс пароля |
#### 5. Страница /spaces/new - Создание
- Превью карточки в реальном времени
- Выбор иконки (эмодзи)
- Выбор цвета (6 вариантов)
- Переключатель приватности
- AI инструкции для пространства
### 3. Ранее — Аудит безопасности
#### 6. Ранее добавлено
- Селектор модели (Auto/GooSeek 1.0)
- Ollama клиент для бесплатной модели
- Обновлённая кнопка "Войти" в сайдбаре
- Репозитории с фильтрацией по user_id
- JWT middleware во всех сервисах
- Tiered rate limiting (free/pro/business)
- Usage tracking
- LLM limits
### Файлы изменены/созданы
```
backend/internal/db/
└── space_repo.go (UPDATED - members, invites)
backend/webui/src/
├── lib/
│ ├── types.ts (UPDATED - SpaceMember, SpaceInvite)
│ └── api.ts (UPDATED - space members API)
├── app/(main)/spaces/
│ ├── page.tsx (REWRITTEN - новый дизайн)
│ ├── new/page.tsx (REWRITTEN - с превью)
│ └── [id]/page.tsx (NEW - детали пространства)
└── components/
├── Sidebar.tsx (UPDATED - кнопка войти)
└── ChatInput.tsx (UPDATED - селектор модели)
backend/internal/llm/
├── ollama.go (NEW)
└── client.go (UPDATED)
backend/pkg/config/config.go (UPDATED - Ollama config)
backend/cmd/agent-svc/main.go (UPDATED - Ollama support)
```
## Осталось сделать
### Высокий приоритет:
1. **Проверить компиляцию**`cd backend && go build ./...`
2. **Протестировать auth flow** — регистрация → логин → refresh → logout
3. **Добавить billing-svc** — интеграция с ЮKassa
1. **Backend API endpoints** — добавить API для:
- `GET /api/v1/spaces/:id/members`
- `POST /api/v1/spaces/:id/invite`
- `DELETE /api/v1/spaces/:id/members/:userId`
- `POST /api/v1/spaces/invite/:token/accept`
- `GET /api/v1/spaces/:id/threads`
2. **Email отправка** — отправлять email с приглашением
3. **Ollama в docker-compose** — добавить сервис ollama
### Средний приоритет:
4. **OAuth провайдеры** — Google, GitHub, Yandex
5. **Email уведомления** — подтверждение email, сброс пароля
6. **Страница настроек профиля** — редактирование name, avatar
7. **Страница подписки** — /settings/billing с выбором тарифа
5. **Подтверждение email** — отправка письма при регистрации
6. **Real-time обновления** — WebSocket для тредов в пространстве
7. **Уведомления** — когда кто-то добавляет сообщение в тред
### Низкий приоритет:
8. **2FA** — TOTP аутентификация
9. **Session management** — список активных сессий
10. **Account deletion** — удаление аккаунта
8. **Интеграция оплаты** — ЮKassa для пополнения баланса
9. **2FA** — TOTP аутентификация
10. **Экспорт тредов** — PDF/Markdown
## Контекст
### Новые файлы UI:
```
backend/webui/src/
├── lib/
│ ├── auth.ts (NEW)
│ └── contexts/
│ └── AuthContext.tsx (NEW)
├── components/
│ └── auth/
│ ├── AuthModal.tsx (NEW)
│ ├── LoginForm.tsx (NEW)
│ ├── RegisterForm.tsx (NEW)
│ ├── ForgotPasswordForm.tsx (NEW)
│ ├── UserMenu.tsx (NEW)
│ └── index.ts (NEW)
└── app/
└── (auth)/
├── layout.tsx (NEW)
├── login/page.tsx (NEW)
├── register/page.tsx (NEW)
├── forgot-password/page.tsx (NEW)
└── reset-password/page.tsx (NEW)
```
### Модели:
| ID | Provider | Тариф |
|----|----------|-------|
| auto | ollama | Бесплатно |
| gooseek-1.0 | timeweb | По тарифу |
### Обновлённые файлы:
```
backend/webui/src/app/providers.tsx — AuthProvider + AuthModal
backend/webui/src/components/Sidebar.tsx — кнопки auth + профиль
```
### Хранение токенов:
```
localStorage:
- token: JWT access token
- refreshToken: refresh token
- user: JSON с данными пользователя
```
### Auth flow:
1. Гость видит кнопки "Войти" / "Регистрация" в сайдбаре
2. Клик открывает модальное окно (или переход на страницу)
3. После успешного входа — сохранение токенов, обновление UI
4. При истечении access token — автоматический refresh
5. При logout — очистка localStorage
### Роли в пространстве:
- `owner` — создатель, полные права
- `admin` — может приглашать/удалять участников
- `member` — может создавать треды