Files
MyClub/database/migrate.go
T
Tomas Dvorak dfc079288f hot fix #1
2026-01-26 08:13:18 +01:00

221 lines
4.8 KiB
Go

package database
import (
"log"
"fotbal-club/internal/models"
"fotbal-club/pkg/utils"
"gorm.io/gorm"
)
// MigrateDB runs database migrations
func MigrateDB(db *gorm.DB) error {
// Enable UUID extension
err := db.Exec(`
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
`).Error
if err != nil {
return err
}
// Drop existing tables if they exist
err = db.Migrator().DropTable(
&models.User{},
&models.Article{},
&models.Category{},
&models.Team{},
&models.Player{},
&models.Sponsor{},
&models.Settings{},
&models.MatchOverride{},
&models.TeamLogoOverride{},
&models.ContactMessage{},
&models.PasswordReset{},
&models.ArticleMatchLink{},
&models.ScoreboardState{},
&models.ContactCategory{},
&models.Contact{},
&models.PageElementConfig{},
&models.Invoice{},
&models.InvoiceItem{},
&models.InvoicePayment{},
&models.InvoiceCustomer{},
&models.InvoiceSettings{},
&models.InvoiceSequence{},
&models.InvoiceTemplate{},
)
if err != nil {
return err
}
// Auto migrate all models
err = db.AutoMigrate(
&models.User{},
&models.Article{},
&models.Category{},
&models.Team{},
&models.Player{},
&models.Sponsor{},
&models.Settings{},
&models.MatchOverride{},
&models.TeamLogoOverride{},
&models.ContactMessage{},
&models.PasswordReset{},
&models.ArticleMatchLink{},
&models.ScoreboardState{},
&models.ContactCategory{},
&models.Contact{},
&models.PageElementConfig{},
&models.Invoice{},
&models.InvoiceItem{},
&models.InvoicePayment{},
&models.InvoiceCustomer{},
&models.InvoiceSettings{},
&models.InvoiceSequence{},
&models.InvoiceTemplate{},
)
if err != nil {
return err
}
// Add indexes
err = db.Exec(`
CREATE INDEX IF NOT EXISTS idx_users_email ON users (email);
CREATE INDEX IF NOT EXISTS idx_articles_category_id ON articles (category_id);
CREATE INDEX IF NOT EXISTS idx_articles_author_id ON articles (author_id);
CREATE INDEX IF NOT EXISTS idx_password_resets_user_id ON password_resets (user_id);
CREATE UNIQUE INDEX IF NOT EXISTS ux_password_resets_token ON password_resets (token);
`).Error
if err != nil {
return err
}
log.Println("Database migration completed successfully")
return nil
}
// SeedDB populates the database with initial data
func SeedDB(db *gorm.DB) error {
// Check if we already have data
var count int64
db.Model(&models.User{}).Count(&count)
if count > 0 {
log.Println("Database already seeded, skipping...")
return nil
}
// Hash the admin password
hashedPassword, err := utils.HashPassword("admin123")
if err != nil {
return err
}
// Create default admin user
admin := models.User{
Email: "admin@fotbalclub.cz",
Password: hashedPassword,
FirstName: "Admin",
LastName: "User",
Role: "admin",
}
if err := db.Create(&admin).Error; err != nil {
return err
}
// Create default test user
hashedPassword, err = utils.HashPassword("user123")
if err != nil {
return err
}
user := models.User{
Email: "user@fotbalclub.cz",
Password: hashedPassword,
FirstName: "Test",
LastName: "User",
Role: "user",
}
if err := db.Create(&user).Error; err != nil {
return err
}
// Create default categories
categories := []models.Category{
{Name: "Novinky", Description: "Aktuální novinky z klubu"},
{Name: "Zápasy", Description: "Zápasy a výsledky"},
{Name: "Tabulka", Description: "Soutěžní tabulka"},
{Name: "Tiskové zprávy", Description: "Oficiální tiskové zprávy"},
}
for _, category := range categories {
if err := db.FirstOrCreate(&category, models.Category{Name: category.Name}).Error; err != nil {
return err
}
}
// Create sample team
team := models.Team{
Name: "FK Fotbal Club",
ShortName: "FKFC",
Description: "Hlavní tým FK Fotbal Clubu",
IsActive: true,
}
if err := db.Create(&team).Error; err != nil {
return err
}
// Create sample players
players := []models.Player{
{
FirstName: "Jan",
LastName: "Novák",
Position: "Brankář",
JerseyNumber: 1,
TeamID: team.ID,
IsActive: true,
},
{
FirstName: "Petr",
LastName: "Svoboda",
Position: "Obránce",
JerseyNumber: 5,
TeamID: team.ID,
IsActive: true,
},
}
for _, player := range players {
if err := db.Create(&player).Error; err != nil {
return err
}
}
// Create sample sponsors
sponsors := []models.Sponsor{
{
Name: "Hlavní partner",
WebsiteURL: "https://example.com",
IsActive: true,
},
{
Name: "Oficiální výstroj",
WebsiteURL: "https://sportovni-vyrobce.cz",
IsActive: true,
},
}
for _, sponsor := range sponsors {
if err := db.Create(&sponsor).Error; err != nil {
return err
}
}
log.Println("Database seeding completed successfully")
return nil
}