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

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 Current »

Мета

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

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

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

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

  3. Перевірки медичного виробу також використовуються в методі https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17782014260 WS.

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

 index.graphql
  "Creates a single `DeviceDefinition`."
  createDeviceDefinition(input: CreateDeviceDefinitionInput!): CreateDeviceDefinitionPayload
 deviceDefinitions.graphql
"""
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/EH/pages/17782014038#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) у відповідності до https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17782014038

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

  • No labels