From a63c4febf49a2fb3defc32b86fb8d79a81a1ece5 Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Sun, 11 Jan 2026 21:00:40 +0300 Subject: [PATCH] add downloads --- core/src/requests/games.rs | 3 +++ core/src/types/game.rs | 27 +++++++++++++++++++- http/src/client/games.rs | 3 +++ http/src/requests/games.rs | 3 +++ http/src/server/routes/games.rs | 44 +++++++++++++++++++++++++++++++-- 5 files changed, 77 insertions(+), 3 deletions(-) diff --git a/core/src/requests/games.rs b/core/src/requests/games.rs index f7bbe34..4688bd9 100644 --- a/core/src/requests/games.rs +++ b/core/src/requests/games.rs @@ -22,6 +22,7 @@ pub mod update { pub slug: Patch, pub thumbnail: Patch>, pub genres: Patch, + pub downloads: Patch>, pub badges: Patch, pub tags: Patch, pub screenshots: Patch, @@ -153,6 +154,8 @@ pub mod create { pub tags: mark::Tags, #[serde(default)] pub genres: mark::Genres, + #[serde(default)] + pub downloads: Vec, pub slug: Option, pub vndb: Option, pub release_date: Option, diff --git a/core/src/types/game.rs b/core/src/types/game.rs index 39649c1..2b61b2f 100644 --- a/core/src/types/game.rs +++ b/core/src/types/game.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use eva::{array, data, int, str, str::CompactString, time::Date}; +use eva::{array, data, int, str, str::CompactString, time::Date, url}; use crate::types::{author, entity::define_eid, file, mark, slug, user}; @@ -80,6 +80,30 @@ pub struct Marks { pub badges: HashMap, } +#[data(copy)] +pub enum Platform { + Android, + Ios, + Pc { + linux: bool, + mac: bool, + windows: bool, + }, +} + +#[data] +pub enum DownloadLink { + External(url::Url), + Dedicated(file::Id), +} + +#[data] +pub struct Download { + pub platform: Platform, + pub link: DownloadLink, + pub label: CompactString, +} + #[data] pub struct Game { pub id: Id, @@ -95,6 +119,7 @@ pub struct Game { pub author: author::Mini, pub release_date: Option, pub publication: Option, + pub downloads: Vec, pub screenshots: Screenshots, pub tags: mark::Tags, diff --git a/http/src/client/games.rs b/http/src/client/games.rs index 6258cc6..33639f8 100644 --- a/http/src/client/games.rs +++ b/http/src/client/games.rs @@ -62,6 +62,7 @@ impl Games for HttpClient { title, description, thumbnail, + downloads, author, slug, vndb, @@ -77,6 +78,7 @@ impl Games for HttpClient { thumbnail, author, tags, + downloads, genres, slug, vndb, @@ -92,6 +94,7 @@ impl Games for HttpClient { ( c!("/games/{id}"), requests::Update { + downloads: update.downloads, title: update.title, description: update.description, slug: update.slug, diff --git a/http/src/requests/games.rs b/http/src/requests/games.rs index 135aa44..847959a 100644 --- a/http/src/requests/games.rs +++ b/http/src/requests/games.rs @@ -15,6 +15,7 @@ pub struct Update { pub description: Patch>, pub slug: Patch, pub thumbnail: Patch>, + pub downloads: Patch>, pub genres: Patch, pub badges: Patch, pub tags: Patch, @@ -71,6 +72,8 @@ pub struct Create { pub description: Option, pub thumbnail: Option, pub author: author::Id, + #[serde(default)] + pub downloads: Vec, pub slug: Option, #[serde(default)] pub tags: mark::Tags, diff --git a/http/src/server/routes/games.rs b/http/src/server/routes/games.rs index bc58da2..fb996bd 100644 --- a/http/src/server/routes/games.rs +++ b/http/src/server/routes/games.rs @@ -1,9 +1,9 @@ use super::*; -use crate::requests::games::{Create, Get, Search}; +use crate::requests::games::{Create, Get, Search, Update}; use viendesu_core::{ - requests::games::{create, get, search}, + requests::games::{create, get, search, update}, service::games::Games, types::{author, game}, }; @@ -21,6 +21,7 @@ pub fn make(router: RouterScope) -> RouterScope { genres, author, slug, + downloads, vndb, release_date, } = ctx.request; @@ -31,6 +32,7 @@ pub fn make(router: RouterScope) -> RouterScope { title, description, thumbnail, + downloads, author, slug, tags, @@ -41,6 +43,44 @@ pub fn make(router: RouterScope) -> RouterScope { .await }), ) + .route( + "/{game_id}", + patch(async |mut session: SessionOf, mut ctx: Ctx| { + let game_id: game::Id = ctx.path().await?; + let Update { + title, + description, + slug, + thumbnail, + downloads, + genres, + badges, + tags, + screenshots, + published, + } = ctx.request; + + session + .games() + .update() + .call(update::Args { + id: game_id, + update: update::Update { + title, + description, + slug, + thumbnail, + genres, + downloads, + badges, + tags, + screenshots, + published, + }, + }) + .await + }), + ) .route( "/{game_id}", get(async |mut session: SessionOf, mut ctx: Ctx| {