package http import ( "fmt" "kemendagri/sipd/services/sipd_auth/controller" "kemendagri/sipd/services/sipd_auth/model/form" "log" "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" "github.com/golang-jwt/jwt/v4" ) type UserHandler struct { Controller *controller.UserController Validate *validator.Validate } func NewUserHandler( r fiber.Router, validator *validator.Validate, controller *controller.UserController, ) { handler := &UserHandler{ Controller: controller, Validate: validator, } // strict route rStrict := r.Group("user") rStrict.Get("/logout", handler.Logout) rStrict.Post("/generate-password-hash", handler.GeneratePasswordHash) rStrict.Post("/change-password", handler.ChangePassword) rStrict.Get("/profile", handler.Profile) rStrict.Put("/update-profile", handler.UpdateProfile) rStrict.Post("/upload-avatar", handler.UploadAvatar) } // Logout User func for logout. // // @Summary logout // @Description user logout. // @ID user-logout // @Tags User // @Produce json // @success 200 {object} bool "Success" // @Failure 400 {object} utils.RequestError "Bad request" // @Failure 403 {object} utils.RequestError "Forbidden" // @Failure 404 {object} utils.RequestError "Data not found" // @Failure 422 {array} utils.RequestError "Data validation failed" // @Failure 500 {object} utils.RequestError "Server error" // @Security ApiKeyAuth // @Router /strict/user/logout [get] func (h *UserHandler) Logout(c *fiber.Ctx) error { log.Println("xxxxx") user := c.Locals("jwt").(*jwt.Token) claims := user.Claims.(jwt.MapClaims) err := h.Controller.Logout( fmt.Sprintf("%v", claims["id_pegawai"]), ) if err != nil { return err } log.Println("sddsdsfs") return c.JSON(true) } // GeneratePasswordHash User func for generate password hash. // // @Summary generate password hash // @Description generate password hash. // @ID user-generate-password-hash // @Tags User // @Param payload body form.GenerateHashForm true "Payload" // @Produce json // @success 200 {object} bool "Success" // @Failure 400 {object} utils.RequestError "Bad request" // @Failure 403 {object} utils.RequestError "Forbidden" // @Failure 404 {object} utils.RequestError "Data not found" // @Failure 422 {array} utils.RequestError "Data validation failed" // @Failure 500 {object} utils.RequestError "Server error" // @Security ApiKeyAuth // @Router /strict/user/generate-password-hash [post] func (h *UserHandler) GeneratePasswordHash(c *fiber.Ctx) error { formModel := new(form.GenerateHashForm) if err := c.BodyParser(formModel); err != nil { return err } // Validate form input err := h.Validate.Struct(formModel) if err != nil { return err } user := c.Locals("jwt").(*jwt.Token) claims := user.Claims.(jwt.MapClaims) err = h.Controller.GeneratePasswordHash( int64(claims["id_user"].(float64)), int64(claims["id_daerah"].(float64)), formModel.Password, ) if err != nil { return err } return c.JSON(true) } // ChangePassword User func for change password. // // @Summary change password // @Description change password. // @ID user-change-password // @Tags User // @Param payload body form.ChangePasswordForm true "Payload" // @Produce json // @success 200 {object} bool "Success" // @Failure 400 {object} utils.RequestError "Bad request" // @Failure 403 {object} utils.RequestError "Forbidden" // @Failure 404 {object} utils.RequestError "Data not found" // @Failure 422 {array} utils.RequestError "Data validation failed" // @Failure 500 {object} utils.RequestError "Server error" // @Security ApiKeyAuth // @Router /strict/user/change-password [post] func (h *UserHandler) ChangePassword(c *fiber.Ctx) error { formModel := new(form.ChangePasswordForm) if err := c.BodyParser(formModel); err != nil { return err } // Validate form input err := h.Validate.Struct(formModel) if err != nil { return err } user := c.Locals("jwt").(*jwt.Token) claims := user.Claims.(jwt.MapClaims) err = h.Controller.ChangePassword( int64(claims["id_user"].(float64)), int64(claims["id_daerah"].(float64)), *formModel, ) if err != nil { return err } return c.JSON(true) } // Profile func for get profile info. // // @Summary user get profile info // @Description get profile info. // @ID user-profile // @Tags User // @Produce json // @success 200 {object} models.UserDetail "Success" // @Failure 400 {object} utils.RequestError "Bad request" // @Failure 404 {object} utils.RequestError "Data not found" // @Failure 422 {array} utils.RequestError "Data validation failed" // @Failure 500 {object} utils.RequestError "Server error" // @Security ApiKeyAuth // @Router /strict/user/profile [get] func (h *UserHandler) Profile(c *fiber.Ctx) error { userModel, err := h.Controller.Profile(c.Locals("jwt").(*jwt.Token)) if err != nil { return err } return c.JSON(userModel) } // UpdateProfile func for update profile. // // @Summary update profile // @Description update profile. // @Tags User // @Param payload body form.UpdateUserProfileForm true "Payload" // @Produce json // @success 200 {object} bool "Success" // @Failure 400 {object} utils.RequestError "Bad request" // @Failure 404 {object} utils.RequestError "Data not found" // @Failure 422 {array} utils.RequestError "Data validation failed" // @Failure 500 {object} utils.RequestError "Server error" // @Security ApiKeyAuth // @Router /strict/user/update-profile [put] func (h *UserHandler) UpdateProfile(c *fiber.Ctx) error { payload := new(form.UpdateUserProfileForm) if err := c.BodyParser(payload); err != nil { return err } //log.Println(payload) // Validate form input err := h.Validate.Struct(payload) if err != nil { return err } err = h.Controller.UpdateProfile(c.Locals("jwt").(*jwt.Token), *payload) if err != nil { return err } return c.JSON(true) } // UploadAvatar User func for upload avatar. // // @Summary upload avatar // @Description upload avatar // @ID user-upload avatar // @Tags User // @Accept x-www-form-urlencoded // @Produce json // @Param file formData file true "Image avatar" // @success 200 {object} bool "Success" // @Failure 400 {object} utils.RequestError "Bad request" // @Failure 403 {object} utils.RequestError "Forbidden" // @Failure 404 {object} utils.RequestError "Data not found" // @Failure 422 {array} utils.RequestError "Data validation failed" // @Failure 500 {object} utils.RequestError "Server error" // @Security ApiKeyAuth // @Router /strict/user/upload-avatar [post] func (h *UserHandler) UploadAvatar(c *fiber.Ctx) error { file, err := c.FormFile("file") if err != nil { return err } err = h.Controller.UploadAvatar(c.Locals("jwt").(*jwt.Token), file) if err != nil { return err } return c.JSON(true) }