package db import ( "errors" dbFacade "f1-game/internal/component/db/facade" nameDB "f1-game/internal/name/db" dbSeason "f1-game/nodes/map/internal/db/data/season" clog "github.com/cherry-game/cherry/logger" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" ) type ( // SeasonTable 赛季表 SeasonTable struct { NodeID string `bson:"NodeID,omitempty"` // node id StartTime int64 `bson:"StartTime,omitempty"` // 赛季开始时间 SeasonID int32 `bson:"SeasonID,omitempty"` // 赛季ID SeasonQuest dbSeason.SeasonQuest `bson:"SeasonQuest,omitempty"` // 赛季霸业任务 dbFacade.TableBase `bson:",inline"` isChangeData bool `bson:"-"` } ) func (p *SeasonTable) TableName() string { return nameDB.Table_MapSeason } func (p *SeasonTable) PrimaryValue() any { return p.SeasonID } func (p *SeasonTable) CheckField() { p.SeasonQuest.CheckField() } func (p *SeasonTable) Filter() bson.M { return bson.M{ nameDB.Field_NodeID: p.NodeID, } } func (p *SeasonTable) SetChangeData() { p.isChangeData = true } func (p *SeasonTable) Save2Queue() { if p.isChangeData { save2Queue(p) p.isChangeData = false } } func newSeasonTable(nodeID string) *SeasonTable { table := &SeasonTable{ NodeID: nodeID, } table.CheckField() return table } func GetSeasonTable(nodeID string) *SeasonTable { if val, ok := mapSeasonCache.GetIfPresent(nodeID); ok { return val.(*SeasonTable) } seasonTable := GetSeasonTableFromDB(nodeID) mapSeasonCache.Put(nodeID, seasonTable) return seasonTable } func GetSeasonTableFromDB(nodeID string) *SeasonTable { seasonTable := newSeasonTable(nodeID) filter := bson.M{ nameDB.Field_NodeID: nodeID, } err := dbComponent.FindOne(seasonTable, filter) if err != nil { if errors.Is(err, mongo.ErrNoDocuments) { clog.Warnf("[nodeID = %v] not found, create new one", seasonTable.NodeID) return seasonTable } clog.Errorf("nodeID = %v, err = %v", seasonTable.NodeID, err) return seasonTable } return seasonTable }