mirror of
https://github.com/warmbly/warmbly.git
synced 2026-08-19 00:01:14 +00:00
79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package middleware
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/google/uuid"
|
|
"github.com/warmbly/warmbly/internal/errx"
|
|
"github.com/warmbly/warmbly/internal/models"
|
|
)
|
|
|
|
const (
|
|
UserIDKey = "user_id"
|
|
AccessTokenKey = "access_token"
|
|
SessionKey = "session"
|
|
OrganizationIDKey = "organization_id"
|
|
)
|
|
|
|
func (h *Handler) AuthMiddleware() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
authHeader := c.GetHeader("Authorization")
|
|
if !strings.HasPrefix(authHeader, "Bearer ") {
|
|
errx.Handle(c, errx.ErrAuth)
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
token := strings.TrimPrefix(authHeader, "Bearer ")
|
|
|
|
session, err := h.TokenService.ValidateAccessToken(c.Request.Context(), token)
|
|
if err != nil {
|
|
errx.Handle(c, err)
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
c.Set(UserIDKey, session.UserID.String())
|
|
c.Set(SessionKey, session)
|
|
c.Set(AccessTokenKey, token)
|
|
|
|
// Set organization context if available
|
|
if session.CurrentOrganizationID != nil {
|
|
c.Set(OrganizationIDKey, *session.CurrentOrganizationID)
|
|
}
|
|
|
|
c.Next()
|
|
}
|
|
}
|
|
|
|
func GetUserID(c *gin.Context) string {
|
|
return c.GetString(UserIDKey)
|
|
}
|
|
|
|
func GetUserUUID(c *gin.Context) (uuid.UUID, error) {
|
|
return uuid.Parse(c.GetString(UserIDKey))
|
|
}
|
|
|
|
func GetAccessToken(c *gin.Context) string {
|
|
return c.GetString(AccessTokenKey)
|
|
}
|
|
|
|
func GetSession(c *gin.Context) *models.Session {
|
|
if session, exists := c.Get(SessionKey); exists {
|
|
if s, ok := session.(*models.Session); ok {
|
|
return s
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func GetOrganizationID(c *gin.Context) *uuid.UUID {
|
|
if orgID, exists := c.Get(OrganizationIDKey); exists {
|
|
if id, ok := orgID.(uuid.UUID); ok {
|
|
return &id
|
|
}
|
|
}
|
|
return nil
|
|
}
|