Требуется реализовать серверное приложение, реализующее проксирование с кешированием для сервиса погоды. Сервер должен предоставлять HTTP API с одним методом для получения погоды в заданной локации и заданный момент (текущий или прошедший). Для доступа к данным о погоде предлагается использовать OpenWeatherMap API (достаточно использовать информацию о погоде в текущий момент времени). При запросе к серверу, он должен использовать кеш, если там присутствуют данные (возможна загрузка данных с погрешностью по времени/локацией). Кеш должен наполняться автоматически в фоне для списка локаций с заданным интервалом.
На выходе должен быть проект Stack (с одним пакетом). В пакете должна быть библиотека и один исполняемый модуль (кеш-сервер).
Ключ API для OpenWeatherMap должен извлекаться из переменной окружения. API root может быть указан в аргументах командной строки или в переменной окружения (по умолчанию стоит использовать API root сервиса).
Сервер для запуска должен принимать следующие параметры (либо из аргументов командной строки, либо из переменных окружения, либо из конфигурационного файла):
- Номер порта, на котором запуститься.
- Список локаций, для которых необходимо автоматическое кеширование.
- (опционально) период автоматических обновлений
- (опционально) допустимые погрешности для локаций и/или времени.
Также опционально сервер может поддерживать Swagger/OpenAPI спецификацию (servant-swagger или servant-openapi3) и раздавать Swagger UI (servant-swagger-ui).
- Для описания API и реализации сервера используй библиотеку servant.
- Для работы с форматом JSON используй библиотеку aeson.
- Для работы с аргументами командной строки можешь использовать библиотеку optparse-applicative.
- Для конфигурационного файла можешь использовать YAML или Dhall.
- Для запросов к OpenWeatherMap API можешь использовать servant-client или поискать другие решения.
stack upgrade # до последней версии
stack new myproj # создаем проект
Потом идем в myproj/package.yaml, добавляем сервант зависимостью в библиотеку нашего пакета так
library:
source-dirs: src
dependencies:
- servant
и потом
cd myproj
stack build