ЕСОЗ - публічна документація

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Мета

Веб-сервіс WS використовується для завантаження реєстру медичних виробів. Процес використовує сервіс jabba. В ході виконання запиту створюється джоба, на базі якої створюються задачі. Кожна задача це один запит для створення сутності з реєстру.

Ключові положення

  1. Це метод GraphQL, який використовується тільки в адміністративній панелі.

  2. Тільки автентифіковані та авторизовані співробітники NHS з відповідним скоупом можуть завантажити реєстр медичних виробів.

  3. Даний веб-сервіс WS використовує сервіс jabba. В ході виконання запиту створюється джоба, на базі якої створюються задачі. Кожна задача це один запит для створення сутності з реєстру.

  4. Вхідні дані для реєстру медичних виробів мають бути в форматі .csv та з символами (тобто лапки, лінії - " як \"; нові лінії розміщені як \r\n ).

  5. Кожен медичний виріб в реєстрі перевіряється так же як і в https://e-health-ua.atlassian.net/wiki/pages/createpage.action?spaceKey=RMDN&title=%5BNEW%5D%20%28GraphQl%29%20Create%20Device%20definition WS.

Специфікація

 index.graphql
  "Creates a single `DeviceRegistryJob`."
  uploadDeviceRegistry(input: UploadDeviceRegistryInput!): UploadDeviceRegistryPayload
 deviceRegistryJobs.graphql
"""
Input for `uploadDeviceRegistry` mutation.

User must have a scope **device_registry:write**
"""
input UploadDeviceRegistryInput {
  "Type of register originating device registry data. The value should be present in the `REGISTER_TYPE` dictionary."
  registerType: String!
  "Create device registry reason description."
  reasonDescription: String!
  "String with input file in csv format with device register."
  csvData: String!
}

"""
Return type for `uploadDeviceRegistry` mutation.
"""
type UploadDeviceRegistryPayload {
  "Created `DeviceRegistryJob`."
  deviceRegistryJob: DeviceRegistryJob
}

"""
An object for DeviceRegistryJob.
"""
type DeviceRegistryJob implements Node {
  "The ID of an object"
  id: ID!
  "Primary key identifier from the database"
  databaseId: UUID!
  "Job name."
  name: String
  "Device registry Job status."
  status: JobStatus!
  "Job execution strategy."
  strategy: JobStrategy!
  "Date and time when the job starts."
  startedAt: DateTime!
  "Date and time when the job ends."
  endedAt: DateTime
  "Tasks within this job."
  tasks(
    "A condition to be used in determining which values should be returned by the collection."
    filter: TaskFilter
    "The method to use when ordering collection items."
    orderBy: TaskOrderBy
    "Read all values in the set after (below) this cursor."
    after: String
    "Read all values in the set before (above) this cursor."
    before: String
    "Only read the first _n_ values of the set."
    first: Int
    "Only read the last _n_ values of the set."
    last: Int
  ): DeviceRegistryTaskConnection!
  "Type of register originating device registry data. The value should be present in the `REGISTER_TYPE` dictionary."
  registerType: String!
  "Device registry job reason description."
  reasonDescription: String!
}

"""
A connection to a list of `DeviceRegistryTask` values.
"""
type DeviceRegistryTaskConnection {
  "Information to aid in pagination."
  pageInfo: PageInfo!
  "A list of nodes."
  nodes: [DeviceRegistryTask]
  "A list of edges."
  edges: [DeviceRegistryTaskEdge]
}

"""
Reads and enables pagination through a set of `DeviceRegistryTask`.
"""
type DeviceRegistryTaskEdge {
  "The item at the end of the edge."
  node: DeviceRegistryTask!
  "A cursor for use in pagination."
  cursor: String!
}

"""
A child of a `DeviceRegistryJob`, contains the result of task execution.
"""
type DeviceRegistryTask implements Node {
  "The ID of an object"
  id: ID!
  "Primary key identifier from the database"
  databaseId: UUID!
  "Task name."
  name: String
  "Task status, is set automatically."
  status: TaskStatus!
  "Task meta data."
  meta: DeviceRegistryTaskMeta
  "Date and time when task was executed."
  endedAt: DateTime
  "Task error."
  error: TaskError
  "Technical information when task was inserted into the DB."
  insertedAt: DateTime!
  "Technical information when task was updated in the DB."
  updatedAt: DateTime!
}

"""
Metadata of a `DeviceRegistryTask`.
"""
type DeviceRegistryTaskMeta {
  "Line number of csv file from input."
  csvDataLine: Int  
}

Авторизація

  • Перевірити валідність токену доступу

    • в разі помилки - повернути 401 (“Invalid access token”) при неуспішних перевірках

  • Перевірити, що токен дійсний

    • в разі помилки - повернути 401 (“Invalid access token”)

  • Перевірити скоупи користувача на можливість виконання даної дії (скоуп = 'device_registry:write')

    • повернути 403 (“Your scope does not allow to access this resource. Missing allowances: device_registry:write”) в разі невалідних скоупів

Перевірити юридичну особу

  • Отримати client_id з токену.

  • Перевірити статус юридичної особи (status = ACTIVE)

    • в разі помилки - повернути 409 ('client_id refers to legal entity that is not active')

  • Перевірити тип клієнта (type = NHS)

    • в разі помилки - повернути 403 ('You don't have permission to access this resource')

Перевірити запит

  • Перевірити, що потрібні поля вказано у відповідності до специфікації

    • в разі помилки - повернути 422 ('required property <field_name> was not present') де field_name - назва відсутнього поля

  • Перевірити, що не вказано додаткових полів, які не відповідають схемі

    • в разі помилки - повернути 422 ('Unknown field')

  • Перевірити, що кожне поле в запиті відповідає типу в специфікації

    • в разі помилки - повернути 422 (In field <<field_name>>: Expected type <<field_type>>, found <<actual_value>>.') де field_name - назва поля з помилкою, field_type - очікуваний тип поля, actual_value - значення, що було вказано в полі

  • Перевірити, що $.registerType = 'UPLOAD_DEVICE_DEFINITIONS_REGISTRY'

    • в разі помилки - повернути 422 ('Invalid register_type')

  • Перевірити, що $.csvData розмір вхідного поля валідний - файл csv з максимальною кількістю рядків 30000 дозволено.

    • в разі помилки - повернути 422 ('The number of tasks for the job with a sequential execution strategy is limited to 30,000')

  • Перевірити, що вхідний $.csvData відповідає структурі файлу (описано в табличці нижче)

    • в разі помилки - повернути 422 з переліком помилок перевірок

Приклад файлу

*Примітка. Поля device_names.name, device_names.type, properties.type, properties.value_integer, properties.value_string, properties.value_boolean, properties.value_decimal можуть бути вказані в масиві. Значення мають бути розділені | (відповідно).

Сервісна логіка

  1. Створити джобу з типом upload_device_definition_registry в таблиці джоби JABBA DB.

  2. Для кожного рядку у вхідному файлі створити окрему задачу на job в таблиці задач в JABBA DB з додатковими задачами metadata:

    1. назва = ‘Create device definition’

    2. meta.csv_data_line = рядок з csv_file

  3. Для кожної створеної задачі:

    1. Перевірити запис по медичному вирібу у відповідності до https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17782014108#Validate-device-definition

      1. в разі помилки валідації - оновити статус задачі на FAILED з відповідним текстом помилки, перейти до задачі

    2. Створити новий медичний виріб в таблицях device_definitions та device_definition_names (PRM DB) у відповідності до співпадіння полів

    3. Оновити статус задачі на PROCESSED, перейти до наступної задачі

  4. Відобразити ідентифікатор джоби з результатом у відповідності до специфікації.

Співпадіння полів

device_definitions

Атрибут

Джерело та логіка

Тип та обмеження

Н/О

id

uuid_generate_v4(), auto

uuid

О

external_id

external_id, з запиту

varchar(255)

Н

classification_type

classification_type, з запиту

varchar(255)

О

description

description, з запиту

varchar(2000)

Н

manufacturer_name

manufacturer_name, з запиту

varchar(255)

О

manufacturer_country

manufacturer_country, з запиту

varchar(255)

О

model_number

model_number, з запиту

varchar(255)

О

part_number

part_number, з запиту

varchar(255)

Н

packaging_type

packaging_type, з запиту

varchar(255)

О

packaging_count

packaging_count, з запиту

int

О

packaging_unit

packaging_unit, з запиту

varchar(255)

О

note

note, з запиту

varchar(2000)

Н

is_active

true, auto

boolean

О

inserted_at

now(), auto

timestamp

О

updated_at

now(), auto

timestamp

О

inserted_by

user_id, з токену

uuid

О

updated_by

user_id, з токену

uuid

О

properties

properties.type + properties.value[X], з запиту, масив об'єктів

jsonb

Н

parent_id

parent_id, з запиту

uuid

Н

device_definition_names

Для кожного об'єкту масивуdevice_names.name та device_names.type створити окремий запис.

Атрибут

Джерело та логіка

Тип та обмеження

Н/О

id

uuid_generate_v4(), auto

uuid

Н

device_definition_id

device_definition_id, значення device_definitions.id зі створеного запису

uuid

Н

type

device_names.type, з запиту

varchar(255)

Н

name

device_names.name, з запиту

varchar(255)

Н

inserted_at

now(), auto

timestamp

Н

updated_at

now(), auto

timestamp

Н

inserted_by

user_id, з токену

uuid

Н

updated_by

user_id, з токену

uuid

Н

  • No labels