package rules import "git.yeij.top/AskaEth/Scoreboard/server/internal/domain" // 本文件是规则包类型与 domain 类型之间的唯一转换入口; // 转换只搬字段、不填默认值(默认值统一由 Canonical 负责),避免两处口径打架。 // ToDomain 把模板转成 domain.ScoringProfile;id 由调用方(仓储层)决定。 func (p Profile) ToDomain(id int64) domain.ScoringProfile { tie := p.TieMode if tie == "" { tie = domain.TieSkip } bonus := p.RecordBonusMode if bonus == "" { bonus = domain.RecordBonusMax } rules := make([]domain.ScoringRule, 0, len(p.Rules)) for _, r := range p.Rules { rules = append(rules, domain.ScoringRule{Rank: r.Rank, Points: r.Points}) } return domain.ScoringProfile{ ID: id, Code: p.Code, Name: p.Name, AwardRanks: p.AwardRanks, LastPlaceZero: p.LastPlaceZero, TieMode: tie, RecordBonusMode: bonus, Rules: rules, } } // ToDomain 把通道转成 domain.ScoreChannel;profileID 由调用方按模板编码查出。 // 三个开关缺省(true)时不落指针,保持与「库里只有显式关闭的通道才写 0」一致; // 汇总口径落库时补成具体值(avg / sum),缺省即 avg。 func (c Channel) ToDomain(eventID, profileID int64, sortOrder int) domain.ScoreChannel { out := domain.ScoreChannel{ EventID: eventID, Scope: c.Scope, Basis: c.Basis, ProfileID: profileID, SortOrder: sortOrder, AggregateMode: c.AggregatesBy(), } if !c.CountsToTeam() { out.CountToTeam = BoolPtr(false) } if !c.CountsToMedals() { out.CountToMedals = BoolPtr(false) } if !c.CountsToTeamMedals() { out.CountToTeamMedals = BoolPtr(false) } return out } // ProfileIndex 按模板编码建索引,便于通道引用解析。 func (p *RulePack) ProfileIndex() map[string]Profile { out := make(map[string]Profile, len(p.Profiles)) for _, prof := range p.Profiles { out[prof.Code] = prof } return out } // ToDomain 把破纪录配置转成 domain.RecordBonusConfig。 func (r RecordBonus) ToDomain() domain.RecordBonusConfig { mode := r.Mode if mode == "" { mode = domain.RecordBonusMax } levels := make([]domain.RecordLevel, 0, len(r.Levels)) for _, lv := range r.Levels { levels = append(levels, domain.RecordLevel{Code: lv.Code, Name: lv.Name, Points: lv.Points}) } return domain.RecordBonusConfig{Enabled: r.Enabled, Mode: mode, Levels: levels} } // ToDomain 把人工调整开关转成 domain.ManualAdjustmentConfig。 func (m ManualAdjustment) ToDomain() domain.ManualAdjustmentConfig { return domain.ManualAdjustmentConfig{Enabled: m.Enabled, ReasonRequired: m.ReasonRequired} }