168 lines
4.8 KiB
Go
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
|
|
}
|