package handlers import ( "net/http" "github.com/gin-gonic/gin" "github.com/tradarr/backend/internal/auth" "github.com/tradarr/backend/internal/httputil" "github.com/tradarr/backend/internal/models" ) type loginRequest struct { Email string `json:"email" binding:"required,email"` Password string `json:"password" binding:"required"` } type registerRequest struct { Email string `json:"email" binding:"required,email"` Password string `json:"password" binding:"required,min=6"` } func (h *Handler) Login(c *gin.Context) { var req loginRequest if err := c.ShouldBindJSON(&req); err != nil { httputil.BadRequest(c, err) return } user, err := h.repo.GetUserByEmail(req.Email) if err != nil || user == nil || !auth.CheckPassword(user.PasswordHash, req.Password) { c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid credentials"}) return } token, err := auth.GenerateToken(user.ID, user.Email, string(user.Role), h.cfg.JWTSecret) if err != nil { httputil.InternalError(c, err) return } httputil.OK(c, gin.H{"token": token, "user": user}) } func (h *Handler) Register(c *gin.Context) { var req registerRequest if err := c.ShouldBindJSON(&req); err != nil { httputil.BadRequest(c, err) return } existing, _ := h.repo.GetUserByEmail(req.Email) if existing != nil { c.JSON(http.StatusConflict, gin.H{"error": "email already in use"}) return } hash, err := auth.HashPassword(req.Password) if err != nil { httputil.InternalError(c, err) return } user, err := h.repo.CreateUser(req.Email, hash, models.RoleUser) if err != nil { httputil.InternalError(c, err) return } token, _ := auth.GenerateToken(user.ID, user.Email, string(user.Role), h.cfg.JWTSecret) httputil.Created(c, gin.H{"token": token, "user": user}) }