Сервіс цифрових документів
1. Загальний опис
Сервіс призначений для тимчасового / проміжного зберігання файлів цифрових документів, до яких необхідно надавати доступ через UI-форми кабінету користувача в рамках виконання задач бізнес-процесу.
2. Функціональні вимоги
-
Завантаження цифрових документів користувачами через UI-форми задач бізнес-процесів
-
Вивантаження та перегляд цифрових документів користувачами через UI-форми задач бізнес-процесів
-
Валідація цифрових документів при завантаженні на предмет відповідності обмеженням, налаштованим для файлових полів UI-форм
3. Базові принципи реалізації
-
Завантаження або вивантаження документів можливе лише через UI-форму задачі бізнес-процесу
-
При завантаженні документу повинні застосовуватись валідаційні правила, ідентиччні до клієнтської валідації згідно налаштувань через інтерфейс адміністрування регламенту
-
Цифрові документи, які були завантажені або зчитані з Дата Фабрики у процесі виконання бізнес-процесу, доступні лише учасникам цього БП в рамках виконання їх задач через UI-форми
-
При завантаженні документу, система автоматично генерує унікальний ідентифікатор UUID та SHA256-геш для подальшого використання у бізнес-процесах
-
У якості сховища даних, сервіс цифрових документів використовує розподілене об’єктне сховище Ceph та оперує документами в окремому бакеті "lowcode-file-storage"
-
Усі документи, які завантажені в рамках бізнес-процесу, зберігаються у вигляді Ceph-об’єктів під ключами з ознакою групування за префіксом (process/{processInstanceId}/{id})
-
Тимчасовість збереження реалізується завдяки автоматичному механізму видалення документів, які були завантажені в рамках БП у разі його завершення
Назва бакету "lowcode-file-storage", який використовується для збереження цифрових документів має бути визначена на рівні конфігурації. |
Включення "digital-document-service" в Istio Service Mesh під питанням. |
5. Сценарії взаємодії
5.1. Генерація ідентифікаторів цифрових документів
Кожен цифровий документ у підсистемі "Low-code" визначається унікальним ідентифікатором файлу в рамках тенанта реєстру, зформований з використанням генератора псевдо-випадкових чисел (cad2e994-0e32-4a9f-9959-b420e20d4522) та який зберігається у вигляді окремого атрибуту мета-даних Ceph-об’єкта id.
var uuid = UUID.randomUUID();
Генерація ключа для збереження Ceph-об’єкта документу виконується згідно конвенції process/{processInstanceId}/{id}, де _processInstanceId - це ідентифікатор бізнес-процеса у виконанні.
5.2. Генерація гешів цифрових документів
При завантаженні файлів, система автоматично генерує геш з використанням SHA256 алгоритму (з використанням бібліотеки Apache Commons Codecs), як більш безпечного по відношенню до MD5. При збереженні документу в Ceph, згенерована checksum записується у вигляді атрибуту на рівні мета-даних Ceph-об’єкта та використовується у процесі підпису даних UI-форми користувача.
var sha256hex = DigestUtils.sha256Hex(data);
Розглянути можливість оптимізації шляхом інкрементального формування гешу у процесі обробки потоку данних при збереженні в Ceph. |
5.3. Авторизація доступу
Доступ до API сервісу цифрових документів надається лише автентифікованим користувачам системи, які мають одну з ролей:
-
officer
-
citizen
У зв’язку з тим, що система дозволяє роботу з документами користувачам тільки через UI-форми задач бізнес-процесів, це накладає ряд додаткових умов на отримання доступу до завантаження, вивантаження та отримання мета-даних файлів, зокрема:
-
Користувач може завантажувати документи в рамках бізнес-процесу тільки при наявності активної задачі, для якої він встановлений у якості assignee
-
Користувач може отримувати доступ на вивантаження документів та мета-дані, завантажених ним або іншими користувачами в рамках цього ж бізнес-процесу, за умови наявності активної задачі, для якої він встановлений у якості assignee
5.4. Валідація цифрових документів при завантаженні
При завантаженні файлів через поля типу "File" на UI-формі задачі бізнес-процесу, повинні застосовуватись валідаційні правила, налаштовані в інтерфейсі адміністрування регламенту реєстру.
На данний момент для файлових полів підтримуються наступні налаштувавння обмежень:
-
File Pattern - обмеження за типом файлу (application/pdf, image/png, image/jpeg)
-
File Maximum Size - обмеження за розміром файлу
5.5. Автоматичне видалення цифрових документів при завершенні бізнес-процесу
Цифрові документи, які зберігаються в окремому Ceph-бакеті "lowcode-file-storage" мають життєвий цикл пов’язаний із виконанням бізнес-процесу, в рамках якого вони були завантажені або зчитані з Дата Фабрики.
Згідно прийнятої конвенції генерації, всі вони зберігаються у вигляді об’єктів, ключі яких мають вигляд process/{processInstanceId}/{id}.
Для забезпечення видалення файлів при завершенні бізнес-процесу, розроблено окремий ExecutionListener який реагує на відповідну подію та проводить видалення об’єктів з бакету для яких виконується умова наявності у ключі префікса вигляду process/{processInstanceId}, де _processInstanceId - це ідентифікатор екземпляра процесу, який підлягає завершенню з будь-якої з наступних причин:
-
COMPLETED
-
INTERNALLY_TERMINATED
-
EXTERNALLY_TERMINATED
5.6. Структура Ceph-об’єкту для збереження цифрового документа
Назва атрибуту | Атрибут JSON-документа | Атрибут Ceph об’єкта | Значення |
---|---|---|---|
Ключ Ceph-об’єкта |
key |
Унікальний ідентифікатор Ceph-документу для збереження файла в області доступу поточного бізнес-процесу. Автоматично формується на базі згенерованого id згідно конвенції process/<processInstanceId>/<id> |
|
Ідентифікатор цифрового документу |
id |
UserMetaData.id |
Унікальний ідентифікатор файла, зформований з використанням генератора псевдо-випадкових чисел (cad2e994-0e32-4a9f-9959-b420e20d4522) |
Назва файлу |
name |
UserMetaData.name |
<Назва файлу> |
Тип контента |
type |
Content-Type (UserMetaData.type) |
application/pdf, image/png, image/jpeg |
Розмір |
size |
Content-Length (UserMetaData.size) |
<Розмір файлу> |
Контент документа |
content |
input |
<Контент файла> |
Геш документа |
checksum |
(UserMetaData.checksum) |
Згенерований SHA256-геш файла |
6. Опис API сервісу
6.1. Завантаження файла цифрового документу
POST /documents/{processInstanceId}/{taskId}/{fieldName}
Назва | Опис |
---|---|
processInstanceId |
Ідентифікатор бізнес-процесу, в рамках якого виконується завантаження файла |
taskId |
Ідентифікатор задачі користувача, в рамках виконання якої виконується завантаження файла через UI-форму |
fieldName |
Унікальна назва файлового поля UI-форми задачі користувача, для якого виконується завантаження файла |
Назва | Обов’язковий | Значення | Опис |
---|---|---|---|
X-Access-Token |
Так |
{Access Token} |
Токен доступу до системи користувача, який виконує завантаження файла |
Content-Type |
Так |
multipart/form-data |
Тип даних запиту для завантаження файла |
Назва | Опис |
---|---|
id |
Унікальний ідентифікатор цифрового документу, зформований з використанням генератора псевдо-випадкових чисел |
name |
Оригінальне ім’я файла |
type |
Тип контенту файла |
size |
Розмір файла |
checksum |
Автоматично згенерований геш на контент файла з використанням SHA256 алгоритму |
url |
Адреса для вивантаження файла, яка автоматично формується на базі параметрів поточного запиту в обробці, контекста запиту та id |
POST /documents/{processInstanceId}/{taskId}/{fieldName}
---------------573cf973d5228
Content-Disposition: form-data; filename="{filename}"
Content-Type: {mime-type}
PDF file content
---------------573cf973d5228--
200 OK
Content-Type: application/json
{
"id": "{id}",
"name": "{filename}",
"type:": "{mime-type}",
"size": 1000,
"checksum": "{sha256-hash}",
"url": "https://.../documents/{processInstanceId}/{taskId}/{fieldName}/{id}"
}
Код | Опис |
---|---|
200 |
OK з поверненням тіла відповіді |
400 |
Некоректно сформований запит |
401 |
Помилка автентифікації (відсутній токен доступу) |
403 |
Недостатньо прав для виконання операції |
422 |
Помилка валідації (недопустимий тип або розмір файлу, тощо) |
500 |
Серверна помилка обробки запиту |
6.2. Вивантаження цифрового документу
GET /documents/{processInstanceId}/{taskId}/{fieldName}/{id}
Назва | Опис |
---|---|
processInstanceId |
Ідентифікатор бізнес-процесу, в рамках якого виконується вивантаження файла |
taskId |
Ідентифікатор задачі користувача, в рамках виконання якої виконується вивантаження файла через UI-форму |
fieldName |
Унікальна назва файлового поля UI-форми задачі користувача, для якого виконується вивантаження файла |
id |
Унікальний ідентифікатор цифрового документу |
Назва | Обов’язковий | Значення | Опис |
---|---|---|---|
X-Access-Token |
Так |
{Access Token} |
Токен доступу до системи користувача, який виконує вивантаження файла |
Content-Type |
Так |
application/pdf, image/jpeg, image/png |
Тип даних, який очікується у відповідь на запит |
200 OK
Content-Type: application/pdf | image/jpeg | image/png
Content-Disposition: attachment; filename="sample.pdf"
Content-Length: 1000
File binary content
Код | Опис |
---|---|
200 |
OK з поверненням тіла відповіді |
400 |
Некоректно сформований запит |
401 |
Помилка автентифікації (відсутній токен доступу) |
403 |
Недостатньо прав для виконання операції |
404 |
Не знайдено документ за ідентифікатором |
500 |
Серверна помилка обробки запиту |
6.3. Пошук цифрових документів
POST /documents/{processInstanceId}/{taskId}/search
Назва | Опис |
---|---|
processInstanceId |
Ідентифікатор бізнес-процесу, в рамках якого виконується завантаження файла |
taskId |
Ідентифікатор задачі користувача, в рамках виконання якої виконується завантаження файла через UI-форму |
Назва | Обов’язковий | Значення | Опис |
---|---|---|---|
X-Access-Token |
Так |
{Access Token} |
Токен доступу до системи користувача, який виконує запит на пошук доступних документів |
Content-Type |
Так |
application/json |
Тип даних, який очікується у відповідь на запит |
Назва | Опис |
---|---|
id |
Унікальний ідентифікатор цифрового документу |
name |
Оригінальне ім’я файла |
type |
Тип контенту файла |
size |
Розмір файла |
checksum |
Автоматично згенерований геш на контент файла з використанням SHA256 алгоритму |
url |
Адреса для вивантаження файла, яка автоматично формується на базі параметрів поточного запиту в обробці |
{
"documents": [
{
"id": "{id1}",
"fieldName": "{fieldName1}"
},
{
"id": "{id2}",
"fieldName": "{fieldName2}"
}
]
}
200 OK
Content-Type: application/json
[
{
"id": "{id}",
"name": "{filename}",
"type:": "{mime-type}",
"size": 1000,
"checksum": "{sha256-hash}",
"url": "https://.../documents/{processInstanceId}/{taskId}/{fieldName}/{id}"
}
]
Код | Опис |
---|---|
200 |
OK з поверненням тіла відповіді |
400 |
Некоректно сформований запит |
401 |
Помилка автентифікації (відсутній токен доступу) |
403 |
Недостатньо прав для виконання операції |
500 |
Серверна помилка обробки запиту |