refactor list antrian query
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user