IT-Planet_If_else_Lushchenko
Решение второго отборочного этапа Прикладное программирование if...else — IT-Планета 2024
Решение
Для решения данного задания использовались следующие технологии:
- Spring Boot (приложение)
- Spring Data JPA + Hibernate (ORM)
- PostgreSQL (База данных)
- Maven (сборка приложения)
- Swagger
- Docker
- Docker compose
Что было реализовано
В данном проекте были реализованы несколько контроллеров (на этапе проектирования я принял решение отойти от ТЗ, так как контроллер Authentication имел никак не относящиеся методы к данному контексту).
Были полностью реализованы следующие контроллеры:
- Account (контроллер отвечает за регистрацию, логин и CRUD для аккаунтов)
- Region (контроллер отвечает за CRUD для регионов)
- RegionType (контроллер отвечает за CRUD для типов регионов)
- WeatherForecast (контроллер отвечает за CRUD для прогноза погоды)
К сожалению, возникли проеблемы с контроллером Weather. В документации было сложно понять, как зависят регионы, погода и прогноз
Например:
GET - /region/weather/{regionld}
Получение информации о погоде в регионе {regionld} : "long" // Идентификатор региона
request Body { empty }
responce
Body { "id": "long", // Идентификатор региона "regionName": "string", // Название региона "temperature": "float", // Температура в регионе, °C "humidity": "float", // Влажность воздуха в регионе, % "windSpeed": "float", // Скорость ветра, м/с "weatherCondition": "string", // Текущее состояние погоды, доступные значения "CLEAR", "CLOUDY", "RAIN", "SNOW", "FOG", "STORM "precipitationAmount": "float", // Количество осадков, мм "measurementDateTime": "dateTime" //
Дата и время измерения погодных условий в формате ISO-8601 "weatherForecast": [forecastld], //
Массив идентификаторов объектов с прогнозом погоды на ближайшие дни }
POST - /region/weather Добавление погоды
request
Body { "regionId": "long", // Идентификатор региона "temperature": "float", // Температура в регионе, °C "humidity": "float", // Влажность воздуха в регионе, % "windSpeed": "float", // Скорость ветра, м/с "weatherCondition": "string", // Текущее состояние погоды, доступные значения "CLEAR", "CLOUDY", "RAIN", "SNOW", "FOG", "STORM" "precipitationAmount": "float", // Количество осадков, мм "measurementDateTime": "dateTime", //
Дата и время измерения погодных условий в формате ISO-8601 "weatherForecast": ["forecastId"]
// Массив идентификаторов объектов с прогнозом погоды на ближайшие дни } responce
{ "id": "long", // Уникальный идентификатор созданной записи о погоде в регионеа "temperature": "float", // Температура в регионе, °C "humidity": "float", / Влажность воздуха в регионе, % "windSpeed": "float", // Скорость ветра, м/с "weatherCondition": "string", // Текущее состояние погоды "precipitationAmount": "float", // Количество осадков, мм "measurementDateTime": "dateTime", // Дата и время измерения погодных условий "weatherForecast": ["forecastId"], // Массив идентификаторов объектов с прогнозом погоды на ближайшие дни }
Непонятно было, как относятся регионы и погоды друг к другу, так как добавление погоды преполагает добавление новой погоды для региона, тогда какую погоду брать для региона, так и не понял
TL;DR проблемы: непонятна связь, OneToOne или OneToMany
Возможно, я не до конца понял, что там происходит, поэтому будет очень круто, если будет разбор заданий или что-то подобное :)
Архитектура
Для реализации данного проекта я использовал паттерн репозиторий. Благодаря Spring Boot и удобства этого паттерна, можно намного проще создавать CRUD для различных моделей
Для авторизации я использовал сессии через cookie,которые сохраняются по парметру id. Сами cookie хранятся в БД в таблице Account. Если пользователь авторизован, на сервере провереяются куки от пользователся и куки на сервере. Если куки не совпадают, то приложение не даёт доступ.
При авторизации, в случае новой сессии, куки презаписываются в БД для корректной работы
Требования к проверке решений
Приложение запускается в docker-compose (приложение + база данных). В конфигурациях я всё прописал, но продублирую сюда
Для базы данных (PostgeSQL)
Хост: localhost
Порт: 5432
База данных: WeatherForecast
Имя пользователя: postgres
Пароль: postgres
Для приложения (Spring Boot)
Хост: localhost
Порт: 8080
Запуск приложения
docker compose up -d --build
Swagger
http://localhost:8080/swagger-ui/index.html
Telegram
Соглашение
Я предоставляю Организатору разрешение на использование, модификацию, публикацию проекта и дальнейшее распространение, включая право на внесение изменений, дополнений, предисловий, комментариев и любых других переработок.
Я гарантирую, что проект не нарушает действующее законодательство, не содержит информации, дискредитирующей лиц или продукты, не вызывает судебных исков или претензий, не нарушает прав и интересов третьих лиц, соответствует общественным интересам, принципам гуманности и морали. Участник подтверждает, что все используемые в проекте материалы и данные являются его собственностью или использованы с разрешения правообладателей, что не ограничивает использование проекта Организатором в полном объеме.
Я подтверждаю, что передача исключительных прав на проект, созданный в рамках конкурса, не нарушает права третьих лиц и что все материалы проекта могут быть использованы Организатором без каких-либо ограничений.
Описание
Репозиторий для "Прикладное программирование if...else — IT-Планета 2024"
Языки
Java
- Dockerfile