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") // }