package integration import ( "errors" "fmt" "satusehat-rssa/internal/constant" "satusehat-rssa/internal/model" "satusehat-rssa/pkg/httputil" ) type ImmunizationInterface interface { // Define methods for ImmunizationInterface CreateImmunization(req model.ImmunizationRequest) (map[string]interface{}, error) UpdateImmunization(req model.ImmunizationRequest) (map[string]interface{}, error) } type ImmunizationRepository struct { // Define fields for ImmunizationRepository akses *model.Akses } func NewImmunizationRepo(akses *model.Akses) ImmunizationInterface { return &ImmunizationRepository{ akses: akses, } } // CreateImmunization implements ImmunizationInterface. func (c *ImmunizationRepository) CreateImmunization(req model.ImmunizationRequest) (map[string]interface{}, error) { req.ResourceType = constant.ImmunizationResourceType //setup primarySource default true karena vaksin bersumber dari orang yg melakukan vaksin req.PrimarySource = true patient, err := c.setupPatient(&req) if err != nil { return nil, err } err = c.setupEncounter(&req, patient) 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 + "/Immunization" return httputil.DoRequest(httputil.RequestOption{ Method: "POST", URL: url, Body: req, BearerToken: token.AccessToken, Headers: httputil.DefaultFHIRHeaders(), }) } func (c *ImmunizationRepository) UpdateImmunization(req model.ImmunizationRequest) (map[string]interface{}, error) { req.ResourceType = constant.ImmunizationResourceType patient, err := c.setupPatient(&req) if err != nil { return nil, err } err = c.setupEncounter(&req, patient) 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("/Immunization/%s", req.Id) return httputil.DoRequest(httputil.RequestOption{ Method: "PUT", URL: url, Body: req, BearerToken: token.AccessToken, Headers: httputil.DefaultFHIRHeaders(), }) } func (c *ImmunizationRepository) setupPatient(req *model.ImmunizationRequest) (string, error) { if req.Patient.Reference == "" { return "", nil } patientInterface := NewPatientRepo(c.akses) patient, err := patientInterface.HandleCheckPatient(req.Patient.Reference) if err != nil { return "", err } if patient != "" { req.Patient.Reference = "Patient/" + patient } return patient, nil } func (c *ImmunizationRepository) setupEncounter(req *model.ImmunizationRequest, 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 }