separating insert child tables from main insert

This commit is contained in:
renaldybrada
2026-02-09 11:53:04 +07:00
parent cae32777d3
commit 845564eba9
+148 -152
View File
@@ -4,6 +4,7 @@ import (
"antrian-operasi/internal/database"
"antrian-operasi/internal/shared"
queryUtils "antrian-operasi/internal/utils/query"
"database/sql"
"log"
"slices"
"strconv"
@@ -51,6 +52,151 @@ func NewRepository(dbService database.Service) IAntrianOperasiRepository {
}
}
func (r antrianOperasiRepo) insertAntrianChildTables(c *gin.Context, tx *sql.Tx, idAntrian string, req CreatePasienOperasiRequest) error {
returningCols := []string{
"id",
}
// INSERT data_telepon_pasien_operasi
var valuesInsertTelepon [][]interface{}
for _, telp := range req.FormData.NoTelepon {
idTelepon := uuid.New().String()
itemValues := []interface{}{idTelepon, telp, idAntrian}
valuesInsertTelepon = append(valuesInsertTelepon, itemValues)
}
insertTeleponQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Nomor_telepon\"",
"\"FK_pasien_operasi_telepon_pasien_operasi_ID\"",
},
Values: valuesInsertTelepon,
}
sql, args, err := r.queryBuilder.BuildBulkInsertQuery("data_telepon_pasien_operasi", insertTeleponQuery, returningCols...)
if err != nil {
log.Printf("error building query telepon %s", err)
return err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
log.Println(err)
return err
}
log.Printf("success insert telepon")
// INSERT data_diagnosa_pasien_operasi
var valuesDiagnosa [][]interface{}
for _, diagnosa := range req.DiagnosisItem {
idDiagnosa := uuid.New().String()
itemValues := []interface{}{
idDiagnosa,
diagnosa.KodeDiagnosa,
diagnosa.Diagnosa,
diagnosa.JenisDiagnosa,
idAntrian,
}
valuesDiagnosa = append(valuesDiagnosa, itemValues)
}
insertDiagnosaQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Kode_diagnosa\"",
"\"Diagnosa\"",
"\"Jenis_diagnosa\"",
"\"FK_pasien_operasi_diagnosa_pasien_operasi_ID\"",
},
Values: valuesDiagnosa,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_diagnosa_pasien_operasi", insertDiagnosaQuery, returningCols...)
if err != nil {
log.Printf("error building query diagnosa %s", err)
return err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
log.Println(err)
return err
}
log.Printf("success insert diagnosa")
// INSERT data_tindakan_pasien_operasi
var valuesTindakan [][]interface{}
for _, tindakan := range req.TindakanItems {
idTindakan := uuid.New().String()
itemValues := []interface{}{
idTindakan,
tindakan.KodeTindakan,
tindakan.Tindakan,
tindakan.TindakanTambahan,
idAntrian,
}
valuesTindakan = append(valuesTindakan, itemValues)
}
insertTindakanQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Kode_tindakan\"",
"\"Tindakan\"",
"\"Tindakan_tambahan\"",
"\"FK_pasien_operasi_tindakan_pasien_operasi_ID\"",
},
Values: valuesTindakan,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_tindakan_pasien_operasi", insertTindakanQuery, returningCols...)
if err != nil {
log.Printf("error building query tindakan %s", err)
return err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
log.Println(err)
return err
}
log.Printf("success insert tindakan")
// INSERT data_pasien_operasi_data_pegawai
var valuesDokterPelaksana [][]interface{}
for _, dokter := range req.DokterPelaksanaItems {
itemValues := []interface{}{
idAntrian,
dokter.Id,
}
valuesDokterPelaksana = append(valuesDokterPelaksana, itemValues)
}
insertDokterPelaksanaQuery := queryUtils.InsertBulkData{
Columns: []string{
"\"data_pasien_operasi_id\"",
"\"data_pegawai_id\"",
},
Values: valuesDokterPelaksana,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_pasien_operasi_data_pegawai_2", insertDokterPelaksanaQuery, returningCols...)
if err != nil {
log.Printf("error building query dokter pelaksana %s", err)
return err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
log.Println(err)
return err
}
return nil
}
func (r antrianOperasiRepo) CreateAntrianOperasi(c *gin.Context, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error) {
db, err := r.db.GetSQLXDB(DB_NAME)
if err != nil {
@@ -109,162 +255,12 @@ func (r antrianOperasiRepo) CreateAntrianOperasi(c *gin.Context, req CreatePasie
}
log.Printf("success insert main")
// INSERT data_telepon_pasien_operasi
var valuesInsertTelepon [][]interface{}
for _, telp := range req.FormData.NoTelepon {
idTelepon := uuid.New().String()
itemValues := []interface{}{idTelepon, telp, idAntrian}
valuesInsertTelepon = append(valuesInsertTelepon, itemValues)
}
insertTeleponQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Nomor_telepon\"",
"\"FK_pasien_operasi_telepon_pasien_operasi_ID\"",
},
Values: valuesInsertTelepon,
}
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
}
_, err = tx.ExecContext(c, sql, args...)
// INSERT CHILD TABLES
err = r.insertAntrianChildTables(c, tx, idAntrian, req)
if err != nil {
tx.Rollback()
log.Println(err)
return req, err
}
log.Printf("success insert telepon")
// INSERT data_diagnosa_pasien_operasi
var valuesDiagnosa [][]interface{}
for _, diagnosa := range req.DiagnosisItem {
idDiagnosa := uuid.New().String()
itemValues := []interface{}{
idDiagnosa,
diagnosa.KodeDiagnosa,
diagnosa.Diagnosa,
diagnosa.JenisDiagnosa,
idAntrian,
}
valuesDiagnosa = append(valuesDiagnosa, itemValues)
}
insertDiagnosaQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Kode_diagnosa\"",
"\"Diagnosa\"",
"\"Jenis_diagnosa\"",
"\"FK_pasien_operasi_diagnosa_pasien_operasi_ID\"",
},
Values: valuesDiagnosa,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_diagnosa_pasien_operasi", insertDiagnosaQuery, returningCols...)
if err != nil {
log.Printf("error building query diagnosa %s", err)
tx.Rollback()
return req, err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
tx.Rollback()
log.Println(err)
return req, err
}
log.Printf("success insert diagnosa")
// INSERT data_tindakan_pasien_operasi
var valuesTindakan [][]interface{}
for _, tindakan := range req.TindakanItems {
idTindakan := uuid.New().String()
itemValues := []interface{}{
idTindakan,
tindakan.KodeTindakan,
tindakan.Tindakan,
tindakan.TindakanTambahan,
idAntrian,
}
valuesTindakan = append(valuesTindakan, itemValues)
}
insertTindakanQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Kode_tindakan\"",
"\"Tindakan\"",
"\"Tindakan_tambahan\"",
"\"FK_pasien_operasi_tindakan_pasien_operasi_ID\"",
},
Values: valuesTindakan,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_tindakan_pasien_operasi", insertTindakanQuery, returningCols...)
if err != nil {
log.Printf("error building query tindakan %s", err)
tx.Rollback()
return req, err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
tx.Rollback()
log.Println(err)
return req, err
}
log.Printf("success insert tindakan")
// INSERT data_pasien_operasi_data_pegawai
var valuesDokterPelaksana [][]interface{}
for _, dokter := range req.DokterPelaksanaItems {
itemValues := []interface{}{
idAntrian,
dokter.Id,
}
valuesDokterPelaksana = append(valuesDokterPelaksana, itemValues)
}
insertDokterPelaksanaQuery := queryUtils.InsertBulkData{
Columns: []string{
"\"data_pasien_operasi_id\"",
"\"data_pegawai_id\"",
},
Values: valuesDokterPelaksana,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_pasien_operasi_data_pegawai", insertDokterPelaksanaQuery, returningCols...)
if err != nil {
log.Printf("error building query dokter pelaksana %s", err)
tx.Rollback()
return req, err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
tx.Rollback()
log.Println(err)
return req, err
}
log.Printf("success insert dokter pelaksana")
// COMMIT TRANSACTION
tx.Commit()