Russian productive calendar with REST API. Kalendar, because it is written in Kotlin.
Приложение для получения данных из производственного календаря Российской Федерации по REST API.
Всё становится лучше с Docker
docker build --no-cache -t productive-kalendar .
docker run -it --rm -p 8080:8080 productive-kalendar
После чего приложение доступно по адресу http://localhost:8080/
Тут всё типично для приложения spring-boot и gradle-wrapper.
./gradlew build
./gradlew build -x test
В проекте используется статический анализ и линтинг средствами detekt.
./gradlew detektCheck
./gradlew bootRun
Информация о выходных днях извлекается из csv-файла, последняя версия которого скачивается с портала открытых данных РФ (https://data.gov.ru/opendata/7708660670-proizvcalendar). На 2018-08-29 портал предоставляет данные с 1999 г. по 2025 г., однако данные 2019-2025 г. ещё не утверждены правительством РФ и являются приблизительными.
POST http://localhost:8080/api/command/parse/gov
RESPONSE обновленный список дат выходных дней в формате json
Далее {date} - это дата в формате гггг-ММ-дд, например 2018-08-18.
В запросах, где предполагается интервал дат, последняя дата не включается. Если даты одинаковые, то в ответе будет 0. Если одна из дат интервала не указана, то вместо неё будет использоваться текущая дата. Если обе даты не указаны, то будет возбуждено исключение и получите ошибку 400 "Incorrect request. Start and end together must not be null".
GET http://localhost:8080/api/query/is/{date}/holiday
RESPONSE boolean, true - выходной, false - рабочий день
GET http://localhost:8080/api/query/is/tomorrow/holiday
RESPONSE boolean, true - выходной, false - рабочий день
GET http://localhost:8080/api/query/all/holidays
RESPONSE отсортированный по возрастанию список дат
{year} - Int, год в диапазоне [1999, 2100]
GET http://localhost:8080/api/query/{year}/holidays
RESPONSE отсортированный по возрастанию список дат. Если за указанный год в системе нет информации, то вернется пустой список
Опциональный параметр inclusive типа Boolean определяет, включает ли подсчет дату end в интервал или нет. По умолчанию false
POST http://localhost:8080/api/query/workdays/between
Content-Type: application/json
{
"start": "{date}",
"end": "{date}",
"inclusive": {true or false(default)}
}
RESPONSE Int - количество рабочих дней между датами
Опциональный параметр inclusive типа Boolean определяет, включает ли подсчет дату end в интервал или нет. По умолчанию false
POST http://localhost:8080/api/query/holidays/between
Content-Type: application/json
{
"start": "{date}",
"end": "{date}",
"inclusive": {true or false(default)}
}
RESPONSE Int - количество выходных дней между датами
GET http://localhost:8080/api/query/productive-calendar
RESPONSE { "holidays": ['1999-01-01', ...], "preholidays": ['1999-03-07', ...] }
{year} - Int, год в диапазоне [1999, 2100]
GET http://localhost:8080/api/query/{year}/productive-calendar
RESPONSE { "holidays": ['2018-01-01', ...], "preholidays": ['2018-03-07', ...] }
GET http://localhost:8080/api/query/day/{date}/type
RESPONSE одно из значений перечисления: WORKDAY, HOLIDAY, PREHOLIDAY
GET http://localhost:8080/api/query/day/tomorrow/type
RESPONSE одно из значений перечисления: WORKDAY, HOLIDAY, PREHOLIDAY
Есть возможность поднять Telegram-бота, который будет стучаться в календарь.