57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package middleware
|
|
|
|
import (
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/google/uuid"
|
|
"gorm.io/gorm"
|
|
"web-qudo-be/app/middleware"
|
|
)
|
|
|
|
// AddClientFilter adds client_id filter to GORM query
|
|
func AddClientFilter(db *gorm.DB, c *fiber.Ctx) *gorm.DB {
|
|
if c == nil {
|
|
return db
|
|
}
|
|
clientID := middleware.GetClientID(c)
|
|
if clientID != nil {
|
|
return db.Where("client_id = ?", clientID)
|
|
}
|
|
return db
|
|
}
|
|
|
|
// SetClientID sets client_id in the given struct if it has a ClientId field
|
|
func SetClientID(c *fiber.Ctx, model interface{}) {
|
|
if c == nil {
|
|
return
|
|
}
|
|
clientID := middleware.GetClientID(c)
|
|
if clientID != nil {
|
|
// Use reflection to set ClientId field if it exists
|
|
if setter, ok := model.(interface{ SetClientID(*uuid.UUID) }); ok {
|
|
setter.SetClientID(clientID)
|
|
}
|
|
}
|
|
}
|
|
|
|
// ValidateClientAccess validates if the current client has access to the resource
|
|
func ValidateClientAccess(db *gorm.DB, c *fiber.Ctx, tableName string, resourceID interface{}) error {
|
|
if c == nil {
|
|
return nil // Skip validation for background jobs
|
|
}
|
|
clientID := middleware.GetClientID(c)
|
|
if clientID == nil {
|
|
return fiber.NewError(fiber.StatusUnauthorized, "Client not authenticated")
|
|
}
|
|
|
|
var count int64
|
|
if err := db.Table(tableName).Where("id = ? AND client_id = ?", resourceID, clientID).Count(&count).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
if count == 0 {
|
|
return fiber.NewError(fiber.StatusForbidden, "Access denied to this resource")
|
|
}
|
|
|
|
return nil
|
|
}
|