# FoodAI Backend Go REST API с авторизацией через Firebase, JWT и PostgreSQL. ## Стек - **Go 1.23** — язык - **chi** — HTTP-роутер - **pgx / pgxpool** — PostgreSQL-драйвер - **goose** — миграции - **golang-jwt/v5** — JWT - **Firebase Admin SDK** — верификация токенов ## Требования - Go 1.23+ - Docker & Docker Compose - [goose](https://github.com/pressly/goose) (`go install github.com/pressly/goose/v3/cmd/goose@latest`) - Файл `firebase-credentials.json` (сервисный аккаунт Firebase) ## Быстрый старт ### 1. Переменные окружения ```bash cp .env.example .env ``` Отредактируйте `.env`: | Переменная | Описание | По умолчанию | |---|---|---| | `DATABASE_URL` | DSN подключения к PostgreSQL | `postgres://food_ai:food_ai_local@localhost:5432/food_ai?sslmode=disable` | | `FIREBASE_CREDENTIALS_FILE` | Путь к JSON-ключу сервисного аккаунта Firebase | `./firebase-credentials.json` | | `JWT_SECRET` | Секрет для подписи JWT | — | | `JWT_ACCESS_DURATION` | Время жизни access-токена | `15m` | | `JWT_REFRESH_DURATION` | Время жизни refresh-токена | `720h` | | `PORT` | Порт сервера | `8080` | | `ALLOWED_ORIGINS` | CORS-разрешённые источники | `http://localhost:3000` | ### 2. Запуск через Docker Compose Поднимает PostgreSQL и собирает приложение: ```bash make docker-up ``` ### 3. Запуск локально (только БД в Docker) ```bash # Запустить только PostgreSQL docker compose up -d postgres # Применить миграции make migrate-up # Запустить сервер make run ``` ## Команды | Команда | Описание | |---|---| | `make run` | Запустить сервер в режиме разработки | | `make test` | Запустить unit-тесты | | `make test-integration` | Запустить интеграционные тесты (требует Docker) | | `make lint` | Проверить код через golangci-lint | | `make docker-up` | Поднять PostgreSQL + приложение | | `make docker-down` | Остановить контейнеры | | `make docker-logs` | Логи приложения | | `make migrate-up` | Применить миграции | | `make migrate-down` | Откатить последнюю миграцию | | `make migrate-status` | Статус миграций | | `make migrate-create name=` | Создать новую миграцию | ## API ### Публичные эндпоинты | Метод | Путь | Описание | |---|---|---| | `GET` | `/health` | Проверка состояния сервера и БД | | `POST` | `/auth/login` | Вход через Firebase ID-токен | | `POST` | `/auth/refresh` | Обновление JWT по refresh-токену | | `POST` | `/auth/logout` | Выход (инвалидация refresh-токена) | ### Защищённые эндпоинты (Bearer JWT) | Метод | Путь | Описание | |---|---|---| | `GET` | `/profile` | Получить профиль пользователя | | `PUT` | `/profile` | Обновить профиль пользователя | ### Примеры запросов **Логин:** ```bash curl -X POST http://localhost:8080/auth/login \ -H "Content-Type: application/json" \ -d '{"firebase_token": ""}' ``` **Получить профиль:** ```bash curl http://localhost:8080/profile \ -H "Authorization: Bearer " ``` **Обновить профиль:** ```bash curl -X PUT http://localhost:8080/profile \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"height_cm": 180, "weight_kg": 75.5, "age": 28, "gender": "male", "activity": "moderate", "goal": "maintain"}' ``` ## Структура проекта ``` backend/ ├── cmd/server/ # Точка входа ├── internal/ │ ├── auth/ # Firebase-верификация, JWT, сервис и хэндлер авторизации │ ├── config/ # Конфигурация через переменные окружения │ ├── database/ # Подключение к PostgreSQL (pgxpool) │ ├── middleware/ # RequestID, Logging, Recovery, CORS, Auth │ ├── server/ # Роутер (chi) │ ├── testutil/ # Вспомогательные утилиты для тестов │ └── user/ # Модель, репозиторий, сервис, хэндлер, расчёт калорий ├── migrations/ # SQL-миграции (goose) ├── .env.example ├── docker-compose.yml ├── Dockerfile └── Makefile ```