0afce0dd59
Chemistry & squads: - Chemistry calculation on GET /squad (club/league/nation links, max 100) - Formation validation on POST /squad (exactly 11 starters, exactly 1 GK) Objectives: - Weekly objectives JSON (4 objectives: warrior, goals, dedicated, SBC) - Daily objectives auto-reset at midnight UTC (background task) SBC validation expanded: - max_overall per-player enforcement - required_clubs validation - min_players_from_same_nation validation - min_players_from_same_club validation Market: - GET /market?min_overall=X&position=Y filtering - Expiry cleanup runs before every NPC refresh - NPC market auto-refresh every 24h (background task, runs at startup) Matches: - GET /matches/opponent?difficulty=beginner|professional|world_class|legendary generates a random AI opponent squad from the card pool Statistics: - win_streak and best_win_streak tracking (migration 0002) - GET /statistics/history?limit=N — last N matches with summary stats Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
39 lines
1.0 KiB
Rust
39 lines
1.0 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)]
|
|
pub struct Statistics {
|
|
pub profile_id: String,
|
|
pub matches_played: i64,
|
|
pub matches_won: i64,
|
|
pub matches_drawn: i64,
|
|
pub matches_lost: i64,
|
|
pub goals_scored: i64,
|
|
pub goals_conceded: i64,
|
|
pub packs_opened: i64,
|
|
pub sbcs_completed: i64,
|
|
pub total_coins_earned: i64,
|
|
pub win_streak: i64,
|
|
pub best_win_streak: i64,
|
|
pub updated_at: String,
|
|
}
|
|
|
|
impl Statistics {
|
|
pub fn new(profile_id: impl Into<String>) -> Self {
|
|
Self {
|
|
profile_id: profile_id.into(),
|
|
matches_played: 0,
|
|
matches_won: 0,
|
|
matches_drawn: 0,
|
|
matches_lost: 0,
|
|
goals_scored: 0,
|
|
goals_conceded: 0,
|
|
packs_opened: 0,
|
|
sbcs_completed: 0,
|
|
total_coins_earned: 0,
|
|
win_streak: 0,
|
|
best_win_streak: 0,
|
|
updated_at: chrono::Utc::now().to_rfc3339(),
|
|
}
|
|
}
|
|
}
|