Skip to content
oschurPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Rent App API

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 миграции для базы данных

Почему такая архитектура?

  1. Разделение ответственности - каждый слой отвечает за свою часть и только за нее
  2. Тестируемость - написание unit-тестов для каждого слоя делается без особых проблем
  3. Гибкость - можно менять реализацию (например, заменить PostgreSQL на другую БД) без изменения бизнес-логики
  4. Масштабируемость - легко добавлять новый функционал
  5. Разделяемость - возможность к декомпозиции модулей на микросервисы

Установка и запуск

  1. Клонируйте репозиторий:
git clone https://github.com/oschur/rent-app.git
  1. Создайте файл .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
  1. Запустите приложение:
docker compose up -d
  1. Проверьте, что все работает:
curl http://localhost:8080/
  1. Откройте Swagger документацию:

  2. Получите JWT токены

    • В /api/auth/login передайте следующее:
    {
    "email": "admin@test.com",
    "password": "admin123"
    }
    
  3. Авторизируйтесь

    • В поле Authorize вставьте следующее "Bearer ваш_access_token"
  4. Готово!

    • Теперь вы можете делать всё, что посчитаете нужным

Основные функции

Аутентификация

  • 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 (администратор) - полный доступ ко всем функциям и данным

Тестирование (проект покрыт тестами на 90%)

Для запуска тестов:

go test ./...              // для прохождения тестов в internal/repository необходим запуск базы данных

База данных

Проект использует PostgreSQL с следующими таблицами:

  • users - информация о пользователях
  • apartments - объявления о квартирах
  • refresh_token_blacklist - черный список отозванных refresh токенов

Первый администратор

При первом запуске автоматически создается администратор:

  • Email: admin@test.com
  • Пароль: admin123

Конфигурация

Приложение использует переменные окружения (через .env файл):

  • PORT - порт для запуска API (по умолчанию: 8080)
  • ENV - окружение: development, staging, production
  • DB_DSN - строка подключения к PostgreSQL
  • JWT_SECRET_KEY - секретный ключ для подписи JWT токенов (минимум 32 символа)

Docker

Проект полностью контейнеризирован:

  • postgres - база данных PostgreSQL
  • migrate - автоматическое применение миграций
  • rent-app - само приложение

Что я изучил, работая над проектом

  1. Go (Golang) - за время работы над проектом я стал гораздо меньше путаться в синтаксисе, начал "чувствовать" язык
  2. Clean Architecture - разделение на слои, инверсия зависимостей, принципы SOLID
  3. REST API - HTTP методы, статус коды, работа с JSON
  4. Базы данных - PostgreSQL, SQL запросы, миграции, индексы
  5. Аутентификация - JWT токены, access и refresh токены, middleware
  6. Docker - контейнеризация, Docker Compose, работа с yml файлами
  7. Тестирование - прокачал навык написания unit-тестов; на практике понял необходимость тестирования кода
  8. Документация - научился работать со Swagger

Возможные улучшения

Потенциально я бы хотел развивать проект в следующем направлении:

  • Добавить загрузку изображений для квартир
  • Реализовать кэширование через Redis
  • Добавить новые модули (к примеру, модуль нотификации для оповещения арендатора о бронировании квартиры, модуль оплаты)
  • При разрастании проекта реализовать его в парадигме микросервисной архитектуры

Автор

Yuri Oschepkov

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages