diff --git a/docs/docs.go b/docs/docs.go index 54f4d8f..585224b 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -123,6 +123,20 @@ const docTemplate = `{ "description": "Search keyword", "name": "search", "in": "query" + }, + { + "type": "string", + "default": "10", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "string", + "default": "0", + "description": "Offset", + "name": "offset", + "in": "query" } ], "responses": { diff --git a/docs/swagger.json b/docs/swagger.json index 64b53e8..bfd6491 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -117,6 +117,20 @@ "description": "Search keyword", "name": "search", "in": "query" + }, + { + "type": "string", + "default": "10", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "string", + "default": "0", + "description": "Offset", + "name": "offset", + "in": "query" } ], "responses": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index ba36567..9734b6e 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -282,6 +282,16 @@ paths: in: query name: search type: string + - default: "10" + description: Limit + in: query + name: limit + type: string + - default: "0" + description: Offset + in: query + name: offset + type: string responses: "200": description: OK diff --git a/internal/domain/reference/dokter/handler.go b/internal/domain/reference/dokter/handler.go index bff9e3e..6c23818 100644 --- a/internal/domain/reference/dokter/handler.go +++ b/internal/domain/reference/dokter/handler.go @@ -21,13 +21,13 @@ func NewDokterHandler(repo IDokterRepository) DokterHandler { // @Summary Get List Dokter // @Tags Dokter // @Param search query string false "Search keyword" +// @Param limit query string false "Limit" default(10) +// @Param offset query string false "Offset" default(0) // @Success 200 {object} []DokterResponse // @Failure 500 {object} shared.BaseErrorResponse // @Router /dokter/ [get] func (h DokterHandler) ListDokter(c *gin.Context) { - var list ListDokterModel - - list, err := h.repo.SearchableListDokter(c) + result, err := h.repo.SearchableListDokter(c) if err != nil { errorResponse := baseResponse.BaseErrorResponse{ Success: false, @@ -38,8 +38,9 @@ func (h DokterHandler) ListDokter(c *gin.Context) { return } - response := baseResponse.ToBaseResponse( - list.ToResponseList(), + response := baseResponse.ToBaseResponsePaginate( + result.Data.ToResponseList(), + result.Paging, true, 200, "success get doctor's list") diff --git a/internal/domain/reference/dokter/model.go b/internal/domain/reference/dokter/model.go index ceac45b..d95df2e 100644 --- a/internal/domain/reference/dokter/model.go +++ b/internal/domain/reference/dokter/model.go @@ -1,6 +1,9 @@ package dokter -import "database/sql" +import ( + "antrian-operasi/internal/shared" + "database/sql" +) type DokterModel struct { ID string `json:"id" db:"id"` @@ -18,3 +21,8 @@ type DokterResponse struct { HfisCode *string `json:"hfis_code"` NamaKsm string `json:"nama_ksm"` } + +type ListDokterModelPaginate struct { + Data ListDokterModel + Paging shared.PaginationInfo +} diff --git a/internal/domain/reference/dokter/repository.go b/internal/domain/reference/dokter/repository.go index b4d238e..fa1bb74 100644 --- a/internal/domain/reference/dokter/repository.go +++ b/internal/domain/reference/dokter/repository.go @@ -2,7 +2,9 @@ package dokter import ( "antrian-operasi/internal/database" + "antrian-operasi/internal/shared" "errors" + "log" queryUtils "antrian-operasi/internal/utils/query" @@ -13,7 +15,7 @@ const DB_NAME = "db_antrian" const TBL_NAME = "data_pegawai" type IDokterRepository interface { - SearchableListDokter(c *gin.Context) ([]DokterModel, error) + SearchableListDokter(c *gin.Context) (ListDokterModelPaginate, error) GetDokterById(c *gin.Context, id string) (DokterModel, error) } @@ -72,8 +74,10 @@ func baseSelectQuery() queryUtils.DynamicQuery { return query } -func (r dokterRepo) SearchableListDokter(c *gin.Context) ([]DokterModel, error) { - var result []DokterModel +func (r dokterRepo) SearchableListDokter(c *gin.Context) (ListDokterModelPaginate, error) { + var result ListDokterModelPaginate + limit := shared.ParseQueryLimit(c) + offset := shared.ParseQueryOffset(c) search := c.Query("search") // base query @@ -105,8 +109,23 @@ func (r dokterRepo) SearchableListDokter(c *gin.Context) ([]DokterModel, error) return result, nil } + // query count + countData, err := r.queryBuilder.ExecuteCount(c, dbconn, query) + if err != nil { + log.Printf("Unable to execute query count : %s ", err) + return result, err + } + result.Paging.Limit = limit + result.Paging.Offset = offset + result.Paging.Total = int(countData) + result.Paging.CalculatePagingInfo() + + // query data + queryData := query + queryData.Limit = limit + queryData.Offset = offset err = r.queryBuilder.ExecuteQuery( - c, dbconn, query, &result) + c, dbconn, queryData, &result.Data) if err != nil { // log.Fatalf("unable to execute query %s", err) return result, nil