Phase 1: Foundation — backend auth, frontend shell, Docker setup
Backend (FastAPI): - App factory with async SQLAlchemy 2.0 + PostgreSQL - Alembic migration for users and sessions tables - JWT auth (access + refresh tokens, bcrypt passwords) - Auth endpoints: register, login, refresh, logout, me - Admin seed script, role-based access deps Frontend (React + TypeScript): - Vite + Tailwind CSS + shadcn/ui theme (health-oriented palette) - i18n with English and Russian translations - Zustand auth/UI stores with localStorage persistence - Axios client with automatic token refresh on 401 - Login/register pages, protected routing - App layout: collapsible sidebar, header with theme/language toggles - Dashboard with placeholder stats Infrastructure: - Docker Compose (postgres, backend, frontend, nginx) - Nginx reverse proxy with WebSocket support - Dev override with hot reload Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
57
frontend/public/locales/en/translation.json
Normal file
57
frontend/public/locales/en/translation.json
Normal file
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"auth": {
|
||||
"login": "Log In",
|
||||
"register": "Sign Up",
|
||||
"email": "Email",
|
||||
"password": "Password",
|
||||
"confirmPassword": "Confirm Password",
|
||||
"username": "Username",
|
||||
"fullName": "Full Name",
|
||||
"rememberMe": "Remember me",
|
||||
"submit": "Submit",
|
||||
"noAccount": "Don't have an account?",
|
||||
"hasAccount": "Already have an account?",
|
||||
"loginTitle": "Welcome Back",
|
||||
"loginSubtitle": "Sign in to your account",
|
||||
"registerTitle": "Create Account",
|
||||
"registerSubtitle": "Get started with your personal AI assistant",
|
||||
"errors": {
|
||||
"invalidCredentials": "Invalid email or password",
|
||||
"emailExists": "User with this email or username already exists",
|
||||
"passwordMismatch": "Passwords do not match",
|
||||
"passwordMinLength": "Password must be at least 8 characters",
|
||||
"usernameFormat": "Username must be 3-50 characters (letters, numbers, _ or -)",
|
||||
"required": "This field is required"
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
"dashboard": "Dashboard",
|
||||
"chats": "Chats",
|
||||
"documents": "Documents",
|
||||
"memory": "Memory",
|
||||
"notifications": "Notifications",
|
||||
"profile": "Profile",
|
||||
"logout": "Log Out",
|
||||
"settings": "Settings",
|
||||
"admin": "Admin",
|
||||
"users": "Users",
|
||||
"context": "Context",
|
||||
"skills": "Skills"
|
||||
},
|
||||
"dashboard": {
|
||||
"welcome": "Welcome, {{name}}",
|
||||
"subtitle": "Your personal AI health assistant"
|
||||
},
|
||||
"common": {
|
||||
"loading": "Loading...",
|
||||
"error": "An error occurred",
|
||||
"notFound": "Page not found",
|
||||
"goHome": "Go to Dashboard",
|
||||
"save": "Save",
|
||||
"cancel": "Cancel",
|
||||
"delete": "Delete",
|
||||
"edit": "Edit",
|
||||
"create": "Create",
|
||||
"search": "Search"
|
||||
}
|
||||
}
|
||||
57
frontend/public/locales/ru/translation.json
Normal file
57
frontend/public/locales/ru/translation.json
Normal file
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"auth": {
|
||||
"login": "Войти",
|
||||
"register": "Регистрация",
|
||||
"email": "Email",
|
||||
"password": "Пароль",
|
||||
"confirmPassword": "Подтвердите пароль",
|
||||
"username": "Имя пользователя",
|
||||
"fullName": "Полное имя",
|
||||
"rememberMe": "Запомнить меня",
|
||||
"submit": "Отправить",
|
||||
"noAccount": "Нет аккаунта?",
|
||||
"hasAccount": "Уже есть аккаунт?",
|
||||
"loginTitle": "С возвращением",
|
||||
"loginSubtitle": "Войдите в свой аккаунт",
|
||||
"registerTitle": "Создать аккаунт",
|
||||
"registerSubtitle": "Начните работу с персональным ИИ-ассистентом",
|
||||
"errors": {
|
||||
"invalidCredentials": "Неверный email или пароль",
|
||||
"emailExists": "Пользователь с таким email или именем уже существует",
|
||||
"passwordMismatch": "Пароли не совпадают",
|
||||
"passwordMinLength": "Пароль должен содержать минимум 8 символов",
|
||||
"usernameFormat": "Имя пользователя: 3-50 символов (буквы, цифры, _ или -)",
|
||||
"required": "Это поле обязательно"
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
"dashboard": "Главная",
|
||||
"chats": "Чаты",
|
||||
"documents": "Документы",
|
||||
"memory": "Память",
|
||||
"notifications": "Уведомления",
|
||||
"profile": "Профиль",
|
||||
"logout": "Выйти",
|
||||
"settings": "Настройки",
|
||||
"admin": "Администрирование",
|
||||
"users": "Пользователи",
|
||||
"context": "Контекст",
|
||||
"skills": "Навыки"
|
||||
},
|
||||
"dashboard": {
|
||||
"welcome": "Добро пожаловать, {{name}}",
|
||||
"subtitle": "Ваш персональный ИИ-ассистент по здоровью"
|
||||
},
|
||||
"common": {
|
||||
"loading": "Загрузка...",
|
||||
"error": "Произошла ошибка",
|
||||
"notFound": "Страница не найдена",
|
||||
"goHome": "На главную",
|
||||
"save": "Сохранить",
|
||||
"cancel": "Отмена",
|
||||
"delete": "Удалить",
|
||||
"edit": "Редактировать",
|
||||
"create": "Создать",
|
||||
"search": "Поиск"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user