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

479 lines
14 KiB
Go

package handler
import (
"kemendagri/sipd/services/master-sipd/controllers"
"kemendagri/sipd/services/master-sipd/models"
"kemendagri/sipd/services/master-sipd/utils"
"log"
"net/http"
"strconv"
"github.com/go-playground/validator/v10"
"github.com/gofiber/fiber/v2"
)
type UrusanHandler struct {
Controller *controllers.UrusanController
Validate *validator.Validate
}
func NewUrusanHandler(app *fiber.App, vld *validator.Validate, controller *controllers.UrusanController) {
handler := &UrusanHandler{
Controller: controller,
Validate: vld,
}
// public route
rpub := app.Group("/urusan")
rpub.Get("/", handler.Index)
rpub.Get("/:id/:tahun", handler.View)
rpub.Post("/", handler.Create)
rpub.Put("/:id", handler.Update)
rpub.Delete("/:id", handler.Delete)
rpub.Put("/:id/lock", handler.UpdateLocked)
rpub.Put("/:id/disable", handler.UpdateDisable)
}
// Index func for get lists of urusan.
//
// @Summary get lists of urusan
// @Description get lists of urusan
// @Tags Master Urusan
// @Accept json
// @Param page query int false "Halaman yang ditampilkan"
// @Param limit query int false "Jumlah data per halaman, maksimal 50 data"
// @param filter query string false "Key value pencarian ([kode_urusan,nama_urusan,tahun,daerah_khusus,jenis_pemda]). Contoh: kode_urusan.1 -> (akan menampilkan data dengan kode urusan = '1')"
// @Produce json
// @success 200 {array} models.MstUrusanModel "Success"
// @Failure 400 {object} utils.RequestError "Bad request"
// @Failure 401 {object} utils.RequestError "Unauthorized"
// @Failure 404 {object} utils.RequestError "Not found"
// @Failure 422 {array} utils.RequestError "Data validation failed"
// @Failure 500 {object} utils.RequestError "Server error"
// @Router /urusan [get]
func (h *UrusanHandler) Index(c *fiber.Ctx) error {
page, err := strconv.Atoi(c.Query("page", "1"))
if err != nil {
return err
}
log.Println("page: ", page)
var limit int
limit, err = strconv.Atoi(c.Query("limit", "20"))
if err != nil {
return err
}
log.Println("page: ", page)
//limit max 50
if limit > 50 {
limit = 50
}
resp, totalCount, pageCount, err := h.Controller.Index(page, limit, c.Query("filter", ""))
if err != nil {
return err
}
log.Printf("totalCount: %d, perPage: %d, pageCount: %d\n", totalCount, limit, pageCount)
c.Append("x-pagination-total-count", strconv.Itoa(totalCount))
c.Append("x-pagination-page-count", strconv.Itoa(pageCount))
c.Append("x-pagination-page-size", strconv.Itoa(limit))
if page > 1 {
c.Append("x-pagination-previous-page", strconv.Itoa(page-1))
}
c.Append("x-pagination-current-page", strconv.Itoa(page))
if page < pageCount {
c.Append("x-pagination-next-page", strconv.Itoa(page+1))
}
return c.JSON(resp)
}
// Index func for get detail of urusan.
//
// @Summary get detail of urusan
// @Description get detail of urusan
// @Tags Master Urusan
// @Accept json
// @Param id path int false "data yang dipilih berdasarkan id urusan"
// @Param tahun path int false "data yang dipilih berdasarkan tahun"
// @Produce json
// @success 200 {object} models.MstUrusanDetilModel "Success"
// @Failure 400 {object} utils.RequestError "Bad request"
// @Failure 401 {object} utils.RequestError "Unauthorized"
// @Failure 404 {object} utils.RequestError "Not found"
// @Failure 422 {array} utils.RequestError "Data validation failed"
// @Failure 500 {object} utils.RequestError "Server error"
// @Router /urusan/{id}/{tahun} [get]
func (h *UrusanHandler) View(c *fiber.Ctx) error {
id, err := c.ParamsInt("id", 0)
if err != nil {
return err
}
tahun, err := c.ParamsInt("tahun", 0)
if err != nil {
return err
}
resp, err := h.Controller.View(id, tahun)
if err != nil {
return err
}
return c.JSON(resp)
}
// Create func for create new urusan.
//
// @Summary create new urusan
// @Description create new urusan.
// @Tags Master Urusan
// @Accept json
// @Param payload body models.MstUrusanPayloadModel true "Payload"
// @Produce json
// @success 200 {object} bool "Create success"
// @Failure 400 {object} utils.RequestError "Bad request"
// @Failure 401 {object} utils.RequestError "Unauthorized"
// @Failure 404 {object} utils.RequestError "Not found"
// @Failure 422 {array} utils.DataValidationError "Data validation failed"
// @Failure 500 {object} utils.RequestError "Server error"
// @Security ApiKeyAuth
// @Router /urusan [post]
func (h *UrusanHandler) Create(c *fiber.Ctx) error {
// Siapkan payload
payload := new(models.MstUrusanPayloadModel)
// Baca payload dari request
err := c.BodyParser(payload)
if err != nil {
return utils.RequestError{
Code: http.StatusBadRequest,
Message: "format payload tidak valid. - " + err.Error(),
}
}
// Validate form input
err = h.Validate.Struct(payload)
if err != nil {
return err
}
// TODO: Dapatkan user ID dari JWT token atau session
// Sementara menggunakan default value 1
createdBy := 1
// Panggil fungsi Create pada UrusanController
err = h.Controller.Create(c.Context(), *payload, createdBy)
if err != nil {
return err
}
return c.JSON(fiber.Map{
"success": true,
"message": "Data urusan berhasil disimpan",
})
}
// Create func for update urusan.
//
// @Summary update urusan
// @Description update urusan.
// @Tags Master Urusan
// @Accept json
// @Param id path int false "data yang dipilih untuk diubah berdasarkan id urusan"
// @Param payload body models.MstUrusanPayloadModel true "Payload"
// @Produce json
// @success 200 {object} bool "Update success"
// @Failure 400 {object} utils.RequestError "Bad request"
// @Failure 401 {object} utils.RequestError "Unauthorized"
// @Failure 404 {object} utils.RequestError "Not found"
// @Failure 422 {array} utils.DataValidationError "Data validation failed"
// @Failure 500 {object} utils.RequestError "Server error"
// @Security ApiKeyAuth
// @Router /urusan/{id} [put]
func (h *UrusanHandler) Update(c *fiber.Ctx) error {
id, err := c.ParamsInt("id", 0)
if err != nil {
return err
}
// siapkan penampung payload dari fe
payload := new(models.MstUrusanUpdatePayloadModel)
// baca kiriman dari fe
err = c.BodyParser(payload)
if err != nil {
return err
}
// Validate form input
err = h.Validate.Struct(payload)
if err != nil {
return err
}
// TODO: Get updatedBy from JWT/Session
updatedBy := 1
err = h.Controller.Update(c.Context(), id, *payload, updatedBy)
if err != nil {
return err
}
return c.JSON(fiber.Map{
"success": true,
"message": "Data urusan berhasil diupdate",
})
}
// Create func for delete urusan.
//
// @Summary delete urusan
// @Description delete urusan.
// @Tags Master Urusan
// @Accept json
// @Param id path int false "data yang dipilih untuk dihapus berdasarkan id urusan"
// @Produce json
// @success 200 {object} bool "Delete success"
// @Failure 400 {object} utils.RequestError "Bad request"
// @Failure 401 {object} utils.RequestError "Unauthorized"
// @Failure 404 {object} utils.RequestError "Not found"
// @Failure 422 {array} utils.DataValidationError "Data validation failed"
// @Failure 500 {object} utils.RequestError "Server error"
// @Security ApiKeyAuth
// @Router /urusan/{id} [delete]
func (h *UrusanHandler) Delete(c *fiber.Ctx) error {
id, err := c.ParamsInt("id", 0)
if err != nil {
return err
}
// TODO: Get deletedBy from JWT/Session
deletedBy := 1
err = h.Controller.Delete(c.Context(), id, deletedBy)
if err != nil {
return err
}
return c.JSON(fiber.Map{
"success": true,
"message": "Data urusan berhasil dihapus",
})
}
// Create func for update urusan locked status.
//
// @Summary update urusan locked status
// @Description update urusan locked status.
// @Tags Master Urusan
// @Accept json
// @Param id path int false "data yang dipilih untuk diubah berdasarkan id urusan"
// @Param locked query bool true "status locked yang diinginkan"
// @Produce json
// @success 200 {object} bool "Update success"
// @Failure 400 {object} utils.RequestError "Bad request"
// @Failure 401 {object} utils.RequestError "Unauthorized"
// @Failure 404 {object} utils.RequestError "Not found"
// @Failure 422 {array} utils.DataValidationError "Data validation failed"
// @Failure 500 {object} utils.RequestError "Server error"
// @Security ApiKeyAuth
// @Router /urusan/{id}/lock [put]
func (h *UrusanHandler) UpdateLocked(c *fiber.Ctx) error {
id, err := c.ParamsInt("id", 0)
if err != nil {
return err
}
locked, err := strconv.ParseBool(c.Query("locked", "true"))
if err != nil {
return utils.RequestError{
Code: http.StatusBadRequest,
Message: "Parameter locked harus berupa boolean (true/false)",
}
}
// TODO: Get updatedBy from JWT/Session
updatedBy := 1
err = h.Controller.UpdateLocked(c.Context(), id, locked, updatedBy)
if err != nil {
return err
}
return c.JSON(fiber.Map{
"success": true,
"message": "Status locked urusan berhasil diupdate",
})
}
// Create func for update urusan disable status.
//
// @Summary update urusan disable status
// @Description update urusan disable status.
// @Tags Master Urusan
// @Accept json
// @Param id path int false "data yang dipilih untuk diubah berdasarkan id urusan"
// @Param disable query bool true "status disable yang diinginkan"
// @Produce json
// @success 200 {object} bool "Update success"
// @Failure 400 {object} utils.RequestError "Bad request"
// @Failure 401 {object} utils.RequestError "Unauthorized"
// @Failure 404 {object} utils.RequestError "Not found"
// @Failure 422 {array} utils.DataValidationError "Data validation failed"
// @Failure 500 {object} utils.RequestError "Server error"
// @Security ApiKeyAuth
// @Router /urusan/{id}/disable [put]
func (h *UrusanHandler) UpdateDisable(c *fiber.Ctx) error {
id, err := c.ParamsInt("id", 0)
if err != nil {
return err
}
disable, err := strconv.ParseBool(c.Query("disable", "true"))
if err != nil {
return utils.RequestError{
Code: http.StatusBadRequest,
Message: "Parameter disable harus berupa boolean (true/false)",
}
}
// TODO: Get updatedBy from JWT/Session
updatedBy := 1
err = h.Controller.UpdateDisable(c.Context(), id, disable, updatedBy)
if err != nil {
return err
}
return c.JSON(fiber.Map{
"success": true,
"message": "Status disable urusan berhasil diupdate",
})
}
// // Create func for create new daerah.
// //
// // @Summary create new daerah
// // @Description create new daerah.
// // @Tags Ref Daerah
// // @Accept json
// // @Param payload body models.RefDaerahModelPayload true "Payload"
// // @Produce json
// // @success 200 {object} bool "Create success"
// // @Failure 400 {object} utils.RequestError "Bad request"
// // @Failure 401 {object} utils.RequestError "Unauthorized"
// // @Failure 404 {object} utils.RequestError "Not found"
// // @Failure 422 {array} utils.DataValidationError "Data validation failed"
// // @Failure 500 {object} utils.RequestError "Server error"
// // @Security ApiKeyAuth
// // @Router /daerah [post]
// func (h *DaerahHandler) Create(c *fiber.Ctx) error {
// // siapkan penampung payload dari fe
// payloadl := new(models.RefDaerahModelPayload)
// // baca kiriman dari fe
// err := c.BodyParser(payloadl)
// if err != nil {
// return err
// }
// // Validate form input
// err = h.Validate.Struct(payloadl)
// if err != nil {
// return err
// }
// err = h.Controller.Create(*payloadl)
// if err != nil {
// return err
// }
// return c.JSON("true")
// }
// // Create func for update daerah.
// //
// // @Summary update daerah
// // @Description update daerah.
// // @Tags Ref Daerah
// // @Accept json
// // @Param id path int false "data yang dipilih untuk diubah berdasarkan id daerah"
// // @Param payload body models.RefDaerahModelPayload true "Payload"
// // @Produce json
// // @success 200 {object} bool "Update success"
// // @Failure 400 {object} utils.RequestError "Bad request"
// // @Failure 401 {object} utils.RequestError "Unauthorized"
// // @Failure 404 {object} utils.RequestError "Not found"
// // @Failure 422 {array} utils.DataValidationError "Data validation failed"
// // @Failure 500 {object} utils.RequestError "Server error"
// // @Security ApiKeyAuth
// // @Router /daerah/{id} [put]
// func (h *DaerahHandler) Update(c *fiber.Ctx) error {
// id, err := c.ParamsInt("id", 0)
// if err != nil {
// return err
// }
// // siapkan penampung payload dari fe
// payloadl := new(models.RefDaerahModelPayload)
// // baca kiriman dari fe
// err = c.BodyParser(payloadl)
// if err != nil {
// return err
// }
// // Validate form input
// err = h.Validate.Struct(payloadl)
// if err != nil {
// return err
// }
// err = h.Controller.Update(id, *payloadl)
// if err != nil {
// return err
// }
// return c.JSON("true")
// }
// // Create func for delete daerah.
// //
// // @Summary delete daerah
// // @Description delete daerah.
// // @Tags Ref Daerah
// // @Accept json
// // @Param id path int false "data yang dipilih untuk dihapus berdasarkan id daerah"
// // @Produce json
// // @success 200 {object} bool "Delete success"
// // @Failure 400 {object} utils.RequestError "Bad request"
// // @Failure 401 {object} utils.RequestError "Unauthorized"
// // @Failure 404 {object} utils.RequestError "Not found"
// // @Failure 422 {array} utils.DataValidationError "Data validation failed"
// // @Failure 500 {object} utils.RequestError "Server error"
// // @Security ApiKeyAuth
// // @Router /daerah/{id} [delete]
// func (h *DaerahHandler) Delete(c *fiber.Ctx) error {
// id, err := c.ParamsInt("id", 0)
// if err != nil {
// return err
// }
// err = h.Controller.Delete(id)
// if err != nil {
// return err
// }
// return c.JSON("true")
// }