Files
bamort/backend/gsmaster/export_import_helpers.go
T

168 lines
4.8 KiB
Go

package gsmaster
import (
"bamort/database"
"bamort/models"
"fmt"
"gorm.io/gorm"
)
// LookupMap builders - reusable functions to build ID<->Code/Name maps
// buildSourceMap creates a map from source ID to source code
func buildSourceMap() map[uint]string {
var sources []models.Source
database.DB.Find(&sources)
sourceMap := make(map[uint]string)
for _, s := range sources {
sourceMap[s.ID] = s.Code
}
return sourceMap
}
// buildSourceMapReverse creates a map from source code to source ID
func buildSourceMapReverse() map[string]uint {
var sources []models.Source
database.DB.Find(&sources)
sourceMap := make(map[string]uint)
for _, s := range sources {
sourceMap[s.Code] = s.ID
}
return sourceMap
}
// buildCategoryMap creates a nested map: game_system -> name -> id
func buildCategoryMap() map[string]map[string]uint {
var categories []models.SkillCategory
database.DB.Find(&categories)
categoryMap := make(map[string]map[string]uint)
for _, c := range categories {
if categoryMap[c.GameSystem] == nil {
categoryMap[c.GameSystem] = make(map[string]uint)
}
categoryMap[c.GameSystem][c.Name] = c.ID
}
return categoryMap
}
// buildDifficultyMap creates a nested map: game_system -> name -> id
func buildDifficultyMap() map[string]map[string]uint {
var difficulties []models.SkillDifficulty
database.DB.Find(&difficulties)
difficultyMap := make(map[string]map[string]uint)
for _, d := range difficulties {
if difficultyMap[d.GameSystem] == nil {
difficultyMap[d.GameSystem] = make(map[string]uint)
}
difficultyMap[d.GameSystem][d.Name] = d.ID
}
return difficultyMap
}
// buildCharacterClassMap creates a map from character class code to ID
func buildCharacterClassMap() map[string]uint {
var classes []models.CharacterClass
database.DB.Find(&classes)
classMap := make(map[string]uint)
for _, c := range classes {
classMap[c.Code] = c.ID
}
return classMap
}
// buildSpellSchoolMap creates a nested map: game_system -> name -> id
func buildSpellSchoolMap() map[string]map[string]uint {
var schools []models.SpellSchool
database.DB.Find(&schools)
schoolMap := make(map[string]map[string]uint)
for _, s := range schools {
if schoolMap[s.GameSystem] == nil {
schoolMap[s.GameSystem] = make(map[string]uint)
}
schoolMap[s.GameSystem][s.Name] = s.ID
}
return schoolMap
}
// buildSkillMap creates a nested map: game_system -> name -> id
func buildSkillMap() map[string]map[string]uint {
var skills []models.Skill
database.DB.Find(&skills)
skillMap := make(map[string]map[string]uint)
for _, s := range skills {
if skillMap[s.GameSystem] == nil {
skillMap[s.GameSystem] = make(map[string]uint)
}
skillMap[s.GameSystem][s.Name] = s.ID
}
return skillMap
}
// buildWeaponSkillMap creates a nested map: game_system -> name -> id
func buildWeaponSkillMap() map[string]map[string]uint {
var weaponSkills []models.WeaponSkill
database.DB.Find(&weaponSkills)
weaponSkillMap := make(map[string]map[string]uint)
for _, ws := range weaponSkills {
if weaponSkillMap[ws.GameSystem] == nil {
weaponSkillMap[ws.GameSystem] = make(map[string]uint)
}
weaponSkillMap[ws.GameSystem][ws.Name] = ws.ID
}
return weaponSkillMap
}
// Generic import helper for entities with name + game_system natural key
type ImportConfig struct {
EntityName string // For error messages, e.g., "skill category"
}
// findOrCreateByNameAndSystem is a helper for import operations
// It looks up an entity by name and game_system, creates if not found
func findOrCreateByNameAndSystem(
name string,
gameSystem string,
model interface{},
entityName string,
) error {
result := database.DB.Where("name = ? AND game_system = ?", name, gameSystem).First(model)
if result.Error == gorm.ErrRecordNotFound {
if err := database.DB.Create(model).Error; err != nil {
return fmt.Errorf("failed to create %s %s: %w", entityName, name, err)
}
} else if result.Error != nil {
return fmt.Errorf("failed to query %s %s: %w", entityName, name, result.Error)
} else {
if err := database.DB.Save(model).Error; err != nil {
return fmt.Errorf("failed to update %s %s: %w", entityName, name, err)
}
}
return nil
}
// findOrCreateByCode is a helper for import operations with code as natural key
func findOrCreateByCode(
code string,
model interface{},
entityName string,
) error {
result := database.DB.Where("code = ?", code).First(model)
if result.Error == gorm.ErrRecordNotFound {
if err := database.DB.Create(model).Error; err != nil {
return fmt.Errorf("failed to create %s %s: %w", entityName, code, err)
}
} else if result.Error != nil {
return fmt.Errorf("failed to query %s %s: %w", entityName, code, result.Error)
} else {
if err := database.DB.Save(model).Error; err != nil {
return fmt.Errorf("failed to update %s %s: %w", entityName, code, err)
}
}
return nil
}