Приложение считывает все данные из соответствующих CSV-файлов (разделитель – запятая) при старте приложения.
Приложение записывает все данные из оперативной памяти в CSV-файлы при завершении работы приложения.
Во время работы приложения ему запрещено взаимодействовать с файловой системой в другие моменты времени.
Имя файла с исходными данными передаётся приложению с ключом --templates-file
Id,SideA,SideB,SideC
4ae25b32-d794-4560-8a08-5e6d09a19c33,1,2,5
22f9f6c1-82af-4681-b92e-a3510ecee4b5,2,3,5
0c96ea19-fa65-499a-80ad-ea0c86b2a5e0,2,3,4
Имя файла с исходными данными передаётся приложению с ключом --triangles-file
Id,Template,RegistrationDateTime,BorderColor,FillColor,Description,Owner
66ade672-2301-4408-9471-8a17aa883d65,4ae25b32-d794-4560-8a08-5e6d09a19c33,2024-08-26T19:01:41.114511727,GREEN,RED,"странные данные, это неправильный треугольник",de42a00f-7f43-4d10-808d-bee47fdeef49
a6be5e23-b8d4-4d78-8aa3-1c204d0befc8,22f9f6c1-82af-4681-b92e-a3510ecee4b5,2024-07-10T17:26:41.129567382,RED,GREEN,"точки расположены на отрезке",de42a00f-7f43-4d10-808d-bee47fdeef49
baa30333-23d6-4eba-a8ed-7c235adf4228,0c96ea19-fa65-499a-80ad-ea0c86b2a5e0,2024-07-27T00:10:41.129642513,RED,GREEN,"обычный треугольник",de42a00f-7f43-4d10-808d-bee47fdeef49
Имя файла с исходными данными передаётся приложению с ключом --users-file
Id,Login,RegistrationDateTime,Email,Role
de42a00f-7f43-4d10-808d-bee47fdeef49,User123,2024-01-01T00:00:00,user123@crafted.su,User
Приложение запускается с помощью системы сборки Gradle, обязательные параметры:
--templates-file – имя файла со списком шаблонов;--triangles-file – имя файла со списком треугольников;--users-file – имя файла с пользователями приложения;--port – порт, по которому доступен веб-сервер.--secret - секретный ключ для HMAC512, который используется для подписи JWT-токенов. ./gradlew run --args="--templates-file ../sample-data/templates.csv --triangles-file ../sample-data/triangles.csv --users-file ../sample-data/users.csv --port 9000 --secret SECRET"
Веб-сервер запускается и работает только при получении корректных значений всех параметров. При некорректном значении хотя бы одного параметра приложение выводит соответствующее сообщение об ошибке и завершает работу с ненулевым кодом возврата.
Error: missing option --triangles-file
Error: file not found «abc.csv»
Во время выполнения запроса пользователь может передать JWT-токен в HTTP-заголовке Authorization в формате Bearier. Отправка Bearier-токена через HTTP-форму или параметры URI не будет выполняться.
Токен содержит следующие ключи:
sub – идентификатор пользователя, которому выдан токен (соответствует User→Id);email – электронная почта пользователя, которому выдан токен (соответствует User→Email);exp – время, когда токен станет невалидным.bearerJWTДля указанного пользователя определяется роль User→Role.
В каждом запросе приведён список ролей, для которых допустимо выполнения запроса. Также присутствуют роли:
Owner – выполнение запроса разрешено владельцу объекта.Все дополнительные роли и правила доступа приведены в описании маршрута.
Если в описании маршрута отсутствует блок Authorizations, маршрут доступен всем пользователям.
Если блок Authorizations присутствует, но список ролей пуст или all, маршрут доступен всем зарегистрированным пользователям вне зависимости от роли.
Список упорядочен по возрастанию даты и времени регистрации и id.
| page | integer >= 1 Default: 1 Example: page=1 Номер страницы. Если номер превышает максимально возможный, приложение возвращает пустой список. Если номер передан и не является натуральным числом, приложение возвращает сообщение об ошибке. |
| records-per-page | integer Default: 10 Enum: 5 10 20 50 Example: records-per-page=10 Количество записей на странице. Если количество передано и не входит в указанный набор значений, приложение возвращает сообщение об ошибке. |
[- {
- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Description": "обыкновенный треугольник",
- "RegistrationDateTime": "2024-01-01T00:00:00"
}
]Дата и время регистрации в системе устанавливаются автоматически по текущей дате и времени, если не переданы.
Идентификатор треугольника генерируется уникальным.
Владелец устанавливается по пользователю, выполнившему запрос.
| Template required | string <UUID> Шаблон треугольника (соответствует |
| RegistrationDateTime | string <date-time> Default: "текущая дата и время" Дата и время регистрации в системе |
| BorderColor required | string Enum: "BLACK" "WHITE" "RED" "GREEN" "BLUE" "YELLOW" "CYAN" "MAGENTA" "SILVER" "GRAY" "MAROON" "OLIVE" "DARKGREEN" "PURPLE" "TEAL" Цвет границы из списка цветов |
| FillColor required | string Enum: "BLACK" "WHITE" "RED" "GREEN" "BLUE" "YELLOW" "CYAN" "MAGENTA" "SILVER" "GRAY" "MAROON" "OLIVE" "DARKGREEN" "PURPLE" "TEAL" Цвет заливки из списка цветов |
| Description required | string Описание треугольника |
{- "Template": "4ae25b32-d794-4560-8a08-5e6d09a19c33",
- "RegistrationDateTime": "2024-01-01T00:00:00",
- "BorderColor": "BLACK",
- "FillColor": "BLACK",
- "Description": "обыкновенный треугольник"
}{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49"
}Информация о владельце треугольника доступна только авторизованным пользователям.
| triangle-id required | string <UUID> Example: de42a00f-7f43-4d10-808d-bee47fdeef49 идентификатор треугольника |
{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Template": "4ae25b32-d794-4560-8a08-5e6d09a19c33",
- "SideA": 3,
- "SideB": 4,
- "SideC": 5,
- "RegistrationDateTime": "2024-01-01T00:00:00",
- "BorderColor": "BLACK",
- "FillColor": "BLACK",
- "Description": "обыкновенный треугольник",
- "Area": 6,
- "Type": "Остроугольный",
- "Owner": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "OwnerLogin": "User123"
}| triangle-id required | string <UUID> Example: de42a00f-7f43-4d10-808d-bee47fdeef49 идентификатор треугольника |
{- "Error": "Некорректный идентификатор треугольника. Для параметра triangle-id ожидается UUID, но получено значение «id»"
}Список упорядочен по возрастанию даты и времени регистрации и id.
| border-color required | string Enum: "BLACK" "WHITE" "RED" "GREEN" "BLUE" "YELLOW" "CYAN" "MAGENTA" "SILVER" "GRAY" "MAROON" "OLIVE" "DARKGREEN" "PURPLE" "TEAL" Example: border-color=BLACK Цвет границы треугольника |
| page | integer >= 1 Default: 1 Example: page=1 Номер страницы. Если номер превышает максимально возможный, приложение возвращает пустой список. Если номер передан и не является натуральным числом, приложение возвращает сообщение об ошибке. |
| records-per-page | integer Default: 10 Enum: 5 10 20 50 Example: records-per-page=10 Количество записей на странице. Если количество передано и не входит в указанный набор значений, приложение возвращает сообщение об ошибке. |
[- {
- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "SideA": 3,
- "SideB": 4,
- "SideC": 5
}
]Обязательно должен быть передан хотя бы один из параметров.
Список упорядочен по возрастанию даты и времени регистрации и id.
| area-min | number <double> Example: area-min=0.0 нижняя граница площади (включительно) |
| area-max | number <double> Example: area-max=6.0 верхняя граница площади (включительно) |
| page | integer >= 1 Default: 1 Example: page=1 Номер страницы. Если номер превышает максимально возможный, приложение возвращает пустой список. Если номер передан и не является натуральным числом, приложение возвращает сообщение об ошибке. |
| records-per-page | integer Default: 10 Enum: 5 10 20 50 Example: records-per-page=10 Количество записей на странице. Если количество передано и не входит в указанный набор значений, приложение возвращает сообщение об ошибке. |
[- {
- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "SideA": 3,
- "SideB": 4,
- "SideC": 5
}
]В выдаче присутствуют только те цвета и типы треугольника, которые есть в списке данных.
Списки упорядочены лексикографически по возрастанию значения поля Color или Type соответственно.
| by required | any Enum: "color" "type" "color,type" Example: by=color,type Тип запрашиваемой статистики.
|
[ ]Идентификатор треугольника генерируется уникальным.
Дата и время регистрации в системе устанавливаются автоматически по текущей дате и времени, если не переданы.
Владелец устанавливается по пользователю, выполнившему запрос.
| template-id required | string <UUID> Example: 4ae25b32-d794-4560-8a08-5e6d09a19c33 идентификатор шаблона |
| RegistrationDateTime | string <date-time> Default: "текущая дата и время" Дата и время регистрации в системе |
| BorderColor required | string Enum: "BLACK" "WHITE" "RED" "GREEN" "BLUE" "YELLOW" "CYAN" "MAGENTA" "SILVER" "GRAY" "MAROON" "OLIVE" "DARKGREEN" "PURPLE" "TEAL" Цвет границы из списка цветов |
| FillColor required | string Enum: "BLACK" "WHITE" "RED" "GREEN" "BLUE" "YELLOW" "CYAN" "MAGENTA" "SILVER" "GRAY" "MAROON" "OLIVE" "DARKGREEN" "PURPLE" "TEAL" Цвет заливки из списка цветов |
| Description required | string Описание треугольника |
{- "RegistrationDateTime": "2024-01-01T00:00:00",
- "BorderColor": "BLACK",
- "FillColor": "BLACK",
- "Description": "обыкновенный треугольник"
}{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49"
}Идентификатор шаблона генерируется уникальным.
| SideA required | integer >= 1 Длина первой стороны (натуральное число) |
| SideB required | integer >= 1 Длина второй стороны (натуральное число) |
| SideC required | integer >= 1 Длина третьей стороны (натуральное число) |
{- "SideA": 3,
- "SideB": 4,
- "SideC": 5
}{- "Id": "4ae25b32-d794-4560-8a08-5e6d09a19c33"
}| template-id required | string <UUID> Example: 4ae25b32-d794-4560-8a08-5e6d09a19c33 идентификатор шаблона |
{- "Id": "4ae25b32-d794-4560-8a08-5e6d09a19c33",
- "SideA": 3,
- "SideB": 4,
- "SideC": 5,
- "Area": 6,
- "Type": "Остроугольный"
}Список редактируемых полей.
| SideA required | integer >= 1 Длина первой стороны (натуральное число) |
| SideB required | integer >= 1 Длина второй стороны (натуральное число) |
| SideC required | integer >= 1 Длина третьей стороны (натуральное число) |
{- "SideA": 3,
- "SideB": 4,
- "SideC": 5
}{- "Value": "{",
- "Error": "Missing a name for object member."
}Идентификатор треугольника генерируется уникальным.
Дата и время регистрации в системе устанавливаются автоматически по текущей дате и времени, если не переданы.
Владелец устанавливается по пользователю, выполнившему запрос.
| template-id required | string <UUID> Example: 4ae25b32-d794-4560-8a08-5e6d09a19c33 идентификатор шаблона |
| RegistrationDateTime | string <date-time> Default: "текущая дата и время" Дата и время регистрации в системе |
| BorderColor required | string Enum: "BLACK" "WHITE" "RED" "GREEN" "BLUE" "YELLOW" "CYAN" "MAGENTA" "SILVER" "GRAY" "MAROON" "OLIVE" "DARKGREEN" "PURPLE" "TEAL" Цвет границы из списка цветов |
| FillColor required | string Enum: "BLACK" "WHITE" "RED" "GREEN" "BLUE" "YELLOW" "CYAN" "MAGENTA" "SILVER" "GRAY" "MAROON" "OLIVE" "DARKGREEN" "PURPLE" "TEAL" Цвет заливки из списка цветов |
| Description required | string Описание треугольника |
{- "RegistrationDateTime": "2024-01-01T00:00:00",
- "BorderColor": "BLACK",
- "FillColor": "BLACK",
- "Description": "обыкновенный треугольник"
}{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49"
}Список упорядочен по возрастанию имени пользователя лексикографически
[- {
- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Login": "User123",
- "RegistrationDateTime": "2024-01-01T00:00:00",
- "Email": "user123@crafted.su"
}
]Дата и время регистрации в системе устанавливаются автоматически по текущей дате и времени.
Идентификатор и имя пользователя используются из JWT-токена.
| Login required | string Уникальное имя пользователя. Не может быть пустым |
Login=%D0%9D%D0%BE%D0%B2%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C
{- "Login": {
- "Value": "",
- "Error": "Ожидается непустая строка"
}
}| user-id required | string <UUID> Example: de42a00f-7f43-4d10-808d-bee47fdeef49 идентификатор пользователя |
| user-role required | string (Роль пользователя) Enum: "User" "TemplateManager" "UserManager" Example: user-role=User роль пользователя |
{- "Error": "Некорректное значение переданного параметра X. Ожидается UUID, но получено текстовое значение"
}Также должны быть удалены все треугольники, чьим владельцем является удаляемый пользователь.
| user-id required | string <UUID> Example: de42a00f-7f43-4d10-808d-bee47fdeef49 идентификатор пользователя |
{- "Error": "Некорректное значение переданного параметра X. Ожидается UUID, но получено текстовое значение"
}| Id | string <UUID> Уникальный идентификатор шаблона треугольника |
| SideA | integer >= 1 Длина первой стороны (натуральное число) |
| SideB | integer >= 1 Длина второй стороны (натуральное число) |
| SideC | integer >= 1 Длина третьей стороны (натуральное число) |
| Area | number or null (Площадь треугольника) Вычисляемое поле, отсутствует в файле с данными. |
| Type | string (Тип треугольника) Enum: "Некорректный" "Отрезок" "Остроугольный" "Прямоугольный" "Тупоугольный" Вычисляемое поле, отсутствует в файле с данными
|
{- "Id": "4ae25b32-d794-4560-8a08-5e6d09a19c33",
- "SideA": 3,
- "SideB": 4,
- "SideC": 5,
- "Area": 6,
- "Type": "Остроугольный"
}| Id | string <UUID> Уникальный идентификатор треугольника |
| Template | string <UUID> Шаблон треугольника (соответствует |
| RegistrationDateTime | string <date-time> Дата и время регистрации в системе |
| BorderColor | string (Color) Enum: "BLACK" "WHITE" "RED" "GREEN" "BLUE" "YELLOW" "CYAN" "MAGENTA" "SILVER" "GRAY" "MAROON" "OLIVE" "DARKGREEN" "PURPLE" "TEAL" Цвет границы из списка цветов |
| FillColor | string (Color) Enum: "BLACK" "WHITE" "RED" "GREEN" "BLUE" "YELLOW" "CYAN" "MAGENTA" "SILVER" "GRAY" "MAROON" "OLIVE" "DARKGREEN" "PURPLE" "TEAL" Цвет заливки из списка цветов |
| Description | string Описание треугольника |
| Owner | string <UUID> Владелец треугольника (соответствует |
{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Template": "4ae25b32-d794-4560-8a08-5e6d09a19c33",
- "RegistrationDateTime": "2024-01-01T00:00:00",
- "BorderColor": "BLACK",
- "FillColor": "BLACK",
- "Description": "обыкновенный треугольник",
- "Owner": "de42a00f-7f43-4d10-808d-bee47fdeef49"
}| Id | string <UUID> Уникальный идентификатор пользователя | ||||||||
| Login | string Уникальное имя пользователя | ||||||||
| RegistrationDateTime | string <date-time> Дата и время регистрации в системе | ||||||||
string Электронная почта пользователя | |||||||||
| Role | string (Роль пользователя) Enum: "User" "TemplateManager" "UserManager" Роль, в зависимости от которой определяются возможности пользователя.
|
{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Login": "User123",
- "RegistrationDateTime": "2024-01-01T00:00:00",
- "Email": "user123@crafted.su",
- "Role": "User"
}