DB creates an instance of gorm.DB if it has not been created already
()
| 333 | |
| 334 | // DB creates an instance of gorm.DB if it has not been created already |
| 335 | func (container *Container) DB() (db *gorm.DB) { |
| 336 | if container.db != nil { |
| 337 | return container.db |
| 338 | } |
| 339 | |
| 340 | container.logger.Debug(fmt.Sprintf("creating %T", db)) |
| 341 | |
| 342 | config := &gorm.Config{ |
| 343 | TranslateError: true, |
| 344 | Logger: container.GormLogger(), |
| 345 | } |
| 346 | |
| 347 | db, err := gorm.Open(postgres.Open(os.Getenv("DATABASE_URL")), config) |
| 348 | if err != nil { |
| 349 | container.logger.Fatal(err) |
| 350 | } |
| 351 | container.db = db |
| 352 | |
| 353 | if err = db.Use(tracing.NewPlugin()); err != nil { |
| 354 | container.logger.Fatal(stacktrace.Propagate(err, "cannot use GORM tracing plugin")) |
| 355 | } |
| 356 | |
| 357 | if os.Getenv("DATABASE_MIGRATION_SKIP") != "" { |
| 358 | container.logger.Debug(fmt.Sprintf("skipping migrations for [%T]", db)) |
| 359 | return container.db |
| 360 | } |
| 361 | |
| 362 | container.logger.Debug(fmt.Sprintf("Running migrations for %T", db)) |
| 363 | |
| 364 | // This prevents a bug in the Gorm AutoMigrate where it tries to delete this no existent constraints |
| 365 | // This is only applicable to PROD on cockroachDB |
| 366 | if os.Getenv("DATABASE_MIGRATION_CONSTRAINT_FIX") == "1" { |
| 367 | db.Exec(` |
| 368 | ALTER TABLE users ADD CONSTRAINT IF NOT EXISTS uni_users_api_key CHECK (api_key IS NOT NULL); |
| 369 | ALTER TABLE phone_api_keys ADD CONSTRAINT IF NOT EXISTS uni_phone_api_keys_api_key CHECK (api_key IS NOT NULL); |
| 370 | ALTER TABLE discords ADD CONSTRAINT IF NOT EXISTS uni_discords_server_id CHECK (server_id IS NOT NULL);`) |
| 371 | } |
| 372 | |
| 373 | if err = db.AutoMigrate(&entities.Message{}); err != nil { |
| 374 | container.logger.Fatal(stacktrace.Propagate(err, fmt.Sprintf("cannot migrate %T", &entities.Message{}))) |
| 375 | } |
| 376 | |
| 377 | if err = db.AutoMigrate(&entities.MessageThread{}); err != nil { |
| 378 | container.logger.Fatal(stacktrace.Propagate(err, fmt.Sprintf("cannot migrate %T", &entities.MessageThread{}))) |
| 379 | } |
| 380 | |
| 381 | if err = db.AutoMigrate(&entities.User{}); err != nil { |
| 382 | container.logger.Fatal(stacktrace.Propagate(err, fmt.Sprintf("cannot migrate %T", &entities.User{}))) |
| 383 | } |
| 384 | |
| 385 | if err = db.AutoMigrate(&entities.MessageSendSchedule{}); err != nil { |
| 386 | container.logger.Fatal(stacktrace.Propagate(err, fmt.Sprintf("cannot migrate %T", &entities.MessageSendSchedule{}))) |
| 387 | } |
| 388 | |
| 389 | if err = db.AutoMigrate(&entities.Phone{}); err != nil { |
| 390 | container.logger.Fatal(stacktrace.Propagate(err, fmt.Sprintf("cannot migrate %T", &entities.Phone{}))) |
| 391 | } |
| 392 |
no test coverage detected