func (a *App) register(c *fiber.Ctx) error { type RegisterInput struct { Username string `json:"username"` Password string `json:"password"` Email string `json:"email"` } var input RegisterInput if err := c.BodyParser(&input); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"status": "error", "message": "Error on register request", "data": err}) } var count int err := a.db.QueryRow("SELECT COUNT(*) FROM users WHERE username = ?", input.Username).Scan(&count) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"status": "error", "message": "Database error", "data": err}) } if count > 0 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"status": "error", "message": "Username already exists", "data": nil}) } hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(input.Password), bcrypt.DefaultCost) _, err = a.db.Exec("INSERT INTO users (username, password, email) VALUES (?, ?, ?)", input.Username, hashedPassword, input.Email) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"status": "error", "message": "Database error", "data": err}) } return c.JSON(fiber.Map{"status": "success", "message": "Registration successful", "data": nil}) }
func (a *App) login(c *fiber.Ctx) error { type LoginInput struct { Username string `json:"username"` Password string `json:"password"` } var input LoginInput if err := c.BodyParser(&input); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"status": "error", "message": "Error on login request", "data": err}) } var hashed_correct_password string err := a.db.QueryRow("SELECT password FROM users WHERE username = ?", input.Username).Scan(&hashed_correct_password) if err != nil { if err == sql.ErrNoRows { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"status": "error", "message": "User not found", "data": nil}) } return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"status": "error", "message": "Database error", "data": err}) } err = bcrypt.CompareHashAndPassword([]byte(hashed_correct_password), []byte(input.Password)) if err != nil { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"status": "error", "message": "Invalid password", "data": nil}) } claims := jwt.MapClaims{ "username": input.Username, "exp": time.Now().Add(time.Hour * 72).Unix(), }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
t, err := token.SignedString(jwtSecret) if err != nil { return c.SendStatus(fiber.StatusInternalServerError) }
return c.JSON(fiber.Map{"status": "success", "message": "Success login", "data": t}) }
|