Skip to content

jmorozov/productive-kalendar

Repository files navigation

productive-kalendar

Build Status

Russian productive calendar with REST API. Kalendar, because it is written in Kotlin.

productive-kalendar [RU]

Приложение для получения данных из производственного календаря Российской Федерации по REST API.

Run

Docker

Всё становится лучше с 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

API

Обновить информацию в календаре

Информация о выходных днях извлекается из 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 bot

Есть возможность поднять Telegram-бота, который будет стучаться в календарь.