250 lines
6.7 KiB
Go
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)
|
|
}
|