From af80723a02ba1d4788ff18a5236619f4d39ec053 Mon Sep 17 00:00:00 2001 From: Kathurima Kimathi Date: Tue, 9 Apr 2024 14:37:03 +0300 Subject: [PATCH] refactor: create fhir document reference Signed-off-by: Kathurima Kimathi --- pkg/clinical/domain/document_reference.go | 4 +- .../usecases/clinical/referral_report.go | 61 +++++++++++-------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/pkg/clinical/domain/document_reference.go b/pkg/clinical/domain/document_reference.go index 1f4b45e..f93214b 100644 --- a/pkg/clinical/domain/document_reference.go +++ b/pkg/clinical/domain/document_reference.go @@ -60,8 +60,8 @@ type FHIRDocumentReferenceContext struct { Period *FHIRPeriod `json:"period,omitempty"` FacilityType *FHIRCodeableConcept `json:"facilityType,omitempty"` PracticeSetting *FHIRCodeableConcept `json:"practiceSetting,omitempty"` - SourcePatientInfo *Reference `json:"sourcePatientInfo,omitempty"` - Related []Reference `json:"related,omitempty"` + SourcePatientInfo *FHIRReference `json:"sourcePatientInfo,omitempty"` + Related []*FHIRReference `json:"related,omitempty"` } // FHIRDocumentReferenceInput is the input type for FHIRDocumentReference diff --git a/pkg/clinical/usecases/clinical/referral_report.go b/pkg/clinical/usecases/clinical/referral_report.go index 49496e2..b70db3f 100644 --- a/pkg/clinical/usecases/clinical/referral_report.go +++ b/pkg/clinical/usecases/clinical/referral_report.go @@ -74,6 +74,14 @@ type TemplateData struct { Footer Footer } +// DocumentReferencePayload models data used to create caller specific reference document payload +type DocumentReferencePayload struct { + Subject *domain.FHIRReferenceInput + Attachment *domain.FHIRAttachment + Related *domain.FHIRReference + TerminologySystem string +} + // GenerateReferralReportPDF generates a PDF report for a given referral. // // The serviceRequestID is unique to each ServiceRequest resource, which, @@ -202,7 +210,26 @@ func (c *UseCasesClinicalImpl) GenerateReferralReportPDF(ctx context.Context, se return nil, err } - _, err = c.CreateDocumentReference(ctx, serviceRequest, result) + title := fmt.Sprintf("%s's Referral report", serviceRequest.Resource.Subject.Display) + serviceRequestReference := fmt.Sprintf("ServiceRequest/%s", *serviceRequest.Resource.ID) + + payload := &DocumentReferencePayload{ + Subject: &domain.FHIRReferenceInput{ + ID: serviceRequest.Resource.Subject.ID, + Reference: serviceRequest.Resource.Subject.Reference, + }, + Attachment: &domain.FHIRAttachment{ + ContentType: (*scalarutils.Code)(&result.ContentType), + URL: (*scalarutils.URL)(&result.SignedURL), + Title: &title, + }, + Related: &domain.FHIRReference{ + Reference: &serviceRequestReference, + }, + TerminologySystem: common.ReferralNoteLOINCTerminologySystem, + } + + _, err = c.CreateDocumentReference(ctx, payload) if err != nil { utils.ReportErrorToSentry(err) return nil, err @@ -212,8 +239,8 @@ func (c *UseCasesClinicalImpl) GenerateReferralReportPDF(ctx context.Context, se } // CreateDocumentReference is a helper method to abstract the creation of a document reference -func (c *UseCasesClinicalImpl) CreateDocumentReference(ctx context.Context, serviceRequest *domain.FHIRServiceRequestRelayPayload, result *dto.Media) (bool, error) { - concept, err := c.GetConcept(ctx, dto.TerminologySourceLOINC, common.ReferralNoteLOINCTerminologySystem) +func (c *UseCasesClinicalImpl) CreateDocumentReference(ctx context.Context, payload *DocumentReferencePayload) (bool, error) { + concept, err := c.GetConcept(ctx, dto.TerminologySourceLOINC, payload.TerminologySystem) if err != nil { utils.ReportErrorToSentry(err) return true, err @@ -222,14 +249,10 @@ func (c *UseCasesClinicalImpl) CreateDocumentReference(ctx context.Context, serv finalDocStatus := domain.CompositionStatusEnumFinal status := domain.DocumentReferenceStatusEnumCurrent instant := scalarutils.Instant(time.Now().Format(time.RFC3339)) - title := fmt.Sprintf("%s's Referral report", serviceRequest.Resource.Subject.Display) - serviceRequestReference := fmt.Sprintf("ServiceRequest/%s", *serviceRequest.Resource.ID) documentReference := &domain.FHIRDocumentReferenceInput{ - Meta: &domain.FHIRMetaInput{}, - Identifier: []domain.FHIRIdentifierInput{}, - Status: status, - DocStatus: &finalDocStatus, + Status: status, + DocStatus: &finalDocStatus, Type: &domain.FHIRCodeableConceptInput{ Coding: []*domain.FHIRCodingInput{ { @@ -240,26 +263,16 @@ func (c *UseCasesClinicalImpl) CreateDocumentReference(ctx context.Context, serv }, Text: concept.DisplayName, }, - Subject: &domain.FHIRReferenceInput{ - ID: serviceRequest.Resource.Subject.ID, - Reference: serviceRequest.Resource.Subject.Reference, - }, - Date: &instant, + Subject: payload.Subject, + Date: &instant, Content: []domain.FHIRDocumentReferenceContent{ { - Attachment: domain.FHIRAttachment{ - ContentType: (*scalarutils.Code)(&result.ContentType), - URL: (*scalarutils.URL)(&result.SignedURL), - Title: &title, - }, + Attachment: *payload.Attachment, }, }, Context: &domain.FHIRDocumentReferenceContext{ - Related: []domain.Reference{ - { - Reference: serviceRequestReference, - Type: "ServiceRequest", - }, + Related: []*domain.FHIRReference{ + payload.Related, }, }, }