testfb/.history/handlers/handlers_20240925160124.go
2024-09-25 16:06:22 +08:00

103 lines
2.7 KiB
Go

package handlers
import (
"time"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/storage/redis/v3"
"github.com/golang-jwt/jwt/v4"
"gorm.io/gorm"
"testfb/models"
)
func Login(db *gorm.DB, redisClient *redis.Storage) fiber.Handler {
return func(c *fiber.Ctx) error {
var input struct {
Username string `json:"username"`
Password string `json:"password"`
}
if err := c.BodyParser(&input); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid input"})
}
var user models.User
if err := db.Where("username = ?", input.Username).First(&user).Error; err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "Invalid credentials"})
}
if err := user.ComparePassword(input.Password); err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "Invalid credentials"})
}
token := jwt.New(jwt.SigningMethodHS256)
claims := token.Claims.(jwt.MapClaims)
claims["user_id"] = user.ID
claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
t, err := token.SignedString([]byte("your-secret-key"))
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Could not login"})
}
err = redisClient.Set(t, user.ID, 24*time.Hour)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Could not store token"})
}
return c.JSON(fiber.Map{"token": t})
}
}
func GetCurrentUser(db *gorm.DB) fiber.Handler {
return func(c *fiber.Ctx) error {
userID := c.Locals("user_id").(uint)
var user models.User
if err := db.First(&user, userID).Error; err != nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
}
return c.JSON(user)
}
}
func UpdateCurrentUser(db *gorm.DB) fiber.Handler {
return func(c *fiber.Ctx) error {
userID := c.Locals("user_id").(uint)
var input models.User
if err := c.BodyParser(&input); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid input"})
}
var user models.User
if err := db.First(&user, userID).Error; err != nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
}
user.Email = input.Email
user.Phone = input.Phone
if err := db.Save(&user).Error; err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Could not update user"})
}
return c.JSON(user)
}
}
func GetUserByID(db *gorm.DB) fiber.Handler {
return func(c *fiber.Ctx) error {
id := c.Params("id")
var user models.User
if err := db.First(&user, id).Error; err != nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
}
return c.JSON(user)
}
}