66 lines
1.8 KiB
Go
66 lines
1.8 KiB
Go
![]() |
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"
|
||
|
)
|
||
|
|
||
|
// Login is a simple login handler that returns a JWT token
|
||
|
// @Summary login
|
||
|
// @Description logs the user in and returns a jwt token
|
||
|
// @Tags User
|
||
|
// @Accept json
|
||
|
// @Param NewUser body types.NewUser true "login info"
|
||
|
// @Produce plain
|
||
|
// @Success 200 Token types.Token "Successfully signed token for user"
|
||
|
// @Failure 400 {string} string "Bad request"
|
||
|
// @Failure 401 {string} string "Unauthorized"
|
||
|
// @Failure 500 {string} string "Internal server error"
|
||
|
// @Router /login [post]
|
||
|
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})
|
||
|
}
|