Minor fixes to orderings and permission serialization (#102)

* Fix latest_version in search results

* Handle users with invalid permissions instead of skipping them

* Specify order of some queries, fix serialization of permissions

* Run sqlx prepare
This commit is contained in:
Aeledfyr 2020-11-10 10:27:36 -06:00 committed by GitHub
parent 578d673a4e
commit da911bfeb8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 83 additions and 18 deletions

View File

@ -1137,6 +1137,26 @@
"nullable": []
}
},
"78c8b561e37e3aed48d3a4108ce7fd81866c6835ea91517ffc90c30e1284246e": {
"query": "\n SELECT id FROM versions\n WHERE mod_id = $1\n ORDER BY date_published ASC\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": "Int8"
}
],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": [
false
]
}
},
"7bbbeecf3246a8e07ad073a07f7d057e0990a810d69ae18cec41de60b704b174": {
"query": "\n SELECT id, user_id, member_name, role, permissions, accepted\n FROM team_members\n WHERE (team_id = $1 AND user_id = $2 AND accepted = TRUE)\n ",
"describe": {
@ -1430,6 +1450,24 @@
"nullable": []
}
},
"a82f1a23eaa2d6a0d1b331ce68c3fa307a20bbcde9b4846cea06e5502cb77a78": {
"query": "\n SELECT loader FROM loaders\n ORDER BY loader ASC\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "loader",
"type_info": "Varchar"
}
],
"parameters": {
"Left": []
},
"nullable": [
false
]
}
},
"a94eb4862ba30ca21f15198d9b7b9fd80ce01d45457e0b4d68270b5e3f9be8c6": {
"query": "\n SELECT u.github_id, u.name, u.email,\n u.avatar_url, u.username, u.bio,\n u.created, u.role\n FROM users u\n WHERE u.id = $1\n ",
"describe": {
@ -2212,6 +2250,24 @@
]
}
},
"ed2e4c5bf2df01ef670f5b0b4c3bd4b9aae9b7019938542a1b39ebd23d616617": {
"query": "\n SELECT category FROM categories\n ORDER BY category ASC\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "category",
"type_info": "Varchar"
}
],
"parameters": {
"Left": []
},
"nullable": [
false
]
}
},
"ed4c0b620d01cdcdd0c2b3b5727ae3485d51114ca76e17331cec0d244d7f972d": {
"query": "\n SELECT version FROM game_versions\n ORDER BY created DESC\n ",
"describe": {

View File

@ -107,7 +107,7 @@ impl TeamMember {
if let Some(m) = e.right() {
let permissions = Permissions::from_bits(m.permissions as u64);
if let Some(perms) = permissions {
Ok(Some(TeamMember {
Ok(Some(Ok(TeamMember {
id: TeamMemberId(m.id),
team_id: id,
user_id: UserId(m.user_id),
@ -115,17 +115,21 @@ impl TeamMember {
role: m.role,
permissions: perms,
accepted: m.accepted,
}))
})))
} else {
Ok(None)
Ok(Some(Err(super::DatabaseError::BitflagError)))
}
} else {
Ok(None)
}
})
.try_collect::<Vec<TeamMember>>()
.try_collect::<Vec<Result<TeamMember, super::DatabaseError>>>()
.await?;
let team_members = team_members
.into_iter()
.collect::<Result<Vec<TeamMember>, super::DatabaseError>>()?;
Ok(team_members)
}
@ -152,7 +156,7 @@ impl TeamMember {
if let Some(m) = e.right() {
let permissions = Permissions::from_bits(m.permissions as u64);
if let Some(perms) = permissions {
Ok(Some(TeamMember {
Ok(Some(Ok(TeamMember {
id: TeamMemberId(m.id),
team_id: TeamId(m.team_id),
user_id: id,
@ -160,17 +164,21 @@ impl TeamMember {
role: m.role,
permissions: perms,
accepted: m.accepted,
}))
})))
} else {
Ok(None)
Ok(Some(Err(super::DatabaseError::BitflagError)))
}
} else {
Ok(None)
}
})
.try_collect::<Vec<TeamMember>>()
.try_collect::<Vec<Result<TeamMember, super::DatabaseError>>>()
.await?;
let team_members = team_members
.into_iter()
.collect::<Result<Vec<TeamMember>, super::DatabaseError>>()?;
Ok(team_members)
}

View File

@ -331,6 +331,7 @@ impl Version {
"
SELECT id FROM versions
WHERE mod_id = $1
ORDER BY date_published ASC
",
mod_id as ModId,
)

View File

@ -22,6 +22,7 @@ pub struct Team {
bitflags::bitflags! {
#[derive(Serialize, Deserialize)]
#[serde(transparent)]
pub struct Permissions: u64 {
const UPLOAD_VERSION = 1 << 0;
const DELETE_VERSION = 1 << 1;
@ -51,5 +52,5 @@ pub struct TeamMember {
/// The role of the user in the team
pub role: String,
/// A bitset containing the user's permissions in this team
pub permissions: Permissions,
pub permissions: Option<Permissions>,
}

View File

@ -30,7 +30,7 @@ pub async fn team_members_get(
user_id: data.user_id.into(),
name: data.name,
role: data.role,
permissions: data.permissions,
permissions: Some(data.permissions),
})
.collect();
@ -44,7 +44,7 @@ pub async fn team_members_get(
user_id: data.user_id.into(),
name: data.name,
role: data.role,
permissions: Permissions::default(),
permissions: None,
})
.collect();

View File

@ -1,6 +1,5 @@
use crate::auth::{check_is_moderator_from_headers, get_user_from_headers};
use crate::database::models::{TeamMember, User};
use crate::models::teams::Permissions;
use crate::models::users::{Role, UserId};
use crate::routes::ApiError;
use actix_web::{delete, get, web, HttpRequest, HttpResponse};
@ -152,9 +151,9 @@ pub async fn teams(
name: data.name,
role: data.role,
permissions: if same_user {
data.permissions
Some(data.permissions)
} else {
Permissions::default()
None
},
})
.collect();

View File

@ -22,7 +22,7 @@ pub async fn index_local(pool: PgPool) -> Result<Vec<UploadSearchMod>, IndexingE
if let Ok(mod_data) = result {
let versions = sqlx::query!(
"
SELECT gv.version FROM versions
SELECT DISTINCT gv.version, gv.created FROM versions
INNER JOIN game_versions_versions gvv ON gvv.joining_version_id=versions.id
INNER JOIN game_versions gv ON gvv.game_version_id=gv.id
WHERE versions.mod_id = $1
@ -90,7 +90,7 @@ pub async fn index_local(pool: PgPool) -> Result<Vec<UploadSearchMod>, IndexingE
// minecraft that this mod has a version that supports; it doesn't
// take betas or other info into account.
let latest_version = versions
.get(0)
.last()
.cloned()
.map(Cow::Owned)
.unwrap_or_else(|| Cow::Borrowed(""));
@ -134,7 +134,7 @@ pub async fn query_one(
let versions = sqlx::query!(
"
SELECT gv.version FROM versions
SELECT DISTINCT gv.version, gv.created FROM versions
INNER JOIN game_versions_versions gvv ON gvv.joining_version_id=versions.id
INNER JOIN game_versions gv ON gvv.game_version_id=gv.id
WHERE versions.mod_id = $1
@ -202,7 +202,7 @@ pub async fn query_one(
// minecraft that this mod has a version that supports; it doesn't
// take betas or other info into account.
let latest_version = versions
.get(0)
.last()
.cloned()
.map(Cow::Owned)
.unwrap_or_else(|| Cow::Borrowed(""));