WIP : create antrian operasi

This commit is contained in:
renaldybrada
2026-01-30 08:01:07 +07:00
parent 1e15a2e1ec
commit eab5b428ea
10 changed files with 236 additions and 19 deletions

No files matched your search

+36 -9
View File
@@ -3,15 +3,29 @@ package antrianoperasi
import (
"log"
dokter "antrian-operasi/internal/domain/reference/dokter"
kategori "antrian-operasi/internal/domain/reference/kategori"
spesialis "antrian-operasi/internal/domain/reference/spesialis"
"antrian-operasi/internal/shared"
"github.com/gin-gonic/gin"
)
type AntrianOperasiHandler struct {
repo IAntrianOperasiRepository
repo IAntrianOperasiRepository
repoKategori kategori.IKategoriRepository
repoSpesialis spesialis.ISpesialisRepository
repoDokter dokter.IDokterRepository
}
func NewAntrianOperasiHandler(repo IAntrianOperasiRepository) AntrianOperasiHandler {
return AntrianOperasiHandler{repo}
func NewAntrianOperasiHandler(
repo IAntrianOperasiRepository,
repoKategori kategori.IKategoriRepository,
repoSpesialis spesialis.ISpesialisRepository,
repoDokter dokter.IDokterRepository) AntrianOperasiHandler {
return AntrianOperasiHandler{
repo, repoKategori, repoSpesialis, repoDokter,
}
}
func (h AntrianOperasiHandler) CreateAntrianOperasi(c *gin.Context) {
@@ -19,15 +33,24 @@ func (h AntrianOperasiHandler) CreateAntrianOperasi(c *gin.Context) {
// Binding format JSON
if err := c.ShouldBindJSON(&req); err != nil {
log.Printf("error bind json : %s", err)
c.JSON(500, err)
c.JSON(500, shared.BaseErrorResponse{
Success: false,
Code: 500,
Message: "error bind json",
})
return
}
// Request data master validation
errValidation := req.DataValidation()
if errValidation != nil {
isValid, errValidation := req.DataValidation(c, h)
if isValid == false {
log.Printf("validation error : %s", errValidation)
c.JSON(500, errValidation)
c.JSON(500, shared.BaseErrorResponse{
Success: false,
Code: 500,
Message: "validation error",
Errors: errValidation,
})
return
}
@@ -35,9 +58,13 @@ func (h AntrianOperasiHandler) CreateAntrianOperasi(c *gin.Context) {
res, err := h.repo.CreateAntrianOperasi(c, req)
if err != nil {
log.Printf("insert error : %s", err)
c.JSON(500, err)
c.JSON(500, shared.BaseErrorResponse{
Success: false,
Code: 500,
Message: "insert error",
})
return
}
c.JSON(201, res)
c.JSON(201, shared.ToBaseResponse(res, true, 201, "success insert antrian operasi"))
}
+102 -2
View File
@@ -4,8 +4,10 @@ import (
"antrian-operasi/internal/database"
queryUtils "antrian-operasi/internal/utils/query"
"log"
"time"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
const DB_NAME = "db_antrian"
@@ -20,9 +22,17 @@ type antrianOperasiRepo struct {
db database.Service
}
func NewAntrianOperasiRepo(dbService database.Service) IAntrianOperasiRepository {
func NewRepository(dbService database.Service) IAntrianOperasiRepository {
queryBuilder := queryUtils.NewQueryBuilder(queryUtils.DBTypePostgreSQL).
SetAllowedColumns([]string{})
SetAllowedColumns([]string{
"id", "status", "date_created", "\"No_rekam_medis\"", "\"No_KTP\"", "\"Nama_pasien\"",
"\"Jenis_kelamin\"", "\"Tanggal_lahir\"", "\"Umur\"", "\"Alamat\"", "\"Tanggal_daftar\"",
"\"Kategori_operasi\"", "\"Rencana_operasi\"", "\"Status_operasi\"", "\"Nomor\"",
"\"Spesialis\"", "\"Sub_spesialis\"", "\"Keterangan_status_pasien\"",
"\"Nomor_spesialis\"", "\"Nomor_sub_spesialis\"",
"\"Nomor_telepon\"",
"\"FK_pasien_operasi_telepon_pasien_operasi_ID\"",
})
queryBuilder.SetSecurityOptions(false, 100)
return antrianOperasiRepo{
@@ -45,6 +55,96 @@ func (r antrianOperasiRepo) CreateAntrianOperasi(c *gin.Context, req CreatePasie
// INSERTING
log.Println("TODO : insert tables")
// INSERT MAIN TABLE : data_pasien_operasi
idAntrian := uuid.New().String()
insertMainQuery := queryUtils.InsertData{
Columns: []string{
"id", "status", "date_created", "\"No_rekam_medis\"", "\"No_KTP\"", "\"Nama_pasien\"",
"\"Jenis_kelamin\"", "\"Tanggal_lahir\"", "\"Umur\"", "\"Alamat\"", "\"Tanggal_daftar\"",
"\"Kategori_operasi\"", "\"Rencana_operasi\"", "\"Status_operasi\"", "\"Nomor\"",
"\"Spesialis\"", "\"Sub_spesialis\"", "\"Keterangan_status_pasien\"",
"\"Nomor_spesialis\"", "\"Nomor_sub_spesialis\"",
}, Values: []interface{}{
idAntrian,
req.StatusPasienData.StatusOperasi,
time.Now(),
req.FormData.NoRekamMedis,
req.FormData.NoKtp,
req.FormData.NamaPasien,
req.FormData.JenisKelamin,
req.FormData.TglLahir,
req.FormData.Umur,
req.FormData.Alamat,
req.RencanaOperasiData.TanggalDaftar,
req.RencanaOperasiData.KategoriOperasi,
req.RencanaOperasiData.RencanaOperasi,
req.StatusPasienData.StatusOperasi,
1, // nomor
req.RencanaOperasiData.Spesialis,
req.RencanaOperasiData.SubSpesialis,
req.RencanaOperasiData.Keterangan,
req.RencanaOperasiData.Spesialis,
req.RencanaOperasiData.SubSpesialis,
},
}
returningCols := []string{
"id",
}
// _, err = r.queryBuilder.ExecuteInsert(c, db, "data_pasien_operasi", insertMainQuery, returningCols...)
sql, args, err := r.queryBuilder.BuildInsertQuery("data_pasien_operasi", insertMainQuery, returningCols...)
log.Printf("query main : %s", sql)
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
tx.Rollback()
log.Println(err)
return req, err
}
log.Printf("success insert main : %s", insertMainQuery.Values...)
// INSERT data_telepon_pasien_operasi
var valuesInsertTelepon []interface{}
for _, telp := range *req.FormData.NoTelepon {
idTelepon := uuid.New().String()
itemValues := []string{idTelepon, telp, idAntrian}
valuesInsertTelepon = append(valuesInsertTelepon, itemValues)
}
insertTeleponQuery := queryUtils.InsertData{
Columns: []string{
"id",
"\"Nomor_telepon\"",
"\"FK_pasien_operasi_telepon_pasien_operasi_ID\"",
},
Values: valuesInsertTelepon,
}
// _, err = r.queryBuilder.ExecuteInsert(c, db, "data_telepon_pasien_operasi", insertTeleponQuery, returningCols...)
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_telepon_pasien_operasi", insertTeleponQuery, returningCols...)
if err != nil {
log.Printf("error building query telepon %s", err)
tx.Rollback()
return req, err
}
log.Printf("query telepon : %s", sql)
log.Printf("args telepon : %s", args...)
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
tx.Rollback()
log.Println(err)
return req, err
}
log.Printf("success insert telepon")
// INSERT data_diagnosa_pasien_operasi
// INSERT data_tindakan_pasien_operasi
// INSERT data_pasien_operasi_data_pegawai
// COMMIT TRANSACTION
tx.Commit()
+1 -1
View File
@@ -37,7 +37,7 @@ type RencanaOperasiRequest struct {
}
type DokterPelaksanaItemRequest struct {
Id *int `json:"id"`
Id string `json:"id"`
Nip *string `json:"nip"`
Nama *string `json:"nama"`
SatuanKerja *string `json:"satuan_kerja"`
@@ -1,8 +1,44 @@
package antrianoperasi
import "log"
import (
"log"
func (req CreatePasienOperasiRequest) DataValidation() error {
log.Println("TODO : Data Validation")
return nil
"github.com/gin-gonic/gin"
)
func (req CreatePasienOperasiRequest) DataValidation(c *gin.Context, handler AntrianOperasiHandler) (bool, []string) {
isValid := false
var errValidation []string
// validasi kategori
_, err := handler.repoKategori.GetKategoriById(c, req.RencanaOperasiData.KategoriOperasi)
if err != nil {
log.Println(err)
errValidation = append(errValidation, err.Error())
}
_, err = handler.repoSpesialis.GetSpesialisById(c, req.RencanaOperasiData.Spesialis)
if err != nil {
log.Println(err)
errValidation = append(errValidation, err.Error())
}
_, err = handler.repoSpesialis.GetSubSpesialisById(c, req.RencanaOperasiData.SubSpesialis)
if err != nil {
log.Println(err)
errValidation = append(errValidation, err.Error())
}
for _, dp := range req.DokterPelaksanaItems {
_, err := handler.repoDokter.GetDokterById(c, dp.Id)
if err != nil {
log.Println(err)
errValidation = append(errValidation, err.Error())
continue
}
}
if len(errValidation) == 0 {
isValid = true
}
return isValid, errValidation
}
+10 -2
View File
@@ -2,13 +2,21 @@ package antrianoperasi
import (
"antrian-operasi/internal/database"
"antrian-operasi/internal/domain/reference/dokter"
"antrian-operasi/internal/domain/reference/kategori"
"antrian-operasi/internal/domain/reference/spesialis"
"github.com/gin-gonic/gin"
)
func RegisterRoutes(r *gin.RouterGroup, dbService database.Service) {
antrianOperasiRepo := NewAntrianOperasiRepo(dbService)
antrianOperasiHandler := NewAntrianOperasiHandler(antrianOperasiRepo)
antrianOperasiRepo := NewRepository(dbService)
kategoriRepo := kategori.NewRepository(dbService)
spesialisRepo := spesialis.NewRepository(dbService)
dokterRepo := dokter.NewRepository(dbService)
antrianOperasiHandler := NewAntrianOperasiHandler(
antrianOperasiRepo, kategoriRepo, spesialisRepo, dokterRepo)
r.POST("/antrian-operasi", antrianOperasiHandler.CreateAntrianOperasi)
}
+7
View File
@@ -1,5 +1,12 @@
package shared
type BaseErrorResponse struct {
Success bool `json:"success"`
Code int `json:"code"`
Message string `json:"message"`
Errors []string `json:"errors"`
}
type BaseResponse[T any] struct {
Success bool `json:"success"`
Code int `json:"code"`
+34
View File
@@ -1332,6 +1332,7 @@ func (qb *QueryBuilder) ExecuteInsert(ctx context.Context, db *sqlx.DB, table st
start := time.Now()
result, err := db.ExecContext(ctx, sql, args...)
if qb.enableQueryLogging {
fmt.Printf("[DEBUG BuilderQuery] Final SQL query: %s\n", sql)
fmt.Printf("[DEBUG] Insert query executed in %v\n", time.Since(start))
}
return result, err
@@ -1712,6 +1713,39 @@ func (qb *QueryBuilder) BuildInsertQuery(table string, data InsertData, returnin
return sql, args, nil
}
func (qb *QueryBuilder) BuildBulkInsertQuery(table string, data InsertData, returningColumns ...string) (string, []interface{}, error) {
// Validate columns
for _, col := range data.Columns {
if qb.allowedColumns != nil && !qb.allowedColumns[col] {
return "", nil, fmt.Errorf("disallowed column: %s", col)
}
}
// Start with basic insert
insert := qb.sqlBuilder.Insert(table).Columns(data.Columns...)
// loop insert data values
for _, item := range data.Values {
log.Printf("%s", item)
insert.Values(item)
}
if len(returningColumns) > 0 {
if qb.dbType == DBTypePostgreSQL {
insert = insert.Suffix("RETURNING " + strings.Join(returningColumns, ", "))
} else {
return "", nil, fmt.Errorf("RETURNING not supported for database type: %s", qb.dbType)
}
}
sql, args, err := insert.ToSql()
if err != nil {
return "", nil, fmt.Errorf("failed to build INSERT query: %w", err)
}
return sql, args, nil
}
// BuildUpdateQuery builds an UPDATE query
func (qb *QueryBuilder) BuildUpdateQuery(table string, updateData UpdateData, filters []FilterGroup, returningColumns ...string) (string, []interface{}, error) {
// Validate columns