Files
api-antrian-operasi/internal/domain/reference/dokter/repository.go
T
2026-01-27 15:19:03 +07:00

106 lines
2.7 KiB
Go

package dokter
import (
"antrian-operasi/internal/database"
"log"
queryUtils "antrian-operasi/internal/utils/query"
"github.com/gin-gonic/gin"
)
const DB_NAME = "db_antrian"
type IDokterRepository interface {
SearchableListDokter(c *gin.Context) ([]DokterModel, error)
}
type kategoriRepo struct {
queryBuilder *queryUtils.QueryBuilder
db database.Service
}
func NewRepository(dbService database.Service) IDokterRepository {
queryBuilder := queryUtils.NewQueryBuilder(queryUtils.DBTypePostgreSQL).
SetAllowedColumns([]string{
"id",
"nip",
"nama_depan",
"nama_belakang",
"hfis_code",
"nama_ksm",
})
queryBuilder.SetSecurityOptions(false, 100)
return kategoriRepo{
queryBuilder: queryBuilder,
db: dbService,
}
}
func (r kategoriRepo) SearchableListDokter(c *gin.Context) ([]DokterModel, error) {
var result []DokterModel
search := c.Query("search")
// base query
query := queryUtils.DynamicQuery{
From: "data_pegawai",
Aliases: "dp",
Fields: []queryUtils.SelectField{
{Expression: "dp.id", Alias: "id"},
{Expression: "dp.NIP", Alias: "nip"},
{Expression: "dp.Nama_depan", Alias: "nama_depan"},
{Expression: "dp.Nama_belakang", Alias: "nama_belakang"},
{Expression: "HFIS_code", Alias: "hfis_code"},
{Expression: "dk.Nama_ksm", Alias: "nama_ksm"},
},
}
query.Joins = []queryUtils.Join{
{
Type: "LEFT",
Table: "daftar_ksm",
Alias: "dk",
OnConditions: queryUtils.FilterGroup{
Filters: []queryUtils.DynamicFilter{
{
Column: "dk.id", Operator: queryUtils.OpEqual, Value: "dp.KSM",
},
},
},
},
}
// filtering KSM is not null
ksmFilter := []queryUtils.DynamicFilter{
{Column: "dp.KSM", Operator: queryUtils.OpNotNull},
}
query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: ksmFilter, LogicOp: "AND"})
// TODO : build query KSM_FILTER AND (SEARCH_FILTER), current condition are all filter with OR operator
// filtering search results
if search != "" {
searchFilters := []queryUtils.DynamicFilter{
{Column: "dp.Nama_depan", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "dp.NIP", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "dp.Nama_belakang", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "dk.Nama_ksm", 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 {
log.Fatalf("unable to connect db %s", err)
}
err = r.queryBuilder.ExecuteQuery(
c, dbconn, query, &result)
if err != nil {
log.Fatalf("unable to execute query %s", err)
}
return result, nil
}