package middleware import ( "net/http" "time" "github.com/gin-gonic/gin" "aimodels-prices/database" "aimodels-prices/models" ) func AuthRequired() gin.HandlerFunc { return func(c *gin.Context) { cookie, err := c.Cookie("session") if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Not logged in"}) c.Abort() return } var session models.Session if err := database.DB.Preload("User").Where("id = ? AND expires_at > ?", cookie, time.Now()).First(&session).Error; err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid or expired session"}) c.Abort() return } c.Set("user", &session.User) c.Next() } } func AdminRequired() gin.HandlerFunc { return func(c *gin.Context) { user, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, gin.H{"error": "Not logged in"}) c.Abort() return } if u, ok := user.(*models.User); !ok || u.Role != "admin" { c.JSON(http.StatusForbidden, gin.H{"error": "Admin access required"}) c.Abort() return } c.Next() } } func RequireAuth() gin.HandlerFunc { return func(c *gin.Context) { _, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, gin.H{"error": "Authentication required"}) c.Abort() return } c.Next() } } func RequireAdmin() gin.HandlerFunc { return func(c *gin.Context) { user, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, gin.H{"error": "Authentication required"}) c.Abort() return } if u, ok := user.(*models.User); !ok || u.Role != "admin" { c.JSON(http.StatusForbidden, gin.H{"error": "Admin access required"}) c.Abort() return } c.Next() } }