Files
Foundry-Scrapping-API/internal/foundry/transport/db.go
2026-04-27 13:14:17 +03:00

138 lines
2.8 KiB
Go

package transport
import (
"slices"
"time"
"gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/models/db"
"gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/models/json"
"gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/requests"
"gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/types"
)
func (tr *FoundryTransport) FillDBWithFoundryData() error {
now := time.Now()
setupExist, err := db.HasSetup(tr.DB)
if err != nil {
return err
}
if !setupExist {
err := tr.InsertSetupToDB()
if err != nil {
return err
}
}
err = tr.InitWorldsData()
if err != nil {
return err
}
tr.Logger.Info("Initialization has been successful", "elapsed_time", time.Since(now).String())
return nil
}
func (tr *FoundryTransport) InsertSetupToDB() error {
msgJson, err := tr.GetJsonDataByType(requests.SetupPath)
if err != nil {
return err
}
foundryStateJson, err := json.ParseSetup(msgJson)
if err != nil {
return err
}
tr.Logger.Info("Setup data received")
var foundryStateDb db.Setup
foundryStateJson.ToDB(&foundryStateDb)
err = foundryStateDb.Insert(tr.DB)
if err != nil {
return err
}
return nil
}
func (tr *FoundryTransport) InitWorldsData() error {
worldNames, err := db.GetNotStartedWorlds(tr.DB)
if err != nil {
return err
}
for i := range tr.InitWorlds {
initWorld := tr.InitWorlds[i]
if !slices.Contains(worldNames, initWorld.Name) {
tr.Logger.Warn("World name does not exist in database or have been already inserted. Skip!", "world_name", initWorld.Name)
continue
}
err = tr.InitWorldData(initWorld)
if err != nil {
return err
}
_, err := tr.Http.PostReturnToSetup()
if err != nil {
return err
}
}
return nil
}
func (tr *FoundryTransport) InitWorldData(worldData types.WorldData) error {
tr.Logger.Debug("Launching world...", "world_name", worldData.Name)
err := tr.LaunchWorld(worldData.Name)
if err != nil {
return err
}
if worldData.UserId == "" {
worldData.UserId, err = tr.GetUserId(worldData.Username)
if err != nil {
return err
}
}
err = tr.ConnectToWorld(worldData.UserId, worldData.UserPass)
if err != nil {
return err
}
return tr.InsertGameToDB()
}
func (tr *FoundryTransport) InsertGameToDB() error {
msgJson, err := tr.GetJsonData("world")
if err != nil {
return err
}
game, err := json.ParseGame(msgJson)
if err != nil {
return err
}
var gameDb db.Game
game.ToDB(&gameDb)
isInserted, err := db.IsWorldInserted(tr.DB, game.World.ID)
if err != nil {
return err
}
if isInserted {
return nil
}
tr.Logger.Info("Game data received", "world_name", game.World.ID)
err = gameDb.Insert(tr.DB)
if err != nil {
return err
}
tr.Logger.Info("Game data inserted to DB", "world_name", game.World.ID)
return nil
}