042a1d4773
* introduced central package registry by package init function * dynamic registration of routes, model, migrations and initializers. * setting a docker compose project name to prevent shutdown of other containers with the same (composer)name * ai documentation * app template * Create tests for ALL API entpoints in ALL packages Based on current data. Ensure that all API endpoints used in frontend are tested. These tests are crucial for the next refactoring tasks. * adopting agent instructions for a more consistent coding style * added desired module layout and debugging information * Fix All Failing tests All failing tests are fixed now that makes the refactoring more easy since all tests must pass * restored routes for maintenance * added common translations * added new tests for API Endpoint * Merge branch 'separate_business_logic' * added lern and skill improvement cost editing * Set Docker image tag when building to prevent rebuild when nothing has changed * add and remove PP for Weaponskill fixed * add and remove PP for same named skills fixed * add new task
608 lines
19 KiB
Go
608 lines
19 KiB
Go
package gsmaster
|
|
|
|
/*
|
|
|
|
import (
|
|
"bamort/database"
|
|
"bamort/bmrt/models"
|
|
"fmt"
|
|
"path/filepath"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// ExportSkillImprovementCosts exports all skill improvement costs to a JSON file
|
|
func ExportSkillImprovementCosts(outputDir string) error {
|
|
var costs []models.SkillImprovementCost
|
|
if err := database.DB.Find(&costs).Error; err != nil {
|
|
return fmt.Errorf("failed to fetch skill improvement costs: %w", err)
|
|
}
|
|
|
|
exportable := make([]ExportableSkillImprovementCost, 0, len(costs))
|
|
for _, cost := range costs {
|
|
// Resolve category and difficulty names
|
|
var lc models.SkillCategory
|
|
if err := database.DB.First(&lc, cost.CategoryID).Error; err != nil {
|
|
continue
|
|
}
|
|
var ld models.SkillDifficulty
|
|
if err := database.DB.First(&ld, cost.DifficultyID).Error; err != nil {
|
|
continue
|
|
}
|
|
// Find skill via learning_skill_category_difficulties
|
|
var scd models.SkillCategoryDifficulty
|
|
if err := database.DB.Where("skill_category = ? AND skill_difficulty = ?", lc.Name, ld.Name).First(&scd).Error; err != nil {
|
|
continue
|
|
}
|
|
var skill models.Skill
|
|
if err := database.DB.First(&skill, scd.SkillID).Error; err != nil {
|
|
continue
|
|
}
|
|
|
|
exportable = append(exportable, ExportableSkillImprovementCost{
|
|
SkillName: skill.Name,
|
|
SkillSystem: skill.GameSystem,
|
|
CategoryName: lc.Name,
|
|
CategorySystem: lc.GameSystem,
|
|
DifficultyName: ld.Name,
|
|
DifficultySystem: ld.GameSystem,
|
|
CurrentLevel: cost.CurrentLevel,
|
|
TERequired: cost.TERequired,
|
|
})
|
|
}
|
|
|
|
return writeJSON(filepath.Join(outputDir, "skill_improvement_costs.json"), exportable)
|
|
}
|
|
|
|
// ImportSkillImprovementCosts imports skill improvement costs from a JSON file
|
|
func ImportSkillImprovementCosts(inputDir string) error {
|
|
var exportable []ExportableSkillImprovementCost
|
|
if err := readJSON(filepath.Join(inputDir, "skill_improvement_costs.json"), &exportable); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Build lookup maps using helpers
|
|
skillMap := buildSkillMap()
|
|
categoryMap := buildCategoryMap()
|
|
difficultyMap := buildDifficultyMap()
|
|
|
|
for _, exp := range exportable {
|
|
// Find skill ID
|
|
skillID, ok := skillMap[exp.SkillSystem][exp.SkillName]
|
|
if !ok {
|
|
return fmt.Errorf("skill not found: %s (%s)", exp.SkillName, exp.SkillSystem)
|
|
}
|
|
|
|
// Find category ID
|
|
categoryID, ok := categoryMap[exp.CategorySystem][exp.CategoryName]
|
|
if !ok {
|
|
return fmt.Errorf("category not found: %s (%s)", exp.CategoryName, exp.CategorySystem)
|
|
}
|
|
|
|
// Find difficulty ID
|
|
difficultyID, ok := difficultyMap[exp.DifficultySystem][exp.DifficultyName]
|
|
if !ok {
|
|
return fmt.Errorf("difficulty not found: %s (%s)", exp.DifficultyName, exp.DifficultySystem)
|
|
}
|
|
|
|
// Find SkillCategoryDifficulty
|
|
var scd models.SkillCategoryDifficulty
|
|
if err := database.DB.Where("skill_id = ? AND skill_category_id = ? AND skill_difficulty_id = ?",
|
|
skillID, categoryID, difficultyID).First(&scd).Error; err != nil {
|
|
return fmt.Errorf("skill category difficulty not found for %s/%s/%s: %w",
|
|
exp.SkillName, exp.CategoryName, exp.DifficultyName, err)
|
|
}
|
|
|
|
// Find or create SkillImprovementCost using category/difficulty IDs
|
|
var cost models.SkillImprovementCost
|
|
result := database.DB.Where("skill_category_id = ? AND skill_difficulty_id = ? AND current_level = ?",
|
|
categoryID, difficultyID, exp.CurrentLevel).First(&cost)
|
|
|
|
if result.Error == gorm.ErrRecordNotFound {
|
|
cost = models.SkillImprovementCost{
|
|
CategoryID: categoryID,
|
|
DifficultyID: difficultyID,
|
|
CurrentLevel: exp.CurrentLevel,
|
|
TERequired: exp.TERequired,
|
|
}
|
|
if err := database.DB.Create(&cost).Error; err != nil {
|
|
return fmt.Errorf("failed to create skill improvement cost: %w", err)
|
|
}
|
|
} else if result.Error != nil {
|
|
return fmt.Errorf("failed to query skill improvement cost: %w", result.Error)
|
|
} else {
|
|
cost.TERequired = exp.TERequired
|
|
if err := database.DB.Save(&cost).Error; err != nil {
|
|
return fmt.Errorf("failed to update skill improvement cost: %w", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ExportWeaponSkills exports all weapon skills to a JSON file
|
|
func ExportWeaponSkills(outputDir string) error {
|
|
var skills []models.WeaponSkill
|
|
if err := database.DB.Find(&skills).Error; err != nil {
|
|
return fmt.Errorf("failed to fetch weapon skills: %w", err)
|
|
}
|
|
|
|
sourceMap := buildSourceMap()
|
|
|
|
exportable := make([]ExportableWeaponSkill, len(skills))
|
|
for i, skill := range skills {
|
|
exportable[i] = ExportableWeaponSkill{
|
|
Name: skill.Name,
|
|
GameSystem: skill.GameSystem,
|
|
Beschreibung: skill.Beschreibung,
|
|
SourceCode: sourceMap[skill.SourceID],
|
|
PageNumber: skill.PageNumber,
|
|
Initialwert: skill.Initialwert,
|
|
BasisWert: skill.BasisWert,
|
|
Bonuseigenschaft: skill.Bonuseigenschaft,
|
|
Improvable: skill.Improvable,
|
|
InnateSkill: skill.InnateSkill,
|
|
Category: skill.Category,
|
|
Difficulty: skill.Difficulty,
|
|
}
|
|
}
|
|
|
|
return writeJSON(filepath.Join(outputDir, "weapon_skills.json"), exportable)
|
|
}
|
|
|
|
// ImportWeaponSkills imports weapon skills from a JSON file
|
|
func ImportWeaponSkills(inputDir string) error {
|
|
var exportable []ExportableWeaponSkill
|
|
if err := readJSON(filepath.Join(inputDir, "weapon_skills.json"), &exportable); err != nil {
|
|
return err
|
|
}
|
|
|
|
sourceMap := buildSourceMapReverse()
|
|
|
|
for _, exp := range exportable {
|
|
var skill models.WeaponSkill
|
|
result := database.DB.Where("name = ? AND game_system = ?", exp.Name, exp.GameSystem).First(&skill)
|
|
|
|
sourceID := sourceMap[exp.SourceCode]
|
|
|
|
if result.Error == gorm.ErrRecordNotFound {
|
|
skill = models.WeaponSkill{
|
|
Skill: models.Skill{
|
|
Name: exp.Name,
|
|
GameSystem: exp.GameSystem,
|
|
Beschreibung: exp.Beschreibung,
|
|
SourceID: sourceID,
|
|
PageNumber: exp.PageNumber,
|
|
Initialwert: exp.Initialwert,
|
|
BasisWert: exp.BasisWert,
|
|
Bonuseigenschaft: exp.Bonuseigenschaft,
|
|
Improvable: exp.Improvable,
|
|
InnateSkill: exp.InnateSkill,
|
|
Category: exp.Category,
|
|
Difficulty: exp.Difficulty,
|
|
},
|
|
}
|
|
if err := database.DB.Create(&skill).Error; err != nil {
|
|
return fmt.Errorf("failed to create weapon skill %s: %w", exp.Name, err)
|
|
}
|
|
} else if result.Error != nil {
|
|
return fmt.Errorf("failed to query weapon skill %s: %w", exp.Name, result.Error)
|
|
} else {
|
|
skill.Beschreibung = exp.Beschreibung
|
|
skill.SourceID = sourceID
|
|
skill.PageNumber = exp.PageNumber
|
|
skill.Initialwert = exp.Initialwert
|
|
skill.BasisWert = exp.BasisWert
|
|
skill.Bonuseigenschaft = exp.Bonuseigenschaft
|
|
skill.Improvable = exp.Improvable
|
|
skill.InnateSkill = exp.InnateSkill
|
|
skill.Category = exp.Category
|
|
skill.Difficulty = exp.Difficulty
|
|
|
|
if err := database.DB.Save(&skill).Error; err != nil {
|
|
return fmt.Errorf("failed to update weapon skill %s: %w", exp.Name, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ExportEquipment exports all equipment to a JSON file
|
|
func ExportEquipment(outputDir string) error {
|
|
var equipment []models.Equipment
|
|
if err := database.DB.Find(&equipment).Error; err != nil {
|
|
return fmt.Errorf("failed to fetch equipment: %w", err)
|
|
}
|
|
|
|
sourceMap := buildSourceMap()
|
|
|
|
exportable := make([]ExportableEquipment, len(equipment))
|
|
for i, eq := range equipment {
|
|
exportable[i] = ExportableEquipment{
|
|
Name: eq.Name,
|
|
GameSystem: eq.GameSystem,
|
|
Beschreibung: eq.Beschreibung,
|
|
SourceCode: sourceMap[eq.SourceID],
|
|
PageNumber: eq.PageNumber,
|
|
Gewicht: eq.Gewicht,
|
|
Wert: eq.Wert,
|
|
PersonalItem: eq.PersonalItem,
|
|
}
|
|
}
|
|
|
|
return writeJSON(filepath.Join(outputDir, "equipment.json"), exportable)
|
|
}
|
|
|
|
// ImportEquipment imports equipment from a JSON file
|
|
func ImportEquipment(inputDir string) error {
|
|
var exportable []ExportableEquipment
|
|
if err := readJSON(filepath.Join(inputDir, "equipment.json"), &exportable); err != nil {
|
|
return err
|
|
}
|
|
|
|
sourceMap := buildSourceMapReverse()
|
|
|
|
for _, exp := range exportable {
|
|
var eq models.Equipment
|
|
result := database.DB.Where("name = ? AND game_system = ?", exp.Name, exp.GameSystem).First(&eq)
|
|
|
|
sourceID := sourceMap[exp.SourceCode]
|
|
|
|
if result.Error == gorm.ErrRecordNotFound {
|
|
eq = models.Equipment{
|
|
Name: exp.Name,
|
|
GameSystem: exp.GameSystem,
|
|
Beschreibung: exp.Beschreibung,
|
|
SourceID: sourceID,
|
|
PageNumber: exp.PageNumber,
|
|
Gewicht: exp.Gewicht,
|
|
Wert: exp.Wert,
|
|
PersonalItem: exp.PersonalItem,
|
|
}
|
|
if err := database.DB.Create(&eq).Error; err != nil {
|
|
return fmt.Errorf("failed to create equipment %s: %w", exp.Name, err)
|
|
}
|
|
} else if result.Error != nil {
|
|
return fmt.Errorf("failed to query equipment %s: %w", exp.Name, result.Error)
|
|
} else {
|
|
eq.Beschreibung = exp.Beschreibung
|
|
eq.SourceID = sourceID
|
|
eq.PageNumber = exp.PageNumber
|
|
eq.Gewicht = exp.Gewicht
|
|
eq.Wert = exp.Wert
|
|
eq.PersonalItem = exp.PersonalItem
|
|
|
|
if err := database.DB.Save(&eq).Error; err != nil {
|
|
return fmt.Errorf("failed to update equipment %s: %w", exp.Name, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ExportWeapons exports all weapons to a JSON file
|
|
func ExportWeapons(outputDir string) error {
|
|
var weapons []models.Weapon
|
|
if err := database.DB.Find(&weapons).Error; err != nil {
|
|
return fmt.Errorf("failed to fetch weapons: %w", err)
|
|
}
|
|
|
|
sourceMap := buildSourceMap()
|
|
|
|
exportable := make([]ExportableWeapon, len(weapons))
|
|
for i, weapon := range weapons {
|
|
exportable[i] = ExportableWeapon{
|
|
Name: weapon.Name,
|
|
GameSystem: weapon.GameSystem,
|
|
Beschreibung: weapon.Beschreibung,
|
|
SourceCode: sourceMap[weapon.SourceID],
|
|
PageNumber: weapon.PageNumber,
|
|
Gewicht: weapon.Gewicht,
|
|
Wert: weapon.Wert,
|
|
PersonalItem: weapon.PersonalItem,
|
|
SkillRequired: weapon.SkillRequired,
|
|
Damage: weapon.Damage,
|
|
RangeNear: weapon.RangeNear,
|
|
RangeMiddle: weapon.RangeMiddle,
|
|
RangeFar: weapon.RangeFar,
|
|
}
|
|
}
|
|
|
|
return writeJSON(filepath.Join(outputDir, "weapons.json"), exportable)
|
|
}
|
|
|
|
// ImportWeapons imports weapons from a JSON file
|
|
func ImportWeapons(inputDir string) error {
|
|
var exportable []ExportableWeapon
|
|
if err := readJSON(filepath.Join(inputDir, "weapons.json"), &exportable); err != nil {
|
|
return err
|
|
}
|
|
|
|
sourceMap := buildSourceMapReverse()
|
|
|
|
for _, exp := range exportable {
|
|
var weapon models.Weapon
|
|
result := database.DB.Where("name = ? AND game_system = ?", exp.Name, exp.GameSystem).First(&weapon)
|
|
|
|
sourceID := sourceMap[exp.SourceCode]
|
|
|
|
if result.Error == gorm.ErrRecordNotFound {
|
|
weapon = models.Weapon{
|
|
Equipment: models.Equipment{
|
|
Name: exp.Name,
|
|
GameSystem: exp.GameSystem,
|
|
Beschreibung: exp.Beschreibung,
|
|
SourceID: sourceID,
|
|
PageNumber: exp.PageNumber,
|
|
Gewicht: exp.Gewicht,
|
|
Wert: exp.Wert,
|
|
PersonalItem: exp.PersonalItem,
|
|
},
|
|
SkillRequired: exp.SkillRequired,
|
|
Damage: exp.Damage,
|
|
RangeNear: exp.RangeNear,
|
|
RangeMiddle: exp.RangeMiddle,
|
|
RangeFar: exp.RangeFar,
|
|
}
|
|
if err := database.DB.Create(&weapon).Error; err != nil {
|
|
return fmt.Errorf("failed to create weapon %s: %w", exp.Name, err)
|
|
}
|
|
} else if result.Error != nil {
|
|
return fmt.Errorf("failed to query weapon %s: %w", exp.Name, result.Error)
|
|
} else {
|
|
weapon.Beschreibung = exp.Beschreibung
|
|
weapon.SourceID = sourceID
|
|
weapon.PageNumber = exp.PageNumber
|
|
weapon.Gewicht = exp.Gewicht
|
|
weapon.Wert = exp.Wert
|
|
weapon.PersonalItem = exp.PersonalItem
|
|
weapon.SkillRequired = exp.SkillRequired
|
|
weapon.Damage = exp.Damage
|
|
weapon.RangeNear = exp.RangeNear
|
|
weapon.RangeMiddle = exp.RangeMiddle
|
|
weapon.RangeFar = exp.RangeFar
|
|
|
|
if err := database.DB.Save(&weapon).Error; err != nil {
|
|
return fmt.Errorf("failed to update weapon %s: %w", exp.Name, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ExportContainers exports all containers to a JSON file
|
|
func ExportContainers(outputDir string) error {
|
|
var containers []models.Container
|
|
if err := database.DB.Find(&containers).Error; err != nil {
|
|
return fmt.Errorf("failed to fetch containers: %w", err)
|
|
}
|
|
|
|
sourceMap := buildSourceMap()
|
|
|
|
exportable := make([]ExportableContainer, len(containers))
|
|
for i, container := range containers {
|
|
exportable[i] = ExportableContainer{
|
|
Name: container.Name,
|
|
GameSystem: container.GameSystem,
|
|
Beschreibung: container.Beschreibung,
|
|
SourceCode: sourceMap[container.SourceID],
|
|
PageNumber: container.PageNumber,
|
|
Gewicht: container.Gewicht,
|
|
Wert: container.Wert,
|
|
PersonalItem: container.PersonalItem,
|
|
Tragkraft: container.Tragkraft,
|
|
Volumen: container.Volumen,
|
|
}
|
|
}
|
|
|
|
return writeJSON(filepath.Join(outputDir, "containers.json"), exportable)
|
|
}
|
|
|
|
// ImportContainers imports containers from a JSON file
|
|
func ImportContainers(inputDir string) error {
|
|
var exportable []ExportableContainer
|
|
if err := readJSON(filepath.Join(inputDir, "containers.json"), &exportable); err != nil {
|
|
return err
|
|
}
|
|
|
|
sourceMap := buildSourceMapReverse()
|
|
|
|
for _, exp := range exportable {
|
|
var container models.Container
|
|
result := database.DB.Where("name = ? AND game_system = ?", exp.Name, exp.GameSystem).First(&container)
|
|
|
|
sourceID := sourceMap[exp.SourceCode]
|
|
|
|
if result.Error == gorm.ErrRecordNotFound {
|
|
container = models.Container{
|
|
Equipment: models.Equipment{
|
|
Name: exp.Name,
|
|
GameSystem: exp.GameSystem,
|
|
Beschreibung: exp.Beschreibung,
|
|
SourceID: sourceID,
|
|
PageNumber: exp.PageNumber,
|
|
Gewicht: exp.Gewicht,
|
|
Wert: exp.Wert,
|
|
PersonalItem: exp.PersonalItem,
|
|
},
|
|
Tragkraft: exp.Tragkraft,
|
|
Volumen: exp.Volumen,
|
|
}
|
|
if err := database.DB.Create(&container).Error; err != nil {
|
|
return fmt.Errorf("failed to create container %s: %w", exp.Name, err)
|
|
}
|
|
} else if result.Error != nil {
|
|
return fmt.Errorf("failed to query container %s: %w", exp.Name, result.Error)
|
|
} else {
|
|
container.Beschreibung = exp.Beschreibung
|
|
container.SourceID = sourceID
|
|
container.PageNumber = exp.PageNumber
|
|
container.Gewicht = exp.Gewicht
|
|
container.Wert = exp.Wert
|
|
container.PersonalItem = exp.PersonalItem
|
|
container.Tragkraft = exp.Tragkraft
|
|
container.Volumen = exp.Volumen
|
|
|
|
if err := database.DB.Save(&container).Error; err != nil {
|
|
return fmt.Errorf("failed to update container %s: %w", exp.Name, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ExportTransportation exports all transportation to a JSON file
|
|
func ExportTransportation(outputDir string) error {
|
|
var transportation []models.Transportation
|
|
if err := database.DB.Find(&transportation).Error; err != nil {
|
|
return fmt.Errorf("failed to fetch transportation: %w", err)
|
|
}
|
|
|
|
sourceMap := buildSourceMap()
|
|
|
|
exportable := make([]ExportableTransportation, len(transportation))
|
|
for i, trans := range transportation {
|
|
exportable[i] = ExportableTransportation{
|
|
Name: trans.Name,
|
|
GameSystem: trans.GameSystem,
|
|
Beschreibung: trans.Beschreibung,
|
|
SourceCode: sourceMap[trans.SourceID],
|
|
PageNumber: trans.PageNumber,
|
|
Gewicht: trans.Gewicht,
|
|
Wert: trans.Wert,
|
|
PersonalItem: trans.PersonalItem,
|
|
Tragkraft: trans.Tragkraft,
|
|
Volumen: trans.Volumen,
|
|
}
|
|
}
|
|
|
|
return writeJSON(filepath.Join(outputDir, "transportation.json"), exportable)
|
|
}
|
|
|
|
// ImportTransportation imports transportation from a JSON file
|
|
func ImportTransportation(inputDir string) error {
|
|
var exportable []ExportableTransportation
|
|
if err := readJSON(filepath.Join(inputDir, "transportation.json"), &exportable); err != nil {
|
|
return err
|
|
}
|
|
|
|
sourceMap := buildSourceMapReverse()
|
|
|
|
for _, exp := range exportable {
|
|
var trans models.Transportation
|
|
result := database.DB.Where("name = ? AND game_system = ?", exp.Name, exp.GameSystem).First(&trans)
|
|
|
|
sourceID := sourceMap[exp.SourceCode]
|
|
|
|
if result.Error == gorm.ErrRecordNotFound {
|
|
trans = models.Transportation{
|
|
Container: models.Container{
|
|
Equipment: models.Equipment{
|
|
Name: exp.Name,
|
|
GameSystem: exp.GameSystem,
|
|
Beschreibung: exp.Beschreibung,
|
|
SourceID: sourceID,
|
|
PageNumber: exp.PageNumber,
|
|
Gewicht: exp.Gewicht,
|
|
Wert: exp.Wert,
|
|
PersonalItem: exp.PersonalItem,
|
|
},
|
|
Tragkraft: exp.Tragkraft,
|
|
Volumen: exp.Volumen,
|
|
},
|
|
}
|
|
if err := database.DB.Create(&trans).Error; err != nil {
|
|
return fmt.Errorf("failed to create transportation %s: %w", exp.Name, err)
|
|
}
|
|
} else if result.Error != nil {
|
|
return fmt.Errorf("failed to query transportation %s: %w", exp.Name, result.Error)
|
|
} else {
|
|
trans.Beschreibung = exp.Beschreibung
|
|
trans.SourceID = sourceID
|
|
trans.PageNumber = exp.PageNumber
|
|
trans.Gewicht = exp.Gewicht
|
|
trans.Wert = exp.Wert
|
|
trans.PersonalItem = exp.PersonalItem
|
|
trans.Tragkraft = exp.Tragkraft
|
|
trans.Volumen = exp.Volumen
|
|
|
|
if err := database.DB.Save(&trans).Error; err != nil {
|
|
return fmt.Errorf("failed to update transportation %s: %w", exp.Name, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ExportBelieves exports all beliefs to a JSON file
|
|
func ExportBelieves(outputDir string) error {
|
|
var believes []models.Believe
|
|
if err := database.DB.Find(&believes).Error; err != nil {
|
|
return fmt.Errorf("failed to fetch believes: %w", err)
|
|
}
|
|
|
|
sourceMap := buildSourceMap()
|
|
|
|
exportable := make([]ExportableBelieve, len(believes))
|
|
for i, believe := range believes {
|
|
exportable[i] = ExportableBelieve{
|
|
Name: believe.Name,
|
|
GameSystem: believe.GameSystem,
|
|
Beschreibung: believe.Beschreibung,
|
|
SourceCode: sourceMap[believe.SourceID],
|
|
PageNumber: believe.PageNumber,
|
|
}
|
|
}
|
|
|
|
return writeJSON(filepath.Join(outputDir, "believes.json"), exportable)
|
|
}
|
|
|
|
// ImportBelieves imports believes from a JSON file
|
|
func ImportBelieves(inputDir string) error {
|
|
var exportable []ExportableBelieve
|
|
if err := readJSON(filepath.Join(inputDir, "believes.json"), &exportable); err != nil {
|
|
return err
|
|
}
|
|
|
|
sourceMap := buildSourceMapReverse()
|
|
|
|
for _, exp := range exportable {
|
|
var believe models.Believe
|
|
result := database.DB.Where("name = ? AND game_system = ?", exp.Name, exp.GameSystem).First(&believe)
|
|
|
|
sourceID := sourceMap[exp.SourceCode]
|
|
|
|
if result.Error == gorm.ErrRecordNotFound {
|
|
believe = models.Believe{
|
|
Name: exp.Name,
|
|
GameSystem: exp.GameSystem,
|
|
Beschreibung: exp.Beschreibung,
|
|
SourceID: sourceID,
|
|
PageNumber: exp.PageNumber,
|
|
}
|
|
if err := database.DB.Create(&believe).Error; err != nil {
|
|
return fmt.Errorf("failed to create believe %s: %w", exp.Name, err)
|
|
}
|
|
} else if result.Error != nil {
|
|
return fmt.Errorf("failed to query believe %s: %w", exp.Name, result.Error)
|
|
} else {
|
|
believe.Beschreibung = exp.Beschreibung
|
|
believe.SourceID = sourceID
|
|
believe.PageNumber = exp.PageNumber
|
|
|
|
if err := database.DB.Save(&believe).Error; err != nil {
|
|
return fmt.Errorf("failed to update believe %s: %w", exp.Name, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
*/
|