* More mod info

* Downloading mods

* Run prepare

* User editing + icon editing

* Finish

* Some fixes

* Fix clippy errors

* Fix hash lookup

* Run prepare

* Run formatter
This commit is contained in:
Geometrically
2020-11-29 14:27:40 -07:00
committed by GitHub
parent 1da5357df6
commit a7be6504a2
7 changed files with 204 additions and 185 deletions

View File

@@ -459,9 +459,9 @@ impl Mod {
",
inner.client_side.0,
)
.fetch_one(executor)
.await?
.name;
.fetch_one(executor)
.await?
.name;
let server_side = sqlx::query!(
"
@@ -470,9 +470,9 @@ impl Mod {
",
inner.server_side.0,
)
.fetch_one(executor)
.await?
.name;
.fetch_one(executor)
.await?
.name;
let license = sqlx::query!(
"
@@ -481,8 +481,8 @@ impl Mod {
",
inner.license.0,
)
.fetch_one(executor)
.await?;
.fetch_one(executor)
.await?;
Ok(Some(QueryMod {
inner,
@@ -493,7 +493,7 @@ impl Mod {
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)
server_side: crate::models::mods::SideType::from_str(&server_side),
}))
} else {
Ok(None)

View File

@@ -173,11 +173,14 @@ async fn main() -> std::io::Result<()> {
WHERE date < (CURRENT_DATE - INTERVAL '30 minutes ago')
"
)
.execute(&pool_ref)
.await;
.execute(&pool_ref)
.await;
if let Err(e) = downloads_result {
warn!("Deleting old records from temporary table downloads failed: {:?}", e);
warn!(
"Deleting old records from temporary table downloads failed: {:?}",
e
);
}
let states_result = sqlx::query!(
@@ -186,16 +189,18 @@ async fn main() -> std::io::Result<()> {
WHERE expires < CURRENT_DATE
"
)
.execute(&pool_ref)
.await;
.execute(&pool_ref)
.await;
if let Err(e) = states_result {
warn!("Deleting old records from temporary table states failed: {:?}", e);
warn!(
"Deleting old records from temporary table states failed: {:?}",
e
);
}
info!("Finished deleting old records from temporary tables");
}
});
let indexing_queue = Arc::new(search::indexing::queue::CreationQueue::new());
@@ -260,7 +265,7 @@ async fn main() -> std::io::Result<()> {
scheduler::schedule_versions(&mut scheduler, pool.clone(), skip_initial);
let ip_salt = Pepper {
pepper: crate::models::ids::Base62Id(crate::models::ids::random_base62(11)).to_string()
pepper: crate::models::ids::Base62Id(crate::models::ids::random_base62(11)).to_string(),
};
let allowed_origins = dotenv::var("CORS_ORIGINS")

View File

@@ -2,12 +2,12 @@ use super::ApiError;
use crate::auth::check_is_moderator_from_headers;
use crate::database;
use crate::models;
use crate::models::mods::{ModStatus, VersionType, ModId};
use actix_web::{get, web, HttpRequest, HttpResponse};
use serde::{Serialize, Deserialize};
use sqlx::PgPool;
use sqlx::types::chrono::{DateTime, Utc};
use crate::models::mods::{ModId, ModStatus, VersionType};
use crate::models::teams::TeamId;
use actix_web::{get, web, HttpRequest, HttpResponse};
use serde::{Deserialize, Serialize};
use sqlx::types::chrono::{DateTime, Utc};
use sqlx::PgPool;
#[derive(Deserialize)]
pub struct ResultCount {

View File

@@ -350,7 +350,9 @@ pub async fn mod_edit(
));
}
if (status == &ModStatus::Rejected || status == &ModStatus::Approved) && !user.role.is_mod() {
if (status == &ModStatus::Rejected || status == &ModStatus::Approved)
&& !user.role.is_mod()
{
return Err(ApiError::CustomAuthenticationError(
"You don't have permission to set this status".to_string(),
));

View File

@@ -45,10 +45,7 @@ pub async fn users_get(
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?;
let users: Vec<crate::models::users::User> = users_data
.into_iter()
.map(convert_user)
.collect();
let users: Vec<crate::models::users::User> = users_data.into_iter().map(convert_user).collect();
Ok(HttpResponse::Ok().json(users))
}

View File

@@ -1,9 +1,9 @@
use super::ApiError;
use crate::auth::{check_is_moderator_from_headers, get_user_from_headers};
use crate::{database, Pepper};
use crate::file_hosting::FileHost;
use crate::models;
use crate::models::teams::Permissions;
use crate::{database, Pepper};
use actix_web::{delete, get, patch, web, HttpRequest, HttpResponse};
use serde::{Deserialize, Serialize};
use sqlx::PgPool;
@@ -117,23 +117,27 @@ pub async fn version_get(
let user_option = get_user_from_headers(req.headers(), &**pool).await.ok();
if let Some(data) = version_data {
if let Some(user) = user_option {
if !data.accepted && !user.role.is_mod() {
let user_id: database::models::ids::UserId = user.id.into();
if !data.accepted {
if let Some(user) = user_option {
if !user.role.is_mod() {
let user_id: database::models::ids::UserId = user.id.into();
let member_exists = sqlx::query!(
"SELECT EXISTS(SELECT 1 FROM team_members tm INNER JOIN mods m ON m.team_id = tm.id AND m.id = $1 WHERE tm.user_id = $2)",
data.mod_id as database::models::ModId,
user_id as database::models::ids::UserId,
)
.fetch_one(&**pool)
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?
.exists;
let member_exists = sqlx::query!(
"SELECT EXISTS(SELECT 1 FROM team_members tm INNER JOIN mods m ON m.team_id = tm.id AND m.id = $1 WHERE tm.user_id = $2)",
data.mod_id as database::models::ModId,
user_id as database::models::ids::UserId,
)
.fetch_one(&**pool)
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?
.exists;
if !member_exists.unwrap_or(false) {
return Ok(HttpResponse::NotFound().body(""));
if !member_exists.unwrap_or(false) {
return Ok(HttpResponse::NotFound().body(""));
}
}
} else {
return Ok(HttpResponse::NotFound().body(""));
}
}
@@ -553,8 +557,9 @@ pub async fn get_version_from_hash(
let result = sqlx::query!(
"
SELECT version_id FROM files
INNER JOIN hashes ON hash = $1 AND algorithm = $2
SELECT f.version_id version_id FROM hashes h
INNER JOIN files f ON h.file_id = f.id
WHERE h.algorithm = $2 AND h.hash = $1
",
hash.as_bytes(),
algorithm.algorithm
@@ -599,9 +604,10 @@ pub async fn download_version(
let result = sqlx::query!(
"
SELECT f.url url, f.id id, f.version_id version_id, v.mod_id mod_id FROM files f
SELECT f.url url, f.id id, f.version_id version_id, v.mod_id mod_id FROM hashes h
INNER JOIN files f ON h.file_id = f.id
INNER JOIN versions v ON v.id = f.version_id
INNER JOIN hashes ON hash = $1 AND algorithm = $2
WHERE h.algorithm = $2 AND h.hash = $1
",
hash.as_bytes(),
algorithm.algorithm
@@ -692,8 +698,10 @@ pub async fn delete_file(
let result = sqlx::query!(
"
SELECT version_id, filename FROM files
INNER JOIN hashes ON hash = $1 AND algorithm = $2
SELECT f.id id, f.version_id version_id, f.filename filename, v.version_number version_number, v.mod_id mod_id FROM hashes h
INNER JOIN files f ON h.file_id = f.id
INNER JOIN versions v ON v.id = f.version_id
WHERE h.algorithm = $2 AND h.hash = $1
",
hash.as_bytes(),
algorithm.algorithm
@@ -703,62 +711,51 @@ pub async fn delete_file(
.map_err(|e| ApiError::DatabaseError(e.into()))?;
if let Some(row) = result {
let version_data = database::models::Version::get_full(
database::models::VersionId(row.version_id),
&**pool,
)
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?;
let mut transaction = pool
.begin()
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?;
if let Some(data) = version_data {
let mut transaction = pool
.begin()
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?;
sqlx::query!(
"
sqlx::query!(
"
DELETE FROM hashes
WHERE hash = $1 AND algorithm = $2
",
hash.as_bytes(),
algorithm.algorithm
)
.execute(&mut *transaction)
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?;
hash.as_bytes(),
algorithm.algorithm
)
.execute(&mut *transaction)
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?;
sqlx::query!(
"
sqlx::query!(
"
DELETE FROM files
WHERE files.version_id = $1
WHERE files.id = $1
",
data.id as database::models::ids::VersionId,
row.id,
)
.execute(&mut *transaction)
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?;
let mod_id: models::mods::ModId = database::models::ids::ModId(row.mod_id).into();
file_host
.delete_file_version(
"",
&format!(
"data/{}/versions/{}/{}",
mod_id, row.version_number, row.filename
),
)
.execute(&mut *transaction)
.await?;
transaction
.commit()
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?;
let mod_id: models::mods::ModId = data.mod_id.into();
file_host
.delete_file_version(
"",
&format!(
"data/{}/versions/{}/{}",
mod_id, data.version_number, row.filename
),
)
.await?;
transaction
.commit()
.await
.map_err(|e| ApiError::DatabaseError(e.into()))?;
Ok(HttpResponse::Ok().body(""))
} else {
Ok(HttpResponse::NotFound().body(""))
}
Ok(HttpResponse::Ok().body(""))
} else {
Ok(HttpResponse::NotFound().body(""))
}