From 1e15a2e1ecbf067e2a1b3ca692cc3a707b551e8c Mon Sep 17 00:00:00 2001 From: renaldybrada Date: Thu, 29 Jan 2026 10:19:13 +0700 Subject: [PATCH] fixing reference query get by id --- internal/domain/reference/dokter/handler.go | 23 +++ .../domain/reference/dokter/repository.go | 72 +++++++-- internal/domain/reference/dokter/routes.go | 1 + .../domain/reference/kategori/repository.go | 57 +++++-- .../domain/reference/spesialis/repository.go | 140 +++++++++++++----- 5 files changed, 240 insertions(+), 53 deletions(-) diff --git a/internal/domain/reference/dokter/handler.go b/internal/domain/reference/dokter/handler.go index cfc4772..fc4eb0b 100644 --- a/internal/domain/reference/dokter/handler.go +++ b/internal/domain/reference/dokter/handler.go @@ -1,6 +1,7 @@ package dokter import ( + "log" "net/http" baseResponse "antrian-operasi/internal/shared" @@ -32,3 +33,25 @@ func (h DokterHandler) ListDokter(c *gin.Context) { c.JSON(http.StatusOK, response) } + +// Test repository GetDokterById, soon to be deleted +func (h DokterHandler) GetDokterById(c *gin.Context) { + var result DokterModel + + idDokter := c.Param("id") + + result, err := h.repo.GetDokterById(c, idDokter) + if err != nil { + log.Printf("something went wrong : %s", err) + c.JSON(http.StatusInternalServerError, err) + return + } + + response := baseResponse.ToBaseResponse( + result.ToResponse(), + true, + 200, + "success get doctor's list") + + c.JSON(http.StatusOK, response) +} diff --git a/internal/domain/reference/dokter/repository.go b/internal/domain/reference/dokter/repository.go index d82aaf9..b4d238e 100644 --- a/internal/domain/reference/dokter/repository.go +++ b/internal/domain/reference/dokter/repository.go @@ -2,7 +2,7 @@ package dokter import ( "antrian-operasi/internal/database" - "log" + "errors" queryUtils "antrian-operasi/internal/utils/query" @@ -10,12 +10,14 @@ import ( ) const DB_NAME = "db_antrian" +const TBL_NAME = "data_pegawai" type IDokterRepository interface { SearchableListDokter(c *gin.Context) ([]DokterModel, error) + GetDokterById(c *gin.Context, id string) (DokterModel, error) } -type kategoriRepo struct { +type dokterRepo struct { queryBuilder *queryUtils.QueryBuilder db database.Service } @@ -32,19 +34,15 @@ func NewRepository(dbService database.Service) IDokterRepository { }) queryBuilder.SetSecurityOptions(false, 100) - return kategoriRepo{ + return dokterRepo{ queryBuilder: queryBuilder, db: dbService, } } -func (r kategoriRepo) SearchableListDokter(c *gin.Context) ([]DokterModel, error) { - var result []DokterModel - search := c.Query("search") - - // base query +func baseSelectQuery() queryUtils.DynamicQuery { query := queryUtils.DynamicQuery{ - From: "data_pegawai", + From: TBL_NAME, Aliases: "dp", Fields: []queryUtils.SelectField{ {Expression: "dp.id", Alias: "id"}, @@ -71,6 +69,16 @@ func (r kategoriRepo) SearchableListDokter(c *gin.Context) ([]DokterModel, error }, } + return query +} + +func (r dokterRepo) SearchableListDokter(c *gin.Context) ([]DokterModel, error) { + var result []DokterModel + search := c.Query("search") + + // base query + query := baseSelectQuery() + // base filtering var baseFilter []queryUtils.DynamicFilter baseFilter = append(baseFilter, queryUtils.DynamicFilter{Column: "dp.KSM", Operator: queryUtils.OpNotNull}) @@ -93,14 +101,56 @@ func (r kategoriRepo) SearchableListDokter(c *gin.Context) ([]DokterModel, error dbconn, err := r.db.GetSQLXDB(DB_NAME) if err != nil { - log.Fatalf("unable to connect db %s", err) + // log.Fatalf("unable to connect db %s", err) + return result, nil } err = r.queryBuilder.ExecuteQuery( c, dbconn, query, &result) if err != nil { - log.Fatalf("unable to execute query %s", err) + // log.Fatalf("unable to execute query %s", err) + return result, nil } return result, nil } + +func (r dokterRepo) GetDokterById(c *gin.Context, id string) (DokterModel, error) { + var resultQuery []DokterModel + var result DokterModel + + // base query + query := baseSelectQuery() + + // LIMIT 1 + query.Limit = 1 + + // base filtering + var baseFilter []queryUtils.DynamicFilter + baseFilter = append(baseFilter, queryUtils.DynamicFilter{Column: "dp.KSM", Operator: queryUtils.OpNotNull}) + + // filter by id + baseFilter = append(baseFilter, queryUtils.DynamicFilter{Column: "dp.id", Operator: queryUtils.OpEqual, Value: id}) + + query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: baseFilter, LogicOp: "AND"}) + + dbconn, err := r.db.GetSQLXDB(DB_NAME) + if err != nil { + // log.Fatalf("unable to connect db %s", err) // TODO : handling error + return result, err + } + + err = r.queryBuilder.ExecuteQuery( + c, dbconn, query, &resultQuery) + if err != nil { + // log.Fatalf("unable to execute query %s", err) + return result, err + } + + if len(resultQuery) == 0 { + notFoundError := errors.New("doctor not found") + return result, notFoundError + } + + return resultQuery[0], nil +} diff --git a/internal/domain/reference/dokter/routes.go b/internal/domain/reference/dokter/routes.go index de7beb4..5311eed 100644 --- a/internal/domain/reference/dokter/routes.go +++ b/internal/domain/reference/dokter/routes.go @@ -11,4 +11,5 @@ func RegisterRoutes(r *gin.RouterGroup, dbService database.Service) { dokterHandler := NewDokterHandler(dokterRepo) r.GET("/dokter", dokterHandler.ListDokter) + // r.GET("/dokter/:id", dokterHandler.GetDokterById) } diff --git a/internal/domain/reference/kategori/repository.go b/internal/domain/reference/kategori/repository.go index f691dad..253982b 100644 --- a/internal/domain/reference/kategori/repository.go +++ b/internal/domain/reference/kategori/repository.go @@ -2,7 +2,7 @@ package kategori import ( "antrian-operasi/internal/database" - "log" + "errors" queryUtils "antrian-operasi/internal/utils/query" @@ -10,9 +10,11 @@ import ( ) const DB_NAME = "db_antrian" +const TBL_NAME = "daftar_kategori_operasi" type IKategoriRepository interface { SearchableListKategori(c *gin.Context) ([]KategoriOperasiModel, error) + GetKategoriById(c *gin.Context, id int) (KategoriOperasiModel, error) } type kategoriRepo struct { @@ -37,12 +39,9 @@ func NewRepository(dbService database.Service) IKategoriRepository { } } -func (r kategoriRepo) SearchableListKategori(c *gin.Context) ([]KategoriOperasiModel, error) { - var result []KategoriOperasiModel - search := c.Query("search") - - query := queryUtils.DynamicQuery{ - From: "daftar_kategori_operasi", +func baseSelectQuery() queryUtils.DynamicQuery { + return queryUtils.DynamicQuery{ + From: TBL_NAME, Fields: []queryUtils.SelectField{ {Expression: "id"}, {Expression: "status"}, @@ -54,6 +53,13 @@ func (r kategoriRepo) SearchableListKategori(c *gin.Context) ([]KategoriOperasiM {Column: "date_created", Order: "DESC"}, }, } +} + +func (r kategoriRepo) SearchableListKategori(c *gin.Context) ([]KategoriOperasiModel, error) { + var result []KategoriOperasiModel + search := c.Query("search") + + query := baseSelectQuery() if search != "" { searchFilters := []queryUtils.DynamicFilter{ @@ -64,14 +70,47 @@ func (r kategoriRepo) SearchableListKategori(c *gin.Context) ([]KategoriOperasiM dbconn, err := r.db.GetSQLXDB(DB_NAME) if err != nil { - log.Fatalf("unable to connect db %s", err) + // log.Fatalf("unable to connect db %s", err) + return result, err } err = r.queryBuilder.ExecuteQuery( c, dbconn, query, &result) if err != nil { - log.Fatalf("unable to execute query %s", err) + // log.Fatalf("unable to execute query %s", err) + return result, err } return result, nil } + +func (r kategoriRepo) GetKategoriById(c *gin.Context, id int) (KategoriOperasiModel, error) { + var resultQuery []KategoriOperasiModel + var result KategoriOperasiModel + + query := baseSelectQuery() + + query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: []queryUtils.DynamicFilter{ + {Column: "id", Operator: queryUtils.OpEqual, Value: id}, + }}) + + dbconn, err := r.db.GetSQLXDB(DB_NAME) + if err != nil { + // log.Fatalf("unable to connect db %s", err) + return result, err + } + + err = r.queryBuilder.ExecuteQuery( + c, dbconn, query, &resultQuery) + if err != nil { + // log.Fatalf("unable to execute query %s", err) + return result, err + } + + if len(resultQuery) == 0 { + notFoundError := errors.New("kategori not found") + return result, notFoundError + } + + return resultQuery[0], nil +} diff --git a/internal/domain/reference/spesialis/repository.go b/internal/domain/reference/spesialis/repository.go index 5b1c647..6ce08f3 100644 --- a/internal/domain/reference/spesialis/repository.go +++ b/internal/domain/reference/spesialis/repository.go @@ -2,7 +2,7 @@ package spesialis import ( "antrian-operasi/internal/database" - "log" + "errors" queryUtils "antrian-operasi/internal/utils/query" @@ -14,6 +14,8 @@ const DB_NAME = "db_antrian" type ISpesialisRepository interface { SearchableListSpesialis(c *gin.Context) ([]SpesialisModel, error) SearchableListSubSpesialis(c *gin.Context) ([]SubSpesialisModel, error) + GetSpesialisById(c *gin.Context, id int) (SpesialisModel, error) + GetSubSpesialisById(c *gin.Context, id int) (SubSpesialisModel, error) } type spesialisRepo struct { @@ -38,11 +40,8 @@ func NewRepository(dbService database.Service) ISpesialisRepository { } } -func (r spesialisRepo) SearchableListSpesialis(c *gin.Context) ([]SpesialisModel, error) { - var result []SpesialisModel - search := c.Query("search") - - query := queryUtils.DynamicQuery{ +func baseQueryListSpesialis() queryUtils.DynamicQuery { + return queryUtils.DynamicQuery{ From: "daftar_spesialis", Fields: []queryUtils.SelectField{ {Expression: "id"}, @@ -50,33 +49,9 @@ func (r spesialisRepo) SearchableListSpesialis(c *gin.Context) ([]SpesialisModel {Expression: "Spesialis"}, }, } - - if search != "" { - searchFilters := []queryUtils.DynamicFilter{ - {Column: "Kode", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, - {Column: "Spesialis", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, - } - query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"}) - } - - dbconn, err := r.db.GetSQLXDB(DB_NAME) - if err != nil { - log.Fatalf("unable to connect db %s", err) - } - - err = r.queryBuilder.ExecuteQuery( - c, dbconn, query, &result) - if err != nil { - log.Fatalf("unable to execute query %s", err) - } - - return result, nil } -func (r spesialisRepo) SearchableListSubSpesialis(c *gin.Context) ([]SubSpesialisModel, error) { - var result []SubSpesialisModel - search := c.Query("search") - +func baseQueryListSubSpesialis() queryUtils.DynamicQuery { query := queryUtils.DynamicQuery{ From: "daftar_subspesialis", Aliases: "dss", @@ -105,6 +80,45 @@ func (r spesialisRepo) SearchableListSubSpesialis(c *gin.Context) ([]SubSpesiali }, } + return query +} + +func (r spesialisRepo) SearchableListSpesialis(c *gin.Context) ([]SpesialisModel, error) { + var result []SpesialisModel + search := c.Query("search") + + query := baseQueryListSpesialis() + + if search != "" { + searchFilters := []queryUtils.DynamicFilter{ + {Column: "Kode", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, + {Column: "Spesialis", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, + } + query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"}) + } + + dbconn, err := r.db.GetSQLXDB(DB_NAME) + if err != nil { + // log.Fatalf("unable to connect db %s", err) + return result, err + } + + err = r.queryBuilder.ExecuteQuery( + c, dbconn, query, &result) + if err != nil { + // log.Fatalf("unable to execute query %s", err) + return result, err + } + + return result, nil +} + +func (r spesialisRepo) SearchableListSubSpesialis(c *gin.Context) ([]SubSpesialisModel, error) { + var result []SubSpesialisModel + search := c.Query("search") + + query := baseQueryListSubSpesialis() + if search != "" { searchFilters := []queryUtils.DynamicFilter{ {Column: "dss.Kode", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, @@ -115,14 +129,74 @@ func (r spesialisRepo) SearchableListSubSpesialis(c *gin.Context) ([]SubSpesiali dbconn, err := r.db.GetSQLXDB(DB_NAME) if err != nil { - log.Fatalf("unable to connect db %s", err) + // log.Fatalf("unable to connect db %s", err) + return result, err } err = r.queryBuilder.ExecuteQuery( c, dbconn, query, &result) if err != nil { - log.Fatalf("unable to execute query %s", err) + // log.Fatalf("unable to execute query %s", err) + return result, err } return result, nil } + +func (r spesialisRepo) GetSpesialisById(c *gin.Context, id int) (SpesialisModel, error) { + var resultQuery []SpesialisModel + var result SpesialisModel + + query := baseQueryListSpesialis() + + query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: []queryUtils.DynamicFilter{ + {Column: "id", Operator: queryUtils.OpEqual, Value: id}, + }}) + + dbconn, err := r.db.GetSQLXDB(DB_NAME) + if err != nil { + return result, err + } + + err = r.queryBuilder.ExecuteQuery( + c, dbconn, query, &resultQuery) + if err != nil { + return result, err + } + + if len(resultQuery) == 0 { + notFoundError := errors.New("spesialis not found") + return result, notFoundError + } + + return resultQuery[0], nil +} + +func (r spesialisRepo) GetSubSpesialisById(c *gin.Context, id int) (SubSpesialisModel, error) { + var resultQuery []SubSpesialisModel + var result SubSpesialisModel + + query := baseQueryListSubSpesialis() + + query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: []queryUtils.DynamicFilter{ + {Column: "dss.id", Operator: queryUtils.OpEqual, Value: id}, + }}) + + dbconn, err := r.db.GetSQLXDB(DB_NAME) + if err != nil { + return result, err + } + + err = r.queryBuilder.ExecuteQuery( + c, dbconn, query, &resultQuery) + if err != nil { + return result, err + } + + if len(resultQuery) == 0 { + notFoundError := errors.New("sub spesialisasi not found") + return result, notFoundError + } + + return resultQuery[0], nil +}