Your Question
Am trying to register a create callback hook for my db but it seems not to be working
package main
import (
"log"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"serverkit.com/cmd/api"
)
func main() {
db, err := gorm.Open(sqlite.Open("./test.db"), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
addr := ":8080"
apiUrl := "api/v1"
logTimeFormat := "02-Jan-2006"
logTimeZone := "America/New_York"
server := api.NewAPIServer(addr, db, apiUrl, logTimeFormat, logTimeZone)
if err := server.Run(); err != nil {
log.Fatalf("Error starting server: %v", err)
}
}
package api
import (
"log"
"os"
"path/filepath"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/logger"
"gorm.io/gorm"
"serverkit.com/services/database/sqlhandler"
)
type APIServer struct {
addr string
sqlDb *gorm.DB
apiUrl string
logTimeFormat string
logTimeZone string
}
func NewAPIServer(addr string, db *gorm.DB, apiUrl string, logTimeFormat string, logTimeZone string) *APIServer {
return &APIServer{
addr: addr,
sqlDb: db,
apiUrl: apiUrl,
logTimeFormat: logTimeFormat,
logTimeZone: logTimeZone,
}
}
func registerCallbacks(db *gorm.DB) {
// Generic callback for create operation
db.Callback().Create().After("gorm:create").Register("global_after_create", afterCreateCallback)
// Similarly, you can add callbacks for update and delete
}
// Generic after-create callback
func afterCreateCallback(tx *gorm.DB) {
tableName := tx.Statement.Table
// Fetch the created record details, you can access `tx.Statement.Dest` to get the data
createdData := tx.Statement.Dest
log.Printf("Table '%s' was updated with data: %v", tableName, createdData)
// Broadcast table name and created data to SSE
// sseManager.BroadcastToClients(fmt.Sprintf("Table '%s' was updated with data: %v", tableName, createdData))
}
func (s *APIServer) Run() error {
app := fiber.New()
// Register global callbacks
registerCallbacks(s.sqlDb)
// Ensure the logs directory exists
logDir := "./logs"
if err := os.MkdirAll(logDir, os.ModePerm); err != nil {
log.Fatalf("error creating log directory: %v", err)
}
// Custom File Writer
logFilePath := filepath.Join(logDir, "fiber.log")
file, err := os.OpenFile(logFilePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("error opening file: %v", err)
}
defer file.Close()
// Create a subrouter for /api/v1
api := app.Group(s.apiUrl)
// Middleware
api.Use(logger.New(logger.Config{
Output: file,
Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
TimeFormat: s.logTimeFormat,
TimeZone: s.logTimeZone,
}))
// Register routes
databaseRepo := sqlhandler.NewSqlRepo(s.sqlDb)
databaseHandler := sqlhandler.NewDBAPIHandler(databaseRepo)
databaseHandler.RegisterRoutes(api)
log.Println("Starting server on", s.addr)
return app.Listen(s.addr)
}
package sqlhandler
import (
"time"
"github.com/gofiber/fiber/v2"
)
func (h *SqlAPIHandler) handlePerformSqlQuery(c *fiber.Ctx) error {
var req PerformSqlQueryRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).SendString(err.Error())
}
// Validate if the query is allowed
if !isValidQuery(req.Query) {
return c.Status(fiber.StatusForbidden).SendString("Query type not allowed")
}
// Log the query for tracking
logQuery(req.Query)
// Measure the execution time
startTime := time.Now()
// Perform the SQL query and capture result
result, err := h.repo.PerformSqlQuery(req.Query)
if err != nil {
return c.Status(fiber.StatusInternalServerError).SendString("Failed to execute query: " + err.Error())
}
// Calculate execution duration
executionTime := time.Since(startTime).Milliseconds()
// Send detailed response
return c.JSON(fiber.Map{
"message": "Query executed successfully",
"query": req.Query,
"rows_affected": result.RowsAffected,
"execution_time": executionTime, // In milliseconds
})
}
http://127.0.0.1:8080/api/v1/db/tables
{
"query" : "INSERT INTO users (name, email, age) VALUES ('Alice', 'alice@example.com', 30); INSERT INTO users (name, email, age) VALUES ('Bob', 'bob@example.com', 25); INSERT INTO users (name, email, age) VALUES ('Charlie', 'charlie@example.com', 35);"
}
am not receiving any logs in the hook, any idea on why it not working
am trying to do a realtime db update
The document you expected this should be explained
[]
https://gorm.io/docs/write_plugins.html
Expected answer
am not receiving any logs in the hook, any idea on why it not working
am trying to do a realtime db update
Comment From: github-actions[bot]
This issue has been automatically marked as stale because it has been open 360 days with no activity. Remove stale label or comment or this will be closed in 180 days