You've already forked AstralRinth
forked from didirus/AstralRinth
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:
@@ -1137,6 +1137,26 @@
|
|||||||
"nullable": []
|
"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": {
|
"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 ",
|
"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": {
|
"describe": {
|
||||||
@@ -1430,6 +1450,24 @@
|
|||||||
"nullable": []
|
"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": {
|
"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 ",
|
"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": {
|
"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": {
|
"ed4c0b620d01cdcdd0c2b3b5727ae3485d51114ca76e17331cec0d244d7f972d": {
|
||||||
"query": "\n SELECT version FROM game_versions\n ORDER BY created DESC\n ",
|
"query": "\n SELECT version FROM game_versions\n ORDER BY created DESC\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ impl TeamMember {
|
|||||||
if let Some(m) = e.right() {
|
if let Some(m) = e.right() {
|
||||||
let permissions = Permissions::from_bits(m.permissions as u64);
|
let permissions = Permissions::from_bits(m.permissions as u64);
|
||||||
if let Some(perms) = permissions {
|
if let Some(perms) = permissions {
|
||||||
Ok(Some(TeamMember {
|
Ok(Some(Ok(TeamMember {
|
||||||
id: TeamMemberId(m.id),
|
id: TeamMemberId(m.id),
|
||||||
team_id: id,
|
team_id: id,
|
||||||
user_id: UserId(m.user_id),
|
user_id: UserId(m.user_id),
|
||||||
@@ -115,17 +115,21 @@ impl TeamMember {
|
|||||||
role: m.role,
|
role: m.role,
|
||||||
permissions: perms,
|
permissions: perms,
|
||||||
accepted: m.accepted,
|
accepted: m.accepted,
|
||||||
}))
|
})))
|
||||||
} else {
|
} else {
|
||||||
Ok(None)
|
Ok(Some(Err(super::DatabaseError::BitflagError)))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.try_collect::<Vec<TeamMember>>()
|
.try_collect::<Vec<Result<TeamMember, super::DatabaseError>>>()
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
let team_members = team_members
|
||||||
|
.into_iter()
|
||||||
|
.collect::<Result<Vec<TeamMember>, super::DatabaseError>>()?;
|
||||||
|
|
||||||
Ok(team_members)
|
Ok(team_members)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,7 +156,7 @@ impl TeamMember {
|
|||||||
if let Some(m) = e.right() {
|
if let Some(m) = e.right() {
|
||||||
let permissions = Permissions::from_bits(m.permissions as u64);
|
let permissions = Permissions::from_bits(m.permissions as u64);
|
||||||
if let Some(perms) = permissions {
|
if let Some(perms) = permissions {
|
||||||
Ok(Some(TeamMember {
|
Ok(Some(Ok(TeamMember {
|
||||||
id: TeamMemberId(m.id),
|
id: TeamMemberId(m.id),
|
||||||
team_id: TeamId(m.team_id),
|
team_id: TeamId(m.team_id),
|
||||||
user_id: id,
|
user_id: id,
|
||||||
@@ -160,17 +164,21 @@ impl TeamMember {
|
|||||||
role: m.role,
|
role: m.role,
|
||||||
permissions: perms,
|
permissions: perms,
|
||||||
accepted: m.accepted,
|
accepted: m.accepted,
|
||||||
}))
|
})))
|
||||||
} else {
|
} else {
|
||||||
Ok(None)
|
Ok(Some(Err(super::DatabaseError::BitflagError)))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.try_collect::<Vec<TeamMember>>()
|
.try_collect::<Vec<Result<TeamMember, super::DatabaseError>>>()
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
let team_members = team_members
|
||||||
|
.into_iter()
|
||||||
|
.collect::<Result<Vec<TeamMember>, super::DatabaseError>>()?;
|
||||||
|
|
||||||
Ok(team_members)
|
Ok(team_members)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -331,6 +331,7 @@ impl Version {
|
|||||||
"
|
"
|
||||||
SELECT id FROM versions
|
SELECT id FROM versions
|
||||||
WHERE mod_id = $1
|
WHERE mod_id = $1
|
||||||
|
ORDER BY date_published ASC
|
||||||
",
|
",
|
||||||
mod_id as ModId,
|
mod_id as ModId,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ pub struct Team {
|
|||||||
|
|
||||||
bitflags::bitflags! {
|
bitflags::bitflags! {
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
|
#[serde(transparent)]
|
||||||
pub struct Permissions: u64 {
|
pub struct Permissions: u64 {
|
||||||
const UPLOAD_VERSION = 1 << 0;
|
const UPLOAD_VERSION = 1 << 0;
|
||||||
const DELETE_VERSION = 1 << 1;
|
const DELETE_VERSION = 1 << 1;
|
||||||
@@ -51,5 +52,5 @@ pub struct TeamMember {
|
|||||||
/// The role of the user in the team
|
/// The role of the user in the team
|
||||||
pub role: String,
|
pub role: String,
|
||||||
/// A bitset containing the user's permissions in this team
|
/// A bitset containing the user's permissions in this team
|
||||||
pub permissions: Permissions,
|
pub permissions: Option<Permissions>,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ pub async fn team_members_get(
|
|||||||
user_id: data.user_id.into(),
|
user_id: data.user_id.into(),
|
||||||
name: data.name,
|
name: data.name,
|
||||||
role: data.role,
|
role: data.role,
|
||||||
permissions: data.permissions,
|
permissions: Some(data.permissions),
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ pub async fn team_members_get(
|
|||||||
user_id: data.user_id.into(),
|
user_id: data.user_id.into(),
|
||||||
name: data.name,
|
name: data.name,
|
||||||
role: data.role,
|
role: data.role,
|
||||||
permissions: Permissions::default(),
|
permissions: None,
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use crate::auth::{check_is_moderator_from_headers, get_user_from_headers};
|
use crate::auth::{check_is_moderator_from_headers, get_user_from_headers};
|
||||||
use crate::database::models::{TeamMember, User};
|
use crate::database::models::{TeamMember, User};
|
||||||
use crate::models::teams::Permissions;
|
|
||||||
use crate::models::users::{Role, UserId};
|
use crate::models::users::{Role, UserId};
|
||||||
use crate::routes::ApiError;
|
use crate::routes::ApiError;
|
||||||
use actix_web::{delete, get, web, HttpRequest, HttpResponse};
|
use actix_web::{delete, get, web, HttpRequest, HttpResponse};
|
||||||
@@ -152,9 +151,9 @@ pub async fn teams(
|
|||||||
name: data.name,
|
name: data.name,
|
||||||
role: data.role,
|
role: data.role,
|
||||||
permissions: if same_user {
|
permissions: if same_user {
|
||||||
data.permissions
|
Some(data.permissions)
|
||||||
} else {
|
} else {
|
||||||
Permissions::default()
|
None
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ pub async fn index_local(pool: PgPool) -> Result<Vec<UploadSearchMod>, IndexingE
|
|||||||
if let Ok(mod_data) = result {
|
if let Ok(mod_data) = result {
|
||||||
let versions = sqlx::query!(
|
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_versions gvv ON gvv.joining_version_id=versions.id
|
||||||
INNER JOIN game_versions gv ON gvv.game_version_id=gv.id
|
INNER JOIN game_versions gv ON gvv.game_version_id=gv.id
|
||||||
WHERE versions.mod_id = $1
|
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
|
// minecraft that this mod has a version that supports; it doesn't
|
||||||
// take betas or other info into account.
|
// take betas or other info into account.
|
||||||
let latest_version = versions
|
let latest_version = versions
|
||||||
.get(0)
|
.last()
|
||||||
.cloned()
|
.cloned()
|
||||||
.map(Cow::Owned)
|
.map(Cow::Owned)
|
||||||
.unwrap_or_else(|| Cow::Borrowed(""));
|
.unwrap_or_else(|| Cow::Borrowed(""));
|
||||||
@@ -134,7 +134,7 @@ pub async fn query_one(
|
|||||||
|
|
||||||
let versions = sqlx::query!(
|
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_versions gvv ON gvv.joining_version_id=versions.id
|
||||||
INNER JOIN game_versions gv ON gvv.game_version_id=gv.id
|
INNER JOIN game_versions gv ON gvv.game_version_id=gv.id
|
||||||
WHERE versions.mod_id = $1
|
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
|
// minecraft that this mod has a version that supports; it doesn't
|
||||||
// take betas or other info into account.
|
// take betas or other info into account.
|
||||||
let latest_version = versions
|
let latest_version = versions
|
||||||
.get(0)
|
.last()
|
||||||
.cloned()
|
.cloned()
|
||||||
.map(Cow::Owned)
|
.map(Cow::Owned)
|
||||||
.unwrap_or_else(|| Cow::Borrowed(""));
|
.unwrap_or_else(|| Cow::Borrowed(""));
|
||||||
|
|||||||
Reference in New Issue
Block a user