use serde::{Deserialize, Serialize};
#[cfg(feature = "sqlx")]
use sqlx::{FromRow, Type};
use time::OffsetDateTime;
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq, Serialize)]
#[serde(rename_all = "lowercase")]
#[cfg_attr(feature = "sqlx", derive(Type))]
#[cfg_attr(feature = "sqlx", sqlx(rename_all = "lowercase"))]
pub enum GameStatus {
Wishlist,
Backlog,
UpNext,
Playing,
RegularRotation,
Finished,
Abandoned,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
pub struct CreateGameRequest {
pub igdb_id: String,
pub status: GameStatus,
pub rating: Option<i16>,
pub finished_at: Option<OffsetDateTime>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct ListGamesResponse {
pub games: Vec<GameResult>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct GameInfo {
pub igdb_id: u64,
pub name: String,
pub rating: Option<f64>,
pub slug: Option<String>,
pub cover: Option<String>,
pub genres: Option<Vec<String>>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "sqlx", derive(FromRow))]
pub struct Game {
pub igdb_id: String,
pub status: GameStatus,
pub rating: Option<i16>,
#[serde(skip_serializing)]
pub user_email: String,
pub finished_at: Option<OffsetDateTime>,
}
impl Game {
pub fn from_request(req: CreateGameRequest, user_id: String) -> Self {
Self {
igdb_id: req.igdb_id,
status: req.status,
rating: req.rating,
finished_at: req.finished_at,
user_email: user_id,
}
}
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct GameResult {
pub status: GameStatus,
pub rating: Option<i16>,
pub finished_at: Option<OffsetDateTime>,
pub info: GameInfo,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct SearchGamesResponse {
pub games: Vec<GameInfo>,
}