package integration import ( "errors" "fmt" "satusehat-rssa/internal/constant" "satusehat-rssa/internal/model" "satusehat-rssa/pkg/httputil" ) type QuestionnaireResponseInterface interface { // Define methods for QuestionnaireResponseInterface CreateQuestionnaireResponse(req model.QuestionnaireResponseRequest) (map[string]interface{}, error) UpdateQuestionnaireResponse(req model.QuestionnaireResponseRequest) (map[string]interface{}, error) } type QuestionnaireResponseRepository struct { // Define fields for QuestionnaireResponseRepository akses *model.Akses } func NewQuestionnaireResponseRepo(akses *model.Akses) QuestionnaireResponseInterface { return &QuestionnaireResponseRepository{ akses: akses, } } // CreateQuestionnaireResponse implements QuestionnaireResponseInterface. func (c *QuestionnaireResponseRepository) CreateQuestionnaireResponse(req model.QuestionnaireResponseRequest) (map[string]interface{}, error) { req.ResourceType = constant.QuestionnaireResponseResourceType patient, err := c.setupPatient(&req) if err != nil { return nil, err } err = c.setupEncounter(&req, patient) if err != nil { return nil, err } err = c.setupSource(&req) if err != nil { return nil, err } // err = c.setupPractitioner(&req) // if err != nil { // return nil, err // } oauth := model.OauthRequest{ ClientId: c.akses.ClientId, ClientSecret: c.akses.ClientSecret, } token, err := NewOauthRequestRepo(c.akses).GenerateToken(oauth) if err != nil { return nil, err } if token == nil { return nil, errors.New(constant.ErrGenerateToken) } url := c.akses.BaseUrl + "/QuestionnaireResponse" return httputil.DoRequest(httputil.RequestOption{ Method: "POST", URL: url, Body: req, BearerToken: token.AccessToken, Headers: httputil.DefaultFHIRHeaders(), }) } func (c *QuestionnaireResponseRepository) UpdateQuestionnaireResponse(req model.QuestionnaireResponseRequest) (map[string]interface{}, error) { req.ResourceType = constant.QuestionnaireResponseResourceType patient, err := c.setupPatient(&req) if err != nil { return nil, err } err = c.setupEncounter(&req, patient) if err != nil { return nil, err } err = c.setupSource(&req) if err != nil { return nil, err } // err = c.setupPractitioner(&req) // if err != nil { // return nil, err // } oauth := model.OauthRequest{ ClientId: c.akses.ClientId, ClientSecret: c.akses.ClientSecret, } token, err := NewOauthRequestRepo(c.akses).GenerateToken(oauth) if err != nil { return nil, err } if token == nil { return nil, errors.New(constant.ErrGenerateToken) } url := c.akses.BaseUrl + fmt.Sprintf("/QuestionnaireResponse/%s", req.Id) return httputil.DoRequest(httputil.RequestOption{ Method: "PUT", URL: url, Body: req, BearerToken: token.AccessToken, Headers: httputil.DefaultFHIRHeaders(), }) } func (c *QuestionnaireResponseRepository) setupPatient(req *model.QuestionnaireResponseRequest) (string, error) { if req.Subject.Reference == "" { return "", nil } patientInterface := NewPatientRepo(c.akses) patient, err := patientInterface.HandleCheckPatient(req.Subject.Reference) if err != nil { return "", err } if patient != "" { req.Subject.Reference = "Patient/" + patient } return patient, nil } func (c *QuestionnaireResponseRepository) setupSource(req *model.QuestionnaireResponseRequest) error { if req.Source.Reference == "" { return nil } patientInterface := NewPatientRepo(c.akses) patient, err := patientInterface.HandleCheckPatient(req.Source.Reference) if err != nil { return err } if patient != "" { req.Source.Reference = "Patient/" + patient } return nil } func (c *QuestionnaireResponseRepository) setupEncounter(req *model.QuestionnaireResponseRequest, patient string) error { if patient == "" { return nil } encounterInterface := NewEncounterRepo(c.akses) encounterId, encounterExist, err := encounterInterface.HandleCheckEncounter(patient) if err != nil { return err } if encounterExist { req.Encounter.Reference = "Encounter/" + encounterId } return nil } // setupPractitioner handles practitioner reference logic. func (c *QuestionnaireResponseRepository) setupPractitioner(req *model.QuestionnaireResponseRequest) error { if req.Author.Reference == "" { return nil } practicionerInterface := NewPracticionerRepo(c.akses) ref, display, err := practicionerInterface.HandleCheckPartitioner(req.Author.Reference) if err != nil { return err } if ref != "" { req.Author.Reference = "Practitioner/" + ref req.Author.Display = display } return nil }