Documentation
¶
Overview ¶
Package database provides unified database access with support for SQL (Postgres, MySQL, SQLite) and NoSQL (MongoDB) databases. It exposes native drivers for maximum flexibility while providing production-ready features like connection pooling, health checks, and observability.
Index ¶
- Constants
- Variables
- func ErrConnectionFailed(dbName string, dbType DatabaseType, cause error) error
- func ErrDatabaseAlreadyExists(name string) error
- func ErrDatabaseNotFound(name string) error
- func ErrDatabaseNotOpened(name string) error
- func ErrInvalidDSN(dsn string) error
- func ErrInvalidDatabaseName(name string) error
- func ErrInvalidDatabaseType(dbType string) error
- func ErrInvalidDatabaseTypeOp(name string, expectedType, actualType DatabaseType) error
- func ErrInvalidPoolConfig(reason string) error
- func ErrNoDatabasesConfigured() error
- func ErrPanicRecovered(dbName string, dbType DatabaseType, panicValue interface{}) error
- func ErrQueryFailed(dbName string, dbType DatabaseType, cause error) error
- func ErrTransactionFailed(dbName string, dbType DatabaseType, cause error) error
- func GetUserID(ctx context.Context) (int64, bool)
- func GetXIDUserID(ctx context.Context) (xid.ID, bool)
- func MaskDSN(dsn string, dbType DatabaseType) string
- func NewExtension(opts ...ConfigOption) forge.Extension
- func NewExtensionWithConfig(config Config) forge.Extension
- func SetUserID(ctx context.Context, userID int64) context.Context
- func SetXIDUserID(ctx context.Context, userID xid.ID) context.Context
- type AppliedMigration
- type AuditModel
- func (m *AuditModel) BeforeDelete(ctx context.Context, query *bun.DeleteQuery) error
- func (m *AuditModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
- func (m *AuditModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
- func (m *AuditModel) IsDeleted() bool
- func (m *AuditModel) Restore()
- type BaseModel
- type Config
- type ConfigOption
- type ConnectionState
- type Database
- type DatabaseConfig
- type DatabaseError
- type DatabaseManager
- func (m *DatabaseManager) CloseAll(ctx context.Context) error
- func (m *DatabaseManager) Get(name string) (Database, error)
- func (m *DatabaseManager) Health(ctx context.Context) error
- func (m *DatabaseManager) HealthCheckAll(ctx context.Context) map[string]HealthStatus
- func (m *DatabaseManager) List() []string
- func (m *DatabaseManager) Mongo(name string) (*mongo.Client, error)
- func (m *DatabaseManager) MongoDatabase(name string) (*MongoDatabase, error)
- func (m *DatabaseManager) OpenAll(ctx context.Context) error
- func (m *DatabaseManager) Register(name string, db Database) error
- func (m *DatabaseManager) SQL(name string) (*bun.DB, error)
- type DatabaseStats
- type DatabaseType
- type Extension
- type HealthStatus
- type Logger
- type MigrationManager
- func (m *MigrationManager) AutoMigrate(ctx context.Context, models ...interface{}) error
- func (m *MigrationManager) CreateMigration(ctx context.Context) error
- func (m *MigrationManager) CreateTables(ctx context.Context) error
- func (m *MigrationManager) Migrate(ctx context.Context) error
- func (m *MigrationManager) Reset(ctx context.Context) error
- func (m *MigrationManager) Rollback(ctx context.Context) error
- func (m *MigrationManager) Status(ctx context.Context) (*MigrationStatusResult, error)
- type MigrationStatus
- type MigrationStatusResult
- type MongoDatabase
- func (d *MongoDatabase) Client() *mongo.Client
- func (d *MongoDatabase) Close(ctx context.Context) error
- func (d *MongoDatabase) Collection(name string) *mongo.Collection
- func (d *MongoDatabase) Database() *mongo.Database
- func (d *MongoDatabase) Driver() interface{}
- func (d *MongoDatabase) Health(ctx context.Context) HealthStatus
- func (d *MongoDatabase) IsOpen() bool
- func (d *MongoDatabase) Name() string
- func (d *MongoDatabase) Open(ctx context.Context) error
- func (d *MongoDatabase) Ping(ctx context.Context) error
- func (d *MongoDatabase) State() ConnectionState
- func (d *MongoDatabase) Stats() DatabaseStats
- func (d *MongoDatabase) Transaction(ctx context.Context, fn func(sessCtx mongo.SessionContext) error) (err error)
- func (d *MongoDatabase) TransactionWithOptions(ctx context.Context, opts *options.TransactionOptions, ...) (err error)
- func (d *MongoDatabase) Type() DatabaseType
- type MultiError
- type QueryHook
- type SQLDatabase
- func (d *SQLDatabase) Bun() *bun.DB
- func (d *SQLDatabase) Close(ctx context.Context) error
- func (d *SQLDatabase) DB() *sql.DB
- func (d *SQLDatabase) Driver() interface{}
- func (d *SQLDatabase) Health(ctx context.Context) HealthStatus
- func (d *SQLDatabase) IsOpen() bool
- func (d *SQLDatabase) Name() string
- func (d *SQLDatabase) Open(ctx context.Context) error
- func (d *SQLDatabase) Ping(ctx context.Context) error
- func (d *SQLDatabase) State() ConnectionState
- func (d *SQLDatabase) Stats() DatabaseStats
- func (d *SQLDatabase) Transaction(ctx context.Context, fn func(tx bun.Tx) error) (err error)
- func (d *SQLDatabase) TransactionWithOptions(ctx context.Context, opts *sql.TxOptions, fn func(tx bun.Tx) error) (err error)
- func (d *SQLDatabase) Type() DatabaseType
- type SoftDeleteModel
- func (m *SoftDeleteModel) BeforeDelete(ctx context.Context, query *bun.DeleteQuery) error
- func (m *SoftDeleteModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
- func (m *SoftDeleteModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
- func (m *SoftDeleteModel) IsDeleted() bool
- func (m *SoftDeleteModel) Restore()
- type TimestampModel
- type UUIDModel
- type UUIDSoftDeleteModel
- func (m *UUIDSoftDeleteModel) BeforeDelete(ctx context.Context, query *bun.DeleteQuery) error
- func (m *UUIDSoftDeleteModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
- func (m *UUIDSoftDeleteModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
- func (m *UUIDSoftDeleteModel) IsDeleted() bool
- func (m *UUIDSoftDeleteModel) Restore()
- type XIDAuditModel
- func (m *XIDAuditModel) BeforeDelete(ctx context.Context, query *bun.DeleteQuery) error
- func (m *XIDAuditModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
- func (m *XIDAuditModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
- func (m *XIDAuditModel) IsDeleted() bool
- func (m *XIDAuditModel) Restore()
- type XIDModel
- type XIDSoftDeleteModel
- func (m *XIDSoftDeleteModel) BeforeDelete(ctx context.Context, query *bun.DeleteQuery) error
- func (m *XIDSoftDeleteModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
- func (m *XIDSoftDeleteModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
- func (m *XIDSoftDeleteModel) IsDeleted() bool
- func (m *XIDSoftDeleteModel) Restore()
Constants ¶
const ( ManagerKey = "databaseManager" DatabaseKey = "database" )
const ( CodeDatabaseError = "DATABASE_ERROR" CodeDatabaseNotFound = "DATABASE_NOT_FOUND" CodeDatabaseExists = "DATABASE_ALREADY_EXISTS" CodeDatabaseNotOpened = "DATABASE_NOT_OPENED" CodeDatabaseInvalidType = "DATABASE_INVALID_TYPE" CodeDatabaseConnection = "DATABASE_CONNECTION_ERROR" CodeDatabaseQuery = "DATABASE_QUERY_ERROR" CodeDatabaseTransaction = "DATABASE_TRANSACTION_ERROR" CodeDatabasePanic = "DATABASE_PANIC_RECOVERED" CodeDatabaseConfig = "DATABASE_CONFIG_ERROR" )
Error codes for database operations
Variables ¶
var ( // Migrations is the global migration collection // All migrations should register themselves here using init() Migrations = migrate.Migrations // RegisterMigration is a helper to register a migration RegisterMigration = migrate.RegisterMigration // RegisterModel adds a model to the auto-registration list RegisterModel = migrate.RegisterModel // Models is the list of all models that should be auto-registered Models = &migrate.Models )
Re-export migrate package for convenience This allows users to import "github.com/xraph/forge/extensions/database" and use database.Migrations instead of importing the migrate subpackage
Functions ¶
func ErrConnectionFailed ¶ added in v0.4.0
func ErrConnectionFailed(dbName string, dbType DatabaseType, cause error) error
func ErrDatabaseNotFound ¶
func ErrDatabaseNotOpened ¶
func ErrInvalidDSN ¶
func ErrInvalidDatabaseName ¶
func ErrInvalidDatabaseType ¶
func ErrInvalidDatabaseTypeOp ¶
func ErrInvalidDatabaseTypeOp(name string, expectedType, actualType DatabaseType) error
func ErrInvalidPoolConfig ¶
func ErrNoDatabasesConfigured ¶
func ErrNoDatabasesConfigured() error
Error constructors for common database errors
func ErrPanicRecovered ¶ added in v0.4.0
func ErrPanicRecovered(dbName string, dbType DatabaseType, panicValue interface{}) error
func ErrQueryFailed ¶ added in v0.4.0
func ErrQueryFailed(dbName string, dbType DatabaseType, cause error) error
func ErrTransactionFailed ¶ added in v0.4.0
func ErrTransactionFailed(dbName string, dbType DatabaseType, cause error) error
func MaskDSN ¶ added in v0.4.0
func MaskDSN(dsn string, dbType DatabaseType) string
MaskDSN masks sensitive information in DSN for logging
func NewExtension ¶
func NewExtension(opts ...ConfigOption) forge.Extension
NewExtension creates a new database extension with variadic options
func NewExtensionWithConfig ¶ added in v0.4.0
NewExtensionWithConfig creates a new database extension with a complete config
Types ¶
type AppliedMigration ¶ added in v0.4.0
AppliedMigration represents an applied migration
type AuditModel ¶ added in v0.4.0
type AuditModel struct {
ID int64 `bun:"id,pk,autoincrement" json:"id"`
CreatedAt time.Time `bun:"created_at,nullzero,notnull,default:current_timestamp" json:"created_at"`
CreatedBy *int64 `bun:"created_by" json:"created_by,omitempty"`
UpdatedAt time.Time `bun:"updated_at,nullzero,notnull,default:current_timestamp" json:"updated_at"`
UpdatedBy *int64 `bun:"updated_by" json:"updated_by,omitempty"`
DeletedAt *time.Time `bun:"deleted_at,soft_delete,nullzero" json:"deleted_at,omitempty"`
DeletedBy *int64 `bun:"deleted_by" json:"deleted_by,omitempty"`
}
AuditModel provides comprehensive audit trail with user tracking Use this when you need to track who created/updated records
func (*AuditModel) BeforeDelete ¶ added in v0.4.0
func (m *AuditModel) BeforeDelete(ctx context.Context, query *bun.DeleteQuery) error
BeforeDelete hook - performs soft delete and tracks deleter
func (*AuditModel) BeforeInsert ¶ added in v0.4.0
func (m *AuditModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
BeforeInsert hook - sets timestamps and tracks creator
func (*AuditModel) BeforeUpdate ¶ added in v0.4.0
func (m *AuditModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
BeforeUpdate hook - updates UpdatedAt and tracks updater
func (*AuditModel) IsDeleted ¶ added in v0.4.0
func (m *AuditModel) IsDeleted() bool
IsDeleted checks if the record is soft deleted
func (*AuditModel) Restore ¶ added in v0.4.0
func (m *AuditModel) Restore()
Restore restores a soft-deleted record
type BaseModel ¶ added in v0.4.0
type BaseModel struct {
ID int64 `bun:"id,pk,autoincrement" json:"id"`
CreatedAt time.Time `bun:"created_at,nullzero,notnull,default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `bun:"updated_at,nullzero,notnull,default:current_timestamp" json:"updated_at"`
}
BaseModel provides common fields and hooks for all models Use this for models that need ID, timestamps, and standard hooks
func (*BaseModel) BeforeInsert ¶ added in v0.4.0
BeforeInsert hook - sets timestamps on insert
func (*BaseModel) BeforeUpdate ¶ added in v0.4.0
BeforeUpdate hook - updates UpdatedAt on every update
type Config ¶
type Config struct {
// List of database configurations
Databases []DatabaseConfig `yaml:"databases" json:"databases" mapstructure:"databases"`
// Default database name (first one if not specified)
Default string `yaml:"default" json:"default" mapstructure:"default"`
// Config loading flags
RequireConfig bool `yaml:"-" json:"-"`
}
Config is the configuration for the database extension
type ConfigOption ¶ added in v0.4.0
type ConfigOption func(*Config)
ConfigOption is a functional option for Config
func WithConfig ¶ added in v0.4.0
func WithConfig(config Config) ConfigOption
WithConfig replaces the entire config
func WithDatabase ¶ added in v0.4.0
func WithDatabase(db DatabaseConfig) ConfigOption
WithDatabase adds a single database configuration
func WithDatabases ¶ added in v0.4.0
func WithDatabases(databases ...DatabaseConfig) ConfigOption
WithDatabases sets the list of database configurations
func WithDefault ¶ added in v0.4.0
func WithDefault(name string) ConfigOption
WithDefault sets the default database name
func WithRequireConfig ¶ added in v0.4.0
func WithRequireConfig(require bool) ConfigOption
WithRequireConfig requires config from YAML
type ConnectionState ¶ added in v0.4.0
type ConnectionState int32
ConnectionState represents the state of a database connection
const ( StateDisconnected ConnectionState = iota StateConnecting StateConnected StateError StateReconnecting )
func (ConnectionState) String ¶ added in v0.4.0
func (s ConnectionState) String() string
type Database ¶
type Database interface {
// Identity
Name() string
Type() DatabaseType
// Lifecycle
Open(ctx context.Context) error
Close(ctx context.Context) error
Ping(ctx context.Context) error
// State
IsOpen() bool
State() ConnectionState
// Health
Health(ctx context.Context) HealthStatus
Stats() DatabaseStats
// Access to native driver/ORM
Driver() interface{}
}
Database represents a database connection
type DatabaseConfig ¶
type DatabaseConfig struct {
Name string `yaml:"name" json:"name"`
Type DatabaseType `yaml:"type" json:"type"`
DSN string `yaml:"dsn" json:"dsn"`
// Connection pool settings
MaxOpenConns int `yaml:"max_open_conns" json:"max_open_conns" default:"25"`
MaxIdleConns int `yaml:"max_idle_conns" json:"max_idle_conns" default:"5"`
ConnMaxLifetime time.Duration `yaml:"conn_max_lifetime" json:"conn_max_lifetime" default:"5m"`
ConnMaxIdleTime time.Duration `yaml:"conn_max_idle_time" json:"conn_max_idle_time" default:"5m"`
// Retry settings
MaxRetries int `yaml:"max_retries" json:"max_retries" default:"3"`
RetryDelay time.Duration `yaml:"retry_delay" json:"retry_delay" default:"1s"`
// Timeout settings
ConnectionTimeout time.Duration `yaml:"connection_timeout" json:"connection_timeout" default:"10s"`
QueryTimeout time.Duration `yaml:"query_timeout" json:"query_timeout" default:"30s"`
// Observability settings
SlowQueryThreshold time.Duration `yaml:"slow_query_threshold" json:"slow_query_threshold" default:"100ms"`
// Health check
HealthCheckInterval time.Duration `yaml:"health_check_interval" json:"health_check_interval" default:"30s"`
// Additional config (database-specific)
Config map[string]interface{} `yaml:"config" json:"config"`
}
DatabaseConfig is the configuration for a database connection
type DatabaseError ¶ added in v0.4.0
type DatabaseError struct {
DBName string
DBType DatabaseType
Operation string
Code string
Err error
}
DatabaseError wraps database-specific errors with context
func NewDatabaseError ¶ added in v0.4.0
func NewDatabaseError(dbName string, dbType DatabaseType, operation string, err error) *DatabaseError
NewDatabaseError creates a new database error with context
func (*DatabaseError) Error ¶ added in v0.4.0
func (e *DatabaseError) Error() string
func (*DatabaseError) Unwrap ¶ added in v0.4.0
func (e *DatabaseError) Unwrap() error
type DatabaseManager ¶
type DatabaseManager struct {
// contains filtered or unexported fields
}
DatabaseManager manages multiple database connections
func NewDatabaseManager ¶
func NewDatabaseManager(logger forge.Logger, metrics forge.Metrics) *DatabaseManager
NewDatabaseManager creates a new database manager
func (*DatabaseManager) CloseAll ¶
func (m *DatabaseManager) CloseAll(ctx context.Context) error
CloseAll closes all registered databases, collecting errors without stopping
func (*DatabaseManager) Get ¶
func (m *DatabaseManager) Get(name string) (Database, error)
Get retrieves a database by name
func (*DatabaseManager) Health ¶ added in v0.4.0
func (m *DatabaseManager) Health(ctx context.Context) error
func (*DatabaseManager) HealthCheckAll ¶
func (m *DatabaseManager) HealthCheckAll(ctx context.Context) map[string]HealthStatus
HealthCheckAll performs health checks on all databases
func (*DatabaseManager) List ¶
func (m *DatabaseManager) List() []string
List returns the names of all registered databases
func (*DatabaseManager) Mongo ¶
func (m *DatabaseManager) Mongo(name string) (*mongo.Client, error)
Mongo retrieves a MongoDB client by name
func (*DatabaseManager) MongoDatabase ¶
func (m *DatabaseManager) MongoDatabase(name string) (*MongoDatabase, error)
MongoDatabase retrieves a MongoDB database wrapper by name
func (*DatabaseManager) OpenAll ¶
func (m *DatabaseManager) OpenAll(ctx context.Context) error
OpenAll opens all registered databases, collecting errors without stopping
type DatabaseStats ¶
type DatabaseStats struct {
OpenConnections int `json:"open_connections"`
InUse int `json:"in_use"`
Idle int `json:"idle"`
WaitCount int64 `json:"wait_count"`
WaitDuration time.Duration `json:"wait_duration"`
MaxIdleClosed int64 `json:"max_idle_closed"`
MaxLifetimeClosed int64 `json:"max_lifetime_closed"`
}
DatabaseStats provides connection pool statistics
type DatabaseType ¶
type DatabaseType string
DatabaseType represents the type of database
const ( TypePostgres DatabaseType = "postgres" TypeMySQL DatabaseType = "mysql" TypeSQLite DatabaseType = "sqlite" TypeMongoDB DatabaseType = "mongodb" TypeRedis DatabaseType = "redis" )
type Extension ¶
type Extension struct {
*forge.BaseExtension
// contains filtered or unexported fields
}
Extension implements the database extension
type HealthStatus ¶
type HealthStatus struct {
Healthy bool `json:"healthy"`
Message string `json:"message"`
Latency time.Duration `json:"latency"`
CheckedAt time.Time `json:"checked_at"`
}
HealthStatus provides database health status
type Logger ¶ added in v0.4.0
type Logger interface {
Info(msg string, fields ...interface{})
Error(msg string, fields ...interface{})
Warn(msg string, fields ...interface{})
}
Logger interface for migration logging
type MigrationManager ¶ added in v0.4.0
type MigrationManager struct {
// contains filtered or unexported fields
}
MigrationManager manages database migrations
func NewMigrationManager ¶ added in v0.4.0
func NewMigrationManager(db *bun.DB, migrations *migrate.Migrations, logger Logger) *MigrationManager
NewMigrationManager creates a new migration manager
func (*MigrationManager) AutoMigrate ¶ added in v0.4.0
func (m *MigrationManager) AutoMigrate(ctx context.Context, models ...interface{}) error
AutoMigrate automatically creates/updates tables for registered models This is a development convenience - use migrations for production
func (*MigrationManager) CreateMigration ¶ added in v0.4.0
func (m *MigrationManager) CreateMigration(ctx context.Context) error
CreateMigration creates the migration tables and initial structure
func (*MigrationManager) CreateTables ¶ added in v0.4.0
func (m *MigrationManager) CreateTables(ctx context.Context) error
CreateTables creates the migrations table
func (*MigrationManager) Migrate ¶ added in v0.4.0
func (m *MigrationManager) Migrate(ctx context.Context) error
Migrate runs all pending migrations
func (*MigrationManager) Reset ¶ added in v0.4.0
func (m *MigrationManager) Reset(ctx context.Context) error
Reset drops all tables and re-runs all migrations
func (*MigrationManager) Rollback ¶ added in v0.4.0
func (m *MigrationManager) Rollback(ctx context.Context) error
Rollback rolls back the last migration group
func (*MigrationManager) Status ¶ added in v0.4.0
func (m *MigrationManager) Status(ctx context.Context) (*MigrationStatusResult, error)
Status returns the current migration status
type MigrationStatus ¶
type MigrationStatus struct {
ID int64 `json:"id"`
Applied bool `json:"applied"`
AppliedAt time.Time `json:"applied_at"`
}
MigrationStatus provides migration status
type MigrationStatusResult ¶ added in v0.4.0
type MigrationStatusResult struct {
Applied []AppliedMigration
Pending []string
}
MigrationStatusResult represents the current state of migrations
type MongoDatabase ¶
type MongoDatabase struct {
// contains filtered or unexported fields
}
MongoDatabase wraps MongoDB client
func NewMongoDatabase ¶
func NewMongoDatabase(config DatabaseConfig, logger forge.Logger, metrics forge.Metrics) (*MongoDatabase, error)
NewMongoDatabase creates a new MongoDB database instance
func (*MongoDatabase) Client ¶
func (d *MongoDatabase) Client() *mongo.Client
Client returns the MongoDB client
func (*MongoDatabase) Close ¶
func (d *MongoDatabase) Close(ctx context.Context) error
Close closes the MongoDB connection
func (*MongoDatabase) Collection ¶
func (d *MongoDatabase) Collection(name string) *mongo.Collection
Collection returns a MongoDB collection
func (*MongoDatabase) Database ¶
func (d *MongoDatabase) Database() *mongo.Database
Database returns the MongoDB database
func (*MongoDatabase) Driver ¶
func (d *MongoDatabase) Driver() interface{}
Driver returns the *mongo.Client for native driver access
func (*MongoDatabase) Health ¶
func (d *MongoDatabase) Health(ctx context.Context) HealthStatus
Health returns the health status
func (*MongoDatabase) IsOpen ¶ added in v0.4.0
func (d *MongoDatabase) IsOpen() bool
IsOpen returns whether the database is connected
func (*MongoDatabase) Open ¶
func (d *MongoDatabase) Open(ctx context.Context) error
Open establishes the MongoDB connection with retry logic
func (*MongoDatabase) Ping ¶
func (d *MongoDatabase) Ping(ctx context.Context) error
Ping checks MongoDB connectivity
func (*MongoDatabase) State ¶ added in v0.4.0
func (d *MongoDatabase) State() ConnectionState
State returns the current connection state
func (*MongoDatabase) Stats ¶
func (d *MongoDatabase) Stats() DatabaseStats
Stats returns MongoDB statistics
func (*MongoDatabase) Transaction ¶
func (d *MongoDatabase) Transaction(ctx context.Context, fn func(sessCtx mongo.SessionContext) error) (err error)
Transaction executes a function in a MongoDB transaction with panic recovery
func (*MongoDatabase) TransactionWithOptions ¶
func (d *MongoDatabase) TransactionWithOptions(ctx context.Context, opts *options.TransactionOptions, fn func(sessCtx mongo.SessionContext) error) (err error)
TransactionWithOptions executes a function in a MongoDB transaction with options and panic recovery
func (*MongoDatabase) Type ¶
func (d *MongoDatabase) Type() DatabaseType
Type returns the database type
type MultiError ¶ added in v0.4.0
MultiError represents multiple database errors
func (*MultiError) Error ¶ added in v0.4.0
func (e *MultiError) Error() string
func (*MultiError) HasErrors ¶ added in v0.4.0
func (e *MultiError) HasErrors() bool
HasErrors returns true if there are any errors
type QueryHook ¶
type QueryHook struct {
// contains filtered or unexported fields
}
QueryHook provides observability for Bun queries
func (*QueryHook) AfterQuery ¶
func (h *QueryHook) AfterQuery(ctx context.Context, event *bun.QueryEvent)
AfterQuery is called after query execution
func (*QueryHook) BeforeQuery ¶
BeforeQuery is called before query execution
type SQLDatabase ¶
type SQLDatabase struct {
// contains filtered or unexported fields
}
SQLDatabase wraps Bun ORM for SQL databases
func NewSQLDatabase ¶
func NewSQLDatabase(config DatabaseConfig, logger forge.Logger, metrics forge.Metrics) (*SQLDatabase, error)
NewSQLDatabase creates a new SQL database instance
func (*SQLDatabase) Close ¶
func (d *SQLDatabase) Close(ctx context.Context) error
Close closes the database connection
func (*SQLDatabase) Driver ¶
func (d *SQLDatabase) Driver() interface{}
Driver returns the raw *sql.DB for native driver access
func (*SQLDatabase) Health ¶
func (d *SQLDatabase) Health(ctx context.Context) HealthStatus
Health returns the health status
func (*SQLDatabase) IsOpen ¶ added in v0.4.0
func (d *SQLDatabase) IsOpen() bool
IsOpen returns whether the database is connected
func (*SQLDatabase) Open ¶
func (d *SQLDatabase) Open(ctx context.Context) error
Open establishes the database connection with retry logic
func (*SQLDatabase) Ping ¶
func (d *SQLDatabase) Ping(ctx context.Context) error
Ping checks database connectivity
func (*SQLDatabase) State ¶ added in v0.4.0
func (d *SQLDatabase) State() ConnectionState
State returns the current connection state
func (*SQLDatabase) Stats ¶
func (d *SQLDatabase) Stats() DatabaseStats
Stats returns connection pool statistics
func (*SQLDatabase) Transaction ¶
Transaction executes a function in a SQL transaction with panic recovery
type SoftDeleteModel ¶ added in v0.4.0
type SoftDeleteModel struct {
ID int64 `bun:"id,pk,autoincrement" json:"id"`
CreatedAt time.Time `bun:"created_at,nullzero,notnull,default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `bun:"updated_at,nullzero,notnull,default:current_timestamp" json:"updated_at"`
DeletedAt *time.Time `bun:"deleted_at,soft_delete,nullzero" json:"deleted_at,omitempty"`
}
SoftDeleteModel provides soft delete functionality with timestamps Soft-deleted records are not permanently removed, just marked as deleted
func (*SoftDeleteModel) BeforeDelete ¶ added in v0.4.0
func (m *SoftDeleteModel) BeforeDelete(ctx context.Context, query *bun.DeleteQuery) error
BeforeDelete hook - performs soft delete
func (*SoftDeleteModel) BeforeInsert ¶ added in v0.4.0
func (m *SoftDeleteModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
BeforeInsert hook - sets timestamps
func (*SoftDeleteModel) BeforeUpdate ¶ added in v0.4.0
func (m *SoftDeleteModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
BeforeUpdate hook - updates UpdatedAt
func (*SoftDeleteModel) IsDeleted ¶ added in v0.4.0
func (m *SoftDeleteModel) IsDeleted() bool
IsDeleted checks if the record is soft deleted
func (*SoftDeleteModel) Restore ¶ added in v0.4.0
func (m *SoftDeleteModel) Restore()
Restore restores a soft-deleted record
type TimestampModel ¶ added in v0.4.0
type TimestampModel struct {
CreatedAt time.Time `bun:"created_at,nullzero,notnull,default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `bun:"updated_at,nullzero,notnull,default:current_timestamp" json:"updated_at"`
}
TimestampModel provides only timestamp fields without ID Use this when you want to add your own ID field type
func (*TimestampModel) BeforeInsert ¶ added in v0.4.0
func (m *TimestampModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
BeforeInsert hook - sets timestamps
func (*TimestampModel) BeforeUpdate ¶ added in v0.4.0
func (m *TimestampModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
BeforeUpdate hook - updates UpdatedAt
type UUIDModel ¶ added in v0.4.0
type UUIDModel struct {
ID uuid.UUID `bun:"id,pk,type:uuid,default:gen_random_uuid()" json:"id"`
CreatedAt time.Time `bun:"created_at,nullzero,notnull,default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `bun:"updated_at,nullzero,notnull,default:current_timestamp" json:"updated_at"`
}
UUIDModel provides UUID-based primary key with timestamps Use this for distributed systems or when you need globally unique IDs
func (*UUIDModel) BeforeInsert ¶ added in v0.4.0
BeforeInsert hook - generates UUID and sets timestamps
func (*UUIDModel) BeforeUpdate ¶ added in v0.4.0
BeforeUpdate hook - updates UpdatedAt
type UUIDSoftDeleteModel ¶ added in v0.4.0
type UUIDSoftDeleteModel struct {
ID uuid.UUID `bun:"id,pk,type:uuid,default:gen_random_uuid()" json:"id"`
CreatedAt time.Time `bun:"created_at,nullzero,notnull,default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `bun:"updated_at,nullzero,notnull,default:current_timestamp" json:"updated_at"`
DeletedAt *time.Time `bun:"deleted_at,soft_delete,nullzero" json:"deleted_at,omitempty"`
}
UUIDSoftDeleteModel combines UUID primary key with soft delete
func (*UUIDSoftDeleteModel) BeforeDelete ¶ added in v0.4.0
func (m *UUIDSoftDeleteModel) BeforeDelete(ctx context.Context, query *bun.DeleteQuery) error
BeforeDelete hook - performs soft delete
func (*UUIDSoftDeleteModel) BeforeInsert ¶ added in v0.4.0
func (m *UUIDSoftDeleteModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
BeforeInsert hook - generates UUID and sets timestamps
func (*UUIDSoftDeleteModel) BeforeUpdate ¶ added in v0.4.0
func (m *UUIDSoftDeleteModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
BeforeUpdate hook - updates UpdatedAt
func (*UUIDSoftDeleteModel) IsDeleted ¶ added in v0.4.0
func (m *UUIDSoftDeleteModel) IsDeleted() bool
IsDeleted checks if the record is soft deleted
func (*UUIDSoftDeleteModel) Restore ¶ added in v0.4.0
func (m *UUIDSoftDeleteModel) Restore()
Restore restores a soft-deleted record
type XIDAuditModel ¶ added in v0.4.0
type XIDAuditModel struct {
ID xid.ID `bun:"id,pk,type:varchar(20)" json:"id"`
CreatedAt time.Time `bun:"created_at,nullzero,notnull,default:current_timestamp" json:"created_at"`
CreatedBy *xid.ID `bun:"created_by" json:"created_by,omitempty"`
UpdatedAt time.Time `bun:"updated_at,nullzero,notnull,default:current_timestamp" json:"updated_at"`
UpdatedBy *xid.ID `bun:"updated_by" json:"updated_by,omitempty"`
DeletedAt *time.Time `bun:"deleted_at,soft_delete,nullzero" json:"deleted_at,omitempty"`
DeletedBy *xid.ID `bun:"deleted_by" json:"deleted_by,omitempty"`
}
XIDAuditModel provides comprehensive audit trail with XID primary key and user tracking Combines XID with full audit capabilities: tracks who created/updated/deleted records
func (*XIDAuditModel) BeforeDelete ¶ added in v0.4.0
func (m *XIDAuditModel) BeforeDelete(ctx context.Context, query *bun.DeleteQuery) error
BeforeDelete hook - performs soft delete and tracks deleter
func (*XIDAuditModel) BeforeInsert ¶ added in v0.4.0
func (m *XIDAuditModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
BeforeInsert hook - generates XID, sets timestamps and tracks creator
func (*XIDAuditModel) BeforeUpdate ¶ added in v0.4.0
func (m *XIDAuditModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
BeforeUpdate hook - updates UpdatedAt and tracks updater
func (*XIDAuditModel) IsDeleted ¶ added in v0.4.0
func (m *XIDAuditModel) IsDeleted() bool
IsDeleted checks if the record is soft deleted
func (*XIDAuditModel) Restore ¶ added in v0.4.0
func (m *XIDAuditModel) Restore()
Restore restores a soft-deleted record
type XIDModel ¶ added in v0.4.0
type XIDModel struct {
ID xid.ID `bun:"id,pk,type:varchar(20)" json:"id"`
CreatedAt time.Time `bun:"created_at,nullzero,notnull,default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `bun:"updated_at,nullzero,notnull,default:current_timestamp" json:"updated_at"`
}
XIDModel provides XID primary key with timestamps XID is a globally unique, sortable, compact, URL-safe identifier It's shorter than UUID (20 bytes vs 36) and sortable by creation time
func (*XIDModel) BeforeInsert ¶ added in v0.4.0
BeforeInsert hook - generates XID and sets timestamps
func (*XIDModel) BeforeUpdate ¶ added in v0.4.0
BeforeUpdate hook - updates UpdatedAt
type XIDSoftDeleteModel ¶ added in v0.4.0
type XIDSoftDeleteModel struct {
ID xid.ID `bun:"id,pk,type:varchar(20)" json:"id"`
CreatedAt time.Time `bun:"created_at,nullzero,notnull,default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `bun:"updated_at,nullzero,notnull,default:current_timestamp" json:"updated_at"`
DeletedAt *time.Time `bun:"deleted_at,soft_delete,nullzero" json:"deleted_at,omitempty"`
}
XIDSoftDeleteModel combines XID primary key with soft delete
func (*XIDSoftDeleteModel) BeforeDelete ¶ added in v0.4.0
func (m *XIDSoftDeleteModel) BeforeDelete(ctx context.Context, query *bun.DeleteQuery) error
BeforeDelete hook - performs soft delete
func (*XIDSoftDeleteModel) BeforeInsert ¶ added in v0.4.0
func (m *XIDSoftDeleteModel) BeforeInsert(ctx context.Context, query *bun.InsertQuery) error
BeforeInsert hook - generates XID and sets timestamps
func (*XIDSoftDeleteModel) BeforeUpdate ¶ added in v0.4.0
func (m *XIDSoftDeleteModel) BeforeUpdate(ctx context.Context, query *bun.UpdateQuery) error
BeforeUpdate hook - updates UpdatedAt
func (*XIDSoftDeleteModel) IsDeleted ¶ added in v0.4.0
func (m *XIDSoftDeleteModel) IsDeleted() bool
IsDeleted checks if the record is soft deleted
func (*XIDSoftDeleteModel) Restore ¶ added in v0.4.0
func (m *XIDSoftDeleteModel) Restore()
Restore restores a soft-deleted record