package http import ( "kemendagri/sipd/services/sipd_auth/controller" "kemendagri/sipd/services/sipd_auth/handler/http/http_util" "kemendagri/sipd/services/sipd_auth/model/form" "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" ) type AuthHandler struct { Controller *controller.AuthController Validate *validator.Validate } func NewAuthHandler(app *fiber.App, controller *controller.AuthController, vld *validator.Validate) { handler := &AuthHandler{ Controller: controller, Validate: vld, } // public route rPub := app.Group("/auth") rPub.Post("/pre-login", handler.PreLogin) rPub.Post("/login", handler.Login) rPub.Post("/register", handler.Register) rPub.Post("/token-refresh/:token", handler.TokenRefresh) rPub.Post("/amankan-kata-sandi", handler.AmankanKataSandi) // strict route // rStrict := r.Group("auth") } // PreLogin func for login. // // @Summary user login // @Description Login to get JWT token and refresh token. // @ID auth-pre-login // @Tags Auth // @Accept json // @Param payload body form.PreLoginForm true "Pre login payload" // @Produce json // @Success 200 {array} models.PreLoginModel "Success" // @Failure 400 {object} utils.RequestError "Bad request" // @Failure 403 {object} utils.LoginError "Login forbidden" // @Failure 404 {object} utils.RequestError "Data not found" // @Failure 422 {array} utils.RequestError "Data validation failed" // @Failure 500 {object} utils.RequestError "Server error" // @Router /auth/pre-login [post] func (ah *AuthHandler) PreLogin(c *fiber.Ctx) error { formModel := new(form.PreLoginForm) if err := c.BodyParser(formModel); err != nil { return err } r, err := ah.Controller.PreLogin(*formModel) if err != nil { return err } return c.JSON(r) } // Login func for login. // // @Summary user login // @Description Login to get JWT token and refresh token. // @ID auth-login // @Tags Auth // @Accept json // @Param payload body form.LoginForm true "Login payload" // @Produce json // @Success 200 {object} http_util.JSONResultLogin "Login Success, jwt provided" // @Failure 400 {object} utils.RequestError "Bad request" // @Failure 403 {object} utils.LoginError "Login forbidden" // @Failure 404 {object} utils.RequestError "Data not found" // @Failure 422 {array} utils.RequestError "Data validation failed" // @Failure 500 {object} utils.RequestError "Server error" // @Router /auth/login [post] func (ah *AuthHandler) Login(c *fiber.Ctx) error { formModel := new(form.LoginForm) if err := c.BodyParser(formModel); err != nil { return err } token, refreshToken, isDefaultPassword, err := ah.Controller.Login(*formModel) if err != nil { return err } return c.JSON( http_util.JSONResultLogin{Token: token, RefreshToken: refreshToken, IsDefaultPassword: isDefaultPassword}, ) } // Register func for register. // // @Summary user register // @Description Register user. // @ID auth-register // @Tags Auth // @Accept json // @Param payload body form.SignupForm true "Register payload" // @Produce json // @Success 200 {object} bool "Register 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" // @Router /auth/register [post] func (ah *AuthHandler) Register(c *fiber.Ctx) error { formModel := new(form.SignupForm) if err := c.BodyParser(formModel); err != nil { return err } resp, err := ah.Controller.Register(formModel) if err != nil { return err } return c.JSON(resp) } // TokenRefresh godoc // // @Summary Refresh Token // @Description Refresh token to get new valid JWT token and refresh token // @ID auth-refresh-token // @Tags Auth // @Produce json // @Param payload body form.RefreshTokenForm true "Payload" // @Success 200 {object} models.ResponseLogin "Refresh Token Success, new JWT token provided" // @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" // @Router /auth/token-refresh/{token} [post] func (ah *AuthHandler) TokenRefresh(c *fiber.Ctx) error { pl := form.RefreshTokenForm{} if err := c.BodyParser(&pl); err != nil { return err } r, err := ah.Controller.RefreshToken(pl) if err != nil { return err } return c.JSON(r) } // AmankanKataSandi User func for change password. // // @Summary Amankan Kata Sandi // @Description User melakukan Amankan Kata Sandi. // @ID auth-amankan-kata-sandi // @Tags Auth // @Param payload body form.ChangePasswordFormPublik 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" // @Router /auth/amankan-kata-sandi [post] func (ah *AuthHandler) AmankanKataSandi(c *fiber.Ctx) error { formModel := new(form.ChangePasswordFormPublik) if err := c.BodyParser(formModel); err != nil { return err } // Validate form input err := ah.Validate.Struct(formModel) if err != nil { return err } err = ah.Controller.AmankanKataSandi(*formModel) if err != nil { return err } return c.JSON(true) }