You've already forked AstralRinth
forked from didirus/AstralRinth
Add way to fetch team members (#89)
* Add way to fetch team members, fix files not being returned with version route * Make it compile * Fixes * Use default error handling
This commit is contained in:
@@ -73,3 +73,38 @@ pub struct TeamMember {
|
||||
pub name: String,
|
||||
pub role: String,
|
||||
}
|
||||
|
||||
impl TeamMember {
|
||||
pub async fn get_from_team<'a, 'b, E>(
|
||||
id: TeamId,
|
||||
executor: E,
|
||||
) -> Result<Vec<TeamMember>, super::DatabaseError>
|
||||
where
|
||||
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
||||
{
|
||||
use futures::stream::TryStreamExt;
|
||||
|
||||
let team_members = sqlx::query!(
|
||||
"
|
||||
SELECT id, user_id, member_name, role
|
||||
FROM team_members
|
||||
WHERE team_id = $1
|
||||
",
|
||||
id as TeamId,
|
||||
)
|
||||
.fetch_many(executor)
|
||||
.try_filter_map(|e| async {
|
||||
Ok(e.right().map(|m| TeamMember {
|
||||
id: TeamMemberId(m.id),
|
||||
team_id: id,
|
||||
user_id: UserId(m.user_id),
|
||||
name: m.member_name,
|
||||
role: m.role,
|
||||
}))
|
||||
})
|
||||
.try_collect::<Vec<TeamMember>>()
|
||||
.await?;
|
||||
|
||||
Ok(team_members)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -504,7 +504,7 @@ impl Version {
|
||||
downloads: row.downloads,
|
||||
|
||||
release_channel: row.channel,
|
||||
files: Vec::<QueryFile>::new(),
|
||||
files,
|
||||
loaders,
|
||||
game_versions,
|
||||
}))
|
||||
|
||||
@@ -233,6 +233,7 @@ async fn main() -> std::io::Result<()> {
|
||||
.configure(routes::tags_config)
|
||||
.configure(routes::mods_config)
|
||||
.configure(routes::versions_config)
|
||||
.configure(routes::teams_config)
|
||||
.configure(routes::users_config),
|
||||
)
|
||||
.default_service(web::get().to(routes::not_found))
|
||||
|
||||
@@ -6,6 +6,7 @@ mod mod_creation;
|
||||
mod mods;
|
||||
mod not_found;
|
||||
mod tags;
|
||||
mod teams;
|
||||
mod users;
|
||||
mod version_creation;
|
||||
mod versions;
|
||||
@@ -52,6 +53,10 @@ pub fn users_config(cfg: &mut web::ServiceConfig) {
|
||||
);
|
||||
}
|
||||
|
||||
pub fn teams_config(cfg: &mut web::ServiceConfig) {
|
||||
cfg.service(web::scope("team").service(teams::team_members_get));
|
||||
}
|
||||
|
||||
#[derive(thiserror::Error, Debug)]
|
||||
pub enum ApiError {
|
||||
#[error("Internal server error")]
|
||||
|
||||
25
src/routes/teams.rs
Normal file
25
src/routes/teams.rs
Normal file
@@ -0,0 +1,25 @@
|
||||
use crate::database::models::TeamMember;
|
||||
use crate::models::teams::TeamId;
|
||||
use crate::routes::ApiError;
|
||||
use actix_web::{get, web, HttpResponse};
|
||||
use sqlx::PgPool;
|
||||
|
||||
#[get("{id}/members")]
|
||||
pub async fn team_members_get(
|
||||
info: web::Path<(TeamId,)>,
|
||||
pool: web::Data<PgPool>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
let id = info.into_inner().0;
|
||||
let members_data = TeamMember::get_from_team(id.into(), &**pool).await?;
|
||||
|
||||
let team_members: Vec<crate::models::teams::TeamMember> = members_data
|
||||
.into_iter()
|
||||
.map(|data| crate::models::teams::TeamMember {
|
||||
user_id: data.user_id.into(),
|
||||
name: data.name,
|
||||
role: data.role,
|
||||
})
|
||||
.collect();
|
||||
|
||||
Ok(HttpResponse::Ok().json(team_members))
|
||||
}
|
||||
Reference in New Issue
Block a user