Files
api-antrian-operasi/internal/domain/reference/diagnosa/repository.go
T
2026-02-19 11:42:57 +07:00

120 lines
2.8 KiB
Go

package diagnosa
import (
"antrian-operasi/internal/database"
"log"
queryUtils "antrian-operasi/internal/utils/query"
"errors"
"context"
)
const DB_NAME = "db_simrs"
const TBL_NAME = "icd"
type IDiagnosaRepository interface {
SearchableListDiagnosa(c context.Context, search string) (ListDiagnosaModel, error)
GetDiagnosaByKode(c context.Context, kode string) (DiagnosaModel, error)
}
type diagnosaRepo struct {
queryBuilder *queryUtils.QueryBuilder
db database.Service
}
func NewRepository(dbService database.Service) IDiagnosaRepository {
queryBuilder := queryUtils.NewQueryBuilder(queryUtils.DBTypePostgreSQL).
SetAllowedColumns([]string{
"icd_code", "jenis_penyakit", "sebabpenyakit",
}).
SetSecurityOptions(false, 100)
return diagnosaRepo{
queryBuilder: queryBuilder,
db: dbService,
}
}
func (r diagnosaRepo) SearchableListDiagnosa(c context.Context, search string) (ListDiagnosaModel, error) {
var result ListDiagnosaModel
query := queryUtils.DynamicQuery{
From: TBL_NAME,
Fields: []queryUtils.SelectField{
{Expression: "icd_code"},
{Expression: "jenis_penyakit"},
{Expression: "sebabpenyakit"},
},
Limit: 10,
}
if search != "" {
searchFilters := []queryUtils.DynamicFilter{
{Column: "icd_code", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "jenis_penyakit", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "sebabpenyakit", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
}
query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"})
}
dbconn, err := r.db.GetSQLXDB(DB_NAME)
if err != nil {
return result, err
}
err = r.queryBuilder.ExecuteQuery(
c, dbconn, query, &result)
if err != nil {
return result, err
}
return result, nil
}
func (r diagnosaRepo) GetDiagnosaByKode(c context.Context, kode string) (DiagnosaModel, error) {
var resultQuery []DiagnosaModel
var result DiagnosaModel
query := queryUtils.DynamicQuery{
From: TBL_NAME,
Fields: []queryUtils.SelectField{
{Expression: "icd_code"},
{Expression: "jenis_penyakit"},
{Expression: "sebabpenyakit"},
},
Filters: []queryUtils.FilterGroup{
{
Filters: []queryUtils.DynamicFilter{
{Column: "icd_code", Operator: queryUtils.OpILike, Value: kode},
}, LogicOp: "AND",
},
},
Limit: 1,
}
dbconn, err := r.db.GetSQLXDB(DB_NAME)
if err != nil {
return result, err
}
err = r.queryBuilder.ExecuteQuery(
c, dbconn, query, &resultQuery)
if err != nil {
return result, err
}
if len(resultQuery) == 0 {
log.Println(query)
notFoundError := errors.New("diagnosa not found : " + kode)
return result, notFoundError
}
for _, x := range resultQuery {
log.Println(x.KodeDiagnosa)
}
return resultQuery[0], nil
}