WIP migration character

This commit is contained in:
2025-07-28 21:35:29 +02:00
parent d65dbae050
commit c5d5c5a6d4
26 changed files with 198 additions and 186 deletions
+7 -7
View File
@@ -55,15 +55,15 @@ func TestSetupCheck(t *testing.T) {
err := database.MigrateStructure()
assert.NoError(t, err, "No error expected when migrating database tables")
err = character.MigrateStructure()
assert.NoError(t, err, "No error expected when migrating character tables")
err = models.MigrateStructure()
assert.NoError(t, err, "No error expected when migrating gsmaster tables")
/*err = character.MigrateStructure()
assert.NoError(t, err, "No error expected when migrating character tables")*/
err = user.MigrateStructure()
assert.NoError(t, err, "No error expected when migrating user tables")
err = models.MigrateStructure()
assert.NoError(t, err, "No error expected when migrating gsmaster tables")
err = equipment.MigrateStructure()
assert.NoError(t, err, "No error expected when migrating equipment tables")
@@ -104,7 +104,7 @@ func TestListCharacters(t *testing.T) {
assert.Equal(t, http.StatusOK, respRecorder.Code)
// Assert the response body
var listOfCharacter []*character.CharList
var listOfCharacter []*models.CharList
err := json.Unmarshal(respRecorder.Body.Bytes(), &listOfCharacter)
assert.NoError(t, err)
assert.Equal(t, "Harsk Hammerhuter, Zen", listOfCharacter[0].Name)
@@ -148,7 +148,7 @@ func TestGetCharacters(t *testing.T) {
assert.Equal(t, http.StatusOK, respRecorder.Code)
// Assert the response body
var listOfCharacter *character.Char
var listOfCharacter *models.Char
err := json.Unmarshal(respRecorder.Body.Bytes(), &listOfCharacter)
assert.NoError(t, err)
assert.Equal(t, "Harsk Hammerhuter, Zen", listOfCharacter.Name)
+9 -9
View File
@@ -50,9 +50,9 @@ func ReadImageAsBase64(filePath string) (string, error) {
return fullBase64String, nil
}
func createChar() *Char {
func createChar() *models.Char {
char := Char{}
char := models.Char{}
char.Name = "Harsk Hammerhuter, Zen"
char.Rasse = "Zwerg"
char.Typ = "Krieger"
@@ -72,7 +72,7 @@ func createChar() *Char {
char.Merkmale.Augenfarbe = "blau"
char.Merkmale.Haarfarbe = "sandfarben"
char.Merkmale.Sonstige = ""
char.Eigenschaften = []Eigenschaft{
char.Eigenschaften = []models.Eigenschaft{
{Name: "Au", Value: 74},
{Name: "Gs", Value: 96},
{Name: "Gw", Value: 70},
@@ -179,7 +179,7 @@ func createChar() *Char {
char.Spezialisierung = database.StringArray{
"Kriegshammer", "Armbrust:schwer", "Stielhammer",
}
char.Bennies = Bennies{
char.Bennies = models.Bennies{
Sg: 1,
Gg: 0,
Gp: 0,
@@ -189,7 +189,7 @@ func createChar() *Char {
},
},
}
char.Erfahrungsschatz = Erfahrungsschatz{
char.Erfahrungsschatz = models.Erfahrungsschatz{
ES: 325,
EP: 300,
BamortCharTrait: models.BamortCharTrait{
@@ -535,7 +535,7 @@ func setSpezialisierung(liste *database.StringArray, pos int,name string) {
}
*/
func charTests(t *testing.T, char *Char) {
func charTests(t *testing.T, char *models.Char) {
assert.LessOrEqual(t, 0, int(char.ID))
assert.Equal(t, "Harsk Hammerhuter, Zen", char.Name)
assert.Equal(t, "Zwerg", char.Rasse)
@@ -744,7 +744,7 @@ func charTests(t *testing.T, char *Char) {
func TestCreateChar(t *testing.T) {
database.SetupTestDB()
err := MigrateStructure()
err := models.MigrateStructure()
if err == nil {
err = skills.MigrateStructure()
if err == nil {
@@ -762,7 +762,7 @@ func TestCreateChar(t *testing.T) {
assert.NoError(t, err, "expected no error finding existing char")
}
char2 := Char{}
char2 := models.Char{}
char2.Name = "Harsk Hammerhuter, Zen"
err = char2.First(char2.Name)
assert.NoError(t, err, "expected no error finding the char")
@@ -772,7 +772,7 @@ func TestCreateChar(t *testing.T) {
func TestReadChar(t *testing.T) {
database.SetupTestDB()
TestCreateChar(t)
char := Char{}
char := models.Char{}
char.Name = "Harsk Hammerhuter, Zen"
err := char.First(char.Name)
assert.NoError(t, err, "expected NO error character not found")
+2 -27
View File
@@ -2,13 +2,14 @@ package character
import (
"bamort/database"
"bamort/models"
"fmt"
"gorm.io/gorm"
)
func SaveCharacterToDB(character *Char) error {
func SaveCharacterToDB(character *models.Char) error {
// Use GORM transaction to ensure atomicity
return database.DB.Transaction(func(tx *gorm.DB) error {
// Save the main character record
@@ -18,29 +19,3 @@ func SaveCharacterToDB(character *Char) error {
return nil
})
}
func MigrateStructure(db ...*gorm.DB) error {
// Use provided DB or default to database.DB
var targetDB *gorm.DB
if len(db) > 0 && db[0] != nil {
targetDB = db[0]
} else {
targetDB = database.DB
}
err := targetDB.AutoMigrate(
&Char{},
&Eigenschaft{},
&Lp{},
&Ap{},
&B{},
&Merkmale{},
&Erfahrungsschatz{},
&Bennies{},
&Vermoegen{},
)
if err != nil {
return err
}
return nil
}
+3 -3
View File
@@ -20,7 +20,7 @@ func TestDebugPracticePoints(t *testing.T) {
defer database.ResetTestDB()
// Migrate the schema
err := MigrateStructure()
err := models.MigrateStructure()
assert.NoError(t, err)
// Also migrate skills and equipment to avoid errors
@@ -30,7 +30,7 @@ func TestDebugPracticePoints(t *testing.T) {
assert.NoError(t, err)
// Create a test character manually using GORM
character := &Char{
character := &models.Char{
BamortBase: models.BamortBase{
Name: "Test Character",
},
@@ -57,7 +57,7 @@ func TestDebugPracticePoints(t *testing.T) {
t.Logf("Body: %s", w.Body.String())
// Check if the character exists in database
var testChar Char
var testChar models.Char
err = database.DB.First(&testChar, character.ID).Error
t.Logf("Character exists in DB: %v, ID: %d, Error: %v", err == nil, character.ID, err)
}
+24 -24
View File
@@ -25,14 +25,14 @@ func respondWithError(c *gin.Context, status int, message string) {
}
func ListCharacters(c *gin.Context) {
var characters []Char
var listOfChars []CharList
var characters []models.Char
var listOfChars []models.CharList
if err := database.DB.Find(&characters).Error; err != nil {
respondWithError(c, http.StatusInternalServerError, "Failed to retrieve characters")
return
}
for i := range characters {
listOfChars = append(listOfChars, CharList{
listOfChars = append(listOfChars, models.CharList{
BamortBase: models.BamortBase{
ID: characters[i].ID,
Name: characters[i].Name,
@@ -47,7 +47,7 @@ func ListCharacters(c *gin.Context) {
}
func CreateCharacter(c *gin.Context) {
var character Char
var character models.Char
if err := c.ShouldBindJSON(&character); err != nil {
respondWithError(c, http.StatusBadRequest, err.Error())
return
@@ -62,7 +62,7 @@ func CreateCharacter(c *gin.Context) {
}
func GetCharacter(c *gin.Context) {
id := c.Param("id")
var character Char
var character models.Char
err := character.FirstID(id)
if err != nil {
respondWithError(c, http.StatusInternalServerError, "Failed to retrieve character")
@@ -73,7 +73,7 @@ func GetCharacter(c *gin.Context) {
}
func UpdateCharacter(c *gin.Context) {
id := c.Param("id")
var character Char
var character models.Char
// First, find the existing character
err := character.FirstID(id)
@@ -98,7 +98,7 @@ func UpdateCharacter(c *gin.Context) {
}
func DeleteCharacter(c *gin.Context) {
id := c.Param("id")
var character Char
var character models.Char
err := character.FirstID(id)
if err != nil {
respondWithError(c, http.StatusNotFound, "Character not found")
@@ -128,8 +128,8 @@ func AddFertigkeit(charID uint, fertigkeit *skills.Fertigkeit) error {
// Append the new Fertigkeit to the slice of the characters property
//character.Fertigkeiten = append(character.Fertigkeiten, fertigkeit)
func ToFeChar(object *Char) *FeChar {
feC := &FeChar{
func ToFeChar(object *models.Char) *models.FeChar {
feC := &models.FeChar{
Char: *object,
}
skills, innateSkills, categories := splitSkills(object.Fertigkeiten)
@@ -169,7 +169,7 @@ func GetLearnSkillCost(c *gin.Context) {
charID := c.Param("id")
// Load the character from the database
var character Char
var character models.Char
if err := character.FirstID(charID); err != nil {
respondWithError(c, http.StatusInternalServerError, "Failed to retrieve character")
return
@@ -203,7 +203,7 @@ func GetLearnSpellCost(c *gin.Context) {
charID := c.Param("id")
// Load the character from the database
var character Char
var character models.Char
if err := character.FirstID(charID); err != nil {
respondWithError(c, http.StatusInternalServerError, "Failed to retrieve character")
return
@@ -339,7 +339,7 @@ type ExperienceAndWealthResponse struct {
// GetCharacterExperienceAndWealth gibt nur die EP und Vermögensdaten eines Charakters zurück
func GetCharacterExperienceAndWealth(c *gin.Context) {
id := c.Param("id")
var character Char
var character models.Char
// Lade nur die benötigten Felder
err := database.DB.
@@ -379,7 +379,7 @@ type UpdateExperienceRequest struct {
// UpdateCharacterExperience aktualisiert die Erfahrungspunkte eines Charakters
func UpdateCharacterExperience(c *gin.Context) {
id := c.Param("id")
var character Char
var character models.Char
// Lade den Charakter
err := database.DB.
@@ -411,7 +411,7 @@ func UpdateCharacterExperience(c *gin.Context) {
// Aktualisiere oder erstelle Erfahrungsschatz
if character.Erfahrungsschatz.ID == 0 {
// Erstelle neuen Erfahrungsschatz
character.Erfahrungsschatz = Erfahrungsschatz{
character.Erfahrungsschatz = models.Erfahrungsschatz{
BamortCharTrait: models.BamortCharTrait{
CharacterID: character.ID,
},
@@ -469,7 +469,7 @@ type UpdateWealthRequest struct {
// UpdateCharacterWealth aktualisiert das Vermögen eines Charakters
func UpdateCharacterWealth(c *gin.Context) {
id := c.Param("id")
var character Char
var character models.Char
// Lade den Charakter
err := database.DB.
@@ -505,7 +505,7 @@ func UpdateCharacterWealth(c *gin.Context) {
// Aktualisiere oder erstelle Vermögen
if character.Vermoegen.ID == 0 {
// Erstelle neues Vermögen
character.Vermoegen = Vermoegen{
character.Vermoegen = models.Vermoegen{
BamortCharTrait: models.BamortCharTrait{
CharacterID: character.ID,
},
@@ -593,7 +593,7 @@ func getValueOrDefault(value *int, defaultValue int) int {
}
// updateOrCreateSkill aktualisiert eine vorhandene Fertigkeit oder erstellt eine neue
func updateOrCreateSkill(character *Char, skillName string, newLevel int) error {
func updateOrCreateSkill(character *models.Char, skillName string, newLevel int) error {
// Suche erst in normalen Fertigkeiten
for i := range character.Fertigkeiten {
if character.Fertigkeiten[i].Name == skillName {
@@ -669,7 +669,7 @@ type LearnSpellRequest struct {
}
// calculateMultiLevelCosts berechnet die Kosten für mehrere Level-Verbesserungen mit gsmaster.GetLernCostNextLevel
func calculateMultiLevelCosts(character *Char, skillName string, currentLevel int, levelsToLearn []int, rewardType string, usePP, useGold int) (*models.LearnCost, error) {
func calculateMultiLevelCosts(character *models.Char, skillName string, currentLevel int, levelsToLearn []int, rewardType string, usePP, useGold int) (*models.LearnCost, error) {
if len(levelsToLearn) == 0 {
return nil, fmt.Errorf("keine Level zum Lernen angegeben")
}
@@ -758,7 +758,7 @@ func calculateMultiLevelCosts(character *Char, skillName string, currentLevel in
}
// getCharacterClass gibt die Charakterklassen-Abkürzung zurück
func getCharacterClass(character *Char) string {
func getCharacterClass(character *models.Char) string {
if len(character.Typ) > 3 {
return gsmaster.GetClassAbbreviation(character.Typ)
}
@@ -768,7 +768,7 @@ func getCharacterClass(character *Char) string {
// LearnSkill lernt eine neue Fertigkeit und erstellt Audit-Log-Einträge
func LearnSkill(c *gin.Context) {
charID := c.Param("id")
var character Char
var character models.Char
if err := character.FirstID(charID); err != nil {
respondWithError(c, http.StatusNotFound, "Charakter nicht gefunden")
@@ -981,7 +981,7 @@ func ImproveSkill(c *gin.Context) {
}
// Hole Charakter über die ID aus dem Request
var character Char
var character models.Char
err := database.DB.
Preload("Fertigkeiten").
Preload("Waffenfertigkeiten").
@@ -1197,7 +1197,7 @@ func ImproveSkill(c *gin.Context) {
// LearnSpell lernt einen neuen Zauber und erstellt Audit-Log-Einträge
func LearnSpell(c *gin.Context) {
charID := c.Param("id")
var character Char
var character models.Char
if err := character.FirstID(charID); err != nil {
respondWithError(c, http.StatusNotFound, "Charakter nicht gefunden")
@@ -1323,7 +1323,7 @@ func GetAvailableSkills(c *gin.Context) {
characterID := c.Param("id")
rewardType := c.Query("reward_type")
var character Char
var character models.Char
if err := database.DB.Preload("Fertigkeiten").Preload("Erfahrungsschatz").Preload("Vermoegen").First(&character, characterID).Error; err != nil {
respondWithError(c, http.StatusNotFound, "Character not found")
return
@@ -1386,7 +1386,7 @@ func GetAvailableSkills(c *gin.Context) {
}
// calculateSkillLearningCosts berechnet die EP- und Goldkosten für das Lernen einer Fertigkeit mit GetLernCostNextLevel
func calculateSkillLearningCosts(skill models.Skill, character Char, rewardType string) (int, int) {
func calculateSkillLearningCosts(skill models.Skill, character models.Char, rewardType string) (int, int) {
// Erstelle LernCostRequest für das Lernen (Level 0 -> 1)
var rewardTypePtr *string
if rewardType != "" && rewardType != "default" {
+5 -8
View File
@@ -20,15 +20,12 @@ func TestImproveSkillHandler(t *testing.T) {
database.SetupTestDB(true, true)
defer database.ResetTestDB()
// Migrate the schema
err := MigrateStructure()
err := models.MigrateStructure()
assert.NoError(t, err)
// Also migrate skills and equipment to avoid preload errors
err = skills.MigrateStructure()
assert.NoError(t, err)
err = models.MigrateStructure()
assert.NoError(t, err)
// Create test character with ID 20
/*
@@ -140,7 +137,7 @@ func TestImproveSkillHandler(t *testing.T) {
assert.Equal(t, "Fertigkeit erfolgreich verbessert", response["message"])
// Verify character state was updated correctly
var updatedChar Char
var updatedChar models.Char
err = updatedChar.FirstID("20")
assert.NoError(t, err)
@@ -157,7 +154,7 @@ func TestImproveSkillHandler(t *testing.T) {
t.Run("ImproveSkill with insufficient EP", func(t *testing.T) {
// Create character with insufficient EP
poorChar := Char{
poorChar := models.Char{
BamortBase: models.BamortBase{
ID: 21,
Name: "Poor Test Character",
@@ -165,13 +162,13 @@ func TestImproveSkillHandler(t *testing.T) {
Typ: "Krieger",
Rasse: "Mensch",
Grad: 1,
Erfahrungsschatz: Erfahrungsschatz{
Erfahrungsschatz: models.Erfahrungsschatz{
BamortCharTrait: models.BamortCharTrait{
CharacterID: 21,
},
ES: 5, // Insufficient EP
},
Vermoegen: Vermoegen{
Vermoegen: models.Vermoegen{
BamortCharTrait: models.BamortCharTrait{
CharacterID: 21,
},
+8 -8
View File
@@ -75,7 +75,7 @@ func GetLernCost(c *gin.Context) {
return
}
charID := fmt.Sprintf("%d", request.CharId)
var character Char
var character models.Char
if err := character.FirstID(charID); err != nil {
respondWithError(c, http.StatusNotFound, "Charakter nicht gefunden")
return
@@ -136,7 +136,7 @@ func GetSkillCost(c *gin.Context) {
charID := c.Param("id")
// Charakter aus der Datenbank laden
var character Char
var character models.Char
if err := character.FirstID(charID); err != nil {
respondWithError(c, http.StatusNotFound, "Charakter nicht gefunden")
return
@@ -259,7 +259,7 @@ func GetSkillCost(c *gin.Context) {
}
// Helper function to get current skill level from character
func getCurrentSkillLevel(character *Char, skillName, skillType string) int {
func getCurrentSkillLevel(character *models.Char, skillName, skillType string) int {
switch skillType {
case "skill":
for _, skill := range character.Fertigkeiten {
@@ -281,7 +281,7 @@ func getCurrentSkillLevel(character *Char, skillName, skillType string) int {
}
// Helper function to calculate single cost
func calculateSingleCost(character *Char, request *SkillCostRequest) (*models.LearnCost, *models.LearnCost, *skillInfo, error) {
func calculateSingleCost(character *models.Char, request *SkillCostRequest) (*models.LearnCost, *models.LearnCost, *skillInfo, error) {
var cost *models.LearnCost
var err error
var info skillInfo
@@ -393,7 +393,7 @@ func applyReward(cost *models.LearnCost, request *SkillCostRequest) *models.Lear
}
// Helper function to calculate multi-level costs
func calculateMultiLevelCost(character *Char, request *SkillCostRequest) *MultiLevelCostResponse {
func calculateMultiLevelCost(character *models.Char, request *SkillCostRequest) *MultiLevelCostResponse {
if request.TargetLevel <= request.CurrentLevel {
return nil
}
@@ -542,7 +542,7 @@ func getSpellInfo(spellName string) skillInfo {
return skillInfo{Category: spell.Category, Difficulty: strconv.Itoa(spell.Stufe)}
}
func canCharacterAfford(character *Char, cost *models.LearnCost) bool {
func canCharacterAfford(character *models.Char, cost *models.LearnCost) bool {
// Check if character has enough EP
if character.Erfahrungsschatz.EP < cost.Ep {
return false
@@ -554,7 +554,7 @@ func canCharacterAfford(character *Char, cost *models.LearnCost) bool {
return totalMoney >= cost.Money
}
func generateNotes(character *Char, request *SkillCostRequest, cost *models.LearnCost) string {
func generateNotes(character *models.Char, request *SkillCostRequest, cost *models.LearnCost) string {
var notes []string
if request.Action == "learn" {
@@ -582,7 +582,7 @@ func generateNotes(character *Char, request *SkillCostRequest, cost *models.Lear
}
// getPPForSkill ermittelt die verfügbaren Praxispunkte für eine spezifische Fertigkeit
func getPPForSkill(character *Char, skillName string) int {
func getPPForSkill(character *models.Char, skillName string) int {
// Ermittle die tatsächliche Fertigkeit (bei Zaubern die Zaubergruppe)
targetSkillName := getSpellCategory(skillName)
+3 -7
View File
@@ -23,7 +23,7 @@ func TestImprovedSkillCostAPI(t *testing.T) {
defer database.ResetTestDB()
// Migrate the schema
err := MigrateStructure()
err := models.MigrateStructure()
assert.NoError(t, err)
// Also migrate skills and equipment to avoid preload errors
@@ -31,8 +31,6 @@ func TestImprovedSkillCostAPI(t *testing.T) {
assert.NoError(t, err)
err = equipment.MigrateStructure()
assert.NoError(t, err)
err = models.MigrateStructure()
assert.NoError(t, err)
// Create test skill data
err = createTestSkillData()
@@ -258,7 +256,7 @@ func TestHelperFunctions(t *testing.T) {
// This would need a proper character setup to test fully
// For now, we're just testing the function exists and doesn't panic
var character Char
var character models.Char
level := getCurrentSkillLevel(&character, "Test", "skill")
assert.Equal(t, -1, level, "Should return -1 for non-existent skill")
})
@@ -603,7 +601,7 @@ func TestGetLernCostEndpoint(t *testing.T) {
defer database.ResetTestDB()
// Migrate the schema
err := MigrateStructure()
err := models.MigrateStructure()
assert.NoError(t, err)
// Also migrate skills and equipment to avoid preload errors
@@ -611,8 +609,6 @@ func TestGetLernCostEndpoint(t *testing.T) {
assert.NoError(t, err)
err = equipment.MigrateStructure()
assert.NoError(t, err)
err = models.MigrateStructure()
assert.NoError(t, err)
/*
// Create test skill data
err = createTestSkillData()
+5 -4
View File
@@ -2,6 +2,7 @@ package character
import (
"bamort/database"
"bamort/models"
"fmt"
"net/http"
@@ -30,7 +31,7 @@ func GetPracticePoints(c *gin.Context) {
charID := c.Param("id")
// Charakter aus der Datenbank laden
var character Char
var character models.Char
if err := character.FirstID(charID); err != nil {
respondWithError(c, http.StatusNotFound, "Charakter nicht gefunden")
return
@@ -56,7 +57,7 @@ func UpdatePracticePoints(c *gin.Context) {
charID := c.Param("id")
// Charakter aus der Datenbank laden
var character Char
var character models.Char
if err := character.FirstID(charID); err != nil {
respondWithError(c, http.StatusNotFound, "Charakter nicht gefunden")
return
@@ -110,7 +111,7 @@ func AddPracticePoint(c *gin.Context) {
charID := c.Param("id")
// Charakter aus der Datenbank laden
var character Char
var character models.Char
if err := character.FirstID(charID); err != nil {
respondWithError(c, http.StatusNotFound, "Charakter nicht gefunden")
return
@@ -208,7 +209,7 @@ func UsePracticePoint(c *gin.Context) {
charID := c.Param("id")
// Charakter aus der Datenbank laden
var character Char
var character models.Char
if err := character.FirstID(charID); err != nil {
respondWithError(c, http.StatusNotFound, "Charakter nicht gefunden")
return
+2 -4
View File
@@ -22,7 +22,7 @@ func TestPracticePointsAPI(t *testing.T) {
defer database.ResetTestDB()
// Migrate the schema
err := MigrateStructure()
err := models.MigrateStructure()
assert.NoError(t, err)
// Also migrate skills and equipment to avoid preload errors
@@ -30,8 +30,6 @@ func TestPracticePointsAPI(t *testing.T) {
assert.NoError(t, err)
err = equipment.MigrateStructure()
assert.NoError(t, err)
err = models.MigrateStructure()
assert.NoError(t, err)
// Create test skill data
err = createTestSkillData()
@@ -39,7 +37,7 @@ func TestPracticePointsAPI(t *testing.T) {
defer cleanupTestSkillData()
// Create a test character
character := &Char{
character := &models.Char{
BamortBase: models.BamortBase{
Name: "Test Character",
},
+4 -3
View File
@@ -8,6 +8,7 @@ import (
"testing"
"bamort/database"
"bamort/models"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
@@ -23,7 +24,7 @@ func TestGetAvailableSkills(t *testing.T) {
t.Run("Get available skills for existing character - default reward type", func(t *testing.T) {
// Get a character ID from the test data
var testChar Char
var testChar models.Char
err := database.DB.Preload("Fertigkeiten").Preload("Erfahrungsschatz").Preload("Vermoegen").First(&testChar).Error
assert.NoError(t, err, "Should find a test character")
@@ -117,7 +118,7 @@ func TestGetAvailableSkills(t *testing.T) {
t.Run("Get available skills for existing character - noGold reward type", func(t *testing.T) {
// Get a character ID from the test data
var testChar Char
var testChar models.Char
err := database.DB.Preload("Fertigkeiten").Preload("Erfahrungsschatz").Preload("Vermoegen").First(&testChar).Error
assert.NoError(t, err, "Should find a test character")
@@ -205,7 +206,7 @@ func TestGetAvailableSkills(t *testing.T) {
t.Run("Check that learned skills are excluded", func(t *testing.T) {
// Get a character with some skills
var testChar Char
var testChar models.Char
err := database.DB.Preload("Fertigkeiten").First(&testChar).Error
assert.NoError(t, err, "Should find a test character")
+7 -9
View File
@@ -21,14 +21,12 @@ func TestImproveSkillUpdatesLevel(t *testing.T) {
defer database.ResetTestDB()
// Migrate the schema
err := MigrateStructure()
err := models.MigrateStructure()
assert.NoError(t, err)
// Also migrate skills and equipment to avoid preload errors
err = skills.MigrateStructure()
assert.NoError(t, err)
err = models.MigrateStructure()
assert.NoError(t, err)
// Try to migrate equipment if it exists
if equipmentDB := database.DB.Exec("CREATE TABLE IF NOT EXISTS equi_equipments (id INTEGER PRIMARY KEY, character_id INTEGER, name TEXT)"); equipmentDB.Error != nil {
@@ -56,7 +54,7 @@ func TestImproveSkillUpdatesLevel(t *testing.T) {
database.DB.Exec("CREATE TABLE IF NOT EXISTS equi_equipments (id INTEGER PRIMARY KEY, character_id INTEGER)")
// Create test character with ID 20
testChar := Char{
testChar := models.Char{
BamortBase: models.BamortBase{
ID: 20,
Name: "Test Krieger",
@@ -64,13 +62,13 @@ func TestImproveSkillUpdatesLevel(t *testing.T) {
Typ: "Krieger",
Rasse: "Mensch",
Grad: 1,
Erfahrungsschatz: Erfahrungsschatz{
Erfahrungsschatz: models.Erfahrungsschatz{
BamortCharTrait: models.BamortCharTrait{
CharacterID: 20,
},
EP: 326, // Starting EP
},
Vermoegen: Vermoegen{
Vermoegen: models.Vermoegen{
BamortCharTrait: models.BamortCharTrait{
CharacterID: 20,
},
@@ -95,7 +93,7 @@ func TestImproveSkillUpdatesLevel(t *testing.T) {
assert.NoError(t, err)
// Verify character was created correctly
var verifyChar Char
var verifyChar models.Char
err = database.DB.Preload("Fertigkeiten").Preload("Erfahrungsschatz").Preload("Vermoegen").First(&verifyChar, 20).Error
assert.NoError(t, err)
t.Logf("Character created with ID: %d, EP: %d, Skills: %d", verifyChar.ID, verifyChar.Erfahrungsschatz.EP, len(verifyChar.Fertigkeiten))
@@ -141,7 +139,7 @@ func TestImproveSkillUpdatesLevel(t *testing.T) {
assert.Equal(t, http.StatusOK, w.Code, "Status code should be 200 OK")
// Verify that the skill level was actually updated in the database
var updatedChar Char
var updatedChar models.Char
err = database.DB.Preload("Fertigkeiten").First(&updatedChar, 20).Error
assert.NoError(t, err)
@@ -193,7 +191,7 @@ func TestImproveSkillUpdatesLevel(t *testing.T) {
assert.Equal(t, http.StatusOK, w.Code, "Status code should be 200 OK")
// Verify that the new skill was created in the database
var updatedChar Char
var updatedChar models.Char
err = updatedChar.FirstID("20")
assert.NoError(t, err)
+2 -4
View File
@@ -22,14 +22,12 @@ func TestSpellCategoryMapping(t *testing.T) {
defer database.ResetTestDB()
// Migrate the schema
err := MigrateStructure()
err := models.MigrateStructure()
assert.NoError(t, err)
err = skills.MigrateStructure()
assert.NoError(t, err)
err = equipment.MigrateStructure()
assert.NoError(t, err)
err = models.MigrateStructure()
assert.NoError(t, err)
// Create test skill data
err = createTestSkillData()
@@ -37,7 +35,7 @@ func TestSpellCategoryMapping(t *testing.T) {
defer cleanupTestSkillData()
// Create a test character
character := &Char{
character := &models.Char{
BamortBase: models.BamortBase{
Name: "Test Character",
},
+2 -3
View File
@@ -2,7 +2,6 @@ package equipment
import (
"bamort/database"
"bamort/models"
"gorm.io/gorm"
)
@@ -19,8 +18,8 @@ func MigrateStructure(db ...*gorm.DB) error {
err := targetDB.AutoMigrate(
&Ausruestung{},
&Waffe{},
&models.Container{},
//&models.Transportation{},
&Container{},
//Transportation{},
)
if err != nil {
return err
+3 -4
View File
@@ -1,7 +1,6 @@
package main
import (
"bamort/character"
"bamort/database"
"bamort/equipment"
"bamort/models"
@@ -46,11 +45,11 @@ func main() {
return
}
err = character.MigrateStructure(secondDB)
/*err = character.MigrateStructure(secondDB)
if err != nil {
fmt.Printf("Fehler bei character Migration: %v\n", err)
return
}
}*/
err = models.MigrateStructure(secondDB)
if err != nil {
@@ -87,7 +86,7 @@ func migrateAllToSecondDB(db *gorm.DB) error {
migrators := []func(db ...*gorm.DB) error{
database.MigrateStructure,
user.MigrateStructure,
character.MigrateStructure,
//character.MigrateStructure,
models.MigrateStructure,
equipment.MigrateStructure,
skills.MigrateStructure,
-1
View File
@@ -1 +0,0 @@
package gsmaster
-1
View File
@@ -1 +0,0 @@
package gsmaster
+5 -5
View File
@@ -1,8 +1,8 @@
package importer
import (
"bamort/character"
"bamort/database"
"bamort/models"
"fmt"
"testing"
@@ -14,7 +14,7 @@ func TestImportVTT2Char(t *testing.T) {
fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json")
char, err := ImportVTTJSON(fileName)
assert.NoError(t, err, "expected no error when saving imported Char")
var chr2 character.Char
var chr2 models.Char
chr2.First(char.Name)
assert.Equal(t, char.ID, chr2.ID)
/*
@@ -31,9 +31,9 @@ func TestImportVTT2Char(t *testing.T) {
assert.Equal(t, "Zwerg", character.Rasse)
assert.Equal(t, "Hören", character.Fertigkeiten[0].Name)
assert.Equal(t, 1, len(character.Zauber))
assert.Equal(t, 17, character.Lp.Value)
assert.Equal(t, 96, character.Eigenschaften.Gs)
assert.Equal(t, 74, character.Eigenschaften.Au)
assert.Equal(t, 17, models.Lp.Value)
assert.Equal(t, 96, models.Eigenschaften.Gs)
assert.Equal(t, 74, models.Eigenschaften.Au)
assert.Equal(t, 1, len(character.Ausruestung))
assert.Equal(t, "Lederrüstung", character.Ausruestung[0].Name)
assert.Equal(t, "blau", character.Merkmale.Augenfarbe)
+12 -13
View File
@@ -1,7 +1,6 @@
package importer
import (
"bamort/character"
"bamort/equipment"
"bamort/models"
"bamort/skills"
@@ -20,7 +19,7 @@ func readImportChar(fileName string) (*CharacterImport, error) {
return &character, err
}
func ImportVTTJSON(fileName string) (*character.Char, error) {
func ImportVTTJSON(fileName string) (*models.Char, error) {
//fileName = fmt.Sprintf("../testdata/%s", "VTT_Import1.json")
imp, err := readImportChar(fileName)
if err != nil {
@@ -59,7 +58,7 @@ func ImportVTTJSON(fileName string) (*character.Char, error) {
return nil, err
}
char := character.Char{}
char := models.Char{}
char.Name = imp.Name
char.Rasse = imp.Rasse
char.Typ = imp.Typ
@@ -94,46 +93,46 @@ func ImportVTTJSON(fileName string) (*character.Char, error) {
}
char.Lp.Max = imp.Lp.Max
char.Lp.Value = imp.Lp.Value
char.Eigenschaften = append(char.Eigenschaften, character.Eigenschaft{
char.Eigenschaften = append(char.Eigenschaften, models.Eigenschaft{
Name: "Au",
Value: imp.Eigenschaften.Au,
})
char.Eigenschaften = append(char.Eigenschaften, character.Eigenschaft{
char.Eigenschaften = append(char.Eigenschaften, models.Eigenschaft{
Name: "Gs",
Value: imp.Eigenschaften.Gs,
})
char.Eigenschaften = append(char.Eigenschaften, character.Eigenschaft{
char.Eigenschaften = append(char.Eigenschaften, models.Eigenschaft{
Name: "Gw",
Value: imp.Eigenschaften.Gw,
})
char.Eigenschaften = append(char.Eigenschaften, character.Eigenschaft{
char.Eigenschaften = append(char.Eigenschaften, models.Eigenschaft{
Name: "In",
Value: imp.Eigenschaften.In,
})
char.Eigenschaften = append(char.Eigenschaften, character.Eigenschaft{
char.Eigenschaften = append(char.Eigenschaften, models.Eigenschaft{
Name: "Ko",
Value: imp.Eigenschaften.Ko,
})
char.Eigenschaften = append(char.Eigenschaften, character.Eigenschaft{
char.Eigenschaften = append(char.Eigenschaften, models.Eigenschaft{
Name: "PA",
Value: imp.Eigenschaften.Pa,
})
char.Eigenschaften = append(char.Eigenschaften, character.Eigenschaft{
char.Eigenschaften = append(char.Eigenschaften, models.Eigenschaft{
Name: "St",
Value: imp.Eigenschaften.St,
})
char.Eigenschaften = append(char.Eigenschaften, character.Eigenschaft{
char.Eigenschaften = append(char.Eigenschaften, models.Eigenschaft{
Name: "Wk",
Value: imp.Eigenschaften.Wk,
})
char.Eigenschaften = append(char.Eigenschaften, character.Eigenschaft{
char.Eigenschaften = append(char.Eigenschaften, models.Eigenschaft{
Name: "Zt",
Value: imp.Eigenschaften.Zt,
})
char.Merkmale.Augenfarbe = imp.Merkmale.Augenfarbe
char.Merkmale.Haarfarbe = imp.Merkmale.Haarfarbe
char.Merkmale.Sonstige = imp.Merkmale.Sonstige
char.Bennies = character.Bennies{
char.Bennies = models.Bennies{
BamortCharTrait: models.BamortCharTrait{
BamortBase: models.BamortBase{Name: "bennies"},
},
+1 -2
View File
@@ -1,12 +1,11 @@
package importer
import (
"bamort/character"
"bamort/models"
"fmt"
)
func ImportChar(char CharacterImport) (*character.Char, error) {
func ImportChar(char CharacterImport) (*models.Char, error) {
return nil, fmt.Errorf("char could not be imported %s", "Weil Wegen Kommt noch")
}
+2 -2
View File
@@ -127,7 +127,7 @@ func TestGetMDSkills(t *testing.T) {
assert.Equal(t, http.StatusOK, respRecorder.Code)
// Assert the response body
var listOfCharacter *character.Char
var listOfCharacter *models.Char
err := json.Unmarshal(respRecorder.Body.Bytes(), &listOfCharacter)
assert.NoError(t, err)
assert.Equal(t, "Harsk Hammerhuter, Zen", listOfCharacter.Name)
@@ -182,7 +182,7 @@ func TestUpdateMDSkill(t *testing.T) {
assert.Equal(t, http.StatusCreated, respRecorder.Code)
// Assert the response body
var createdCharacter character.Char
var createdCharacter models.Char
err = json.Unmarshal(respRecorder.Body.Bytes(), &createdCharacter)
assert.NoError(t, err)
assert.Equal(t, "Aragorn", createdCharacter.Name)
+15 -14
View File
@@ -1,7 +1,6 @@
package maintenance
import (
"bamort/character"
"bamort/database"
"bamort/equipment"
"bamort/importer"
@@ -46,9 +45,11 @@ func migrateAllStructures(db *gorm.DB) error {
if err := user.MigrateStructure(db); err != nil {
return fmt.Errorf("failed to migrate user structures: %w", err)
}
if err := character.MigrateStructure(db); err != nil {
return fmt.Errorf("failed to migrate character structures: %w", err)
}
/*
if err := character.MigrateStructure(db); err != nil {
return fmt.Errorf("failed to migrate character structures: %w", err)
}
*/
if err := models.MigrateStructure(db); err != nil {
return fmt.Errorf("failed to migrate gsmaster structures: %w", err)
}
@@ -181,56 +182,56 @@ func copyAllDataToTestDB(liveDB, testDB *gorm.DB) (map[string]int, error) {
stats["gsmaster_believes"] = count
// Step 2: Copy character data (depends on nothing)
count, err = copyTableDataWithCount(liveDB, testDB, &character.Char{})
count, err = copyTableDataWithCount(liveDB, testDB, &models.Char{})
if err != nil {
return stats, err
}
stats["characters"] = count
// Step 3: Copy character-dependent data
count, err = copyTableDataWithCount(liveDB, testDB, &character.Eigenschaft{})
count, err = copyTableDataWithCount(liveDB, testDB, &models.Eigenschaft{})
if err != nil {
return stats, err
}
stats["character_eigenschaften"] = count
count, err = copyTableDataWithCount(liveDB, testDB, &character.Lp{})
count, err = copyTableDataWithCount(liveDB, testDB, &models.Lp{})
if err != nil {
return stats, err
}
stats["character_lp"] = count
count, err = copyTableDataWithCount(liveDB, testDB, &character.Ap{})
count, err = copyTableDataWithCount(liveDB, testDB, &models.Ap{})
if err != nil {
return stats, err
}
stats["character_ap"] = count
count, err = copyTableDataWithCount(liveDB, testDB, &character.B{})
count, err = copyTableDataWithCount(liveDB, testDB, &models.B{})
if err != nil {
return stats, err
}
stats["character_b"] = count
count, err = copyTableDataWithCount(liveDB, testDB, &character.Merkmale{})
count, err = copyTableDataWithCount(liveDB, testDB, &models.Merkmale{})
if err != nil {
return stats, err
}
stats["character_merkmale"] = count
count, err = copyTableDataWithCount(liveDB, testDB, &character.Erfahrungsschatz{})
count, err = copyTableDataWithCount(liveDB, testDB, &models.Erfahrungsschatz{})
if err != nil {
return stats, err
}
stats["character_erfahrungsschatz"] = count
count, err = copyTableDataWithCount(liveDB, testDB, &character.Bennies{})
count, err = copyTableDataWithCount(liveDB, testDB, &models.Bennies{})
if err != nil {
return stats, err
}
stats["character_bennies"] = count
count, err = copyTableDataWithCount(liveDB, testDB, &character.Vermoegen{})
count, err = copyTableDataWithCount(liveDB, testDB, &models.Vermoegen{})
if err != nil {
return stats, err
}
@@ -469,7 +470,7 @@ func getTestDataStatistics(db *gorm.DB) (map[string]int64, error) {
// Count records in each table
tables := map[string]interface{}{
"users": &user.User{},
"characters": &character.Char{},
"characters": &models.Char{},
"gsmaster_skills": &models.Skill{},
"gsmaster_spells": &models.Spell{},
"gsmaster_equipment": &models.Equipment{},
+15 -14
View File
@@ -1,7 +1,6 @@
package maintenance
import (
"bamort/character"
"bamort/database"
"bamort/equipment"
"bamort/models"
@@ -43,7 +42,7 @@ func createTestDataInLiveDB(t *testing.T, liveDB *gorm.DB) {
require.NoError(t, err)
// Create test character
testChar := &character.Char{
testChar := &models.Char{
BamortBase: models.BamortBase{
Name: "Test Character",
},
@@ -93,8 +92,10 @@ func TestMakeTestdataFromLiveRewrite(t *testing.T) {
require.NoError(t, err)
err = user.MigrateStructure(liveDB)
require.NoError(t, err)
err = character.MigrateStructure(liveDB)
require.NoError(t, err)
/*
err = character.MigrateStructure(liveDB)
require.NoError(t, err)
*/
err = models.MigrateStructure(liveDB)
require.NoError(t, err)
err = skills.MigrateStructure(liveDB)
@@ -115,8 +116,8 @@ func TestMakeTestdataFromLiveRewrite(t *testing.T) {
require.NoError(t, err)
err = user.MigrateStructure(testDb)
require.NoError(t, err)
err = character.MigrateStructure(testDb)
require.NoError(t, err)
/*err = character.MigrateStructure(testDb)
require.NoError(t, err)*/
err = models.MigrateStructure(testDb)
require.NoError(t, err)
err = skills.MigrateStructure(testDb)
@@ -178,8 +179,8 @@ func TestLoadPredefinedTestDataFromFile(t *testing.T) {
require.NoError(t, err)
err = user.MigrateStructure(sourceDB)
require.NoError(t, err)
err = character.MigrateStructure(sourceDB)
require.NoError(t, err)
/*err = character.MigrateStructure(sourceDB)
require.NoError(t, err)*/
err = models.MigrateStructure(sourceDB)
require.NoError(t, err)
err = skills.MigrateStructure(sourceDB)
@@ -213,8 +214,8 @@ func TestLoadPredefinedTestDataFromFile(t *testing.T) {
require.NoError(t, err)
err = user.MigrateStructure(targetDB)
require.NoError(t, err)
err = character.MigrateStructure(targetDB)
require.NoError(t, err)
/*err = character.MigrateStructure(targetDB)
require.NoError(t, err)*/
err = models.MigrateStructure(targetDB)
require.NoError(t, err)
err = skills.MigrateStructure(targetDB)
@@ -233,7 +234,7 @@ func TestLoadPredefinedTestDataFromFile(t *testing.T) {
assert.Greater(t, userCount, int64(0), "Should have loaded users")
var charCount int64
err = targetDB.Model(&character.Char{}).Count(&charCount).Error
err = targetDB.Model(&models.Char{}).Count(&charCount).Error
require.NoError(t, err)
assert.Greater(t, charCount, int64(0), "Should have loaded characters")
@@ -249,7 +250,7 @@ func TestLoadPredefinedTestDataFromFile(t *testing.T) {
assert.Equal(t, "testuser", loadedUser.Username)
assert.Equal(t, "test@example.com", loadedUser.Email)
var loadedChar character.Char
var loadedChar models.Char
err = targetDB.Where("name = ?", "Test Character").First(&loadedChar).Error
require.NoError(t, err)
assert.Equal(t, "Test Character", loadedChar.Name)
@@ -291,8 +292,8 @@ func TestSetupTestDBWithTestData(t *testing.T) {
require.NoError(t, err)
err = user.MigrateStructure(sourceDB)
require.NoError(t, err)
err = character.MigrateStructure(sourceDB)
require.NoError(t, err)
/*err = character.MigrateStructure(sourceDB)
require.NoError(t, err)*/
err = models.MigrateStructure(sourceDB)
require.NoError(t, err)
err = skills.MigrateStructure(sourceDB)
+46
View File
@@ -15,6 +15,26 @@ func MigrateStructure(db ...*gorm.DB) error {
targetDB = database.DB
}
err := gsMasterMigrateStructure(targetDB)
if err != nil {
return err
}
err = characterMigrateStructure(targetDB)
if err != nil {
return err
}
return nil
}
func gsMasterMigrateStructure(db ...*gorm.DB) error {
// Use provided DB or default to database.DB
var targetDB *gorm.DB
if len(db) > 0 && db[0] != nil {
targetDB = db[0]
} else {
targetDB = database.DB
}
err := targetDB.AutoMigrate(
&Skill{},
&WeaponSkill{},
@@ -30,3 +50,29 @@ func MigrateStructure(db ...*gorm.DB) error {
}
return nil
}
func characterMigrateStructure(db ...*gorm.DB) error {
// Use provided DB or default to database.DB
var targetDB *gorm.DB
if len(db) > 0 && db[0] != nil {
targetDB = db[0]
} else {
targetDB = database.DB
}
err := targetDB.AutoMigrate(
&Char{},
&Eigenschaft{},
&Lp{},
&Ap{},
&B{},
&Merkmale{},
&Erfahrungsschatz{},
&Bennies{},
&Vermoegen{},
)
if err != nil {
return err
}
return nil
}
@@ -1,17 +1,14 @@
package character
package models
import (
"bamort/database"
"bamort/equipment"
"bamort/models"
"bamort/skills"
"fmt"
"gorm.io/gorm"
)
var dbPrefix = "char"
// Au, Gs, Gw ,In, Ko, Pa, St, Wk, Zt
type Eigenschaft struct {
ID uint `gorm:"index" json:"id"`
@@ -49,7 +46,7 @@ type B struct {
*/
type Merkmale struct {
models.BamortCharTrait
BamortCharTrait
Augenfarbe string `json:"augenfarbe"`
Haarfarbe string `json:"haarfarbe"`
Sonstige string `json:"sonstige"`
@@ -58,27 +55,27 @@ type Merkmale struct {
}
type Erfahrungsschatz struct {
models.BamortCharTrait
BamortCharTrait
ES int `json:"es"` // Erfahrungsschatz
EP int `json:"ep"` // Erfahrungspunkte
}
type Bennies struct {
models.BamortCharTrait
BamortCharTrait
Gg int `json:"gg"` // Göttliche Gnade
Gp int `json:"gp"` // Glückspunkte
Sg int `json:"sg"` // Schicksalsgunst
}
type Vermoegen struct {
models.BamortCharTrait
BamortCharTrait
Goldstücke int `json:"goldstücke"` // GS
Silberstücke int `json:"silberstücke"` // SS
Kupferstücke int `json:"kupferstücke"` // KS
}
type Char struct {
models.BamortBase
BamortBase
Rasse string `json:"rasse"`
Typ string `json:"typ"`
Alter int `json:"alter"`
@@ -107,7 +104,7 @@ type Char struct {
Image string `json:"image,omitempty"`
}
type CharList struct {
models.BamortBase
BamortBase
Rasse string `json:"rasse"`
Typ string `json:"typ"`
Grad int `json:"grad"`
@@ -122,6 +119,7 @@ type FeChar struct {
}
func (object *Char) TableName() string {
dbPrefix := "char"
return dbPrefix + "_" + "chars"
}
@@ -200,26 +198,34 @@ func (object *Char) Delete() error {
return err
}
func (object *Eigenschaft) TableName() string {
dbPrefix := "char"
return dbPrefix + "_" + "eigenschaften"
}
func (object *Lp) TableName() string {
dbPrefix := "char"
return dbPrefix + "_" + "health"
}
func (object *Ap) TableName() string {
dbPrefix := "char"
return dbPrefix + "_" + "endurances"
}
func (object *B) TableName() string {
dbPrefix := "char"
return dbPrefix + "_" + "motionranges"
}
func (object *Merkmale) TableName() string {
dbPrefix := "char"
return dbPrefix + "_" + "characteristics"
}
func (object *Erfahrungsschatz) TableName() string {
dbPrefix := "char"
return dbPrefix + "_" + "experiances"
}
func (object *Bennies) TableName() string {
dbPrefix := "char"
return dbPrefix + "_" + "bennies"
}
func (object *Vermoegen) TableName() string {
dbPrefix := "char"
return dbPrefix + "_" + "wealth"
}