Skip to content
This repository was archived by the owner on Feb 17, 2026. It is now read-only.

drillcoder/freedom-finance-test

Repository files navigation

Currency Rates API

PHP-приложение для получения курсов валют с сайта Центрального Банка России (cbr.ru).

Технологии

  • PHP 8.4 + Symfony 7.4
  • PostgreSQL 15 - основная база данных
  • RabbitMQ - брокер сообщений для асинхронной обработки
  • Redis - кеширование данных
  • Docker + Docker Compose - контейнеризация

Возможности

  • Получение курса валюты на указанную дату
  • Расчёт разницы курса с предыдущим торговым днём
  • Поддержка кросс-курсов (например, USD/EUR)
  • Кеширование данных в Redis
  • Асинхронный сбор данных через RabbitMQ воркеры
  • Консольная команда для загрузки исторических данных за 180 дней

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

1. Инициализация проекта

# Инициализировать проект (запуск, установка зависимостей, миграции)
make init

2. Загрузка исторических данных

# Отправить задачи в очередь
make fetch-rates

# Воркер уже запущен автоматически (сервис worker в docker compose)
# Можно проверить логи воркера:
docker compose logs -f worker

3. Использование API

API доступно по адресу: http://localhost:8080

Получение курса валюты

# Курс USD к рублю на конкретную дату
curl "http://localhost:8080/api/rate?date=2026-01-15&currency=USD"

# Курс EUR к рублю
curl "http://localhost:8080/api/rate?date=2026-01-15&currency=EUR"

# Кросс-курс USD к EUR
curl "http://localhost:8080/api/rate?date=2026-01-15&currency=USD&base=EUR"

Пример ответа

{
    "date": "2026-01-15",
    "currency": "USD",
    "base": "RUR",
    "rate": 88.123456,
    "diff": 0.234567,
    "previous_date": "2026-01-14"
}

Health Check

curl "http://localhost:8080/api/health"

API Reference

GET /api/rate

Получить курс валюты.

Параметры запроса:

Параметр Тип Обязательный Описание
date string Да Дата в формате Y-m-d
currency string Да Код валюты (USD, EUR, GBP и т.д.)
base string Нет Базовая валюта (по умолчанию RUR)

Ответ:

Поле Тип Описание
date string Дата курса
currency string Код валюты
base string Базовая валюта
rate float Курс валюты
diff float|null Разница с предыдущим торговым днём
previous_date string|null Дата предыдущего торгового дня

GET /api/health

Health check endpoint.

Архитектура

src/
├── Command/
│   └── FetchRatesCommand.php        # Консольная команда загрузки 
├── Controller/
│   └── CurrencyRateController.php   # REST API endpoints
├── Dto/
│   ├── CurrencyRateDto.php          # DTO для ответа API
│   └── RateDto.php                  # DTO для данных курса
├── Entity/
│   └── CurrencyRate.php             # Doctrine Entity (БД)
├── Message/
│   ├── FetchRatesMessage.php        # Сообщение для AMQP очереди
│   └── FetchRatesMessageHandler.php # Обработчик сообщений воркером
├── Repository/
│   └── CurrencyRateRepository.php   # Запросы к БД
└── Service/
    ├── Exception/                   # Исключения сервисов
    │   ├── CbrApiClientException.php
    │   └── CurrencyRateServiceException.php
    ├── CbrApiClient.php             # HTTP клиент для CBR API
    └── CurrencyRateService.php      # Бизнес-логика и кеширование

Makefile команды

Для управления проектом используй команды make:

# Инициализация проекта (один раз при клонировании)
make init

# Запуск/остановка контейнеров
make up
make down
make restart

# Логи
make logs

# Доступ в контейнер PHP
make shell

# Установка зависимостей и миграции
make composer
make migrate

# Загрузка курсов за N дней (по умолчанию 180)
make fetch-rates DAYS=10

# Очистка кеша Redis (все данные)
make cache-clear

# Запуск тестов
make test

# Показать все доступные команды
make help

Docker Services

Сервис Порт Описание
nginx 8080 Web сервер
php 9000 PHP-FPM
worker - Symfony Messenger worker
postgres 5432 PostgreSQL база данных
rabbitmq 5672, 15672 RabbitMQ (15672 - management UI)
redis 6379 Redis кеш

RabbitMQ Management

Доступен по адресу: http://localhost:15672

  • Username: guest
  • Password: guest

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

Используй .env.local для локальных секретов (например, APP_SECRET).

Переменная По умолчанию Описание
APP_ENV dev Окружение (dev/prod)
APP_SECRET - Секретный ключ приложения
DATABASE_URL - URL подключения к PostgreSQL
MESSENGER_TRANSPORT_DSN - URL подключения к RabbitMQ
REDIS_URL - URL подключения к Redis

About

Тестовое задание в компанию Freedom Finance Technologies. Позиция - Senior PHP Developer

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages