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 }