package handlers import ( "strconv" "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 { 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"}) } // Convert user.ID to string before storing in Redis userIDStr := strconv.FormatUint(uint64(user.ID), 10) err = redisClient.Set(t, []byte(userIDStr), 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) } }