package handler import ( "BE-MiniERP/database" "BE-MiniERP/modules/auth/models" "BE-MiniERP/modules/auth/repository" "BE-MiniERP/modules/auth/service" "github.com/gofiber/fiber/v2" ) type AuthHandler struct { Repo *repository.UserRepository } func NewAuthHandler() *AuthHandler { return &AuthHandler{ Repo: repository.NewUserRepository(database.DB), } } func (h *AuthHandler) Register(c *fiber.Ctx) error { var input struct { Username string `json:"username"` Password string `json:"password"` Role string `json:"role"` } if err := c.BodyParser(&input); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid input"}) } hash, err := service.HashPassword(input.Password) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "failed to hash password"}) } user := &models.User{ Username: input.Username, PasswordHash: hash, Role: input.Role, } if err := h.Repo.Create(user); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "failed to create user"}) } return c.JSON(fiber.Map{"message": "user registered"}) } func (h *AuthHandler) Login(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"}) } user, err := h.Repo.FindByUsername(input.Username) if err != nil || !service.CheckPasswordHash(input.Password, user.PasswordHash) { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "invalid credentials"}) } token, err := service.GenerateJWT(user.ID, user.Role) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "failed to generate token"}) } return c.JSON(fiber.Map{"token": token, "role": user.Role}) }