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 }