added import and export of gsmaster data
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
package gsmaster
|
||||
|
||||
import (
|
||||
"bamort/database"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
// ExportData represents the combined data to be exported
|
||||
type exportData struct {
|
||||
Skills []Skill `json:"skills"`
|
||||
WeaponSkills []WeaponSkill `json:"weapon_skills"`
|
||||
Spells []Spell `json:"spells"`
|
||||
Equipments []Equipment `json:"equipments"`
|
||||
Weapons []Weapon `json:"weapons"`
|
||||
Containers []Container `json:"containers"`
|
||||
Transportations []Transportation `json:"transportations"`
|
||||
Believes []Believe `json:"believes"`
|
||||
}
|
||||
|
||||
func Export(filePath string) error {
|
||||
var skills []Skill
|
||||
var weaponSkills []WeaponSkill
|
||||
var spells []Spell
|
||||
var equipments []Equipment
|
||||
var weapons []Weapon
|
||||
var containers []Container
|
||||
var transportations []Transportation
|
||||
var believes []Believe
|
||||
|
||||
// Fetch all data from the respective tables
|
||||
if err := database.DB.Find(&skills).Error; err != nil {
|
||||
return fmt.Errorf("failed to retrieve equipment: %w", err)
|
||||
}
|
||||
if err := database.DB.Find(&weaponSkills).Error; err != nil {
|
||||
return fmt.Errorf("failed to retrieve equipment: %w", err)
|
||||
}
|
||||
if err := database.DB.Find(&spells).Error; err != nil {
|
||||
return fmt.Errorf("failed to retrieve equipment: %w", err)
|
||||
}
|
||||
if err := database.DB.Find(&equipments).Error; err != nil {
|
||||
return fmt.Errorf("failed to retrieve equipment: %w", err)
|
||||
}
|
||||
if err := database.DB.Find(&weapons).Error; err != nil {
|
||||
return fmt.Errorf("failed to retrieve equipment: %w", err)
|
||||
}
|
||||
if err := database.DB.Find(&containers).Error; err != nil {
|
||||
return fmt.Errorf("failed to retrieve equipment: %w", err)
|
||||
}
|
||||
if err := database.DB.Find(&transportations).Error; err != nil {
|
||||
return fmt.Errorf("failed to retrieve equipment: %w", err)
|
||||
}
|
||||
if err := database.DB.Find(&believes).Error; err != nil {
|
||||
return fmt.Errorf("failed to retrieve equipment: %w", err)
|
||||
}
|
||||
|
||||
// Combine the data into a single structure
|
||||
exportData := exportData{
|
||||
Skills: skills,
|
||||
WeaponSkills: weaponSkills,
|
||||
Spells: spells,
|
||||
Equipments: equipments,
|
||||
Weapons: weapons,
|
||||
Containers: containers,
|
||||
Transportations: transportations,
|
||||
Believes: believes,
|
||||
}
|
||||
|
||||
// Create the JSON file for writing
|
||||
file, err := os.Create(filePath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create JSON file: %w", err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// Write the combined data as JSON
|
||||
encoder := json.NewEncoder(file)
|
||||
encoder.SetIndent("", " ") // Pretty-print the JSON
|
||||
if err := encoder.Encode(exportData); err != nil {
|
||||
return fmt.Errorf("failed to write JSON: %w", err)
|
||||
}
|
||||
|
||||
fmt.Printf("Data exported to %s successfully\n", filePath)
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
// ReimportFromJSON reads a JSON file and reimports the data into the database
|
||||
func Import(filePath string) error {
|
||||
|
||||
// Open the JSON file
|
||||
file, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to open JSON file: %w", err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// Decode the JSON file into the ExportData structure
|
||||
var data exportData
|
||||
decoder := json.NewDecoder(file)
|
||||
if err := decoder.Decode(&data); err != nil {
|
||||
return fmt.Errorf("failed to decode JSON file: %w", err)
|
||||
}
|
||||
|
||||
// Save the data back to the database
|
||||
if len(data.Skills) > 0 {
|
||||
if err := database.DB.Clauses(clause.OnConflict{
|
||||
UpdateAll: true, // Update all fields if there's a conflict
|
||||
}).Create(&data.Skills).Error; err != nil {
|
||||
return fmt.Errorf("failed to reimport skills: %w", err)
|
||||
}
|
||||
}
|
||||
if len(data.WeaponSkills) > 0 {
|
||||
if err := database.DB.Clauses(clause.OnConflict{
|
||||
UpdateAll: true, // Update all fields if there's a conflict
|
||||
}).Create(&data.WeaponSkills).Error; err != nil {
|
||||
return fmt.Errorf("failed to reimport WeaponSkills: %w", err)
|
||||
}
|
||||
}
|
||||
if len(data.Spells) > 0 {
|
||||
if err := database.DB.Create(&data.Spells).Error; err != nil {
|
||||
return fmt.Errorf("failed to reimport Spells: %w", err)
|
||||
}
|
||||
}
|
||||
if len(data.Equipments) > 0 {
|
||||
if err := database.DB.Clauses(clause.OnConflict{
|
||||
UpdateAll: true, // Update all fields if there's a conflict
|
||||
}).Create(&data.Equipments).Error; err != nil {
|
||||
return fmt.Errorf("failed to reimport equipment: %w", err)
|
||||
}
|
||||
}
|
||||
if len(data.Weapons) > 0 {
|
||||
if err := database.DB.Clauses(clause.OnConflict{
|
||||
UpdateAll: true, // Update all fields if there's a conflict
|
||||
}).Create(&data.Weapons).Error; err != nil {
|
||||
return fmt.Errorf("failed to reimport Weapons: %w", err)
|
||||
}
|
||||
}
|
||||
if len(data.Containers) > 0 {
|
||||
if err := database.DB.Clauses(clause.OnConflict{
|
||||
UpdateAll: true, // Update all fields if there's a conflict
|
||||
}).Create(&data.Containers).Error; err != nil {
|
||||
return fmt.Errorf("failed to reimport Containers: %w", err)
|
||||
}
|
||||
}
|
||||
if len(data.Transportations) > 0 {
|
||||
if err := database.DB.Clauses(clause.OnConflict{
|
||||
UpdateAll: true, // Update all fields if there's a conflict
|
||||
}).Create(&data.Transportations).Error; err != nil {
|
||||
return fmt.Errorf("failed to reimport Transportations: %w", err)
|
||||
}
|
||||
}
|
||||
if len(data.Believes) > 0 {
|
||||
if err := database.DB.Clauses(clause.OnConflict{
|
||||
UpdateAll: true, // Update all fields if there's a conflict
|
||||
}).Create(&data.Believes).Error; err != nil {
|
||||
return fmt.Errorf("failed to reimport Believes: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Printf("Data imported from %s successfully\n", filePath)
|
||||
return nil
|
||||
|
||||
}
|
||||
@@ -404,3 +404,46 @@ func (object *Transportation) Save() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (stamm *Believe) Create() error {
|
||||
gameSystem := "midgard"
|
||||
stamm.System = gameSystem
|
||||
err := database.DB.Transaction(func(tx *gorm.DB) error {
|
||||
// Save the main character record
|
||||
if err := tx.Create(&stamm).Error; err != nil {
|
||||
return fmt.Errorf("failed to save Lookup: %w", err)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (object *Believe) FirstId(value uint) error {
|
||||
gameSystem := "midgard"
|
||||
err := database.DB.First(&object, "system=? AND id = ?", gameSystem, value).Error
|
||||
if err != nil {
|
||||
// zauber found
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (stamm *Believe) First(name string) error {
|
||||
gameSystem := "midgard"
|
||||
err := database.DB.First(&stamm, "system=? AND name = ?", gameSystem, name).Error
|
||||
if err != nil {
|
||||
// zauber found
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (object *Believe) Save() error {
|
||||
err := database.DB.Save(&object).Error
|
||||
if err != nil {
|
||||
// zauber found
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -347,6 +347,26 @@ func TransformImportEquipment2GSDMaster(object *Ausruestung) (*gsmaster.Equipmen
|
||||
return &gsmobj, nil
|
||||
}
|
||||
|
||||
func TransformImportBelieve2GSDMaster(object string) (*gsmaster.Believe, error) {
|
||||
gsmobj := gsmaster.Believe{}
|
||||
|
||||
err := gsmobj.First(object)
|
||||
// if found check if we need to adjust masterdata
|
||||
if err == nil {
|
||||
return &gsmobj, nil
|
||||
}
|
||||
// if not found insert to masterdata
|
||||
gsmobj.System = "midgard"
|
||||
gsmobj.Name = object
|
||||
gsmobj.Beschreibung = ""
|
||||
//gsmobj.Quelle = object.Quelle
|
||||
err = gsmobj.Create()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("creating gsmaster record failed: %s", err)
|
||||
}
|
||||
return &gsmobj, nil
|
||||
}
|
||||
|
||||
func CheckFertigkeiten2GSMaster(objects []Fertigkeit) error {
|
||||
for i := range objects {
|
||||
gsmobj, err := TransformImportFertigkeit2GSDMaster(&objects[i])
|
||||
@@ -410,3 +430,10 @@ func CheckEquipments2GSMaster(objects []Ausruestung) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func CheckBelieve2GSMaster(objects *CharacterImport) error {
|
||||
gsmobj, err := TransformImportBelieve2GSDMaster(objects.Glaube)
|
||||
if err != nil {
|
||||
return fmt.Errorf("creating gsmaster failed for 1 record: %s, %v", err, gsmobj)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ func initTestDB4Import() *gorm.DB {
|
||||
&gsmaster.Container{},
|
||||
&gsmaster.Transportation{},
|
||||
&gsmaster.Equipment{},
|
||||
&gsmaster.Believe{},
|
||||
)
|
||||
return db
|
||||
}
|
||||
@@ -228,8 +229,10 @@ func TestImportVTTStructure(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestImportSkill2GSMaster(t *testing.T) {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
if database.DB == nil {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
}
|
||||
fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json")
|
||||
character, err := readImportChar(fileName)
|
||||
assert.NoError(t, err, "Expected no error when Unmarshal filecontent")
|
||||
@@ -270,8 +273,10 @@ func TestImportSkill2GSMaster(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestImportWeaponSkill2GSMaster(t *testing.T) {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
if database.DB == nil {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
}
|
||||
fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json")
|
||||
character, err := readImportChar(fileName)
|
||||
assert.NoError(t, err, "Expected no error when Unmarshal filecontent")
|
||||
@@ -312,8 +317,10 @@ func TestImportWeaponSkill2GSMaster(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestImportSpell2GSMaster(t *testing.T) {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
if database.DB == nil {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
}
|
||||
fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json")
|
||||
character, err := readImportChar(fileName)
|
||||
assert.NoError(t, err, "Expected no error when Unmarshal filecontent")
|
||||
@@ -356,8 +363,10 @@ func TestImportSpell2GSMaster(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestImportWeapon2GSMaster(t *testing.T) {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
if database.DB == nil {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
}
|
||||
fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json")
|
||||
character, err := readImportChar(fileName)
|
||||
assert.NoError(t, err, "Expected no error when Unmarshal filecontent")
|
||||
@@ -400,8 +409,10 @@ func TestImportWeapon2GSMaster(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestImportContainer2GSMaster(t *testing.T) {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
if database.DB == nil {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
}
|
||||
fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json")
|
||||
character, err := readImportChar(fileName)
|
||||
assert.NoError(t, err, "Expected no error when Unmarshal filecontent")
|
||||
@@ -444,8 +455,10 @@ func TestImportContainer2GSMaster(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestImportTransportation2GSMaster(t *testing.T) {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
if database.DB == nil {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
}
|
||||
fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json")
|
||||
character, err := readImportChar(fileName)
|
||||
assert.NoError(t, err, "Expected no error when Unmarshal filecontent")
|
||||
@@ -488,8 +501,10 @@ func TestImportTransportation2GSMaster(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestImportEquipment2GSMaster(t *testing.T) {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
if database.DB == nil {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
}
|
||||
fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json")
|
||||
character, err := readImportChar(fileName)
|
||||
assert.NoError(t, err, "Expected no error when Unmarshal filecontent")
|
||||
@@ -526,6 +541,42 @@ func TestImportEquipment2GSMaster(t *testing.T) {
|
||||
err = importer.CheckEquipments2GSMaster(character.Ausruestung)
|
||||
assert.NoError(t, err, "Expected no error when checkimg Transüportations against gsmaster")
|
||||
}
|
||||
func TestImportBelieve2GSMaster(t *testing.T) {
|
||||
if database.DB == nil {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
}
|
||||
fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json")
|
||||
character, err := readImportChar(fileName)
|
||||
assert.NoError(t, err, "Expected no error when Unmarshal filecontent")
|
||||
//for i := range character.Fertigkeiten {
|
||||
skill, erro := importer.TransformImportBelieve2GSDMaster(character.Glaube)
|
||||
|
||||
assert.NoError(t, erro, "Expected no error when Unmarshal filecontent")
|
||||
assert.GreaterOrEqual(t, int(skill.ID), 1)
|
||||
assert.Equal(t, "midgard", skill.System)
|
||||
assert.Equal(t, "Torkin", skill.Name)
|
||||
assert.Equal(t, "", skill.Beschreibung)
|
||||
assert.Equal(t, "", skill.Quelle)
|
||||
//}
|
||||
skill2 := gsmaster.Believe{}
|
||||
erro = skill2.First("Torkin")
|
||||
assert.NoError(t, erro, "Expected no error when finding Record by name")
|
||||
assert.Equal(t, 1, int(skill.ID))
|
||||
|
||||
skill3 := gsmaster.Believe{}
|
||||
erro = skill3.FirstId(1)
|
||||
assert.NoError(t, erro, "Expected no error when finding Record by ID")
|
||||
assert.Equal(t, "Torkin", skill3.Name)
|
||||
|
||||
assert.Equal(t, skill2.ID, skill3.ID)
|
||||
assert.Equal(t, skill2.System, skill3.System)
|
||||
assert.Equal(t, skill2.Name, skill3.Name)
|
||||
assert.Equal(t, skill2.Beschreibung, skill3.Beschreibung)
|
||||
assert.Equal(t, skill2.Quelle, skill3.Quelle)
|
||||
err = importer.CheckBelieve2GSMaster(character)
|
||||
assert.NoError(t, err, "Expected no error when checkimg Transüportations against gsmaster")
|
||||
}
|
||||
|
||||
/*
|
||||
func TestImportFertigkeitenStammdatenSingle(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,9 @@ package tests
|
||||
import (
|
||||
"bamort/database"
|
||||
"bamort/gsmaster"
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"gorm.io/gorm"
|
||||
@@ -18,10 +20,26 @@ func initTestDB4Lookup() *gorm.DB {
|
||||
&gsmaster.Equipment{}, //needed for stammdaten.Check...
|
||||
&gsmaster.Container{}, //needed for stammdaten.Check...
|
||||
&gsmaster.Transportation{}, //needed for stammdaten.Check...
|
||||
&gsmaster.Weapon{},
|
||||
&gsmaster.Believe{},
|
||||
)
|
||||
return db
|
||||
}
|
||||
|
||||
// GenerateFilename generates a filename based on the prefix and the current date/time
|
||||
func generateFilename(prefix string, extension string) string {
|
||||
// Get the current date and time
|
||||
now := time.Now()
|
||||
|
||||
// Format the date and time as "YYYY-MM-DD_HH-MM-SS"
|
||||
//timestamp = now.Format("2006-01-02_15-04-05")
|
||||
timestamp := now.Format("20060102_150405")
|
||||
|
||||
// Combine the prefix and the timestamp to form the filename
|
||||
return fmt.Sprintf("%s_%s.%s", prefix, timestamp, extension)
|
||||
}
|
||||
|
||||
/*s
|
||||
func TestCreateLookupSkill(t *testing.T) {
|
||||
// Setup test database
|
||||
testDB := initTestDB4Lookup()
|
||||
@@ -218,3 +236,36 @@ func TestFindLookupTransportation(t *testing.T) {
|
||||
assert.Equal(t, 0.6, stamm.Gewicht)
|
||||
assert.Equal(t, 12.5, stamm.Volumen)
|
||||
}
|
||||
*/
|
||||
|
||||
func TestExportGSMasterdata(t *testing.T) {
|
||||
// Setup test database
|
||||
if database.DB == nil {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
}
|
||||
//testDB := initTestDB4Lookup()
|
||||
//database.DB = testDB // Assign test DB to global DB
|
||||
TestImportSkill2GSMaster(t)
|
||||
TestImportWeaponSkill2GSMaster(t)
|
||||
TestImportSpell2GSMaster(t)
|
||||
TestImportWeapon2GSMaster(t)
|
||||
TestImportContainer2GSMaster(t)
|
||||
TestImportTransportation2GSMaster(t)
|
||||
TestImportEquipment2GSMaster(t)
|
||||
TestImportBelieve2GSMaster(t)
|
||||
err := gsmaster.Export(generateFilename("../testdata/gsmaster_", "json"))
|
||||
assert.NoError(t, err, "expexted no Error during Export if gsmaster data")
|
||||
}
|
||||
|
||||
func TestImportGSMasterdata(t *testing.T) {
|
||||
// Setup test database
|
||||
if database.DB == nil {
|
||||
testDB := initTestDB4Import()
|
||||
database.DB = testDB // Assign test DB to global DB
|
||||
}
|
||||
//testDB := initTestDB4Lookup()
|
||||
//database.DB = testDB // Assign test DB to global DB
|
||||
err := gsmaster.Import(generateFilename("../testdata/gsmaster_", "json"))
|
||||
assert.NoError(t, err, "expexted no Error during Export if gsmaster data")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user