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

AR_[NEW] (GraphQl) Update Device definition_UA

Мета

Даний веб-сервіс WS розроблений, щоб дозволити співробітнику з відповідними скоупами оновлювати поля медичних виробів в eHealth.

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

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

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

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

"Updates a single `DeviceDefinition` using its globally unique ID." updateDeviceDefinition(input: UpdateDeviceDefinitionInput!): UpdateDeviceDefinitionPayload
""" Input for `updateDeviceDefinition` mutation. User must have scopes **device_definition:write** """ input UpdateDeviceDefinitionInput { "The ID of an object" id: ID! "Device names." deviceNames: [UpdateDeviceDefinitionNameInput]! } """ Input for `deviceNames` of `updateDeviceDefinition` mutation. """ input UpdateDeviceDefinitionNameInput { "Device name type. The value should be present in the `device_name_type` dictionary." type: String! "Device name." name: String! } """ Return type for `updateDeviceDefinition` mutation. """ type UpdateDeviceDefinitionPayload { "Updated `DeviceDefinition`." deviceDefinition: DeviceDefinition } """ An instance of a medical-related component of a medical device. User must have a scope **device_definition:read** """ type DeviceDefinition implements Node { "The ID of an object." id: ID! "Primary key identifier from the database." databaseId: UUID! "Device identifier in external system." externalId: String "Device names." deviceNames: [DeviceName]! "A classification or risk class of the device model. The value should be present in the `device_classification_type` dictionary." classificationType: String! "Description of the device." description: String "Name of device manufacturer" manufacturerName: String! "Country of manufacture. The value should be present in the `COUNTRY` dictionary." manufacturerCountry: String! "The catalog or model number for the device for example as defined by the manufacturer." modelNumber: String! "The part number or catalog number of the device." partNumber: String "A code that defines the specific type of packaging. The value should be present in the `device_definition_packaging_type` dictionary." packagingType: String! "The number of items contained in the package." packagingCount: Int! "Unit of measurement. The value should be present in the `DEVICE_UNIT` dictionary." packagingUnit: String! "Device notes and comments." note: String "Array of device properties." properties: [DeviceDefinitionProperty] "Reference to parent device definition." parentId: UUID "is_active status." isActive: Boolean! "Date and time when record was inserted" insertedAt: DateTime! "Date and time when record was updated" updatedAt: DateTime! } """ A component part of DeviceDefinition. """ type DeviceName implements DeviceDefinition { "Device name type. The value should be present in the `device_name_type` dictionary." type: String! "Device name." name: String! } """ A component part of DeviceDefinition. """ type DeviceDefinitionProperty implements DeviceDefinition { "Device property type. The value should be present in the `device_properties` dictionary." type: String! "Device property value in integer format." valueInteger: Int "Device property value in string format." valueString: String "Device property value in boolean format." valueBoolean: Boolean "Device property value in decimal format." valueDecimal: Float }

Авторизація

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

    • Повернути (401, 'Invalid access token') в разі неуспішних валідацій

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

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

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

    • Повернути (403, 'Your scope does not allow to access this resource. Missing allowances: device_definition: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 ('In field <<field_name>>: Expected type <<field_type>>, found null.') де field_name - назва відсутнього поля, field_type - тип відсутнього поля

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

    • в разі помилки - повернути 422 ('In field <<field_name>>: Unknown field.') де field_name - назва додаткового поля, яке не відповідає схемі

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

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

Перевірити медичний виріб

  • Перевірити, що медичний виріб по $.id існує в таблиці device_definitions в PRM DB

    • в разі помилки - повернути 404 ('Device definition is not found')

  • Перевірити, що медичний виріб активний (is_active = true)

    • в разі помилки - повернути 409 ('Device definition should be active')

Перевірити назви виробів

  • Перевірити, що відсутні дублі типів по $.deviceNames ($.deviceNames.type має бути унікальним по $.deviceNames)

    • в разі помилки - повернути 422 ('Values are not unique by 'type'.)

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

  1. Оновити записи в таблиці device_definition_names в PRM DB для device_definition_id = $.id, встановити значення:

    1. type = $.deviceName.type

    2. name = $.deviceName.name

    3. inserted_at = now() (тільки для нових записів)

    4. updated_by = user_id з токену (тільки для нових записів)

    5. updated_at = now()

    6. updated_by = user_id з токену

  2. Оновити записи в таблиці device_definitions в PRM DB

    1. updated_at = now()

    2. updated_by = user_id з токену

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

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