166 lines
3.9 KiB
Go
166 lines
3.9 KiB
Go
package patient
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
|
|
cfg "simrs-vx/internal/infra/sync-cfg"
|
|
pl "simrs-vx/pkg/logger"
|
|
|
|
e "simrs-vx/internal/domain/main-entities/patient"
|
|
un "simrs-vx/internal/use-case/simgos-sync-use-case/new/patient"
|
|
|
|
d "github.com/karincake/dodol"
|
|
)
|
|
|
|
const source = "old-to-new-patient"
|
|
|
|
var path = "patient"
|
|
|
|
func Create(input e.Patient) (*d.Data, error) {
|
|
evt := pl.Event{
|
|
Feature: "Create",
|
|
Source: source,
|
|
}
|
|
|
|
pl.SetLogInfo(&evt, input, "started", "create")
|
|
|
|
// create request body
|
|
jsonPatient, err := json.Marshal(input)
|
|
if err != nil {
|
|
return nil, pl.SetLogError(&evt, input)
|
|
}
|
|
reqBody := bytes.NewBuffer(jsonPatient)
|
|
// send data to main-api
|
|
resp, err := send(http.MethodPost, path, reqBody, *input.RegisteredBy_User_Name)
|
|
if err != nil {
|
|
return nil, pl.SetLogError(&evt, input)
|
|
}
|
|
// getting response
|
|
var data MainApiResp
|
|
err = json.Unmarshal(resp, &data)
|
|
if err != nil {
|
|
return nil, pl.SetLogError(&evt, string(resp))
|
|
}
|
|
// create PatientLink
|
|
un.CreateLinkData(data.Data.Id, input.Id, &evt)
|
|
pl.SetLogInfo(&evt, nil, "complete")
|
|
return &d.Data{
|
|
Meta: d.II{
|
|
"source": source,
|
|
"structure": "single-data",
|
|
"status": "created",
|
|
},
|
|
Data: input.ToResponse(),
|
|
}, nil
|
|
}
|
|
|
|
func Update(input e.Patient) (*d.Data, error) {
|
|
evt := pl.Event{
|
|
Feature: "Update",
|
|
Source: source,
|
|
}
|
|
pl.SetLogInfo(&evt, input, "started", "update")
|
|
|
|
// get patient link from database
|
|
patientLink, err := ReadDetailLinkData(input.Id)
|
|
if err != nil {
|
|
return nil, pl.SetLogError(&evt, input)
|
|
}
|
|
|
|
// get data patient from main-api
|
|
resp, err := send(http.MethodGet, fmt.Sprintf("%s%v", "patient/", patientLink.Simx_Id), nil, *input.RegisteredBy_User_Name)
|
|
if err != nil {
|
|
return nil, pl.SetLogError(&evt, input)
|
|
}
|
|
// unpack data from resp
|
|
var respData MainApiResp
|
|
err = json.Unmarshal(resp, &respData)
|
|
if err != nil {
|
|
return nil, pl.SetLogError(&evt, input)
|
|
}
|
|
|
|
// copy data from simgos m_patient to simx Patient
|
|
preserve := map[string]bool{
|
|
"Main.Id": true,
|
|
"Person.Id": true,
|
|
}
|
|
simxPatient := respData.Data
|
|
SetPatient(&simxPatient, &input, preserve)
|
|
|
|
jsonPatient, err := json.Marshal(simxPatient)
|
|
if err != nil {
|
|
return nil, pl.SetLogError(&evt, input)
|
|
}
|
|
|
|
// send data to main api
|
|
url := fmt.Sprintf("%s%v", "patient/", simxPatient.Id)
|
|
reqBody := bytes.NewBuffer(jsonPatient)
|
|
_, err = send(http.MethodPatch, url, reqBody, *input.RegisteredBy_User_Name)
|
|
if err != nil {
|
|
return nil, pl.SetLogError(&evt, input)
|
|
}
|
|
|
|
pl.SetLogInfo(&evt, nil, "complete")
|
|
return &d.Data{
|
|
Meta: d.II{
|
|
"source": source,
|
|
"structure": "single-data",
|
|
"status": "updated",
|
|
},
|
|
Data: input.ToResponse(),
|
|
}, nil
|
|
}
|
|
|
|
func Delete(input e.Patient) (*d.Data, error) {
|
|
evt := pl.Event{
|
|
Feature: "Delete",
|
|
Source: source,
|
|
}
|
|
pl.SetLogInfo(&evt, input, "started", "delete")
|
|
|
|
// get patient link from database
|
|
patientLink, err := ReadDetailLinkData(input.Id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
_, err = send(http.MethodDelete, fmt.Sprintf("%s%v", "patient/", patientLink.Simx_Id), nil, *input.RegisteredBy_User_Name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &d.Data{
|
|
Meta: d.II{
|
|
"source": source,
|
|
"structure": "single-data",
|
|
"status": "deleted",
|
|
},
|
|
Data: input.ToResponse(),
|
|
}, nil
|
|
}
|
|
|
|
func send(method string, endpoint string, body *bytes.Buffer, username string) ([]byte, error) {
|
|
var url string = cfg.O.NewHost + endpoint
|
|
var reader io.Reader = nil
|
|
if body != nil {
|
|
reader = body
|
|
}
|
|
req, err := http.NewRequest(method, url, reader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.Header.Set("Content-Type", "application/json")
|
|
req.Header.Set("X-Sync-Source", cfg.O.OldSource)
|
|
req.Header.Set("X-Sync-SecretKey", cfg.O.NewSecretKey)
|
|
req.Header.Set("X-Sync-UserName", username)
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
respBody, _ := io.ReadAll(resp.Body)
|
|
return respBody, nil
|
|
}
|