REST API для управления арендой квартир, написанный на Go. Проект создан в первую очередь для изучения backend разработки, архитектуры приложений и работы с базами данных.
Rent App API позволяет пользователям:
- Регистрироваться и входить в систему
- Создавать и управлять объявлениями о сдаче квартир
- Просматривать доступные квартиры с фильтрацией
- Управлять информацией профиля
- Работать через роли: обычный пользователь, арендодатель, администратор
- Go (Golang) язык программирования для создания API
- PostgreSQL реляционная база данных для хранения информации
- JWT (JSON Web Tokens) для аутентификации и авторизации пользователей
- Docker для контейнеризации и упрощения развертывания
- Swagger для автоматической документации API
Проект использует Clean Architecture (чистая архитектура), в соответствии с принципами которой код разделен на слои:
cmd/api/main.go // точка входа в приложение
docs/ // документация
internal/domain/... // инициализация доменных сущностей
internal/repository/... // слой доступа к базе данных
internal/service/... // реализация бизнес-логики
internal/handler/... // реализация http-хендлеров
internal/middleware/auth // middleware для аутентификации
internal/config // конфигурация приложения
internal/database // подключение к базе данных
internal/context // контекст для интеграции слоев
internal/adapter // адаптер для интеграции слоев
migrations/ // SQL миграции для базы данных
- Разделение ответственности - каждый слой отвечает за свою часть и только за нее
- Тестируемость - написание unit-тестов для каждого слоя делается без особых проблем
- Гибкость - можно менять реализацию (например, заменить PostgreSQL на другую БД) без изменения бизнес-логики
- Масштабируемость - легко добавлять новый функционал
- Разделяемость - возможность к декомпозиции модулей на микросервисы
- Клонируйте репозиторий:
git clone https://github.com/oschur/rent-app.git- Создайте файл
.envв корне проекта:
POSTGRES_USER=admin
POSTGRES_PASSWORD=admin
POSTGRES_DB=users
POSTGRES_PORT=5432
DB_DSN=postgres://admin:admin@postgres:5432/users?sslmode=disable
PORT=8080
ENV=development
JWT_SECRET_KEY=your-secret-key-here-min-32-characters-for-production- Запустите приложение:
docker compose up -d- Проверьте, что все работает:
curl http://localhost:8080/-
Откройте Swagger документацию:
- Перейдите в браузере: http://localhost:8080/swagger/index.html
-
Получите JWT токены
- В /api/auth/login передайте следующее:
{ "email": "admin@test.com", "password": "admin123" } -
Авторизируйтесь
- В поле Authorize вставьте следующее "Bearer ваш_access_token"
-
Готово!
- Теперь вы можете делать всё, что посчитаете нужным
- POST /api/auth/login - вход в систему (получение JWT токенов)
- POST /api/auth/refresh - обновление access токена через refresh токен
- POST /api/users - регистрация нового пользователя
- GET /api/users - получить всех пользователей (только для админов)
- GET /api/users/{id} - получить пользователя по ID (только для админов)
- PUT /api/users/{id} - обновить информацию о пользователе
- PUT /api/users/{id}/reset-password - сбросить пароль
- DELETE /api/users/{id} - удалить пользователя
- POST /api/apartments - создать объявление о квартире (для landlords и админов)
- GET /api/apartments - получить список квартир (с фильтрацией)
- GET /api/apartments/{id} - получить квартиру по ID
- GET /api/apartments/owner/{ownerID} - получить квартиры владельца
- PUT /api/apartments/{id} - обновить информацию о квартире
- DELETE /api/apartments/{id} - удалить квартиру
Доступные query параметры для GET /api/apartments:
country- фильтр по странеcity- фильтр по городуmin_area_m2,max_area_m2- фильтр по площадиrooms- количество комнатfloor- этажpets_allowed- разрешены ли животныеmin_price,max_price- фильтр по цене
GET /api/apartments?city=Berlin&min_price=500&max_price=1000
- Обычный пользователь - может управлять только своим профилем
- Landlord (арендодатель) - может создавать свои объявления и управлять ими
- Admin (администратор) - полный доступ ко всем функциям и данным
Для запуска тестов:
go test ./... // для прохождения тестов в internal/repository необходим запуск базы данныхПроект использует PostgreSQL с следующими таблицами:
users- информация о пользователяхapartments- объявления о квартирахrefresh_token_blacklist- черный список отозванных refresh токенов
При первом запуске автоматически создается администратор:
- Email:
admin@test.com - Пароль:
admin123
Приложение использует переменные окружения (через .env файл):
PORT- порт для запуска API (по умолчанию: 8080)ENV- окружение: development, staging, productionDB_DSN- строка подключения к PostgreSQLJWT_SECRET_KEY- секретный ключ для подписи JWT токенов (минимум 32 символа)
Проект полностью контейнеризирован:
- postgres - база данных PostgreSQL
- migrate - автоматическое применение миграций
- rent-app - само приложение
- Go (Golang) - за время работы над проектом я стал гораздо меньше путаться в синтаксисе, начал "чувствовать" язык
- Clean Architecture - разделение на слои, инверсия зависимостей, принципы SOLID
- REST API - HTTP методы, статус коды, работа с JSON
- Базы данных - PostgreSQL, SQL запросы, миграции, индексы
- Аутентификация - JWT токены, access и refresh токены, middleware
- Docker - контейнеризация, Docker Compose, работа с yml файлами
- Тестирование - прокачал навык написания unit-тестов; на практике понял необходимость тестирования кода
- Документация - научился работать со Swagger
Потенциально я бы хотел развивать проект в следующем направлении:
- Добавить загрузку изображений для квартир
- Реализовать кэширование через Redis
- Добавить новые модули (к примеру, модуль нотификации для оповещения арендатора о бронировании квартиры, модуль оплаты)
- При разрастании проекта реализовать его в парадигме микросервисной архитектуры
Yuri Oschepkov
- Email: genda5656@gmail.com
- Telegram: t.me/happy_jury