diff --git a/pkg/clinical/application/dto/input.go b/pkg/clinical/application/dto/input.go index 128b96b4..9bcb0eec 100644 --- a/pkg/clinical/application/dto/input.go +++ b/pkg/clinical/application/dto/input.go @@ -132,9 +132,10 @@ type SectionInput struct { // ConsentInput models the consent input type ConsentInput struct { - Status ConsentStatusEnum `json:"status"` - Provision ConsentProvisionTypeEnum `json:"provision,omitempty"` - PatientID string `json:"patientID,omitempty"` + Status ConsentStatusEnum `json:"status"` + Provision ConsentProvisionTypeEnum `json:"provision,omitempty"` + PatientID string `json:"patientID,omitempty"` + DenyReason string `json:"denyReason,omitempty"` } // QuestionnaireResponse models input for questionnaire response resource in fhir diff --git a/pkg/clinical/domain/consent.go b/pkg/clinical/domain/consent.go index a4fe4ddc..e842541d 100644 --- a/pkg/clinical/domain/consent.go +++ b/pkg/clinical/domain/consent.go @@ -4,7 +4,7 @@ import ( "github.com/savannahghi/clinical/pkg/clinical/application/dto" ) -// Consent models a fhir consent resource +// Consent models a fhir consent resource. type FHIRConsent struct { ID *string `json:"id,omitempty"` Status *dto.ConsentStatusEnum `json:"status"` @@ -14,6 +14,7 @@ type FHIRConsent struct { Provision *FHIRConsentProvision `json:"provision,omitempty"` Patient *FHIRReference `json:"patient,omitempty"` Meta *FHIRMetaInput `json:"meta,omitempty"` + Extension []Extension `json:"extension,omitempty"` } // ConsentProvision models a fhir consent provision diff --git a/pkg/clinical/presentation/graph/generated/generated.go b/pkg/clinical/presentation/graph/generated/generated.go index 3fb9955a..efeb1285 100644 --- a/pkg/clinical/presentation/graph/generated/generated.go +++ b/pkg/clinical/presentation/graph/generated/generated.go @@ -4384,6 +4384,7 @@ input ConsentInput{ status: ConsentStatusEnum! provision: ConsentProvisionTypeEnum! patientID: String! + denyReason: String } input ReferenceInput { @@ -28750,7 +28751,7 @@ func (ec *executionContext) unmarshalInputConsentInput(ctx context.Context, obj asMap[k] = v } - fieldsInOrder := [...]string{"status", "provision", "patientID"} + fieldsInOrder := [...]string{"status", "provision", "patientID", "denyReason"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -28784,6 +28785,15 @@ func (ec *executionContext) unmarshalInputConsentInput(ctx context.Context, obj return it, err } it.PatientID = data + case "denyReason": + var err error + + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("denyReason")) + data, err := ec.unmarshalOString2string(ctx, v) + if err != nil { + return it, err + } + it.DenyReason = data } } diff --git a/pkg/clinical/presentation/graph/inputs.graphql b/pkg/clinical/presentation/graph/inputs.graphql index fc4e6cc1..6e93eacc 100644 --- a/pkg/clinical/presentation/graph/inputs.graphql +++ b/pkg/clinical/presentation/graph/inputs.graphql @@ -109,6 +109,7 @@ input ConsentInput{ status: ConsentStatusEnum! provision: ConsentProvisionTypeEnum! patientID: String! + denyReason: String } input ReferenceInput { diff --git a/pkg/clinical/usecases/clinical/consent.go b/pkg/clinical/usecases/clinical/consent.go index 9abd8c11..83a7ddc7 100644 --- a/pkg/clinical/usecases/clinical/consent.go +++ b/pkg/clinical/usecases/clinical/consent.go @@ -23,7 +23,7 @@ func (u *UseCasesClinicalImpl) RecordConsent(ctx context.Context, input dto.Cons } scope := &domain.FHIRCodeableConcept{ - Text: "privacy", + Text: "patient-privacy", } var system scalarutils.URI = "http://terminology.hl7.org/CodeSystem/consentcategorycodes" @@ -65,6 +65,14 @@ func (u *UseCasesClinicalImpl) RecordConsent(ctx context.Context, input dto.Cons Meta: &consentMeta, } + if input.Provision == dto.ConsentProvisionTypeDeny { + extension := &domain.Extension{ + URL: "http://hl7.org/fhir/StructureDefinition/event-statusReason", + ValueString: input.DenyReason, + } + consent.Extension = []domain.Extension{*extension} + } + resp, err := u.infrastructure.FHIR.CreateFHIRConsent(ctx, consent) if err != nil { return nil, err diff --git a/pkg/clinical/usecases/clinical/consent_test.go b/pkg/clinical/usecases/clinical/consent_test.go index 02c53c63..ab1033fb 100644 --- a/pkg/clinical/usecases/clinical/consent_test.go +++ b/pkg/clinical/usecases/clinical/consent_test.go @@ -37,9 +37,10 @@ func TestUseCasesClinicalImpl_RecordConsent(t *testing.T) { args: args{ ctx: context.Background(), input: dto.ConsentInput{ - PatientID: ID, - Provision: dto.ConsentProvisionTypeEnum(provisionType), - Status: dto.ConsentStatusEnum(status), + PatientID: ID, + Provision: dto.ConsentProvisionTypeEnum(provisionType), + Status: dto.ConsentStatusEnum(status), + DenyReason: "", }, }, wantErr: false, @@ -49,8 +50,9 @@ func TestUseCasesClinicalImpl_RecordConsent(t *testing.T) { args: args{ ctx: context.Background(), input: dto.ConsentInput{ - PatientID: ID, - Status: dto.ConsentStatusEnum(status), + PatientID: ID, + Status: dto.ConsentStatusEnum(status), + DenyReason: "", }, }, wantErr: true, @@ -60,8 +62,9 @@ func TestUseCasesClinicalImpl_RecordConsent(t *testing.T) { args: args{ ctx: context.Background(), input: dto.ConsentInput{ - PatientID: "", - Status: dto.ConsentStatusEnum(status), + PatientID: "", + Status: dto.ConsentStatusEnum(status), + DenyReason: "", }, }, wantErr: true, @@ -71,8 +74,9 @@ func TestUseCasesClinicalImpl_RecordConsent(t *testing.T) { args: args{ ctx: nil, input: dto.ConsentInput{ - PatientID: "", - Status: dto.ConsentStatusEnum(status), + PatientID: "", + Status: dto.ConsentStatusEnum(status), + DenyReason: "", }, }, wantErr: true,