ссылка на техническое задание: https://docs.google.com/document/d/1BtmVY7XE2uyYn0LgYnYrk2yEIpmrZ3tcUnX_hrOz9C8/edit?usp=sharing
Weather Grid Service — это REST API-сервис, предназначенный для получения, хранения и кэширования погодных данных на основе регулярной географической сетки. Система разработана для агросегментационных задач и использует внешнее погодное API (Open-Meteo) с привязкой к координатной сетке, а не к конкретным полям.
-
Добавление пользователя в систему:
- Добавление пользователя с параметром: Имя
-
Добавления полей в систему:
- Добавление поля с характеристиками:
- Долгота, широта, тип орошения и урожая, наименования поля, размер участка(hA), углеводы
- Добавление поля с характеристиками:
-
Получение прогноза погоды:
- Прогноз погоды по координатам поля запрашивается с помощью Open-Meteo API
- Прогноз кэшируется в Redis
- Параметры прогноза: температура, осадки, влажность, давление, облачность, скорость и направление ветра, снежный покров и др.
-
Автоматическое и ручное заполнение истории:
- История погоды сохраняется в БД (weather_daily_history) по каждому узлу сетки к которым привязаны поля.
- Поддерживается ручной вызов эндпоинта и автоматическое обновление по расписанию через @Scheduled
-
Журналирование и логирование:
- Все создания записей записываются в журнал через Slf4j от Lombok.
- Логи сохраняются в файл.
-
API:
- REST API реализовано для всех действий, с подробной документацией через Swagger.
- Java 21
- Spring Boot
- Spring Data JPA
- Redis
- MapStruct
- PostgresSQL
- PostGIS
- JTS
- Spring WebFlux
- Docker
- Lombok
- Liquibase (для миграций)
- Leaflet
- Open-Meteo API
- Maven
- Созданы таблицы для:
- weather_locations, users, fields, weather_daily_history, country_boundaries.
- Созданы модели и репозитории для:
- weatherLocations, users, fields, weatherDailyHistory & weatherDailyHistoryId(@Embeddable).
- Redis: используется для кэширования данных прогноза погоды по узлам сетки. Позволяет значительно снизить количество обращений к внешнему API Open-Meteo. Ключи формируются по шаблону forecast:loc_ID_{id}, время жизни кэша (TTL) — от 1 до 3 часов.
- Slf4j: Логирование всех действий через Lombok Slf4j.
- ScheduledConfig: Для активации планировщика создании записей.
- GlobalExceptionHandler: Исключения обрабатываются централизованно для каждой сущности.
- Все DTO, принимаемые через POST и PUT запросы, проходят валидацию на корректность. Дополнительно для класса FieldDto реализована кастомная аннотация для проверки некоторых константных значений.
- Реализована логика на основе паттернов "Синглтон" & "фабричный" для проверки различных данных.
- Регистрация пользователей и создание полей с привязкой пользователей.
- Управление ресурсами (CRUD).
- Ручное добавление записей(истории) локации привязанные к полям.
- Автоматическое добавление записей(истории) у локации привязанные к полю.
- Чтение и проверка нормы прогнозы погод у локаций.
- Кэширование реактивных объектов: благодаря Spring Cache и Redis, погодные данные, полученные через WebClient, кэшируются в реактивной среде, что уменьшает задержки и количество внешних запросов.
- Redis: используется для временного хранения прогноза погоды по каждому узлу сетки. Позволяет существенно снизить нагрузку на Open-Meteo API. Ключи формируются динамически, с TTL от 1 до 3 часов.
- PostGIS: расширение PostgreSQL для работы с географическими данными. Используется для хранения геометрий, выполнения пространственных запросов и привязки полей к ближайшим узлам погодной сетки.
- Leflet: используется для визуализации сетки, полей и погодных точек на карте во фронтенд-части приложения.
- Плановое добавление данных: АвтомАвтоматическоеатическое добавление и расчет данных в БД с помощью аннотации @Scheduled.
- Кастомные валидации: Реализованы отдельные валидаторы, чтобы вынести бизнес-валидации за пределы сервисного слоя.
- MapStruct: Интегрирован MapStruct для удобной и быстрой конвертации между сущностями и DTO.
- Docker: Проект и база данных запускаются в Docker-окружении с использованием Docker Compose для удобства развертывания и управления контейнерами.
- Профилирование окружений(
application-local,application-prod): используется механизм Spring Profiles для разделения конфигураций разработки и продакшена. Настройки окружения (базы данных, Redis, логгирование, планировщики и т.д.) подгружаются в зависимости от активного профиля.
- Клонируйте репозиторий.
- чтобы запустить локально настройте Run/Debug Configurations:

- Запустите приложение в Docker с использованием Docker Compose:
docker compose up --build - Используйте Postman для тестирования API.
Коллекция для тестирования API доступна в проекте(в папке resources) и может быть импортирована в Postman для демонстрации функциональности.