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

123 lines
2.9 KiB
Go

package pasien
import (
"antrian-operasi/internal/database"
"errors"
queryUtils "antrian-operasi/internal/utils/query"
"context"
)
const DB_NAME = "db_simrs"
const TBL_NAME = "m_pasien"
type IPasienRepository interface {
SearchableListPasien(c context.Context, search string) (ListPasienModel, error)
GetPasienByNoMr(c context.Context, noMr string) (PasienModel, error)
}
type pasienRepo struct {
queryBuilder *queryUtils.QueryBuilder
db database.Service
}
func NewRepository(dbService database.Service) IPasienRepository {
queryBuilder := queryUtils.NewQueryBuilder(queryUtils.DBTypePostgreSQL).
SetAllowedColumns([]string{
"id",
"alamat",
"alamat_ktp",
"jeniskelamin",
"nama",
"noktp",
"nomr",
"tgllahir",
})
queryBuilder.SetSecurityOptions(false, 100)
return pasienRepo{
queryBuilder: queryBuilder,
db: dbService,
}
}
func baseSelectQuery() queryUtils.DynamicQuery {
return queryUtils.DynamicQuery{
From: TBL_NAME,
Fields: []queryUtils.SelectField{
{Expression: "id"},
{Expression: "alamat"},
{Expression: "alamat_ktp"},
{Expression: "jeniskelamin"},
{Expression: "nama"},
{Expression: "noktp"},
{Expression: "nomr"},
{Expression: "tgllahir"},
},
Sort: []queryUtils.SortField{
{Column: "id", Order: "DESC"},
},
}
}
func (r pasienRepo) SearchableListPasien(c context.Context, search string) (ListPasienModel, error) {
var result ListPasienModel
query := baseSelectQuery()
query.Limit = 10 // default limit
if search != "" {
searchFilters := []queryUtils.DynamicFilter{
{Column: "nama", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "noktp", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "nomr", 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)
return result, err
}
err = r.queryBuilder.ExecuteQuery(
c, dbconn, query, &result)
if err != nil {
// log.Fatalf("unable to execute query %s", err)
return result, err
}
return result, nil
}
func (r pasienRepo) GetPasienByNoMr(c context.Context, noMr string) (PasienModel, error) {
var resultQuery ListPasienModel
var result PasienModel
query := baseSelectQuery()
query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: []queryUtils.DynamicFilter{
{Column: "nomr", Operator: queryUtils.OpEqual, Value: noMr},
}})
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 {
notFoundError := errors.New("pasien not found, no rekam medis : " + noMr)
return result, notFoundError
}
return resultQuery[0], nil
}