Table of Contents |
---|
Ціль
Даний веб-сервіс (WS) розроблено для створення дозволу на сутність, що є агрегуючою сутністю (контекстом) для інших сутностей (episode_of_care, diagnostic_report, care_plan), АБО заборонену групу АБО дігностичний звіт, АБО на service_request з врахуванням його permitted_resources АБО на відміну взаємодії чи процедури.
Дозволи обробляються асинхронним шляхом.
Тільки автентифіковані та авторизовані співробітники з відповідним скоупом можуть створювати доступи.
Специфікація
...
Перевірити запит
...
Авторизація
Перевірити валідність токену доступу
...
Перевірити скоупи користувачів approval:create на можливість виконання даної операції
Логіка
...
Апрували виконуються в асинхронний спосіб
...
Користувач може сворити апрувал тільки для співробітника його юридичної особи
client_id з токену повинен бути поєднаним з employee_id від об'єкту granted_to.
granted_to.employee_id повинен бути активним.
...
Тільки користувачі з типами працівника "DOCTOR", "SPECIALIST", "ASSISTANT" можуть створювати апрувал
Перевірити granted_to.identifier.value: employee_type = "DOCTOR"/"SPECIALIST"/"ASSISTANT" і працівник у статусі APPROVED у базі даних
у разі помилки повернути - 422 з повідомленням “Invalid employee type“
...
в разі помилки - повернути 401 (“Invalid access token”) в разі неуспішної валідації
Перевірити, що токен дійсний
в разі помилки - повернути 401 (“Invalid access token”)
Перевірити скоупи користувача на можливість виконання даної дії (scope = 'approval:create ')
повернути 403 (“Your scope does not allow to access this resource. Missing allowances: approval:create ”) в разі невалідних скоупів
Перевірити запит
Перевірити користувача
Granted_to.employee_id повинні бути активні
в разі помилки - повернути 422 “Should be active“
Перевірити, що співробітник належіть тій самій юридичній особі що і користувач:
client_id з токену повинен бути пов'язаний з employee_id з об'єкту granted_to.
в разі помилки - повернути 422 “Employee <employee_id> doesn't belong to your legal entity“
Перевірити ресурси чи блоки ресурсів
Дозволи відпрацьовуються асинхронно
Перевірити ресурси
якщо episode_of_care вказано в запиті як код ресурсу
Перевірити, що episode_of_care в рапиті існує та знаходиться в статусі активний або закритий в DB
в разі помилки - повернути 422 (Episode is canceled)
якщо diagnostic_report вказано в запиті як код ресурсу
Перевірити, що блок diagnostic_report в запиті існує в фінальному статусі в DB
в разі помилки - повернути 422 (Diagnostic report in \"entered_in_error\" status can not be referenced or Diagnostic report with such id is not found)
якщо care_plan вказано в запиті як код ресурсу
Перевірити care_plan з запиту присутній в DB
в разі помилки - повернути 422 (Care plan with such id is not found)
Перевірити, що в запиті відсутні інші об'єкти
в разі помилки - повернути 422 (Approval for care plan can not contain other entities)
якщо взаємодія наявна вказана в запиті як код ресурсу
Перевірити, що взаємодія з запиту присутня в DB
в разі помилки - повернути 422 (not found)
якщо процедура присутня в запиті як блок ресурсу
Перевірити, що процедура з запиту присутня в DB
в разі помилки - повернути 422 (not found)
Перевірити service_request
Якщо блок service_request присутній в запиті
...
(тільки в
...
активному стані)
...
використати Response.permitted_resources як
...
ресурс для
...
доступу (
...
можуть бути епізод
...
чи diagnostic_report).
...
якщо блок forbidden_group вказано в запиті
...
Перевірити forbidden_group
Якщо блок forbidden_group вказано в запиті
Check forbidden group in the request exists and is_active in DB
in case of error return - 404 (not found)
Перевірити diagnoses_group
Якщо diagnoses_group block вказано в запиті
Check diagnoses_group in the request exists and is_active in DB
in case of error return - 404 (not found)
Перевірити пацієнта
Якщо patient block вказано в запиті
Отримати patient_id з URL:
Перевірити, що person_id з запиту відповідає patient_id з URL
в разі помилки - повернути 404 (“Approval for one patient can not be created in another patient’s context”)
існує та is_active в
...
DB
в разі помилки - повернути
...
404 (Person is not found)
...
Перевірити блок child_resource
Якщо child_resource не пустий:
перевірити, що access_level == read
в разі помилки - повернути 422 ("$.access_level. value is not allowed in enum")
перевірити, що контекст $.child_resource.identifier.value відповідає $.resource.identifier.value
в разі помилки - повернути 422 (Child resource context id is not equal to granted resource id)
перевірити, що service_requests / forbidden_groups / diagnoses_group / patients не заповнені
в разі помилки - повернути 422 (schema does not allow additional properties)
перевірити, що максимальна кількість сутностей в ресурсі = 1
в разі помилки - повернути 422 ($.resources.expected a maximum of 1 items but got 2)
Перевірити authentication_method персони
Перевірити patient_id:
...
якщо
...
належить person,
...
то GET auth_method
...
використовує MPI
...
{patient_id}
якщо це OTP:
...
направити SMS
...
на auth_phone
...
по otpч_verification
...
сервіс POST /verifications
зберегти
...
погодження до DB
зберегти authentication_method_current.type та номер
...
до DB
...
повернути authentication_method_current.type = OTP
якщо
...
оф-лайн
зберегти
...
доступ до DB
зберегти authentication_method_current.type
...
and number to DB
повернути authentication_method_current.type = offline
...
якщо це null:
повернути
...
error 409 (Person
...
does not have active authentication
...
method)
якщо належить
...
preperson:
зберегти
...
погодження до
...
DB
встановити
...
для доступу status
...
= active
встановити
...
для доступу urgent = null
Перевірити access_level
Перевірити, що access_level відповідає granted_resources:
в разі помилки повернути
...
422 ("Resource types [\"$.granted_resources[].code\"] not allowed to use write access_level")
Блок | granted_resources | access_level |
---|
Доступ на | reason | ||
---|---|---|---|
resources | episode_of_care | read | Читання всіх даних |
по вказаному в доступі епізоду | null | |
diagnostic_report | read | Читання всіх даних |
по вказаному в дозволі діагностичному звіті |
null | ||
diagnostic_report | write | Відмінити пакет по діагностичному звіту |
care_plan | read | Читання всіх даних |
по вказаному в дозволі плану лікування | null | |||
care_plan | write | Створення активностей для плану лікування, відміна рецептів або відкликання\відміна сервіс реквестів, які основуються на плану лікування | ||
encounter | write | Відміна пакету по взаємодії | null | |
procedure | write | Відміна процедури | null | |
child_resources | diagnostic_report | read | Читання всіх даних, які вказані в контекстні для diagnostic_report та на сам diagnostic_report | null |
encounter | Читання всіх даних, які вказані в контекстні для encounter та на сам encounter | null | ||
condition | Читання всіх даних, які вказані в контекстні для condition та на сам condition | null | ||
observation | Читання всіх даних, які вказані в контекстні для observation та на сам observation | null | ||
activity | Читання всіх даних, які вказані в контекстні для activity та на сам activity | null | ||
clinical_impression | Читання всіх даних, які вказані в контекстні для clinical_impression та на сам clinical_impression | null | ||
allergy_intolerance | Читання всіх даних, які вказані в контекстні для allergy_intolerance та на сам allergy_intolerance | null | ||
immunization | Читання всіх даних, які вказані в контекстні для immunization та на сам immunization | null | ||
device | Читання всіх даних, які вказані в контекстні для device та на сам device | null | ||
risk_assessment | Читання всіх даних, які вказані в контекстні для risk_assessment та на сам risk_assessment | null | ||
procedure | Читання всіх даних, які вказані в контекстні для procedure та на сам procedure | null | ||
service_request | episode_of_care | read | Читання даних з granted_resources в доступі направлення | service_request |
diagnostic_report | read |
forbidden_group | forbidden_group | read | Читання всіх медичних даних з |
даними (codes/services/service_groups) |
, які вказані в |
доступі на заборонені групи | null | |||
diagnoses_group | episode_of_care array | read | Читання всіх даних на епізод з current_diagnoses.codes, які вказані в доступах на діагностичні групи | null |
patient_id | patient_id | read | Читання всіх даних по вказаному пацієнту | null |
Перевірити authorize_with
Пацієнт може передати id його auth_method з , яким він має намір дати апрувал. Потрібний метод автентифікації (auth method) може бути знайдений за допомогою хоче підтвердити доступ. Необхідний метод auth може бути знайдений шляхом Get person's auth methods
перевірити
...
auth_method.
...
id в UUID
в разі помилки
...
повернути 422
знайти
...
метод автентифікації в MPI.person_authentication_method
в разі помилки
...
повернути 422, "such authentication method doesn't exist"
знайти
...
метод автентифікації пацієнта,
...
де MPI.person_authentication_method.person_id = $.patient.id
в разі помилки
...
повернути 422, "such authentication method does not belong to this person"
перевірити, що auth_method.type = NA
повернути помилку 422, "Сannot be confirmed by a method with type= NA. Use a different method."
перевірити, що
...
метод автентифікації активний (authentication_method.ended_at > now() та is_active = true)
Дане поле опціональне/не обов'язкове та вказане в некількох полях Поле опційне та встановити в нове поле authorize_with
та зберігає та зберегти type
та та phone_number
в approvals.urgent.authentication_method_current.
Якщо апрувал дозвіл не має даних полівцього поля, тоді то вибрати той метод, який повертається з mpi як як person's default method.
Відмінити існуючий дозвіл
Знайти, якщо існують активні та дійсні дозволи, надані поточним patient_id, для тих же granted_resources, granted_to та access_level з запиту.
Якщо знайдено - встановити їх статус на
terminated
. Такод, встановити updated_at та updated_by поточному користувачу.
Додаткова логіка
Всі
...
дозволи в статусі "new"
...
повинна бути
...
видалена через 12
...
hours після створення -
...
env. configuration parameter
Всі
...
дозволи з forbidden_group має свій власний expires_at config parameter - env. configuration parameter
Всі дозволи з care_plan має свій власний expires_at
...
config parameter - env. configuration parameter
Всі дозволи на картку пацієнта має свій власний expires_at config parameter - env. configuration parameter
Дозволи з child_resources буде створено на сутність, яка є контекстом для child_resources
Для дозволів на child_resource з ресурсом або service_request:
встановити child_resource до блоку reason
встановити service_request до блоку reason
Перевірити, чи granted_resource та\чи reason мають коди заборонених груп:
якщо є записи з заборонених груп
перевірити тип authentication_method для пацієнта
якщо тип 'OTP' відправити SMS (Код <code> для доступу до даних про ВІЛ/РПП https://bit.ly/nszu1677f )
якщо немає записів з заборонених груп та блок diagnoses_group вказано в запиті
якщо група діагнозів містить коди з довідника ICD10:
перевірити тип authentication_method для пацієнта
якщо тип 'OTP' відправити SMS (Код <code>: доступ на групу діагнозів {diagnoses_group_code} http://bit.ly/nszu1677b )
якщо група діагнозів містить коди з довідника ICPC2:
перевірити тип authentication_method для пацієнта
якщо тип 'OTP' відправити SMS (Код <code> доступ на групу діагнозів {diagnoses_group_code} http://bit.ly/nszu1677e )
якщо відсутні коди заборонених груп
перевірити тип authentication_method по пацієнту
якщо тип = 'OTP' відправити SMS (Код авторизації дій в системі eHealth: <code>')