mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-03 18:22:57 +00:00
221 lines
4.8 KiB
Go
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
|
|
}
|