Skip to content

Cпроектировать и реализовать REST-сервис для агрегации данных об онлайн подписках пользователей.

Notifications You must be signed in to change notification settings

prokhin/Effective_Mobile_GO

Repository files navigation

🚀 REST-сервис для агрегации данных об онлайн-подписках пользователей

Высокопроизводительный REST API на Go для управления подписками пользователей с полной документацией и тестированием.

📋 Обзор проекта

Это проект демонстрирует лучшие практики Go-разработки включая чистую архитектуру, полное тестирование, Docker контейнеризацию и Swagger документацию.

✨ Ключевые особенности

  • 🏗️ Чистая архитектура с разделением ответственности
  • 🧪 Полное тестовое покрытие (unit, integration, load tests)
  • Высокая производительность - 2689 запросов/сек
  • 🐳 Docker готовность с многоэтапной сборкой
  • 📚 Swagger документация с интерактивным UI
  • 🔒 Типизированная обработка ошибок и валидация
  • 📊 Подробное логирование запросов
  • 🎯 PostgreSQL с миграциями

🏛️ Архитектура

cmd/
├── api/           # Главный вход приложения
└── migrate/       # Утилита миграций

internal/
├── config/        # Управление конфигурацией
├── database/      # Подключение к БД
├── errors/        # Типизированные ошибки
├── handler/       # HTTP обработчики
├── middleware/    # Middleware (логирование, CORS)
├── model/         # Модели данных
├── repository/    # Слой доступа к данным
├── response/      # Стандартизация API ответов
├── service/       # Бизнес-логика
└── validation/    # Валидация входных данных

tests/             # Интеграционные и нагрузочные тесты
docs/              # Swagger документация
migrations/        # SQL миграции

🚀 Быстрый старт

Требования

  • Go 1.25+
  • PostgreSQL 15+
  • Docker & Docker Compose

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

  1. Клонирование репозитория
git clone <repository-url>
cd Effective_Mobile_GO
  1. Настройка окружения
cp .env.example .env
# Настройте параметры подключения к БД в .env
  1. Запуск с Docker Compose
docker-compose up -d
  1. Запуск миграций
go run ./cmd/migrate
  1. Запуск приложения
go run ./cmd/api

Сервис будет доступен по адресу: http://localhost:8080

📚 API Документация

Swagger UI

Откройте в браузере: http://localhost:8080/swagger/

Основные эндпоинты

Метод Эндпоинт Описание
POST /subscriptions Создать подписку
GET /subscriptions Получить все подписки
GET /subscriptions/{id} Получить подписку по ID
PUT /subscriptions/{id} Обновить подписку
DELETE /subscriptions/{id} Удалить подписку
GET /subscriptions/total Рассчитать общую стоимость

Примеры запросов

Создание подписки:

curl -X POST http://localhost:8080/subscriptions \
  -H "Content-Type: application/json" \
  -d '{
    "service_name": "Netflix",
    "price": 899,
    "user_id": "550e8400-e29b-41d4-a716-446655440000",
    "start_date": "01-2026",
    "end_date": "12-2026"
  }'

Расчет общей стоимости:

curl "http://localhost:8080/subscriptions/total?user_id=550e8400-e29b-41d4-a716-446655440000&period_start=01-2026&period_end=12-2026"

🧪 Тестирование

Запуск всех тестов

go test ./... -v

Unit тесты

go test ./internal/validation -v
go test ./internal/handler -v

Интеграционные тесты

go test ./tests -v

Нагрузочные тесты

go test ./tests -v -run TestConcurrentSubscriptions

📊 Результаты тестирования

✅ Unit тесты

  • Валидация: 25 тестов - 100% пройдено
  • Обработчики: 3 теста - 100% пройдено

✅ Интеграционные тесты

  • Все CRUD операции - 100% пройдено
  • Расчет стоимости - 100% пройдено

⚡ Нагрузочные тесты

  • 50 одновременных запросов: 100% успех
  • Производительность: 2689 запросов/сек
  • Время ответа: ~18мс

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

Переменные окружения

# База данных
DB_HOST=localhost
DB_PORT=5432
DB_USER=admin
DB_PASSWORD=superpassword
DB_NAME=auth_system
DB_SSLMODE=disable

# Сервер
SERVER_PORT=8080
SERVER_READ_TIMEOUT=30s
SERVER_WRITE_TIMEOUT=30s

🗄️ База данных

Миграции

CREATE TABLE subscriptions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    service_name VARCHAR(100) NOT NULL,
    price INTEGER NOT NULL CHECK (price > 0),
    user_id UUID NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

Индексы

  • idx_subscriptions_user_id - для фильтрации по пользователям
  • idx_subscriptions_service_name - для поиска по названию
  • idx_subscriptions_start_date - для фильтрации по датам

📦 Сборка и развертывание

Локальная сборка

go build -o main ./cmd/api
./main

Docker сборка

docker build -t effective-mobile-go .
docker run -p 8080:8080 effective-mobile-go

Docker Compose

docker-compose up --build

🔍 Мониторинг и логирование

Структура логов

{
  "level": "info",
  "msg": "Request completed: GET /subscriptions - Status: 200 - Duration: 1.2ms - ID: uuid"
}

Метрики производительности

  • Время ответа каждого запроса
  • HTTP статус коды
  • Уникальные ID запросов для трассировки

🛠️ Разработка

Структура проекта

Проект следует принципам чистой архитектуры:

  • Handler - обработка HTTP запросов
  • Service - бизнес-логика
  • Repository - доступ к данным
  • Model - модели данных
  • Validation - валидация входных данных

Добавление новых эндпоинтов

  1. Создать модель в internal/model/
  2. Добавить валидацию в internal/validation/
  3. Реализовать бизнес-логику в internal/service/
  4. Добавить репозиторий в internal/repository/
  5. Создать обработчик в internal/handler/
  6. Зарегистрировать роут в cmd/api/main.go

🤝 Вклад в проект

  1. Fork репозитория
  2. Создать feature ветку
  3. Внести изменения
  4. Написать тесты
  5. Запустить все тесты
  6. Создать Pull Request

📄 Лицензия

MIT License

👨‍💻 Автор

Разработано с любовью к Go и чистому коду.


🎯 Результаты

Все требования выполнены:

  • CRUD операции для подписок
  • Расчет суммарной стоимости
  • PostgreSQL с миграциями
  • Покрытие логами
  • Конфигурация в .env
  • Swagger документация
  • Docker Compose

Дополнительные улучшения:

  • Чистая архитектура
  • Полное тестирование
  • Высочайшая производительность
  • Типизированные ошибки
  • Middleware для логирования и CORS
  • Нагрузочные тесты

About

Cпроектировать и реализовать REST-сервис для агрегации данных об онлайн подписках пользователей.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published