2024-03-29 14:37:22 +01:00
|
|
|
package users
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
db "ttime/internal/database"
|
|
|
|
"ttime/internal/types"
|
|
|
|
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
"github.com/gofiber/fiber/v2/log"
|
|
|
|
"github.com/golang-jwt/jwt/v5"
|
|
|
|
)
|
|
|
|
|
2024-03-29 18:42:12 +01:00
|
|
|
// @Summary Login
|
|
|
|
// @Description Logs in a user and returns a JWT token
|
|
|
|
// @Tags Auth
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param body body types.NewUser true "User credentials"
|
|
|
|
// @Success 200 {object} types.Token "JWT token"
|
|
|
|
// @Failure 400 {string} string "Bad request"
|
|
|
|
// @Failure 401 {string} string "Unauthorized"
|
|
|
|
// @Failure 500 {string} string "Internal server error"
|
|
|
|
// @Router /login [post]
|
|
|
|
//
|
|
|
|
// Login logs in a user and returns a JWT token
|
2024-03-29 14:37:22 +01:00
|
|
|
func Login(c *fiber.Ctx) error {
|
|
|
|
// The body type is identical to a NewUser
|
|
|
|
|
|
|
|
u := new(types.NewUser)
|
|
|
|
if err := c.BodyParser(u); err != nil {
|
|
|
|
log.Warn("Error parsing body")
|
|
|
|
return c.Status(400).SendString(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Info("Username logging in:", u.Username)
|
|
|
|
if !db.GetDb(c).CheckUser(u.Username, u.Password) {
|
|
|
|
log.Info("User not found")
|
|
|
|
return c.SendStatus(fiber.StatusUnauthorized)
|
|
|
|
}
|
|
|
|
|
|
|
|
isAdmin, err := db.GetDb(c).IsSiteAdmin(u.Username)
|
|
|
|
if err != nil {
|
|
|
|
log.Info("Error checking admin status:", err)
|
|
|
|
return c.Status(500).SendString(err.Error())
|
|
|
|
}
|
|
|
|
// Create the Claims
|
|
|
|
claims := jwt.MapClaims{
|
|
|
|
"name": u.Username,
|
|
|
|
"admin": isAdmin,
|
|
|
|
"exp": time.Now().Add(time.Hour * 72).Unix(),
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create token
|
|
|
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|
|
|
log.Info("Token created for user:", u.Username)
|
|
|
|
|
|
|
|
// Generate encoded token and send it as response.
|
|
|
|
t, err := token.SignedString([]byte("secret"))
|
|
|
|
if err != nil {
|
|
|
|
log.Warn("Error signing token")
|
|
|
|
return c.SendStatus(fiber.StatusInternalServerError)
|
|
|
|
}
|
|
|
|
|
|
|
|
println("Successfully signed token for user:", u.Username)
|
|
|
|
return c.JSON(types.Token{Token: t})
|
|
|
|
}
|