package province import ( "cargo-erp-backend/internal/handlers/dto" "cargo-erp-backend/internal/usecases" "cargo-erp-backend/pkg/helpers" "cargo-erp-backend/pkg/response" "net/http" "strconv" "github.com/gin-gonic/gin" ) type ProvinceHandlerInterface interface { Router() } type ProvinceHandler struct { Helper helpers.HelperInterface Group *gin.RouterGroup } func NewProvinceHandler(helper helpers.HelperInterface, g *gin.RouterGroup) ProvinceHandlerInterface { return &ProvinceHandler{Helper: helper, Group: g} } func (h *ProvinceHandler) Router() { r := h.Group.Group("provinces") { r.GET("/", h.GetAll) r.POST("/list", h.GetList) r.GET("/:id", h.GetByID) r.POST("/", h.Create) r.PUT("/:id", h.Update) r.DELETE("/:id", h.Delete) } } func (h *ProvinceHandler) GetAll(c *gin.Context) { userid, err := h.Helper.GetAuthInfo(c.GetString("auth")) if err != nil { response.Error(c, http.StatusUnauthorized, err.Error()) return } page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10")) if page < 1 { page = 1 } if limit < 1 { limit = 10 } u := usecases.NewProvinceUsecase(h.Helper, *userid) provinces, total, err := u.GetAll(page, limit) if err != nil { response.Error(c, http.StatusInternalServerError, err.Error()) return } response.PaginatedResponse(c, provinces, int(total), page, limit) } func (h *ProvinceHandler) GetList(c *gin.Context) { userid, err := h.Helper.GetAuthInfo(c.GetString("auth")) if err != nil { response.Error(c, http.StatusUnauthorized, err.Error()) return } var req dto.DataTableRequest // 1. Bind JSON request otomatis ke struct if err := c.ShouldBindJSON(&req); err != nil { response.Error(c, http.StatusBadRequest, "Request Format request invalid") return } u := usecases.NewProvinceUsecase(h.Helper, *userid) res, err := u.GetList(req) if err != nil { response.Error(c, http.StatusInternalServerError, err.Error()) return } response.Success(c, res) return } func (h *ProvinceHandler) GetByID(c *gin.Context) { userid, err := h.Helper.GetAuthInfo(c.GetString("auth")) if err != nil { response.Error(c, http.StatusUnauthorized, err.Error()) return } id := c.Param("id") u := usecases.NewProvinceUsecase(h.Helper, *userid) province, err := u.GetByID(id) if err != nil { response.Error(c, http.StatusNotFound, "province not found") return } response.Success(c, province) } func (h *ProvinceHandler) Create(c *gin.Context) { var req dto.CreateProvinceRequest if err := c.BindJSON(&req); err != nil { response.Error(c, http.StatusBadRequest, err.Error()) return } userid, err := h.Helper.GetAuthInfo(c.GetString("auth")) if err != nil { response.Error(c, http.StatusUnauthorized, err.Error()) return } var merchantid *string = nil if userid.UsersRole_Relation.RoleKey != "SPM" { merchantid = userid.MerchantID } createdBy := userid.ID u := usecases.NewProvinceUsecase(h.Helper, *userid) province, err := u.Create(req.Name, createdBy, merchantid) if err != nil { response.Error(c, http.StatusInternalServerError, err.Error()) return } var responseDTO dto.CreateProvinceResponse h.Helper.MapStructToStruct(province, "json", &responseDTO, "json") response.Created(c, responseDTO) } func (h *ProvinceHandler) Update(c *gin.Context) { id := c.Param("id") var req dto.UpdateProvinceRequest if err := c.BindJSON(&req); err != nil { response.Error(c, http.StatusBadRequest, err.Error()) return } userid, err := h.Helper.GetAuthInfo(c.GetString("auth")) if err != nil { response.Error(c, http.StatusUnauthorized, err.Error()) return } updatedBy := userid.ID u := usecases.NewProvinceUsecase(h.Helper, *userid) province, err := u.Update(id, req.Name, updatedBy) if err != nil { response.Error(c, http.StatusInternalServerError, err.Error()) return } response.Success(c, province) } func (h *ProvinceHandler) Delete(c *gin.Context) { userid, err := h.Helper.GetAuthInfo(c.GetString("auth")) if err != nil { response.Error(c, http.StatusUnauthorized, err.Error()) return } id := c.Param("id") u := usecases.NewProvinceUsecase(h.Helper, *userid) if err := u.Delete(id); err != nil { response.Error(c, http.StatusInternalServerError, err.Error()) return } response.Success(c, map[string]interface{}{"message": "province deleted"}) }