sipd-master/controllers/kecamatan_controller.go
2025-09-16 08:26:35 +07:00

435 lines
11 KiB
Go

package controllers
import (
"context"
"fmt"
"math"
"net/http"
"reflect"
"time"
"kemendagri/sipd/services/master-sipd/models"
"kemendagri/sipd/services/master-sipd/utils"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
)
type KecamatanController struct {
contextTimeout time.Duration
pgxConn *pgxpool.Pool
}
func NewKecamatanController(conn *pgxpool.Pool, timeout time.Duration) (controller *KecamatanController) {
controller = &KecamatanController{
pgxConn: conn,
contextTimeout: timeout,
}
return
}
func getKecamatanDetailFields() []string {
var field []string
v := reflect.ValueOf(models.MstKecamatanModel{})
for i := 0; i < v.Type().NumField(); i++ {
field = append(field, v.Type().Field(i).Tag.Get("json"))
}
// log.Println("fields: ", field)
return field
}
// Index lists of kecamatan
func (c *KecamatanController) Index(
page, limit int,
filter string,
) (
resp []models.MstKecamatanModel,
totalCount int,
pageCount int,
err error,
) {
var q string
resp = make([]models.MstKecamatanModel, 0)
pageCount = 1
offset := limit * (page - 1)
var filterCond string
if filter != "" {
var filterMap map[string]string
filterMap, err = utils.ValidateAndReturnFilterMap(filter, getKecamatanDetailFields())
if err != nil {
return resp, totalCount, pageCount, err
}
// log.Println("filterMap: ", filterMap)
var key, val string
for k, v := range filterMap {
key = k
val = v
}
switch key {
case "nama_kecamatan":
filterCond = fmt.Sprintf(" AND kc.%s ILIKE '%s%s%s' ", key, "%", val, "%")
case "kode_kecamatan", "id_kabkota":
filterCond = fmt.Sprintf(" AND kc.%s = '%s' ", key, val)
default:
filterCond = ""
}
}
// total data
q = `SELECT COALESCE(COUNT(kc.id_kecamatan), 0)
FROM "master_data"."mst_kecamatan" AS kc
LEFT JOIN "master_data"."mst_daerah" AS kb ON kb.id_daerah=kc.id_daerah
WHERE kc.deleted_by = 0 AND kc.deleted_at='0001-01-01 00:00:00'` + filterCond
err = c.pgxConn.QueryRow(context.Background(), q).Scan(&totalCount)
if err != nil {
err = utils.RequestError{
Code: http.StatusInternalServerError,
Message: "gagal mengambil total data. - " + err.Error(),
}
return resp, totalCount, pageCount, err
}
var rows pgx.Rows
q = `SELECT kc.id_kecamatan, kc.id_daerah as id_kabkota, kb.kode_ddn as kode_kabkota, kb.nama_daerah as nama_kabkota
, kc.kode_kecamatan, kc.nama_kecamatan, kc.locked
FROM "master_data"."mst_kecamatan" AS kc
LEFT JOIN "master_data"."mst_daerah" AS kb ON kb.id_daerah=kc.id_daerah
WHERE kc.deleted_by = 0 AND kc.deleted_at='0001-01-01 00:00:00' `
q += filterCond
q += ` ORDER BY kc.kode_kecamatan LIMIT $1 OFFSET $2`
rows, err = c.pgxConn.Query(context.Background(), q, limit, offset)
if err != nil {
err = utils.RequestError{
Code: http.StatusInternalServerError,
Message: "gagal mengambil data. - " + err.Error(),
}
return resp, totalCount, pageCount, err
}
defer rows.Close()
for rows.Next() {
var m models.MstKecamatanModel
err = rows.Scan(
&m.IDKecamatan,
&m.IDKabkota,
&m.KodeKabkota,
&m.NamaKabkota,
&m.KodeKecamatan,
&m.NamaKecamatan,
&m.Locked,
)
if err != nil {
err = utils.RequestError{
Code: http.StatusInternalServerError,
Message: "gagal iterasi data. - " + rows.Err().Error(),
}
return resp, totalCount, pageCount, err
}
resp = append(resp, m)
}
if rows.Err() != nil {
err = utils.RequestError{
Code: http.StatusInternalServerError,
Message: "gagal mengambil data (rows). - " + rows.Err().Error(),
}
return resp, totalCount, pageCount, err
}
rows.Close()
if totalCount > 0 && totalCount > limit {
pageCount = int(math.Ceil(float64(totalCount) / float64(limit)))
}
return resp, totalCount, pageCount, err
}
// View detail of kecamatan
func (c *KecamatanController) View(id int) (resp models.MstKecamatanDetilModel, err error) {
// log.Println("id: ", id)
q := `SELECT kc.id_kecamatan, kc.id_daerah as id_kabkota, kb.id_prov, pv.kode_ddn as kode_prov, pv.nama_daerah as nama_prov
,kb.kode_ddn as kode_kabkota, kb.nama_daerah as nama_kabkota, kc.kode_kecamatan, kc.nama_kecamatan, kc.locked
,kc.created_at, kc.created_by, kc.updated_at, kc.updated_by, kc.deleted_at, kc.deleted_by
FROM "master_data"."mst_kecamatan" AS kc
LEFT JOIN "master_data"."mst_daerah" AS kb ON kb.id_daerah=kc.id_daerah
LEFT JOIN "master_data"."mst_daerah" AS pv ON pv.id_daerah=kb.id_prov
WHERE kc.deleted_by = 0 AND kc.deleted_at='0001-01-01 00:00:00' and kc.id_kecamatan=$1`
err = c.pgxConn.QueryRow(context.Background(), q, id).Scan(
&resp.IDKecamatan,
&resp.IDKabkota,
&resp.IDProv,
&resp.KodeProv,
&resp.NamaProv,
&resp.KodeKabkota,
&resp.NamaKabkota,
&resp.KodeKecamatan,
&resp.NamaKecamatan,
&resp.Locked,
&resp.CreatedAt,
&resp.CreatedBy,
&resp.UpdatedAt,
&resp.UpdatedBy,
&resp.DeletedAt,
&resp.DeletedBy,
)
if err != nil {
if err.Error() == "no rows in result set" {
err = utils.RequestError{
Code: http.StatusNotFound,
Message: "Data tidak ditemukan",
}
} else {
err = utils.RequestError{
Code: http.StatusInternalServerError,
Message: "gagal mengambil data. - " + err.Error(),
}
}
return resp, err
}
if resp.DeletedBy > 0 && !resp.DeletedAt.IsZero() {
err = utils.RequestError{
Code: http.StatusNotFound,
Message: "Data sudah dihapus.",
}
return resp, err
}
return resp, err
}
// Create new daerah
// func (c *DaerahController) Create(payloadl models.RefDaerahModelPayload) error {
// var err error
// var kodeUnik string
// kodeUnik = uuid.New().String()
// // mulai validasi duplikat unique key
// var exists bool
// q := `
// SELECT EXISTS (
// SELECT 1
// FROM "master_data"."mst_daerah"
// WHERE kode_ddn = $1
// AND nama_daerah = $2
// )
// `
// err = c.pgxConn.QueryRow(
// context.Background(),
// q,
// payloadl.KodeDdn,
// payloadl.NamaDaerah,
// ).Scan(&exists)
// if err != nil {
// err = utils.RequestError{
// Code: http.StatusInternalServerError,
// Message: "gagal memeriksa duplikasi unique key. - " + err.Error(),
// }
// return err
// }
// if exists {
// err = utils.RequestError{
// Code: http.StatusBadRequest,
// Message: "Data sudah ada",
// }
// return err
// }
// // selesai validasi duplikat unique key
// q = `
// INSERT INTO "master_data"."mst_daerah" (
// id_prov,
// daerah_khusus,
// jns_pemda,
// zona_waktu,
// zona_wilayah,
// kode_unik,
// kode_ddn,
// nama_daerah,
// nama_ibu_kota,
// logo_daerah
// ) VALUES (
// $1, -- id
// $2, -- id_prov
// $3, -- daerah_khusus
// $4, -- jns_pemda
// $5, -- zona_waktu
// $6, -- zona_wilayah
// $7, -- kode_unik
// $8, -- kode_ddn
// $9, -- nama_daerah
// $10 -- nama_ibu_kota
// )
// `
// _, err = c.pgxConn.Exec(
// context.Background(),
// q,
// &payloadl.IDProv,
// &payloadl.DaerahKhusus,
// &payloadl.JnsPemda,
// &payloadl.ZonaWaktu,
// &payloadl.ZonaWilayah,
// &kodeUnik,
// &payloadl.KodeDdn,
// &payloadl.NamaDaerah,
// &payloadl.NamaIbuKota,
// &payloadl.LogoDaerah,
// )
// if err != nil {
// err = utils.RequestError{
// Code: http.StatusInternalServerError,
// Message: "gagal menyimpan data daerah. - " + err.Error(),
// }
// return err
// }
// return err
// }
// // Update daerah
// func (c *DaerahController) Update(id int, payloadl models.RefDaerahModelPayload) error {
// var err error
// var q string
// // pastikan data dengan id tersebut ada, dengan cara mengambil datanya.
// var idDaerah int
// var kodeDdn, namaDaerah string
// q = `SELECT id, kode_ddn, nama_daerah FROM "master_data"."mst_daerah" WHERE id_daerah=$1`
// err = c.pgxConn.QueryRow(context.Background(), q, id).Scan(&idDaerah, &kodeDdn, &namaDaerah)
// if err != nil {
// {
// err = utils.RequestError{
// Code: http.StatusInternalServerError,
// Message: "gagal mengambil data daerah. - " + err.Error(),
// }
// return err
// }
// }
// if kodeDdn != payloadl.KodeDdn && namaDaerah != payloadl.NamaDaerah {
// // mulai validasi duplikat unique key
// var exists bool
// q = `
// SELECT EXISTS (
// SELECT 1
// FROM "master_data"."mst_daerah"
// WHERE kode_ddn = $1
// AND nama_daerah = $2
// )
// `
// err = c.pgxConn.QueryRow(
// context.Background(),
// q,
// payloadl.KodeDdn,
// payloadl.NamaDaerah,
// ).Scan(&exists)
// if err != nil {
// err = utils.RequestError{
// Code: http.StatusInternalServerError,
// Message: "gagal memeriksa duplikasi unique key. - " + err.Error(),
// }
// return err
// }
// if exists {
// err = utils.RequestError{
// Code: http.StatusBadRequest,
// Message: "Data sudah ada",
// }
// return err
// }
// // selesai validasi duplikat unique key
// }
// q = `
// UPDATE "master_data"."mst_daerah"
// SET
// id_prov = $1,
// daerah_khusus = $2,
// jns_pemda = $3,
// zona_waktu = $4,
// zona_wilayah = $5,
// nama_daerah = $6,
// nama_ibu_kota = $7,
// logo_daerah = $8,
// updated_at = NOW()
// WHERE id = $9
// `
// _, err = c.pgxConn.Exec(
// context.Background(),
// q,
// payloadl.IDProv,
// payloadl.DaerahKhusus,
// payloadl.JnsPemda,
// payloadl.ZonaWaktu,
// payloadl.ZonaWilayah,
// payloadl.NamaDaerah,
// payloadl.NamaIbuKota,
// payloadl.LogoDaerah,
// id, // kondisi WHERE
// )
// if err != nil {
// err = utils.RequestError{
// Code: http.StatusInternalServerError,
// Message: "gagal mengupdate data daerah. - " + err.Error(),
// }
// return err
// }
// return err
// }
// func (c *DaerahController) Delete(id int) error {
// var err error
// var idDaerah, deletedBy int
// var deletedAt time.Time
// q := `SELECT id, deleted_by, deleted_at FROM "master_data"."mst_daerah" WHERE id_daerah=$1`
// err = c.pgxConn.QueryRow(context.Background(), q, id).Scan(&idDaerah, &deletedBy, &deletedAt)
// if err != nil {
// {
// err = utils.RequestError{
// Code: http.StatusInternalServerError,
// Message: "gagal mengambil data daerah. - " + err.Error(),
// }
// return err
// }
// }
// if deletedBy != 0 {
// err = utils.RequestError{
// Code: http.StatusBadRequest,
// Message: "data sudah dihapus",
// }
// return err
// }
// q = `
// UPDATE "master_data"."mst_daerah"
// SET
// deleted_by = $1,
// deleted_at = NOW()
// WHERE id = $2
// `
// _, err = c.pgxConn.Exec(
// context.Background(),
// q,
// id,
// id,
// )
// if err != nil {
// err = utils.RequestError{
// Code: http.StatusInternalServerError,
// Message: "gagal menghapus data daerah. - " + err.Error(),
// }
// return err
// }
// return err
// }