medol-be/app/database/index.database.go

148 lines
3.5 KiB
Go
Raw Normal View History

2024-03-05 19:15:53 +00:00
package database
import (
"web-medols-be/app/database/entity"
"web-medols-be/app/database/entity/article_category_details"
"web-medols-be/config/config"
2024-03-05 19:15:53 +00:00
"github.com/rs/zerolog"
"gorm.io/driver/postgres"
"gorm.io/gorm"
2025-02-15 10:23:39 +00:00
"gorm.io/gorm/logger"
2024-03-05 19:15:53 +00:00
)
// Database setup database with gorm
type Database struct {
DB *gorm.DB
Log zerolog.Logger
Cfg *config.Config
}
type Seeder interface {
Seed(*gorm.DB) error
Count(*gorm.DB) (int, error)
}
func NewDatabase(cfg *config.Config, log zerolog.Logger) *Database {
db := &Database{
Cfg: cfg,
Log: log,
}
return db
}
// ConnectDatabase connect database
func (_db *Database) ConnectDatabase() {
2025-02-15 10:23:39 +00:00
logMode := _db.Cfg.DB.Postgres.LogMode
var logLevel logger.LogLevel
if logMode == "INFO" {
logLevel = logger.Info
} else if logMode == "WARN" {
logLevel = logger.Warn
} else if logMode == "ERROR" {
logLevel = logger.Error
} else if logMode == "NONE" {
logLevel = logger.Silent
}
conn, err := gorm.Open(postgres.Open(_db.Cfg.DB.Postgres.DSN), &gorm.Config{
Logger: logger.Default.LogMode(logLevel),
})
2024-03-05 19:15:53 +00:00
if err != nil {
_db.Log.Error().Err(err).Msg("An unknown error occurred when to connect the database!")
} else {
_db.Log.Info().Msg("Connected the database succesfully!")
}
_db.DB = conn
}
// ShutdownDatabase shutdown database
func (_db *Database) ShutdownDatabase() {
sqlDB, err := _db.DB.DB()
if err != nil {
_db.Log.Error().Err(err).Msg("An unknown error occurred when to shutdown the database!")
} else {
_db.Log.Info().Msg("Shutdown the database succesfully!")
}
sqlDB.Close()
}
// MigrateModels migrate models
func (_db *Database) MigrateModels() {
err := _db.DB.AutoMigrate(
Models()...,
)
if err != nil {
_db.Log.Error().Err(err).Msg("An unknown error occurred when to migrate the database!")
} else {
_db.Log.Info().Msg("Migrate the database entity succesfully!")
}
}
// Models list of models for migration
func Models() []interface{} {
return []interface{}{
2025-02-07 04:07:13 +00:00
entity.ActivityLogs{},
entity.ActivityLogTypes{},
2025-03-11 07:52:11 +00:00
entity.Advertisement{},
entity.ApprovalWorkflows{},
entity.ApprovalWorkflowSteps{},
2024-03-29 16:33:52 +00:00
entity.Articles{},
entity.ArticleApprovalFlows{},
entity.ArticleApprovalStepLogs{},
2024-03-05 19:15:53 +00:00
entity.ArticleCategories{},
2025-02-17 14:02:17 +00:00
entity.ArticleApprovals{},
2025-01-20 09:30:39 +00:00
article_category_details.ArticleCategoryDetails{},
2024-03-05 19:15:53 +00:00
entity.ArticleFiles{},
entity.ArticleComments{},
2024-11-22 15:58:15 +00:00
entity.ArticleNulisAI{},
entity.AuditTrails{},
2025-09-16 18:21:27 +00:00
entity.Bookmarks{},
2024-03-05 19:15:53 +00:00
entity.Cities{},
2025-07-02 06:03:52 +00:00
entity.Clients{},
entity.ClientApprovalSettings{},
2025-04-09 21:28:46 +00:00
entity.CsrfTokenRecords{},
2024-11-22 04:14:14 +00:00
entity.CustomStaticPages{},
2024-03-05 19:15:53 +00:00
entity.Districts{},
entity.Feedbacks{},
entity.ForgotPasswords{},
2024-03-05 19:15:53 +00:00
entity.Magazines{},
entity.MagazineFiles{},
entity.MasterMenus{},
entity.MasterModules{},
entity.MasterStatuses{},
2024-05-05 14:55:06 +00:00
entity.MasterApprovalStatuses{},
2024-03-05 19:15:53 +00:00
entity.Provinces{},
entity.OneTimePasswords{},
entity.Subscription{},
2024-03-05 19:15:53 +00:00
entity.UserLevels{},
entity.UserRoles{},
entity.UserRoleAccesses{},
entity.Users{},
entity.UserRoleLevelDetails{},
2024-03-05 19:15:53 +00:00
}
}
// SeedModels seed data
func (_db *Database) SeedModels(seeder []Seeder) {
for _, seed := range seeder {
count, err := seed.Count(_db.DB)
if err != nil {
_db.Log.Error().Err(err).Msg("An unknown error occurred when to seed the database!")
}
if count == 0 {
if err := seed.Seed(_db.DB); err != nil {
_db.Log.Error().Err(err).Msg("An unknown error occurred when to seed the database!")
}
_db.Log.Info().Msg("Seeded the database successfully!")
} else {
_db.Log.Info().Msg("Database is already seeded!")
}
}
_db.Log.Info().Msg("Seeded the database succesfully!")
}