Тестовое задание «Инвентаризационный список техники» (2.0.0)

Описание

Приложение, решающее задачу по управлению списком с данными.

Данные

Приложение считывает все данные из соответствующих CSV-файлов (разделитель – запятая) при старте приложения.

Список элементов техники

Имя файла с исходными данными передаётся приложению с ключом --equipment-file

Id,Equipment,Category,GuaranteeDate,IsUsed,Price,Location,ResponsiblePerson
1d0f861e-9d0c-4340-acad-69ade7b83085,"Монитор 19.5"" LG 20M47D",Монитор,2028-01-01,false,2800,склад,Иванов Иван Иванович
4cc3098f-fa98-4312-b351-fce99fde825f,"Монитор 19.5"" Acer K202HQL",Монитор,2028-01-01,false,5700,склад,Иванов Иван Иванович
bf7c82ce-334a-470b-89be-f7ae283ce564,"Системный блок Acer Intel Core i5-6500, RAM 16 ГБ, SSD 480 ГБ, Intel HD Graphics 530",ПК,2028-01-01,false,15300,склад,Иванов Иван Иванович
f463afc0-3088-4ba4-92ae-5859faedc585,"Принтер Canon PIXMA G540 ",Принтер,2030-01-01,true,21550,"офис, кабинет № 26",Иванов Иван Иванович
d7494a0f-6929-4d71-9bbc-fb067356bfeb,IP-телефон Cisco CP-7940G,Телефон,2030-01-01,true,6100,"офис, кабинет № 26",Иванов Иван Иванович
fe385d95-f916-47c0-b042-557435b2e160,Проектор Epson EB-E20,Другое,2030-01-01,true,60600,"офис, кабинет № 15",Иванов Иван Иванович
f920444e-3741-497c-a6b2-b9fa1bc5b741,"Принтер Canon PIXMA G540 ",Принтер,2030-01-01,true,21550,"офис, кабинет № 15",Иванов Иван Иванович

Записи в журнале

Имя файла с исходными данными передаётся приложению с ключом --log-file

Id,Equipment,ResponsiblePerson,Operation,Text,LogDateTime
29478648-3524-4d60-9176-22aad1c3bb4a,1d0f861e-9d0c-4340-acad-69ade7b83085,Иванов Иван Иванович,Приобретение,Приобретение,2024-01-01T00:00:00

Запуск приложения

Приложение запускается с помощью системы сборки Gradle, обязательные параметры:

  • --equipment-file – имя файла со списком оборудования
  • --log-file – имя файла с журналом
  • --port – порт, по которому доступен веб-сервер
./gradlew run --args="--equipment-file ../sample-data/equipment.csv --log-file ../sample-data/log.csv --port 9000"

Веб-сервер запускается и работает только при получении корректных значений всех параметров. При некорректном значении хотя бы одного параметра приложение выводит соответствующее сообщение об ошибке и завершает работу с ненулевым кодом возврата.

Error: missing option --equipment-file
Error: file not found «abc.csv»

Базовые маршруты

Маршруты проверки работоспособности веб-сервера

Проверка, запущен ли веб-сервер

Маршрут обязательно должен быть реализован, при отсутствии приложение не будет проверяться.

Responses

Инвентаризация

Методы, связанные с получением информации о технике

Получение списка техники

Список упорядочен по возрастанию типа техники лексикографически и id.

query Parameters
page
integer >= 1
Default: 1
Example: page=1

Номер страницы.

Если номер превышает максимально возможный, приложение возвращает пустой список.

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

records-per-page
integer
Default: 10
Enum: 5 10 20 50
Example: records-per-page=10

Количество записей на странице.

Если количество передано и не входит в указанный набор значений, приложение возвращает сообщение об ошибке.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Добавление нового оборудования

Добавление нового оборудования:

  • Идентификатор оборудования генерируется автоматически.

Добавление записи о новом оборудовании в журнал:

  • Идентификатор записи генерируется автоматически.
  • Идентификатор оборудования соответствует идентификатору нового оборудования.
  • Дата и время создания записи генерируются автоматически по текущей дате и времени.
Request Body schema: application/json
required
Equipment
required
string

Наименование оборудования

Category
required
string
Enum: "Монитор" "ПК" "Телефон" "Принтер" "Другое"

Тип техники

GuaranteeDate
required
string <date>

Гарантийный срок

Price
required
number <double> >= 0

Балансная стоимость

IsUsed
boolean
Default: false

Используется или свободно

  • true – используется
  • false – свободно
Location
required
string

Место хранения

ResponsiblePerson
required
string

Сохраняется в поле ResponsiblePerson обоих объектов: оборудования и записи в журнале.

Operation
required
string

Журналируемая операция. Поле не может быть пустым

Text
string
Default: ""

Комментарий к операции

Responses

Request samples

Content type
application/json
{
  • "Equipment": "Системный блок Acer",
  • "Category": "ПК",
  • "GuaranteeDate": "2028-01-01",
  • "Price": 15300,
  • "IsUsed": true,
  • "Location": "дома",
  • "ResponsiblePerson": "Иванов Иван Иванович",
  • "Operation": "Приобретение",
  • "Text": "Приобретение нового ПК в связи с поломкой предыдущего"
}

Response samples

Content type
application/json
{
  • "EquipmentId": "67bfcd12-6c8f-45fc-bc6b-265c23d7d881",
  • "LogId": "29478648-3524-4d60-9176-22aad1c3bb4a"
}

Получение информации о элементе техники

path Parameters
equipment-id
required
string <UUID>
Example: 67bfcd12-6c8f-45fc-bc6b-265c23d7d881

Идентификатор техники

Responses

Response samples

Content type
application/json
{
  • "Id": "67bfcd12-6c8f-45fc-bc6b-265c23d7d881",
  • "Equipment": "Системный блок Acer",
  • "Category": "ПК",
  • "GuaranteeDate": "2028-01-01",
  • "IsUsed": true,
  • "Price": 15300,
  • "Location": "дома",
  • "ResponsiblePerson": "Иванов Иван Иванович",
  • "Log": [
    ]
}

Редактирование оборудования

Отсутствие необязательных полей (не required) подразумевает, что поля не изменяются.

Добавление записи об изменении оборудования в журнал:

  • Происходит только если изменилось хотя бы одно поле, описывающее оборудование.
  • Идентификатор записи генерируется автоматически.
  • Дата и время создания записи генерируются автоматически по текущей дате и времени.
path Parameters
equipment-id
required
string <UUID>
Example: 67bfcd12-6c8f-45fc-bc6b-265c23d7d881

Идентификатор техники

Request Body schema: application/json
required
Equipment
required
string

Наименование оборудования

Category
string
Enum: "Монитор" "ПК" "Телефон" "Принтер" "Другое"

Тип техники

GuaranteeDate
string <date>

Гарантийный срок

IsUsed
boolean

Используется или свободно

  • true – используется
  • false – свободно
Price
number <double> >= 0

Балансная стоимость

Location
required
string

Место хранения

ResponsiblePerson
required
string

Материально-ответственное лицо.

Сохраняется в поле ResponsiblePerson обоих объектов: оборудования и записи в журнале.

Operation
required
string

Журналируемая операция. Поле не может быть пустым

Text
required
string

Комментарий к операции

Responses

Request samples

Content type
application/json
{
  • "Equipment": "Системный блок Acer",
  • "Category": "ПК",
  • "GuaranteeDate": "2028-01-01",
  • "IsUsed": true,
  • "Price": 15300,
  • "Location": "дома",
  • "ResponsiblePerson": "Иванов Иван Иванович",
  • "Operation": "Приобретение",
  • "Text": "Приобретение нового ПК в связи с поломкой предыдущего"
}

Response samples

Content type
application/json
{
  • "LogId": "29478648-3524-4d60-9176-22aad1c3bb4a"
}

Списание оборудования

Элемент техники удаляется. Для удалённого оборудования добавляется запись в журнал:

  • Идентификатор записи генерируется автоматически.
  • Идентификатор оборудования соответствует идентификатору удалённого оборудования.
  • Материально-ответственное лицо соответствует МОЛ оборудования.
  • Поле Operation соответствует «Списание: [поле Equipment]» (например «Списание: Системный блок Acer»).
  • Дата и время создания записи генерируются автоматически по текущей дате и времени.
path Parameters
equipment-id
required
string <UUID>
Example: 67bfcd12-6c8f-45fc-bc6b-265c23d7d881

Идентификатор техники

Responses

Response samples

Content type
application/json
{
  • "LogId": "29478648-3524-4d60-9176-22aad1c3bb4a"
}

Список свободной техники

Получение списка свободной (не использующейся) техники переданных типов.

Список упорядочен по возрастанию типа техники лексикографически и id.

query Parameters
category
string
Enum: "Монитор" "ПК" "Телефон" "Принтер" "Другое"
Example: category=Монитор,Телефон

Тип техники.

Содержит ноль, один или несколько типов техники через запятую.

Если параметр пустой или отсутствует, приложение возвращает список без фильтрации по типу.

Тип техники должен точно соответствовать одному из указанных значений. Например, пк и телефон не являются корректными значениями.

Если хотя бы один из переданных типов не является корректным, значение параметра считается некорректным.

page
integer >= 1
Default: 1
Example: page=1

Номер страницы.

Если номер превышает максимально возможный, приложение возвращает пустой список.

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

records-per-page
integer
Default: 10
Enum: 5 10 20 50
Example: records-per-page=10

Количество записей на странице.

Если количество передано и не входит в указанный набор значений, приложение возвращает сообщение об ошибке.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Список техники на замену

Получение списка техники, которую нужно заменить к моменту времени: в переданный момент времени истечёт гарантийный срок.

Список упорядочен по возрастанию типа техники лексикографически и id.

query Parameters
time
required
string <date-time>
Example: time=2030-01-01T00:00:00.0

Дата и время в формате ISO

page
integer >= 1
Default: 1
Example: page=1

Номер страницы.

Если номер превышает максимально возможный, приложение возвращает пустой список.

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

records-per-page
integer
Default: 10
Enum: 5 10 20 50
Example: records-per-page=10

Количество записей на странице.

Если количество передано и не входит в указанный набор значений, приложение возвращает сообщение об ошибке.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Статистика

query Parameters
by-type
required
string
Enum: "category" "person"
Example: by-type=category

Тип статистики.

  • category – статистика по типу техники
  • person – статистика по материально ответственному лицу

Статистика упорядочена по полю Category/Person лексикографически.

Responses

Response samples

Content type
application/json
Example
{
  • "StatisticsByCategory": [
    ]
}

Журнал

Получение информации о записи в журнале

path Parameters
log-id
required
string <UUID>
Example: 29478648-3524-4d60-9176-22aad1c3bb4a

Идентификатор запииси в журнале

Responses

Response samples

Content type
application/json
{
  • "Id": "29478648-3524-4d60-9176-22aad1c3bb4a",
  • "Equipment": "67bfcd12-6c8f-45fc-bc6b-265c23d7d881",
  • "ResponsiblePerson": "Иванов Иван Иванович",
  • "Operation": "Приобретение",
  • "Text": "Приобретение нового ПК в связи с поломкой предыдущего",
  • "LogDateTime": "2024-01-01T00:00:00"
}

Редактирование записи в журнале

path Parameters
log-id
required
string <UUID>
Example: 29478648-3524-4d60-9176-22aad1c3bb4a

Идентификатор запииси в журнале

Request Body schema: application/x-www-form-urlencoded
required
Operation
required
string

Журналируемая операция. Поле не может быть пустым

Text
required
string

Комментарий к операции

Responses

Request samples

Content type
application/x-www-form-urlencoded
Operation=%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0&Text=%D0%9F%D0%9A%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D0%BD%20%D0%9F%D0%B5%D1%82%D1%80%D0%BE%D0%B2%D1%83%20%D0%9F.%20%D0%9F.

Response samples

Content type
application/json
Example
{
  • "Operation": {
    },
  • "Text": {
    }
}

Элемент техники (Equipment)

Id
string <UUID>

Уникальный идентификатор оборудования

Equipment
string

Наименование оборудования

Category
string
Enum: "Монитор" "ПК" "Телефон" "Принтер" "Другое"

Тип техники

GuaranteeDate
string <date>

Гарантийный срок

IsUsed
boolean

Используется или свободно

  • true – используется
  • false – свободно
Price
number <double> >= 0

Балансная стоимость

Location
string

Место хранения

ResponsiblePerson
string

ФИО материально-ответственного лица

{
  • "Id": "67bfcd12-6c8f-45fc-bc6b-265c23d7d881",
  • "Equipment": "Системный блок Acer",
  • "Category": "ПК",
  • "GuaranteeDate": "2028-01-01",
  • "IsUsed": true,
  • "Price": 15300,
  • "Location": "дома",
  • "ResponsiblePerson": "Иванов Иван Иванович"
}

Запись в журнале (Log)

Id
string <UUID>

Идентификатор записи в журнале.

Equipment
string <UUID>

Уникальный идентификатор оборудования

ResponsiblePerson
string

ФИО материально-ответственного лица

Operation
string

Журналируемая операция. Поле не может быть пустым

Text
string

Комментарий к операции

LogDateTime
string <date-time>

Дата и время создания записи

{
  • "Id": "29478648-3524-4d60-9176-22aad1c3bb4a",
  • "Equipment": "67bfcd12-6c8f-45fc-bc6b-265c23d7d881",
  • "ResponsiblePerson": "Иванов Иван Иванович",
  • "Operation": "Приобретение",
  • "Text": "Приобретение нового ПК в связи с поломкой предыдущего",
  • "LogDateTime": "2024-01-01T00:00:00"
}