diff --git a/internal/domain/antrian_operasi/handler.go b/internal/domain/antrian_operasi/handler.go index b6f181e..1573f35 100644 --- a/internal/domain/antrian_operasi/handler.go +++ b/internal/domain/antrian_operasi/handler.go @@ -100,7 +100,13 @@ func (h AntrianOperasiHandler) CreateAntrianOperasi(c *gin.Context) { // @Failure 500 {object} shared.BaseErrorResponse // @Router /antrian-operasi/ [get] func (h AntrianOperasiHandler) GetListAntrianOperasi(c *gin.Context) { - res, err := h.repo.SearchableListAntrianOperasi(c) + var query AntrianQuery + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, gin.H{"error": err.Error()}) + return + } + + res, err := h.repo.SearchableListAntrianOperasi(c.Request.Context(), query) if err != nil { c.JSON(500, shared.BaseErrorResponse{ Success: false, diff --git a/internal/domain/antrian_operasi/repository.go b/internal/domain/antrian_operasi/repository.go index ec952a5..80b17bc 100644 --- a/internal/domain/antrian_operasi/repository.go +++ b/internal/domain/antrian_operasi/repository.go @@ -6,10 +6,10 @@ import ( queryUtils "antrian-operasi/internal/utils/query" "database/sql" "log" - "slices" - "strconv" "time" + "context" + "github.com/gin-gonic/gin" "github.com/google/uuid" ) @@ -23,7 +23,7 @@ const TBL_DOKTER_OPERASI = "data_pasien_operasi_data_pegawai_2" type IAntrianOperasiRepository interface { CreateAntrianOperasi(c *gin.Context, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error) - SearchableListAntrianOperasi(c *gin.Context) (ListPasienOperasiPaginate, error) + SearchableListAntrianOperasi(c context.Context, q AntrianQuery) (ListPasienOperasiPaginate, error) GetAntrianOperasiById(c *gin.Context, id string) (DetailPasienOperasiResultQuery, error) UpdateAntrianOperasi(c *gin.Context, id string, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error) UpdateStatusAntrianOperasi(c *gin.Context, id string, req StatusPasienRequest) (StatusPasienRequest, error) @@ -360,21 +360,8 @@ func (r antrianOperasiRepo) CreateAntrianOperasi(c *gin.Context, req CreatePasie return req, nil } -func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPasienOperasiPaginate, error) { +func (r antrianOperasiRepo) SearchableListAntrianOperasi(c context.Context, q AntrianQuery) (ListPasienOperasiPaginate, error) { var result ListPasienOperasiPaginate - search := c.Query("search") - availableType := []string{"all", "kategori", "spesialis", "sub-spesialis"} - antrianType := c.Query("type") - antrianTypeId, err := strconv.Atoi(c.Query("type_id")) - if err != nil { - antrianTypeId = 0 - } - if !slices.Contains(availableType, antrianType) { - antrianType = "all" - } - limit := shared.ParseQueryLimit(c) - offset := shared.ParseQueryOffset(c) - statusOp := c.Query("status") query := queryUtils.DynamicQuery{ From: TBL_NAME, @@ -419,7 +406,7 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa var selectFilter []queryUtils.DynamicFilter typeIdColumn := "" - switch antrianType { + switch q.Type { case "kategori": typeIdColumn = "dko.id" query.WindowFunctions = append(query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis) @@ -436,8 +423,8 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa query.WindowFunctions = append(query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis) } - if antrianTypeId != 0 && antrianType != "all" { - selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: antrianTypeId}) + if q.TypeID != 0 && q.Type != "all" { + selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: q.TypeID}) } query.Joins = []queryUtils.Join{ @@ -480,18 +467,18 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa } // filtering search results - if search != "" { + if q.Search != "" { searchFilters := []queryUtils.DynamicFilter{ - {Column: "dpo.No_KTP", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, - {Column: "dpo.No_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, - {Column: "dpo.Nama_pasien", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, + {Column: "dpo.No_KTP", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + {Column: "dpo.No_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + {Column: "dpo.Nama_pasien", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, } query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"}) } - if statusOp != "" { - selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: statusOp}) + if q.Status != "" { + selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: q.Status}) } // wiring all select filter @@ -509,15 +496,15 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa log.Printf("Unable to execute query count : %s ", err) return result, err } - result.Paging.Limit = limit - result.Paging.Offset = offset + result.Paging.Limit = q.Limit + result.Paging.Offset = q.Offset result.Paging.Total = int(countData) result.Paging.CalculatePagingInfo() // query data queryData := query - queryData.Limit = limit - queryData.Offset = offset + queryData.Limit = q.Limit + queryData.Offset = q.Offset err = r.queryBuilder.ExecuteQuery( c, dbconn, queryData, &result.Data) if err != nil { diff --git a/internal/domain/antrian_operasi/request.go b/internal/domain/antrian_operasi/request.go index 8b64ee3..e5c9c81 100644 --- a/internal/domain/antrian_operasi/request.go +++ b/internal/domain/antrian_operasi/request.go @@ -60,3 +60,12 @@ type CreatePasienOperasiRequest struct { DokterPelaksanaItems []DokterPelaksanaItemRequest `json:"dokterPelaksanaItems"` StatusPasienData StatusPasienRequest `json:"statusPasienData"` } + +type AntrianQuery struct { + Search string `form:"search"` + Type string `form:"type,default=all" binding:"omitempty,oneof=all kategori spesialis sub-spesialis"` + TypeID int `form:"type_id,default=0"` + Status string `form:"status" binding:"omitempty,oneof=1 2 3 4"` + Limit int `form:"limit,default=10"` + Offset int `form:"offset,default=0"` +}