Versions Compared

Key

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

Мета

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

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

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

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

  3. Користувач може профільтрувати перелік по пошуковим параметрам.

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

Expand
titleindex.graphql
Code Block
languagegraphql
"Reads and enables pagination through a set of `DeviceDefinition`."
  deviceDefinitions(
    "A condition to be used in determining which values should be returned by the collection."
    filter: DeviceDefitinionFilter
    "The method to use when ordering collection items."
    orderBy: DeviceDefitinionOrderBy
    "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
  ): DeviceDefinitionConnection!
Expand
titledeviceDefinitions.graphql
Code Block
languagegraphql
"""
DeviceDefitinion filter.
"""
input DeviceDefitinionFilter {
  "Primary key identifier from the database."
  databaseId: UUID
  "Device name."
  deviceNames: DeviceDefinitionName
  "is_active status."
  isActive: Boolean
  "A classification or risk class of the device model. The value should be present in the `device_classification_type` dictionary."
  classificationType: String
  "Name of device manufacturer."
  manufacturerName: String
  "The catalog or model number for the device for example as defined by the manufacturer."
  modelNumber: String
}

"""
Methods to use when ordering `DeviceDefitinion`.
"""
enum DeviceDefitinionOrderBy {
  "Sort by classification_type in ascending order."
  CLASSIFICATION_TYPE_ASC
  "Sort by classification_type in descending order."
  CLASSIFICATION_TYPE_DESC
  "Sort by inserted_at in ascending order."
  INSERTED_AT_ASC
  "Sort by inserted_at in descending order."
  INSERTED_AT_DESC
  "Sort by model_number in ascending order."
  MODEL_NUMBER_ASC
  "Sort by model_number in descending order."
  MODEL_NUMBER_DESC
}

"""
A connection to a list of `DeviceDefinition` items.
"""
type DeviceDefinitionConnection {
  "Information to aid in pagination."
  pageInfo: PageInfo!
  "A list of nodes."
  nodes: [DeviceDefinition]
  "A list of edges."
  edges: [DeviceDefinitionEdge]
}

"""
An edge in a connection of `DeviceDefinition`.
"""
type DeviceDefinitionEdge {
  "The item at the end of the edge."
  node: DeviceDefinition!
  "A cursor for use in pagination."
  cursor: String!
}

"""
A component part of medication. 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:read')

    • Повернути (403, 'Your scope does not allow to access this resource. Missing allowances: device_definition:read') в разі невалідних скоупів

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

  • Отримати 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')

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

  1. Отримати всі записи з таблиць device_definitions та device_definition_names в базі даних PRM

  2. Задіяти додаткові пошукові параметри (пов'язані за допомогою логічного І):

    1. databaseId - здійснити пошук по device_definitions.id (використовуючи виключне співпадіння з = operator)

    2. deviceNames.type - здійснити пошук по device_definition_names.type (використовуючи виключне співпадіння з = operator )

    3. deviceNames.name - device_definition_names.name (використовуючи порівняння like, нечутливий до регістру)

    4. isActive - здійснити пошук по device_definitions.is_active (використовуючи виключне співпадіння з = operator)

    5. classificationType - пошу по device_definitions.classification_type (використовуючи виключне співпадіння з = operator)

    6. manufacturerName - пошук по device_definitions.manufacturer_name (використовуючи порівння like , нечутливий до регістру)

    7. modelNumber - пошук по device_definitions.model_number (використовуючи порівняння like, нечутливий до регістру)

  3. Використовувати опційний порядок

    1. якщо не передано $.orderBy - відсортувати записи по полю inserted_at в спадаючому порядку.

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