За основу приложения взят фреймворк Lumen Для удобства развёртывания, добавлен пакет asavenkov/sail-lumen В приложении используется сервис-репозиторный подход
- Для запуска необходим установленный, Docker Compose
- Установите зависимости
composer install --ignore-platform-reqs
с игнорированием требований в случае, если локальная версия php ниже требуемой - Создадим алиас для команды sail
alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail
- Перед запуском контейнеров необходимо заполнить переменные окружения в файле .env по примеру .env.example
- Запускаем контейнеры
sail up -d
Также можно воспользоваться Makefile при условии если у вас установлен make - После запуска контейнеров необходимо выполнить миграции
sail artisan migrate
- В базовый образ Dockerfile добавлен демон crontab c расписанием
- crontab запускается supervisor в качестве worker
- в Kernal реализуется запуск команды AddNewArticlesByThemes по расписанию из настроек
- команда AddNewArticlesByThemes берёт из настроек темы для парсинга и в цикле добавляет AddNewArticleJob c темой в очередь
- Далее происходи вызов команды обработки очереди
Artisan::call('queue:work --stop-when-empty --daemon')
Драйвером очереди настроен Redis - AddNewArticleJob обращается к сервису добавления статей ArticleService, который используя сервис GetArticlesFromApiService и репозиторий ArticleRepository получает статьи из внешнего API и сохраняет их в базу данных
- В случае если в базе данных уже есть статьи с идентичной темой, то данная статья не сохраняется
- Микросервис получает запросы по GET маршруту:
api/v1/articles
- В качестве GET параметров можно передать следующие фильтры:
source=Reuters // фильтр по источнику новостей, может не передаваться
theme=bitcoin // фильтр по теме статьи, может не передаваться
published_at=2022/03/02 // фильтр по дате опубликования статьи, может не передаваться, только дата
- При неверном формате фильтра могут возникнуть ошибки валидации, например:
{
"error_type": "Validation errors",
"errors": {
"published_at": [
"The published at is not a valid date."
]
}
}
- Дополнительно есть возможность поиска по подстроке в атрибутах статьи theme, author, title, description, content, source
search_in=title_substring // Где title это название атрибута а substring - искомая подстрока
- При несоблюдении данного синтаксиса могут возникать ошибки валидации, например:
{
"error_type": "Validation errors",
"errors": {
"search_in": [
"Field value in not in accepted list"
]
}
}
- Ответ на запрос отправляется а виде json с ключем
result
{
"result": [
{
"theme": "litecoin",
"author": null,
"title": "EU checking if cryptoassets being used to bust Russian sanctions - EU official - Reuters",
"description": "The European Commission is studying whether cryptoassets are being used to get round financial sanctions imposed on Russian banks following the country's invasion of Ukraine, a senior European Union official said on Wednesday.",
"url": "https://www.reuters.com/technology/eu-checking-if-cryptoassets-being-used-bust-russian-sanctions-eu-official-2022-03-02/",
"image_url": "https://www.reuters.com/resizer/Vy3OPpFOIGA6zpWKlo4HR7HmJDY=/1200x628/smart/filters:quality(80)/cloudfront-us-east-2.images.arcpublishing.com/reuters/2FHQFCQIZJK6LEZTN6S6YS34KY.jpg",
"published_at": "2022-03-02 11:03:00",
"content": "Representations of cryptocurrencies Bitcoin, Ethereum, DogeCoin, Ripple, and Litecoin are seen in front of a displayed Binance logo in this illustration taken, June 28, 2021. REUTERS/Dado Ruvic/Illus… [+1327 chars]",
"source": "Reuters"
},
//...
]
}
- В настройках можно изменить api - поставщика данных для микросервиса а также время кеширования в .env:
#Базовый url для внешнего api, например https://newsapi.org/v2/everything
NEWS_API_BASE_URL=
#Ключ api
NEWS_API_KEY=
#Язык на котором необходимо получить ответ, по умолчанию стоит "ru"
NEWS_API_RESULT_LANG=ru
#Темы, по которым необходимо получить новости, разделяются запятой:
#"bitcoin,litecoin,ripple,dash,ethereum"
ARTICLES_THEMES=
#Задержка в минутах между запросами к внешнему api для получения новостей
#Миниальным знаенчением является 1 раз в минуту (настройка crontab)
PER_ARTICLE_REQUEST_DELAY=