From 1f760ff9d54cddef988cca37380890df6c6f8122 Mon Sep 17 00:00:00 2001 From: renaldybrada Date: Tue, 3 Feb 2026 13:45:43 +0700 Subject: [PATCH] api dashboard antrian per kategori --- docs/docs.go | 39 ++++++++++++ docs/swagger.json | 39 ++++++++++++ docs/swagger.yaml | 25 ++++++++ internal/domain/dashboard/handler.go | 40 ++++++++++++ internal/domain/dashboard/model.go | 7 +++ internal/domain/dashboard/repository.go | 82 +++++++++++++++++++++++++ internal/domain/dashboard/routes.go | 14 +++++ internal/routes/routes.go | 5 ++ 8 files changed, 251 insertions(+) create mode 100644 internal/domain/dashboard/handler.go create mode 100644 internal/domain/dashboard/model.go create mode 100644 internal/domain/dashboard/repository.go create mode 100644 internal/domain/dashboard/routes.go diff --git a/docs/docs.go b/docs/docs.go index b668c83..74c296f 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -111,6 +111,31 @@ const docTemplate = `{ } } }, + "/dashboard/antrian-per-kategori/": { + "get": { + "tags": [ + "Dashboard" + ], + "summary": "Get Antrian Per Kategori", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dashboard.AntrianPerKategori" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/shared.BaseErrorResponse" + } + } + } + } + }, "/reference/dokter/": { "get": { "tags": [ @@ -494,6 +519,20 @@ const docTemplate = `{ } } }, + "dashboard.AntrianPerKategori": { + "type": "object", + "properties": { + "id_kategori": { + "type": "integer" + }, + "jumlah_antrean": { + "type": "integer" + }, + "kategori": { + "type": "string" + } + } + }, "dokter.DokterResponse": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index 773314a..2307cb6 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -105,6 +105,31 @@ } } }, + "/dashboard/antrian-per-kategori/": { + "get": { + "tags": [ + "Dashboard" + ], + "summary": "Get Antrian Per Kategori", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dashboard.AntrianPerKategori" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/shared.BaseErrorResponse" + } + } + } + } + }, "/reference/dokter/": { "get": { "tags": [ @@ -488,6 +513,20 @@ } } }, + "dashboard.AntrianPerKategori": { + "type": "object", + "properties": { + "id_kategori": { + "type": "integer" + }, + "jumlah_antrean": { + "type": "integer" + }, + "kategori": { + "type": "string" + } + } + }, "dokter.DokterResponse": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 8054997..f61360d 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -128,6 +128,15 @@ definitions: tindakanTambahan: type: string type: object + dashboard.AntrianPerKategori: + properties: + id_kategori: + type: integer + jumlah_antrean: + type: integer + kategori: + type: string + type: object dokter.DokterResponse: properties: hfis_code: @@ -294,6 +303,22 @@ paths: summary: Create Antrian Operasi tags: - Antrian Operasi + /dashboard/antrian-per-kategori/: + get: + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dashboard.AntrianPerKategori' + type: array + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/shared.BaseErrorResponse' + summary: Get Antrian Per Kategori + tags: + - Dashboard /reference/dokter/: get: parameters: diff --git a/internal/domain/dashboard/handler.go b/internal/domain/dashboard/handler.go new file mode 100644 index 0000000..927117e --- /dev/null +++ b/internal/domain/dashboard/handler.go @@ -0,0 +1,40 @@ +package dashboard + +import ( + "net/http" + + baseResponse "antrian-operasi/internal/shared" + + "github.com/gin-gonic/gin" +) + +type DashboardHandler struct { + repo IDashboardRepository +} + +func NewDashboardHandler(repo IDashboardRepository) DashboardHandler { + return DashboardHandler{repo} +} + +// GetAntrianPerKategori godoc +// @Summary Get Antrian Per Kategori +// @Tags Dashboard +// @Success 200 {object} []AntrianPerKategori +// @Failure 500 {object} shared.BaseErrorResponse +// @Router /dashboard/antrian-per-kategori/ [get] +func (h DashboardHandler) GetAntrianPerKategori(c *gin.Context) { + data, err := h.repo.GetAntrianPerKategori(c) + if err != nil { + errorResponse := baseResponse.BaseErrorResponse{ + Success: false, + Code: 500, + Message: err.Error(), + } + c.JSON(http.StatusInternalServerError, errorResponse) + return + } + + response := baseResponse.ToBaseResponse(data, true, 200, "success get jumlah antrian per kategori") + + c.JSON(http.StatusOK, response) +} diff --git a/internal/domain/dashboard/model.go b/internal/domain/dashboard/model.go new file mode 100644 index 0000000..3e32f54 --- /dev/null +++ b/internal/domain/dashboard/model.go @@ -0,0 +1,7 @@ +package dashboard + +type AntrianPerKategori struct { + IdKategori int `db:"Kategori_operasi" json:"id_kategori"` + Kategori string `db:"Kategori" json:"kategori"` + JmlAntrian int `db:"jumlah_antrean" json:"jumlah_antrean"` +} diff --git a/internal/domain/dashboard/repository.go b/internal/domain/dashboard/repository.go new file mode 100644 index 0000000..ed84e4a --- /dev/null +++ b/internal/domain/dashboard/repository.go @@ -0,0 +1,82 @@ +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" + +type IDashboardRepository interface { + GetAntrianPerKategori(c *gin.Context) ([]AntrianPerKategori, 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: "dpo.Kategori_operasi", Order: "DESC"}, + }, + } + + 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", + }, + }, + }, + }, + } + + 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 +} diff --git a/internal/domain/dashboard/routes.go b/internal/domain/dashboard/routes.go new file mode 100644 index 0000000..63b619a --- /dev/null +++ b/internal/domain/dashboard/routes.go @@ -0,0 +1,14 @@ +package dashboard + +import ( + "antrian-operasi/internal/database" + + "github.com/gin-gonic/gin" +) + +func RegisterRoutes(r *gin.RouterGroup, dbService database.Service) { + dashboardRepo := NewRepository(dbService) + dashboardHandler := NewDashboardHandler(dashboardRepo) + + r.GET("/antrian-per-kategori", dashboardHandler.GetAntrianPerKategori) +} diff --git a/internal/routes/routes.go b/internal/routes/routes.go index 4f74378..03b67af 100644 --- a/internal/routes/routes.go +++ b/internal/routes/routes.go @@ -4,6 +4,7 @@ import ( "antrian-operasi/internal/config" "antrian-operasi/internal/database" antrianoperasi "antrian-operasi/internal/domain/antrian_operasi" + "antrian-operasi/internal/domain/dashboard" "antrian-operasi/internal/domain/reference/dokter" "antrian-operasi/internal/domain/reference/kategori" "antrian-operasi/internal/domain/reference/pasien" @@ -42,6 +43,10 @@ func RegisterRoutes(cfg *config.Config, dbService database.Service) *gin.Engine dokter.RegisterRoutes(reference, dbService) pasien.RegisterRoutes(reference, dbService) } + dboard := api.Group("dashboard") + { + dashboard.RegisterRoutes(dboard, dbService) + } return router }