API для управления фильмами, жанрами и отзывами с системой аутентификации и ролями.
- Go 1.24 или выше
- PostgreSQL 16 или выше
- Docker и Docker Compose (опционально, для упрощенного запуска)
Самый простой способ запустить проект:
-
Запустите все сервисы (база данных + API + Admin):
docker-compose up -d
-
Миграции применяются автоматически при запуске API сервера.
-
Сервисы будут доступны на:
- API: http://localhost:8080
- Admin панель: http://localhost:8081
go mod downloadИспользуйте Docker Compose только для базы данных:
docker-compose up -d dbИли используйте свою локальную установку PostgreSQL.
# Создайте базу данных
createdb -U app app
# Примените миграции (требуется golang-migrate)
migrate -path internal/migrations -database "postgres://app:app@localhost:5432/app?sslmode=disable" upWindows (PowerShell):
$env:DB_DSN="postgres://app:app@localhost:5432/app?sslmode=disable"
$env:JWT_SECRET="your-secret-key-here-change-in-production"
$env:PORT="8080"
$env:MIGRATIONS_PATH="internal/migrations"Windows (CMD):
set DB_DSN=postgres://app:app@localhost:5432/app?sslmode=disable
set JWT_SECRET=your-secret-key-here-change-in-production
set PORT=8080
set MIGRATIONS_PATH=internal/migrationsLinux/Mac:
export DB_DSN="postgres://app:app@localhost:5432/app?sslmode=disable"
export JWT_SECRET="your-secret-key-here-change-in-production"
export PORT="8080"
export MIGRATIONS_PATH="internal/migrations"Или создайте файл .env (если используете инструмент для загрузки .env файлов).
go run cmd/api/main.goСервер будет доступен на http://localhost:8080
GET /api/v1/health- Проверка здоровья сервисаPOST /api/v1/auth/register- Регистрация нового пользователяPOST /api/v1/auth/login- Вход в системуGET /api/v1/genres- Список всех жанровGET /api/v1/genres/:id- Получить жанр по IDGET /api/v1/movies- Список всех фильмовGET /api/v1/movies/:id- Получить фильм по IDGET /api/v1/movies/:id/reviews- Список отзывов к фильмуGET /api/v1/users/:id/reviews- Список отзывов пользователя
GET /api/v1/me- Информация о текущем пользователеPUT /api/v1/me- Обновление профиля текущего пользователяPUT /api/v1/me/password- Изменение пароляGET /api/v1/me/reviews- Мои отзывыPOST /api/v1/movies/:id/reviews- Создать отзыв к фильмуPUT /api/v1/reviews/:id- Обновить отзывDELETE /api/v1/reviews/:id- Удалить отзыв
GET /api/v1/users- Список всех пользователейGET /api/v1/users/:id- Получить пользователя по IDPUT /api/v1/users/:id- Обновить пользователяPUT /api/v1/users/:id/role- Изменить роль пользователяDELETE /api/v1/users/:id- Удалить пользователяGET /api/v1/stats- Статистика системыGET /api/v1/audit-logs- Логи аудитаPOST /api/v1/genres- Создать жанрPUT /api/v1/genres/:id- Обновить жанрDELETE /api/v1/genres/:id- Удалить жанрPOST /api/v1/movies- Создать фильмPUT /api/v1/movies/:id- Обновить фильмDELETE /api/v1/movies/:id- Удалить фильм
API использует JWT токены для аутентификации. После регистрации или входа вы получите токен, который нужно передавать в заголовке:
Authorization: Bearer <your-token>
-
user - обычный пользователь (по умолчанию)
- Может создавать и управлять своими отзывами
- Может просматривать фильмы и жанры
- Может обновлять свой профиль
-
admin - администратор
- Все права пользователя
- Управление пользователями
- Управление фильмами и жанрами
- Просмотр статистики и логов аудита
При запуске API сервера миграции базы данных применяются автоматически. Путь к миграциям настраивается через переменную окружения MIGRATIONS_PATH.
Система включает background worker для обработки событий отзывов:
- Автоматическое обновление среднего рейтинга фильма при создании/обновлении/удалении отзыва
- Запись событий в audit log
Все действия с отзывами (создание, обновление, удаление) логируются в таблицу audit_logs для отслеживания активности пользователей.
В API включён простой in-memory rate limiting middleware:
- лимит: 60 запросов в минуту на один IP-адрес
- при превышении возвращается
429 Too Many Requestsс телом:{"error":"rate limit exceeded"}
API использует следующие middleware:
- Request ID - уникальный ID для каждого запроса
- Logger - логирование запросов
- Rate Limit - ограничение частоты запросов
- CORS - настройка CORS заголовков
- Body Limit - ограничение размера тела запроса (1MB)
- Auth - проверка JWT токена
- Role-based access control - проверка ролей для admin endpoints
В корне репозитория лежит файл postman_collection.json с примерными запросами:
- Auth: регистрация и логин (
/api/v1/auth/register,/api/v1/auth/login) - Genres: список и создание жанра (для admin)
- Movies: список и создание фильма (для admin)
- Reviews: создание отзыва авторизованным пользователем
Как использовать:
- Импортируйте
postman_collection.jsonв Postman. - В переменной
base_urlоставьтеhttp://localhost:8080или измените при необходимости. - Зарегистрируйте пользователя и залогиньтесь, возьмите токен и заполните:
{{admin_token}}— токен admin-пользователя{{user_token}}— токен обычного пользователя
| Переменная | Описание | Обязательная | По умолчанию |
|---|---|---|---|
PORT |
Порт для API сервера | Нет | 8080 |
DB_DSN |
Строка подключения к PostgreSQL | Да | - |
JWT_SECRET |
Секретный ключ для JWT токенов | Да | - |
MIGRATIONS_PATH |
Путь к файлам миграций | Нет | internal/migrations |
golang-project/
├── cmd/
│ ├── api/ # API сервер
│ └── admin/ # Admin панель
├── internal/
│ ├── database/ # Подключение к БД
│ ├── handler/ # HTTP обработчики
│ ├── middleware/ # Middleware
│ ├── migrations/ # SQL миграции
│ ├── models/ # Модели данных
│ ├── repository/ # Репозитории
│ ├── router/ # Роутинг
│ └── service/ # Бизнес-логика
└── pkg/ # Публичные пакеты
Для запуска тестов:
go test ./...Для запуска тестов с покрытием:
go test -cover ./...docker-compose downДля удаления данных базы данных:
docker-compose down -vThis project was developed by kbtu students as an students project for the Open Source / Digital Public Goods assignment.
This project contributes to UN Sustainable Development Goal 9 — Industry, Innovation and Infrastructure.
It provides a modern, fully open-source backend API that demonstrates how to build scalable digital services using Go, PostgreSQL and Docker. By publishing the complete source code, the project promotes technological innovation, knowledge sharing and reuse of infrastructure solutions.
- Passwords are stored using secure hashing.
- Authentication is performed via JWT tokens.
- Sensitive configuration (database credentials, JWT secret) is managed exclusively through environment variables and is never committed to the repository.
- Rate limiting (60 requests per minute per IP) is implemented to protect against abuse.
- The project follows security best practices and can be extended with additional privacy features if needed.
We welcome contributions!
Please read CONTRIBUTING.md for details on our code of conduct, development process, and how to submit pull requests.
This project is licensed under the MIT License — see the LICENSE file for details.
This project adheres to the Contributor Covenant Code of Conduct.
We expect all contributors and users to follow it to ensure a welcoming and inclusive environment.