sipd-auth/handler/http/user.go
2025-09-16 08:32:11 +07:00

250 lines
6.7 KiB
Go

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