package database import ( "context" "fmt" "git.siteworxpro.com/packages/go/utilities/Env" "git.siteworxpro.com/reloading-manager/backend/models/bullets" "git.siteworxpro.com/reloading-manager/backend/models/loads" "git.siteworxpro.com/reloading-manager/backend/models/manufacturer" "git.siteworxpro.com/reloading-manager/backend/models/powder" "git.siteworxpro.com/reloading-manager/backend/models/primers" "github.com/jackc/pgx/v5" "log" ) const ( DbHost Env.EnvironmentVariable = "DB_HOST" DbDatabase Env.EnvironmentVariable = "DB_DATABASE" DbUser Env.EnvironmentVariable = "DB_USER" DbPassword Env.EnvironmentVariable = "DB_PASSWORD" ) type contextKeyType string const dbContextKey contextKeyType = "dbcontext" type Database struct { Db *pgx.Conn connected bool databaseName string Bullets *bullets.Queries Manufacturer *manufacturer.Queries Powder *powder.Queries Primer *primers.Queries Loads *loads.Queries } func (*Database) DSN(hidePassword bool) string { dbHost := DbHost.GetEnvString("localhost") dbDatabase := DbDatabase.GetEnvString("loading") dbUser := DbUser.GetEnvString("postgres") dbPassword := DbPassword.GetEnvString("password") extraParams := "?sslmode=require" if dbHost == "localhost" || dbHost == "127.0.0.1" { extraParams = "?sslmode=disable" } if hidePassword { dbPassword = "********" } return fmt.Sprintf("postgres://%s:%s@%s:5432/%s%s", dbUser, dbPassword, dbHost, dbDatabase, extraParams) } func NewWithContext(ctx context.Context) context.Context { db := GetNewDatabase() return context.WithValue(ctx, dbContextKey, db) } func NewFromContext(ctx context.Context) *Database { if ok := ctx.Value(dbContextKey); ok != nil { return ctx.Value(dbContextKey).(*Database) } return nil } func WithContext(ctx context.Context, database *Database) context.Context { return context.WithValue(ctx, dbContextKey, database) } func GetNewDatabase() *Database { var dbSingleton Database conn, dbErr := pgx.Connect(context.Background(), dbSingleton.DSN(false)) if dbErr != nil { log.Fatal(dbErr) } dbSingleton.Db = conn dbSingleton.connected = true dbSingleton.databaseName = DbDatabase.GetEnvString("loading") dbSingleton.Bullets = bullets.New(dbSingleton.Db) dbSingleton.Manufacturer = manufacturer.New(dbSingleton.Db) dbSingleton.Powder = powder.New(dbSingleton.Db) dbSingleton.Primer = primers.New(dbSingleton.Db) dbSingleton.Loads = loads.New(dbSingleton.Db) return &dbSingleton }