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 BidangUrusanController struct { contextTimeout time.Duration pgxConn *pgxpool.Pool } func NewBidangUrusanController(conn *pgxpool.Pool, timeout time.Duration) (controller *BidangUrusanController) { controller = &BidangUrusanController{ pgxConn: conn, contextTimeout: timeout, } return } func getBidangUrusanDetailFields() []string { var field []string v := reflect.ValueOf(models.MstBidangUrusanModel{}) 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 bidang urusan func (c *BidangUrusanController) Index( page, limit int, filter string, ) ( resp []models.MstBidangUrusanModel, totalCount int, pageCount int, err error, ) { var q string resp = make([]models.MstBidangUrusanModel, 0) pageCount = 1 offset := limit * (page - 1) var filterCond string if filter != "" { var filterMap map[string]string filterMap, err = utils.ValidateAndReturnFilterMap(filter, getBidangUrusanDetailFields()) 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_urusan": filterCond = fmt.Sprintf(" AND mu.%s ILIKE '%s%s%s' ", key, "%", val, "%") case "nama_bidang_urusan": filterCond = fmt.Sprintf(" AND mbu.%s ILIKE '%s%s%s' ", key, "%", val, "%") case "kode_urusan": filterCond = fmt.Sprintf(" AND mu.%s = '%s' ", key, val) case "kode_bidang_urusan", "tahun": filterCond = fmt.Sprintf(" AND mbu.%s = '%s' ", key, val) case "daerah_khusus", "jenis_pemda": filterCond = fmt.Sprintf(" AND '%s' = ANY(mbu.%s) ", val, key) default: filterCond = "" } } // total data q = `SELECT COALESCE(COUNT(mbu.id_bidang_urusan), 0) FROM "master_data"."mst_bidang_urusan" AS mbu LEFT JOIN "master_data"."mst_urusan" AS mu ON mu.tahun=mbu.tahun AND mu.id_urusan=mbu.id_urusan WHERE mbu."locked"='f' AND mbu."disable"='f' AND mbu.deleted_by = 0 AND mbu.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 mbu.id_bidang_urusan, mbu.id_urusan, mbu.tahun, mu.kode_urusan, mu.nama_urusan, mbu.kode_bidang_urusan, mbu.nama_bidang_urusan , mbu.locked, mbu.disable FROM "master_data"."mst_bidang_urusan" AS mbu LEFT JOIN "master_data"."mst_urusan" AS mu ON mu.tahun=mbu.tahun AND mu.id_urusan=mbu.id_urusan WHERE mbu."locked"='f' AND mbu."disable"='f' AND mbu.deleted_by = 0 AND mbu.deleted_at='0001-01-01 00:00:00' ` q += filterCond q += ` ORDER BY mbu.kode_bidang_urusan 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.MstBidangUrusanModel err = rows.Scan( &m.IDBidangUrusan, &m.IDUrusan, &m.Tahun, &m.KodeUrusan, &m.NamaUrusan, &m.KodeBidangUrusan, &m.NamaBidangUrusan, &m.Locked, &m.Disable, ) 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 bidang urusan func (c *BidangUrusanController) View(id int, tahun int) (resp models.MstBidangUrusanDetilModel, err error) { // log.Println("id: ", id) q := `SELECT mbu.id_bidang_urusan, mu.id_urusan, mbu.tahun, mu.kode_urusan, mu.nama_urusan, mbu.kode_bidang_urusan, mbu.nama_bidang_urusan , mbu.locked, mbu.disable, mbu.daerah_khusus, mbu.jns_pemda , mbu.created_at, mbu.created_by, mbu.updated_at, mbu.updated_by, mbu.deleted_at, mbu.deleted_by FROM "master_data"."mst_bidang_urusan" AS mbu LEFT JOIN "master_data"."mst_urusan" AS mu ON mu.tahun=mbu.tahun AND mu.id_urusan=mbu.id_urusan WHERE mbu."locked"='f' AND mbu."disable"='f' AND mbu.deleted_by = 0 AND mbu.deleted_at='0001-01-01 00:00:00' AND mbu.id_bidang_urusan=$1 AND mbu.tahun=$2` err = c.pgxConn.QueryRow(context.Background(), q, id, tahun).Scan( &resp.IDBidangUrusan, &resp.IDUrusan, &resp.Tahun, &resp.KodeUrusan, &resp.NamaUrusan, &resp.KodeBidangUrusan, &resp.NamaBidangUrusan, &resp.Locked, &resp.Disable, &resp.DaerahKhusus, &resp.JenisPemda, &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 // }