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