Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents

Мета

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

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

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

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

  3. Перевірки медичного виробу також використовуються в методі [NEW] (GraphQl) Upload Device definitions registry https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17782014260 WS.

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

Expand
titleindex.graphql
Code Block
languagegraphql
  "Creates a single `DeviceDefinition`."
  createDeviceDefinition(input: CreateDeviceDefinitionInput!): CreateDeviceDefinitionPayload
Expand
titledeviceDefinitions.graphql
Code Block
languagegraphql
"""
Input for `createDeviceDefinition` mutation.

User must have scopes **device_definition:write**
"""
input CreateDeviceDefinitionInput {
  "Device identifier in external system."
  externalId: String
  "Device names."
  deviceNames: [CreateDeviceDefinitionNameInput]!
  "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: [CreateDeviceDefinitionPropertyInput]
  "Reference to parent device definition."
  parentId: UUID
}

"""
Input for `deviceNames` of `createDeviceDefinition` mutation.
"""
input CreateDeviceDefinitionNameInput {
  "Device name type. The value should be present in the `device_name_type` dictionary."
  type: String!
  "Device name."
  name: String!
}

"""
Input for `properties` of `createDeviceDefinition` mutation.
"""
input CreateDeviceDefinitionPropertyInput {
  "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
}

"""
Return type for `createDeviceDefinition` mutation.
"""
type CreateDeviceDefinitionPayload {
  "Created `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 - значення, що було вказано в полі

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

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

    • $.classificationTypedevice_classification_type довідник

    • $.manufacturerCountryCOUNTRY довідник

    • $.packagingTypedevice_definition_packaging_type довідник

    • $.packagingUnitDEVICE_UNIT довідник

    • $.deviceNames.typedevice_name_type довідник

    • $.properties.typedevice_properties довідник

      • в разі помилки - повернути 422 ('value is not allowed in enum')

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

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

  • Якщо $.properties вказано, перевірити, що хоча б один з полів $.value[X] вказано в об'єкті

    • в разі помилки - повернути 422 ('One and only one key is allowed from the list')

  • Якщо $.properties вказано, перевірити, що тільки одне поле $.value[X] вказано в кожному об'єкті

    • в разі помилки - повернути 422 ('One and only one key is allowed from the list')

  • Якщо $.parentId вказано, перевірити, що медичний виріб існує і є активним записом https://e-health-ua.atlassian.net/wiki/spaces/RMDNEH/pages/17670504863/UPD+Device+definition+data+model#Device17782014038#Device-definition в таблиці PRM DB

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

  • Якщо $.externalId вказано, перевірити, що не існуює активних медичних виробів з тим же external_id

    • в разі помилки - повернути 422 ('Active device definition with the same external_id already exists.')

  • Перевірити, що не існує активного медичного виробу з тією ж комбінацією полів $.classificationType, $.manufacturerName, $.modelNumber, $.packagingCount, $.partNumber

    • в разі помилки - повернути 422 ('Active device definition with the same classification_type, manufacturer_name, model_number, packaging_count, part_number already exists.')

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

  1. Зберегти дані до таблиць device_definitions та device_definition_names (PRM DB) у відповідності до [UPD] Device definition data model_EN https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17782014038

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