package spesialis import ( "antrian-operasi/internal/database" "log" queryUtils "antrian-operasi/internal/utils/query" "github.com/gin-gonic/gin" ) const DB_NAME = "db_antrian" type ISpesialisRepository interface { SearchableListSpesialis(c *gin.Context) ([]SpesialisModel, error) SearchableListSubSpesialis(c *gin.Context) ([]SubSpesialisModel, error) } type spesialisRepo struct { queryBuilder *queryUtils.QueryBuilder db database.Service } func NewRepository(dbService database.Service) ISpesialisRepository { queryBuilder := queryUtils.NewQueryBuilder(queryUtils.DBTypePostgreSQL). SetAllowedColumns([]string{ "id", "Kode", "Spesialis", "Subspesialis", "FK_daftar_spesialis_ID", }) queryBuilder.SetSecurityOptions(false, 100) return spesialisRepo{ queryBuilder: queryBuilder, db: dbService, } } func (r spesialisRepo) SearchableListSpesialis(c *gin.Context) ([]SpesialisModel, error) { var result []SpesialisModel search := c.Query("search") query := queryUtils.DynamicQuery{ From: "daftar_spesialis", Fields: []queryUtils.SelectField{ {Expression: "id"}, {Expression: "Kode"}, {Expression: "Spesialis"}, }, } if search != "" { searchFilters := []queryUtils.DynamicFilter{ {Column: "Kode", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, {Column: "Spesialis", 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 } func (r spesialisRepo) SearchableListSubSpesialis(c *gin.Context) ([]SubSpesialisModel, error) { var result []SubSpesialisModel search := c.Query("search") query := queryUtils.DynamicQuery{ From: "daftar_subspesialis", Aliases: "dss", Fields: []queryUtils.SelectField{ {Expression: "dss.id", Alias: "id"}, {Expression: "dss.Kode", Alias: "Kode"}, {Expression: "Subspesialis", Alias: "Subspesialis"}, {Expression: "ds.Kode", Alias: "kode_spesialis"}, {Expression: "ds.Spesialis", Alias: "spesialis"}, {Expression: "ds.id", Alias: "id_spesialis"}, }, } query.Joins = []queryUtils.Join{ { Type: "LEFT", Table: "daftar_spesialis", Alias: "ds", OnConditions: queryUtils.FilterGroup{ Filters: []queryUtils.DynamicFilter{ { Column: "FK_daftar_spesialis_ID", Operator: queryUtils.OpEqual, Value: "ds.id", }, }, }, }, } if search != "" { searchFilters := []queryUtils.DynamicFilter{ {Column: "dss.Kode", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, {Column: "dss.Subspesialis", 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 }