package integration import ( "bytes" "encoding/json" "errors" "net/http" "satusehat-rssa/internal/constant" "satusehat-rssa/internal/model" ) type OrganizationInterface interface { // Define methods for OrganizationInterface CreateOrganization(req model.OrganizationRequest) (map[string]interface{}, error) GetOrganizationPatient(id string) (map[string]interface{}, error) HandleCheckOrganization(id string) (string, bool, error) } type OrganizationRepository struct { akses *model.Akses } // CreateOrganization implements OrganizationInterface. func (o *OrganizationRepository) CreateOrganization(req model.OrganizationRequest) (map[string]interface{}, error) { var data map[string]interface{} req.ResourceType = constant.OrganizationResourceType url := o.akses.BaseUrl + "/Organization" method := "POST" payload, err := json.Marshal(req) if err != nil { return nil, err } client := &http.Client{} request, err := http.NewRequest(method, url, bytes.NewBuffer(payload)) if err != nil { return nil, err } oauth := model.OauthRequest{ ClientId: o.akses.ClientId, ClientSecret: o.akses.ClientSecret, } OauthInterface := NewOauthRequestRepo(o.akses) token, err := OauthInterface.GenerateToken(oauth) if err != nil { return nil, err } request.Header.Set("Authorization", "Bearer "+token.AccessToken) request.Header.Set("Content-Type", "application/json") response, err := client.Do(request) if err != nil { return nil, err } defer response.Body.Close() err = json.NewDecoder(response.Body).Decode(&data) if err != nil { return nil, err } return data, nil } // GetDiagnosisReportByPatient implements OrganizationInterface. func (o *OrganizationRepository) GetOrganizationPatient(id string) (map[string]interface{}, error) { url := o.akses.BaseUrl + "/DiagnosticReport?patient=" + id method := "GET" client := &http.Client{} request, err := http.NewRequest(method, url, nil) if err != nil { return nil, err } oauth := model.OauthRequest{ ClientId: o.akses.ClientId, ClientSecret: o.akses.ClientSecret, } OauthInterface := NewOauthRequestRepo(o.akses) token, err := OauthInterface.GenerateToken(oauth) if err != nil { return nil, err } request.Header.Set("Authorization", "Bearer "+token.AccessToken) request.Header.Set("Accept", constant.ContentTypeFHIRJSON) response, err := client.Do(request) if err != nil { return nil, err } defer response.Body.Close() if response.StatusCode != http.StatusOK { return nil, errors.New("failed to get diagnosis report") } var data map[string]interface{} err = json.NewDecoder(response.Body).Decode(&data) if err != nil { return nil, err } return data, nil } // HandleCheckOrganization implements OrganizationInterface. func (o *OrganizationRepository) HandleCheckOrganization(id string) (string, bool, error) { url := o.akses.BaseUrl + "/Organization/" + id method := "GET" client := &http.Client{} request, err := http.NewRequest(method, url, nil) if err != nil { return "", false, err } oauth := model.OauthRequest{ ClientId: o.akses.ClientId, ClientSecret: o.akses.ClientSecret, } OauthInterface := NewOauthRequestRepo(o.akses) token, err := OauthInterface.GenerateToken(oauth) if err != nil { return "", false, err } request.Header.Set("Authorization", "Bearer "+token.AccessToken) request.Header.Set("Accept", constant.ContentTypeFHIRJSON) response, err := client.Do(request) if err != nil { return "", false, err } defer response.Body.Close() if response.StatusCode == http.StatusNotFound { return "", false, nil } else if response.StatusCode != http.StatusOK { return "", false, errors.New("failed to check organization") } var data map[string]interface{} err = json.NewDecoder(response.Body).Decode(&data) if err != nil { return "", false, err } name, ok := data["name"].(string) if !ok { return "", false, errors.New("organization name not found") } return name, true, nil } func NewOrganizationRepo(akses *model.Akses) OrganizationInterface { return &OrganizationRepository{akses: akses} }