package dashboard import ( "antrian-operasi/internal/database" queryUtils "antrian-operasi/internal/utils/query" "github.com/gin-gonic/gin" ) const DB_NAME = "db_antrian" const TBL_NAME = "data_pasien_operasi" const TBL_SUBSPESIALIS = "daftar_subspesialis" type IDashboardRepository interface { GetAntrianPerKategori(c *gin.Context) ([]AntrianPerKategori, error) GetAntrianPerSpesialis(c *gin.Context) (ListModelAntrianPerSpesialis, error) } type dashboardRepo struct { queryBuilder *queryUtils.QueryBuilder db database.Service } func NewRepository(dbService database.Service) IDashboardRepository { queryBuilder := queryUtils.NewQueryBuilder(queryUtils.DBTypePostgreSQL). SetAllowedColumns([]string{ "Kategori_operasi", "Kategori", "jumlah_antrean", }) queryBuilder.SetSecurityOptions(false, 100) return dashboardRepo{ queryBuilder: queryBuilder, db: dbService, } } func (r dashboardRepo) GetAntrianPerKategori(c *gin.Context) ([]AntrianPerKategori, error) { var result []AntrianPerKategori query := queryUtils.DynamicQuery{ From: TBL_NAME, Aliases: "dpo", Fields: []queryUtils.SelectField{ {Expression: "dpo.Kategori_operasi", Alias: "Kategori_operasi"}, {Expression: "dko.Kategori", Alias: "Kategori"}, {Expression: "COUNT(dpo.id)", Alias: "jumlah_antrean"}, }, GroupBy: []string{"dpo.Kategori_operasi", "dko.Kategori"}, Sort: []queryUtils.SortField{ {Column: "dko.Kategori", Order: "ASC"}, }, } query.Joins = []queryUtils.Join{ { Type: "LEFT", Table: "daftar_kategori_operasi", Alias: "dko", OnConditions: queryUtils.FilterGroup{ Filters: []queryUtils.DynamicFilter{ { Column: "dpo.Kategori_operasi", Operator: queryUtils.OpEqual, Value: "dko.id", }, }, }, }, } // filter status = 1 (belum) var filter []queryUtils.DynamicFilter filter = append(filter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: "1"}) query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: filter, LogicOp: "AND"}) 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 dashboardRepo) GetAntrianPerSpesialis(c *gin.Context) (ListModelAntrianPerSpesialis, error) { var result ListModelAntrianPerSpesialis query := queryUtils.DynamicQuery{ From: TBL_SUBSPESIALIS, Aliases: "dss", Fields: []queryUtils.SelectField{ {Expression: "ds.id", Alias: "id_spesialis"}, {Expression: "dss.id", Alias: "id_subspesialis"}, {Expression: "ds.Spesialis"}, {Expression: "dss.Subspesialis"}, {Expression: "COUNT(dpo.id)", Alias: "jml_antrian"}, }, Joins: []queryUtils.Join{ { Type: "LEFT", Table: "daftar_spesialis", Alias: "ds", OnConditions: queryUtils.FilterGroup{ Filters: []queryUtils.DynamicFilter{ { Column: "dss.FK_daftar_spesialis_ID", Operator: queryUtils.OpEqual, Value: "ds.id", }, }, }, }, { Type: "LEFT", Table: "data_pasien_operasi", Alias: "dpo", OnConditions: queryUtils.FilterGroup{ Filters: []queryUtils.DynamicFilter{ { Column: "dpo.Sub_spesialis", Operator: queryUtils.OpEqual, Value: "dss.id", }, { Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: "1", }, }, LogicOp: "AND", }, }, }, GroupBy: []string{"dss.id", "dss.Subspesialis", "ds.id", "ds.Spesialis"}, Sort: []queryUtils.SortField{ {Column: "ds.id"}, }, } 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 }