Improve peformance of search indexing, v2 fixes + new routes (#205)

* Refactor search to not spam the database with queries, new utility routes for V2

* Run prepare
This commit is contained in:
Geometrically
2021-06-02 18:33:11 -07:00
committed by GitHub
parent 16db28060c
commit 157962e42a
18 changed files with 833 additions and 763 deletions

View File

@@ -1,4 +1,5 @@
use super::ids::*;
use crate::database::models::User;
use crate::models::teams::Permissions;
pub struct TeamBuilder {
@@ -78,6 +79,17 @@ pub struct TeamMember {
pub accepted: bool,
}
/// A member of a team
pub struct QueryTeamMember {
pub id: TeamMemberId,
pub team_id: TeamId,
/// The user associated with the member
pub user: User,
pub role: String,
pub permissions: Permissions,
pub accepted: bool,
}
impl TeamMember {
/// Lists the members of a team
pub async fn get_from_team<'a, 'b, E>(
@@ -127,6 +139,68 @@ impl TeamMember {
Ok(team_members)
}
// Lists the full members of a team
pub async fn get_from_team_full<'a, 'b, E>(
id: TeamId,
executor: E,
) -> Result<Vec<QueryTeamMember>, super::DatabaseError>
where
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
{
use futures::stream::TryStreamExt;
let team_members = sqlx::query!(
"
SELECT tm.id id, tm.role member_role, tm.permissions permissions, tm.accepted accepted,
u.id user_id, u.github_id github_id, u.name user_name, u.email email,
u.avatar_url avatar_url, u.username username, u.bio bio,
u.created created, u.role user_role
FROM team_members tm
INNER JOIN users u ON u.id = tm.user_id
WHERE tm.team_id = $1
",
id as TeamId,
)
.fetch_many(executor)
.try_filter_map(|e| async {
if let Some(m) = e.right() {
let permissions = Permissions::from_bits(m.permissions as u64);
if let Some(perms) = permissions {
Ok(Some(Ok(QueryTeamMember {
id: TeamMemberId(m.id),
team_id: id,
role: m.member_role,
permissions: perms,
accepted: m.accepted,
user: User {
id: UserId(m.id),
github_id: m.github_id,
name: m.user_name,
email: m.email,
avatar_url: m.avatar_url,
username: m.username,
bio: m.bio,
created: m.created,
role: m.user_role,
},
})))
} else {
Ok(Some(Err(super::DatabaseError::BitflagError)))
}
} else {
Ok(None)
}
})
.try_collect::<Vec<Result<QueryTeamMember, super::DatabaseError>>>()
.await?;
let team_members = team_members
.into_iter()
.collect::<Result<Vec<QueryTeamMember>, super::DatabaseError>>()?;
Ok(team_members)
}
/// Lists the team members for a user. Does not list pending requests.
pub async fn get_from_user_public<'a, 'b, E>(
id: UserId,