initiate reference pasien

This commit is contained in:
renaldybrada
2026-02-03 12:24:30 +07:00
parent 11bcf44f6b
commit 6caee98c07
4 changed files with 195 additions and 0 deletions

View File

@@ -0,0 +1,41 @@
package pasien
import (
"net/http"
baseResponse "antrian-operasi/internal/shared"
"github.com/gin-gonic/gin"
)
type PasienHandler struct {
repo IPasienRepository
}
func NewPasienHandler(repo IPasienRepository) PasienHandler {
return PasienHandler{repo}
}
// ListPasien godoc
// @Summary Get List Pasien
// @Tags Pasien
// @Param search query string false "Search keyword"
// @Success 200 {object} []PasienModel
// @Failure 500 {object} shared.BaseErrorResponse
// @Router /reference/pasien/ [get]
func (h PasienHandler) ListPasienOperasi(c *gin.Context) {
list, err := h.repo.SearchableListPasien(c)
if err != nil {
errorResponse := baseResponse.BaseErrorResponse{
Success: false,
Code: 500,
Message: err.Error(),
}
c.JSON(http.StatusInternalServerError, errorResponse)
return
}
response := baseResponse.ToBaseResponse(list, true, 200, "success get pasien")
c.JSON(http.StatusOK, response)
}

View File

@@ -0,0 +1,12 @@
package pasien
type PasienModel struct {
Id int `db:"id"`
Alamat string `db:"alamat"`
AlamatKtp string `db:"alamat_ktp"`
JenisKelamin string `db:"jeniskelamin"`
Nama string `db:"nama"`
Nik string `db:"noktp"`
NoMr string `db:"nomr"`
TglLahir string `db:"tgllahir"`
}

View File

@@ -0,0 +1,125 @@
package pasien
import (
"antrian-operasi/internal/database"
"errors"
queryUtils "antrian-operasi/internal/utils/query"
"github.com/gin-gonic/gin"
)
const DB_NAME = "db_simrs"
const TBL_NAME = "m_pasien"
type IPasienRepository interface {
SearchableListPasien(c *gin.Context) ([]PasienModel, error)
GetPasienByNoMr(c *gin.Context, id int) (PasienModel, error)
}
type pasienRepo struct {
queryBuilder *queryUtils.QueryBuilder
db database.Service
}
func NewRepository(dbService database.Service) IPasienRepository {
queryBuilder := queryUtils.NewQueryBuilder(queryUtils.DBTypePostgreSQL).
SetAllowedColumns([]string{
"id",
"alamat",
"alamat_ktp",
"jeniskelamin",
"nama",
"noktp",
"nomr",
"tgllahir",
})
queryBuilder.SetSecurityOptions(false, 100)
return pasienRepo{
queryBuilder: queryBuilder,
db: dbService,
}
}
func baseSelectQuery() queryUtils.DynamicQuery {
return queryUtils.DynamicQuery{
From: TBL_NAME,
Fields: []queryUtils.SelectField{
{Expression: "id"},
{Expression: "alamat"},
{Expression: "alamat_ktp"},
{Expression: "jeniskelamin"},
{Expression: "nama"},
{Expression: "noktp"},
{Expression: "nomr"},
{Expression: "tgllahir"},
},
Sort: []queryUtils.SortField{
{Column: "id", Order: "DESC"},
},
}
}
func (r pasienRepo) SearchableListPasien(c *gin.Context) ([]PasienModel, error) {
var result []PasienModel
search := c.Query("search")
query := baseSelectQuery()
query.Limit = 10 // default limit
if search != "" {
searchFilters := []queryUtils.DynamicFilter{
{Column: "nama", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "noktp", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "nomr", 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 pasienRepo) GetPasienByNoMr(c *gin.Context, id int) (PasienModel, error) {
var resultQuery []PasienModel
var result PasienModel
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
}

View File

@@ -0,0 +1,17 @@
package pasien
import (
"antrian-operasi/internal/database"
"github.com/gin-gonic/gin"
)
func RegisterRoutes(r *gin.RouterGroup, dbService database.Service) {
pasienRepo := NewRepository(dbService)
PasienHandler := NewPasienHandler(pasienRepo)
kategori := r.Group("/pasien")
{
kategori.GET("", PasienHandler.ListPasienOperasi)
}
}