More mod info (#104)

* More mod info

* Downloading mods

* Run prepare

* User editing + icon editing

* Finish

* Some fixes

* Fix clippy errors
This commit is contained in:
Geometrically
2020-11-27 10:57:04 -07:00
committed by GitHub
parent 92e1847c59
commit 1da5357df6
19 changed files with 3287 additions and 604 deletions

View File

@@ -1,5 +1,36 @@
use super::ids::*;
pub struct DonationUrl {
pub mod_id: ModId,
pub platform_id: DonationPlatformId,
pub url: String,
}
impl DonationUrl {
pub async fn insert(
&self,
transaction: &mut sqlx::Transaction<'_, sqlx::Postgres>,
) -> Result<(), sqlx::error::Error> {
sqlx::query!(
"
INSERT INTO mods_donations (
joining_mod_id, joining_platform_id, url
)
VALUES (
$1, $2, $3
)
",
self.mod_id as ModId,
self.platform_id as DonationPlatformId,
self.url,
)
.execute(&mut *transaction)
.await?;
Ok(())
}
}
pub struct ModBuilder {
pub mod_id: ModId,
pub team_id: TeamId,
@@ -10,9 +41,16 @@ pub struct ModBuilder {
pub issues_url: Option<String>,
pub source_url: Option<String>,
pub wiki_url: Option<String>,
pub license_url: Option<String>,
pub discord_url: Option<String>,
pub categories: Vec<CategoryId>,
pub initial_versions: Vec<super::version_item::VersionBuilder>,
pub status: StatusId,
pub client_side: SideTypeId,
pub server_side: SideTypeId,
pub license: LicenseId,
pub slug: Option<String>,
pub donation_urls: Vec<DonationUrl>,
}
impl ModBuilder {
@@ -34,6 +72,12 @@ impl ModBuilder {
issues_url: self.issues_url,
source_url: self.source_url,
wiki_url: self.wiki_url,
license_url: self.license_url,
discord_url: self.discord_url,
client_side: self.client_side,
server_side: self.server_side,
license: self.license,
slug: self.slug,
};
mod_struct.insert(&mut *transaction).await?;
@@ -42,6 +86,11 @@ impl ModBuilder {
version.insert(&mut *transaction).await?;
}
for mut donation in self.donation_urls {
donation.mod_id = self.mod_id;
donation.insert(&mut *transaction).await?;
}
for category in self.categories {
sqlx::query!(
"
@@ -73,6 +122,12 @@ pub struct Mod {
pub issues_url: Option<String>,
pub source_url: Option<String>,
pub wiki_url: Option<String>,
pub license_url: Option<String>,
pub discord_url: Option<String>,
pub client_side: SideTypeId,
pub server_side: SideTypeId,
pub license: LicenseId,
pub slug: Option<String>,
}
impl Mod {
@@ -85,12 +140,16 @@ impl Mod {
INSERT INTO mods (
id, team_id, title, description, body_url,
published, downloads, icon_url, issues_url,
source_url, wiki_url, status
source_url, wiki_url, status, discord_url,
client_side, server_side, license_url, license,
slug
)
VALUES (
$1, $2, $3, $4, $5,
$6, $7, $8, $9,
$10, $11, $12
$10, $11, $12, $13,
$14, $15, $16, $17,
$18
)
",
self.id as ModId,
@@ -104,7 +163,13 @@ impl Mod {
self.issues_url.as_ref(),
self.source_url.as_ref(),
self.wiki_url.as_ref(),
self.status.0
self.status.0,
self.discord_url.as_ref(),
self.client_side as SideTypeId,
self.server_side as SideTypeId,
self.license_url.as_ref(),
self.license as LicenseId,
self.slug.as_ref()
)
.execute(&mut *transaction)
.await?;
@@ -121,8 +186,8 @@ impl Mod {
SELECT title, description, downloads,
icon_url, body_url, published,
updated, status,
issues_url, source_url, wiki_url,
team_id
issues_url, source_url, wiki_url, discord_url, license_url,
team_id, client_side, server_side, license, slug
FROM mods
WHERE id = $1
",
@@ -145,7 +210,13 @@ impl Mod {
issues_url: row.issues_url,
source_url: row.source_url,
wiki_url: row.wiki_url,
license_url: row.license_url,
discord_url: row.discord_url,
client_side: SideTypeId(row.client_side),
status: StatusId(row.status),
server_side: SideTypeId(row.server_side),
license: LicenseId(row.license),
slug: row.slug,
}))
} else {
Ok(None)
@@ -164,8 +235,8 @@ impl Mod {
SELECT id, title, description, downloads,
icon_url, body_url, published,
updated, status,
issues_url, source_url, wiki_url,
team_id
issues_url, source_url, wiki_url, discord_url, license_url,
team_id, client_side, server_side, license, slug
FROM mods
WHERE id IN (SELECT * FROM UNNEST($1::bigint[]))
",
@@ -186,7 +257,13 @@ impl Mod {
issues_url: m.issues_url,
source_url: m.source_url,
wiki_url: m.wiki_url,
license_url: m.license_url,
discord_url: m.discord_url,
client_side: SideTypeId(m.client_side),
status: StatusId(m.status),
server_side: SideTypeId(m.server_side),
license: LicenseId(m.license),
slug: m.slug,
}))
})
.try_collect::<Vec<Mod>>()
@@ -227,6 +304,16 @@ impl Mod {
.execute(exec)
.await?;
sqlx::query!(
"
DELETE FROM mods_donations
WHERE joining_mod_id = $1
",
id as ModId,
)
.execute(exec)
.await?;
use futures::TryStreamExt;
let versions: Vec<VersionId> = sqlx::query!(
"
@@ -277,6 +364,30 @@ impl Mod {
Ok(Some(()))
}
pub async fn get_full_from_slug<'a, 'b, E>(
slug: String,
executor: E,
) -> Result<Option<QueryMod>, sqlx::error::Error>
where
E: sqlx::Executor<'a, Database = sqlx::Postgres> + Copy,
{
let id = sqlx::query!(
"
SELECT id FROM mods
WHERE slug = $1
",
slug
)
.fetch_optional(executor)
.await?;
if let Some(mod_id) = id {
Mod::get_full(ModId(mod_id.id), executor).await
} else {
Ok(None)
}
}
pub async fn get_full<'a, 'b, E>(
id: ModId,
executor: E,
@@ -312,6 +423,24 @@ impl Mod {
.try_collect::<Vec<VersionId>>()
.await?;
let donations: Vec<DonationUrl> = sqlx::query!(
"
SELECT joining_platform_id, url FROM mods_donations
WHERE joining_mod_id = $1
",
id as ModId,
)
.fetch_many(executor)
.try_filter_map(|e| async {
Ok(e.right().map(|c| DonationUrl {
mod_id: id,
platform_id: DonationPlatformId(c.joining_platform_id),
url: c.url,
}))
})
.try_collect::<Vec<DonationUrl>>()
.await?;
let status = sqlx::query!(
"
SELECT status FROM statuses
@@ -323,11 +452,48 @@ impl Mod {
.await?
.status;
let client_side = sqlx::query!(
"
SELECT name FROM side_types
WHERE id = $1
",
inner.client_side.0,
)
.fetch_one(executor)
.await?
.name;
let server_side = sqlx::query!(
"
SELECT name FROM side_types
WHERE id = $1
",
inner.server_side.0,
)
.fetch_one(executor)
.await?
.name;
let license = sqlx::query!(
"
SELECT short, name FROM licenses
WHERE id = $1
",
inner.license.0,
)
.fetch_one(executor)
.await?;
Ok(Some(QueryMod {
inner,
categories,
versions,
donation_urls: donations,
status: crate::models::mods::ModStatus::from_str(&status),
license_id: license.short,
license_name: license.name,
client_side: crate::models::mods::SideType::from_str(&client_side),
server_side: crate::models::mods::SideType::from_str(&server_side)
}))
} else {
Ok(None)
@@ -351,5 +517,10 @@ pub struct QueryMod {
pub categories: Vec<String>,
pub versions: Vec<VersionId>,
pub donation_urls: Vec<DonationUrl>,
pub status: crate::models::mods::ModStatus,
pub license_id: String,
pub license_name: String,
pub client_side: crate::models::mods::SideType,
pub server_side: crate::models::mods::SideType,
}