mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2026-01-07 04:14:26 +00:00
Added cursor filters and hooks
This commit is contained in:
197
pkg/restheadspec/hooks_example.go
Normal file
197
pkg/restheadspec/hooks_example.go
Normal file
@@ -0,0 +1,197 @@
|
||||
package restheadspec
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/Warky-Devs/ResolveSpec/pkg/logger"
|
||||
)
|
||||
|
||||
// This file contains example implementations showing how to use hooks
|
||||
// These are just examples - you can implement hooks as needed for your application
|
||||
|
||||
// ExampleLoggingHook logs before and after operations
|
||||
func ExampleLoggingHook(hookType HookType) HookFunc {
|
||||
return func(ctx *HookContext) error {
|
||||
logger.Info("[%s] Operation: %s.%s, ID: %s", hookType, ctx.Schema, ctx.Entity, ctx.ID)
|
||||
if ctx.Data != nil {
|
||||
logger.Debug("[%s] Data: %+v", hookType, ctx.Data)
|
||||
}
|
||||
if ctx.Result != nil {
|
||||
logger.Debug("[%s] Result: %+v", hookType, ctx.Result)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// ExampleValidationHook validates data before create/update operations
|
||||
func ExampleValidationHook(ctx *HookContext) error {
|
||||
// Example: Ensure certain fields are present
|
||||
if dataMap, ok := ctx.Data.(map[string]interface{}); ok {
|
||||
// Check for required fields
|
||||
requiredFields := []string{"name"} // Add your required fields here
|
||||
for _, field := range requiredFields {
|
||||
if _, exists := dataMap[field]; !exists {
|
||||
return fmt.Errorf("required field missing: %s", field)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExampleAuthorizationHook checks if the user has permission to perform the operation
|
||||
func ExampleAuthorizationHook(ctx *HookContext) error {
|
||||
// Example: Check user permissions from context
|
||||
// userID, ok := ctx.Context.Value("user_id").(string)
|
||||
// if !ok {
|
||||
// return fmt.Errorf("unauthorized: no user in context")
|
||||
// }
|
||||
|
||||
// You can access the handler's database or registry if needed
|
||||
// For example, to check permissions in the database:
|
||||
// query := ctx.Handler.db.NewSelect().Table("permissions")...
|
||||
|
||||
// Add your authorization logic here
|
||||
logger.Debug("Authorization check for %s.%s", ctx.Schema, ctx.Entity)
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExampleDataTransformHook modifies data before create/update
|
||||
func ExampleDataTransformHook(ctx *HookContext) error {
|
||||
if dataMap, ok := ctx.Data.(map[string]interface{}); ok {
|
||||
// Example: Add a timestamp or user ID
|
||||
// dataMap["updated_at"] = time.Now()
|
||||
// dataMap["updated_by"] = ctx.Context.Value("user_id")
|
||||
|
||||
// Update the context with modified data
|
||||
ctx.Data = dataMap
|
||||
logger.Debug("Data transformed for %s.%s", ctx.Schema, ctx.Entity)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExampleAuditLogHook creates audit log entries for operations
|
||||
func ExampleAuditLogHook(hookType HookType) HookFunc {
|
||||
return func(ctx *HookContext) error {
|
||||
// Example: Log to audit system
|
||||
auditEntry := map[string]interface{}{
|
||||
"operation": hookType,
|
||||
"schema": ctx.Schema,
|
||||
"entity": ctx.Entity,
|
||||
"table_name": ctx.TableName,
|
||||
"id": ctx.ID,
|
||||
}
|
||||
|
||||
if ctx.Error != nil {
|
||||
auditEntry["error"] = ctx.Error.Error()
|
||||
}
|
||||
|
||||
logger.Info("Audit log: %+v", auditEntry)
|
||||
|
||||
// In a real application, you would save this to a database using the handler
|
||||
// Example:
|
||||
// query := ctx.Handler.db.NewInsert().Table("audit_logs").Model(&auditEntry)
|
||||
// if _, err := query.Exec(ctx.Context); err != nil {
|
||||
// logger.Error("Failed to save audit log: %v", err)
|
||||
// }
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// ExampleCacheInvalidationHook invalidates cache after create/update/delete
|
||||
func ExampleCacheInvalidationHook(ctx *HookContext) error {
|
||||
// Example: Invalidate cache for the entity
|
||||
cacheKey := fmt.Sprintf("%s.%s", ctx.Schema, ctx.Entity)
|
||||
logger.Info("Invalidating cache for: %s", cacheKey)
|
||||
|
||||
// Add your cache invalidation logic here
|
||||
// cache.Delete(cacheKey)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExampleFilterSensitiveDataHook removes sensitive data from responses
|
||||
func ExampleFilterSensitiveDataHook(ctx *HookContext) error {
|
||||
// Example: Remove password fields from results
|
||||
// This would be called in AfterRead hooks
|
||||
logger.Debug("Filtering sensitive data for %s.%s", ctx.Schema, ctx.Entity)
|
||||
|
||||
// Add your data filtering logic here
|
||||
// You would iterate through ctx.Result and remove sensitive fields
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExampleRelatedDataHook fetches related data using the handler's database
|
||||
func ExampleRelatedDataHook(ctx *HookContext) error {
|
||||
// Example: Fetch related data after reading the main entity
|
||||
// This hook demonstrates using ctx.Handler to access the database
|
||||
|
||||
if ctx.Entity == "users" && ctx.Result != nil {
|
||||
// Example: Fetch user's recent activity
|
||||
// userID := ... extract from ctx.Result
|
||||
|
||||
// Use the handler's database to query related data
|
||||
// query := ctx.Handler.db.NewSelect().Table("user_activity").Where("user_id = ?", userID)
|
||||
// var activities []Activity
|
||||
// if err := query.Scan(ctx.Context, &activities); err != nil {
|
||||
// logger.Error("Failed to fetch user activities: %v", err)
|
||||
// return err
|
||||
// }
|
||||
|
||||
// Optionally modify the result to include the related data
|
||||
// if resultMap, ok := ctx.Result.(map[string]interface{}); ok {
|
||||
// resultMap["recent_activities"] = activities
|
||||
// }
|
||||
|
||||
logger.Debug("Fetched related data for user entity")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetupExampleHooks demonstrates how to register hooks on a handler
|
||||
func SetupExampleHooks(handler *Handler) {
|
||||
hooks := handler.Hooks()
|
||||
|
||||
// Register logging hooks for all operations
|
||||
hooks.Register(BeforeRead, ExampleLoggingHook(BeforeRead))
|
||||
hooks.Register(AfterRead, ExampleLoggingHook(AfterRead))
|
||||
hooks.Register(BeforeCreate, ExampleLoggingHook(BeforeCreate))
|
||||
hooks.Register(AfterCreate, ExampleLoggingHook(AfterCreate))
|
||||
hooks.Register(BeforeUpdate, ExampleLoggingHook(BeforeUpdate))
|
||||
hooks.Register(AfterUpdate, ExampleLoggingHook(AfterUpdate))
|
||||
hooks.Register(BeforeDelete, ExampleLoggingHook(BeforeDelete))
|
||||
hooks.Register(AfterDelete, ExampleLoggingHook(AfterDelete))
|
||||
|
||||
// Register validation hooks for create/update
|
||||
hooks.Register(BeforeCreate, ExampleValidationHook)
|
||||
hooks.Register(BeforeUpdate, ExampleValidationHook)
|
||||
|
||||
// Register authorization hooks for all operations
|
||||
hooks.RegisterMultiple([]HookType{
|
||||
BeforeRead, BeforeCreate, BeforeUpdate, BeforeDelete,
|
||||
}, ExampleAuthorizationHook)
|
||||
|
||||
// Register data transform hook for create/update
|
||||
hooks.Register(BeforeCreate, ExampleDataTransformHook)
|
||||
hooks.Register(BeforeUpdate, ExampleDataTransformHook)
|
||||
|
||||
// Register audit log hooks for after operations
|
||||
hooks.Register(AfterCreate, ExampleAuditLogHook(AfterCreate))
|
||||
hooks.Register(AfterUpdate, ExampleAuditLogHook(AfterUpdate))
|
||||
hooks.Register(AfterDelete, ExampleAuditLogHook(AfterDelete))
|
||||
|
||||
// Register cache invalidation for after operations
|
||||
hooks.Register(AfterCreate, ExampleCacheInvalidationHook)
|
||||
hooks.Register(AfterUpdate, ExampleCacheInvalidationHook)
|
||||
hooks.Register(AfterDelete, ExampleCacheInvalidationHook)
|
||||
|
||||
// Register sensitive data filtering for read operations
|
||||
hooks.Register(AfterRead, ExampleFilterSensitiveDataHook)
|
||||
|
||||
// Register related data fetching for read operations
|
||||
hooks.Register(AfterRead, ExampleRelatedDataHook)
|
||||
|
||||
logger.Info("Example hooks registered successfully")
|
||||
}
|
||||
Reference in New Issue
Block a user