115 lines
3.1 KiB
Go
115 lines
3.1 KiB
Go
package handlers
|
|
|
|
import (
|
|
"kontor-api-echo/internal/config"
|
|
"kontor-api-echo/internal/globals"
|
|
"kontor-api-echo/internal/helpers"
|
|
"kontor-api-echo/internal/models"
|
|
"kontor-api-echo/internal/repository"
|
|
"kontor-api-echo/internal/service"
|
|
"net/http"
|
|
|
|
"github.com/labstack/echo/v5"
|
|
"github.com/uptrace/bun"
|
|
)
|
|
|
|
type AuthHandler struct {
|
|
Service *service.AuthService
|
|
Secret []byte
|
|
}
|
|
|
|
func NewAuthHandler(db *bun.DB) *AuthHandler {
|
|
handler := &AuthHandler{Service: service.NewAuthService(repository.NewProfileRepository(db)), Secret: config.ServerConfig.ApiSecret}
|
|
return handler
|
|
}
|
|
|
|
func (handler *AuthHandler) Login(c *echo.Context) error {
|
|
var input models.LoginInput
|
|
|
|
if err := c.Bind(&input); err != nil {
|
|
return c.JSON(http.StatusBadRequest, map[string]any{"error": err.Error()})
|
|
}
|
|
|
|
profile_id, err := handler.Service.LoginCheck(input.Email, input.Password)
|
|
|
|
if err != nil {
|
|
return c.JSON(http.StatusBadRequest, map[string]any{"error": "username or password is incorrect."})
|
|
}
|
|
|
|
token, err := helpers.GenerateToken(profile_id)
|
|
logger := c.Logger()
|
|
if err != nil {
|
|
logger.Info("Login", "GenerateToken error", err.Error())
|
|
}
|
|
return c.JSON(http.StatusOK, map[string]any{"token": token})
|
|
}
|
|
|
|
func (handler *AuthHandler) LoginPage(c *echo.Context) error {
|
|
cookie, _ := c.Cookie(globals.UserKey)
|
|
user := cookie.Value
|
|
logger := c.Logger()
|
|
logger.Info("LoginPage", globals.UserKey, user)
|
|
data := globals.GetDefaultValues(user, "Please logout first")
|
|
if user != "" {
|
|
return c.Render(http.StatusBadRequest, "login", data)
|
|
}
|
|
data["message"] = ""
|
|
return c.Render(http.StatusOK, "login", data)
|
|
}
|
|
|
|
func (handler *AuthHandler) LoginPost(c *echo.Context) error {
|
|
cookie, _ := c.Cookie(globals.UserKey)
|
|
user := cookie.Value
|
|
logger := c.Logger()
|
|
logger.Info("LoginPost", "user", user)
|
|
data := globals.GetDefaultValues(user, "Please logout first")
|
|
if user != "" {
|
|
return c.Render(http.StatusBadRequest, "login", data)
|
|
}
|
|
|
|
username := c.FormValue("username")
|
|
password := c.FormValue("password")
|
|
|
|
if helpers.EmptyUserPass(username, password) {
|
|
data["message"] = "Parameters can't be empty"
|
|
c.Render(http.StatusBadRequest, "login", data)
|
|
}
|
|
|
|
profile_id, err := handler.Service.LoginCheck(username, password)
|
|
if err != nil {
|
|
data["message"] = "Incorrect username or password"
|
|
c.Render(http.StatusUnauthorized, "login", data)
|
|
}
|
|
c.SetCookie(&http.Cookie{
|
|
Name: globals.UserKey,
|
|
Value: profile_id,
|
|
MaxAge: 3600,
|
|
Path: "/",
|
|
Domain: "",
|
|
HttpOnly: true,
|
|
})
|
|
logger.Info("LoginPost: redirect to index")
|
|
return c.Redirect(http.StatusMovedPermanently, "/")
|
|
}
|
|
|
|
func (handler *AuthHandler) LogoutPage(c *echo.Context) error {
|
|
cookie, _ := c.Cookie(globals.UserKey)
|
|
user := cookie.Value
|
|
logger := c.Logger()
|
|
logger.Info("LogoutPage", globals.UserKey, user)
|
|
if user == "" {
|
|
logger.Info("Invalid session token")
|
|
return c.Redirect(http.StatusMovedPermanently, "/")
|
|
}
|
|
c.SetCookie(&http.Cookie{
|
|
Name: globals.UserKey,
|
|
Value: "",
|
|
MaxAge: -1, // Deletes the cookie immediately
|
|
Path: "/",
|
|
Domain: "",
|
|
HttpOnly: true,
|
|
})
|
|
logger.Info("LogoutPage: redirect to index page")
|
|
return c.Redirect(http.StatusMovedPermanently, "/")
|
|
}
|