felicity-lims/felicity/api/rest/api_v1/fhir/r4.py

78 lines
2.4 KiB
Python
Raw Normal View History

import json
2023-08-14 02:08:08 +08:00
from sanic import Blueprint
from sanic.request import Request
from sanic.exceptions import SanicException
2023-05-17 16:54:05 +08:00
from apps.iol.fhir.schema import (
BundleResource,
2023-05-17 16:54:05 +08:00
DiagnosticReportResource,
PatientResource,
ServiceRequestResource,
)
from apps.iol.fhir.utils import get_diagnostic_report_resource, get_patient_resource, create_resource
from apps.user import models as user_models
2023-05-17 16:54:05 +08:00
2023-08-14 02:08:08 +08:00
fhir_v4 = Blueprint('fhir-v4', url_prefix="/fhir")
2023-05-17 16:54:05 +08:00
2023-08-14 02:08:08 +08:00
@fhir_v4.post("/{resource_type}")
async def add_resource(
request: Request,
2023-08-14 02:08:08 +08:00
resource_type: str,
current_user: user_models.User,
):
2023-05-17 16:54:05 +08:00
"""
Add a fhir resource
Supported Resources are Bundle, ServiceRequest and Patient
2023-05-17 16:54:05 +08:00
"""
if not "authenticated" in request.auth.scopes:
2023-08-14 02:08:08 +08:00
return SanicException("You are not authenticated", status_code=400)
user_auth = await user_models.UserAuth.get_by_username(request.user.username)
current_user = await user_models.User.get(auth_uid=user_auth.uid)
2023-06-24 18:28:27 +08:00
data = json.loads(await request.json())
resources = {
"Bundle": BundleResource,
"DiagnosticReport": DiagnosticReportResource,
"ServiceRequest": ServiceRequestResource,
"Patient": PatientResource,
}
if resource_type not in resources:
2023-08-14 02:08:08 +08:00
raise SanicException(
f"{resource_type} Resource not supported",
status_code=417
2023-05-17 16:54:05 +08:00
)
mapped_data = resources[resource_type](**data)
return await create_resource(resource_type, mapped_data, request, current_user)
2023-05-17 16:54:05 +08:00
2023-08-14 02:08:08 +08:00
@fhir_v4.get("/{resource}/{resource_id}")
async def get_resource(request, resource: str, resource_id: int,
current_user: user_models.User,):
2023-05-17 16:54:05 +08:00
"""
Supported Resources are DiagnosticReport and Patient
- **resource_id** A Fhir Resource ID
"""
if resource not in ["Patient", "DiagnosticReport"]:
2023-08-14 02:08:08 +08:00
raise SanicException(
f"{resource} Resource not supported",
status_code=417
2023-05-17 16:54:05 +08:00
)
item = None
if resource == "Patient":
item = await get_patient_resource(resource_id)
if resource == "DiagnosticReport":
item = await get_diagnostic_report_resource(resource_id)
if not item:
2023-08-14 02:08:08 +08:00
raise SanicException(
f"{resource} with id {resource_id} not found",
status_code=404
2023-05-17 16:54:05 +08:00
)
return item