Skip to content

Commit

Permalink
feat: persist patient referral form as FHIR document reference
Browse files Browse the repository at this point in the history
Signed-off-by: Kathurima Kimathi <kathurimakimathi415@gmail.com>
  • Loading branch information
KathurimaKimathi committed Apr 8, 2024
1 parent b793b1b commit ace78ad
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 17 deletions.
4 changes: 3 additions & 1 deletion pkg/clinical/domain/document_reference.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package domain

import "github.com/savannahghi/scalarutils"

// FHIRDocumentReference represents a reference to a document of any kind for any purpose.
// It provides metadata about the document so that the document can be discovered and managed.
// The scope of a document is any seralized object with a mime-type, so includes formal patient centric documents (CDA), cliical notes, scanned paper, and non-patient centric documents like policy text.
Expand Down Expand Up @@ -78,7 +80,7 @@ type FHIRDocumentReferenceInput struct {
Type *FHIRCodeableConceptInput `json:"type,omitempty"`
Category []FHIRCodeableConceptInput `json:"category,omitempty"`
Subject *FHIRReferenceInput `json:"subject,omitempty"`
Date *string `json:"date,omitempty"`
Date *scalarutils.Instant `json:"date,omitempty"`
Author []FHIRReferenceInput `json:"author,omitempty"`
Authenticator *FHIRReferenceInput `json:"authenticator,omitempty"`
Custodian *FHIRReferenceInput `json:"custodian,omitempty"`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ type FHIRMock struct {
MockGetFHIRPatientEverythingFn func(ctx context.Context, id string, params map[string]interface{}) (*domain.PagedFHIRResource, error)
MockGetFHIRServiceRequestFn func(_ context.Context, id string) (*domain.FHIRServiceRequestRelayPayload, error)
MockCreateFHIRSubscriptionFn func(_ context.Context, subscription *domain.FHIRSubscriptionInput) (*domain.FHIRSubscription, error)
MockCreateFHIRDocumentReferenceFn func(ctx context.Context, subscription *domain.FHIRSubscriptionInput) (*domain.FHIRSubscription, error)
MockCreateFHIRDocumentReferenceFn func(ctx context.Context, documentReference *domain.FHIRDocumentReferenceInput) (*domain.FHIRDocumentReference, error)
}

// NewFHIRMock initializes a new instance of FHIR mock
Expand Down Expand Up @@ -2263,24 +2263,31 @@ func NewFHIRMock() *FHIRMock {
Channel: domain.FHIRSubscriptionChannel{},
}, nil
},
MockCreateFHIRDocumentReferenceFn: func(ctx context.Context, subscription *domain.FHIRSubscriptionInput) (*domain.FHIRSubscription, error) {
resourceID := uuid.New().String()
return &domain.FHIRSubscription{
ID: &resourceID,
MockCreateFHIRDocumentReferenceFn: func(ctx context.Context, documentReference *domain.FHIRDocumentReferenceInput) (*domain.FHIRDocumentReference, error) {
resourceID := gofakeit.UUID()
return &domain.FHIRDocumentReference{
ID: resourceID,
Meta: &domain.FHIRMeta{},
ImplicitRules: new(string),
Language: new(string),
Text: &domain.FHIRNarrative{},
Extension: []*domain.Extension{},
ModifierExtension: []*domain.Extension{},
Identifier: []*domain.FHIRIdentifier{},
Extension: []domain.FHIRExtension{},
ModifierExtension: []domain.FHIRExtension{},
MasterIdentifier: &domain.FHIRIdentifier{},
Identifier: []domain.FHIRIdentifier{},
Status: "",
Contact: []domain.FHIRContactPoint{},
End: new(string),
Reason: "",
Criteria: "",
Error: new(string),
Channel: domain.FHIRSubscriptionChannel{},
Type: &domain.FHIRCodeableConcept{},
Category: []domain.FHIRCodeableConcept{},
Subject: &domain.FHIRReference{},
Date: new(string),
Author: []domain.FHIRReference{},
Authenticator: &domain.FHIRReference{},
Custodian: &domain.FHIRReference{},
RelatesTo: []domain.FHIRDocumentReferenceRelatesTo{},
Description: "",
SecurityLabel: []domain.FHIRCodeableConcept{},
Content: []domain.FHIRDocumentReferenceContent{},
Context: &domain.FHIRDocumentReferenceContext{},
}, nil
},
}
Expand Down Expand Up @@ -2652,6 +2659,6 @@ func (fh *FHIRMock) CreateFHIRSubscription(ctx context.Context, subscription *do
}

// CreateFHIRDocumentReference mocks the implementation of creating a FHIR document reference
func (fh *FHIRMock) CreateFHIRDocumentReference(ctx context.Context, subscription *domain.FHIRSubscriptionInput) (*domain.FHIRSubscription, error) {
return fh.MockCreateFHIRSubscriptionFn(ctx, subscription)
func (fh *FHIRMock) CreateFHIRDocumentReference(ctx context.Context, documentReference *domain.FHIRDocumentReferenceInput) (*domain.FHIRDocumentReference, error) {
return fh.MockCreateFHIRDocumentReferenceFn(ctx, documentReference)
}
1 change: 1 addition & 0 deletions pkg/clinical/repository/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ type FHIR interface {
FHIRRiskAssessment
FHIRDiagnosticReport
FHIRSubscription
FHIRDocumentReference
}

type FHIROrganization interface {
Expand Down
61 changes: 61 additions & 0 deletions pkg/clinical/usecases/clinical/referral_report.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/SebastiaanKlippert/go-wkhtmltopdf"
"github.com/savannahghi/clinical/pkg/clinical/application/common/helpers"
"github.com/savannahghi/clinical/pkg/clinical/application/utils"
"github.com/savannahghi/clinical/pkg/clinical/domain"
"github.com/savannahghi/scalarutils"
)

Expand Down Expand Up @@ -203,5 +204,65 @@ func (c *UseCasesClinicalImpl) GenerateReferralReportPDF(ctx context.Context, se
return nil, err
}

result, err := c.infrastructure.Upload.UploadMedia(ctx, filename, bytes.NewReader(pdfBytes), "")
if err != nil {
utils.ReportErrorToSentry(err)
return nil, err
}

// Create a document reference to the document reference
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,
Type: &domain.FHIRCodeableConceptInput{
ID: serviceRequest.Resource.Code.ID,
Coding: []*domain.FHIRCodingInput{
{
ID: serviceRequest.Resource.Code.ID,
System: serviceRequest.Resource.Code.Coding[0].System,
Code: *serviceRequest.Resource.Code.Coding[0].Code,
Display: serviceRequest.Resource.Code.Coding[0].Display,
},
},
Text: serviceRequest.Resource.Code.Coding[0].Display,
},
Subject: &domain.FHIRReferenceInput{
ID: serviceRequest.Resource.Subject.ID,
Reference: serviceRequest.Resource.Subject.Reference,
},
Date: &instant,
Content: []domain.FHIRDocumentReferenceContent{
{
Attachment: domain.FHIRAttachment{
ContentType: (*scalarutils.Code)(&result.ContentType),
URL: (*scalarutils.URL)(&result.SignedURL),
Title: &title,
},
},
},
Context: &domain.FHIRDocumentReferenceContext{
Related: []domain.Reference{
{
Reference: serviceRequestReference,
Type: "ServiceRequest",
},
},
},
}

_, err = c.infrastructure.FHIR.CreateFHIRDocumentReference(ctx, documentReference)
if err != nil {
utils.ReportErrorToSentry(err)
return nil, err
}

return pdfBytes, nil
}

0 comments on commit ace78ad

Please sign in to comment.