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:
parent
e966ef96e5
commit
1ff8c908b8
245
sqlx-data.json
245
sqlx-data.json
@ -1,25 +1,5 @@
|
|||||||
{
|
{
|
||||||
"db": "PostgreSQL",
|
"db": "PostgreSQL",
|
||||||
"01858339ec93e444b83c5d8793285d7b03982344770221c8a5a9bab9958d78ff": {
|
|
||||||
"query": "\n SELECT id\n FROM release_channels\n WHERE channel = $1\n ",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "id",
|
|
||||||
"type_info": "Int4"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Text"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"02d8895627dfe108735a6e10ad63239348b71b3322b4734526a2646f17aedf05": {
|
"02d8895627dfe108735a6e10ad63239348b71b3322b4734526a2646f17aedf05": {
|
||||||
"query": "\n SELECT status FROM statuses\n WHERE id = $1\n ",
|
"query": "\n SELECT status FROM statuses\n WHERE id = $1\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
@ -59,26 +39,6 @@
|
|||||||
"nullable": []
|
"nullable": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"0a3f99eae57c0c3d10aa0014db7fb8a33952da3e7d00949a25ade843859272cb": {
|
|
||||||
"query": "\n SELECT id\n FROM release_channels\n WHERE channel = $1\n ",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "id",
|
|
||||||
"type_info": "Int4"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Text"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"0ca11a32b2860e4f5c3d20892a5be3cb419e084f42ba0f98e09b9995027fcc4e": {
|
"0ca11a32b2860e4f5c3d20892a5be3cb419e084f42ba0f98e09b9995027fcc4e": {
|
||||||
"query": "\n SELECT id FROM statuses\n WHERE status = $1\n ",
|
"query": "\n SELECT id FROM statuses\n WHERE status = $1\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
@ -126,26 +86,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"0ef06dd5094da2458c558b115ed272da338ade372e717d8580cdf52c0000f80c": {
|
|
||||||
"query": "\n SELECT user_id FROM team_members\n WHERE team_id = $1\n ",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "user_id",
|
|
||||||
"type_info": "Int8"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Int8"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"1016a0bf55e9474357ac5ef725605ac337e82e1a2b93726ae795ec48f0d696dd": {
|
"1016a0bf55e9474357ac5ef725605ac337e82e1a2b93726ae795ec48f0d696dd": {
|
||||||
"query": "\n SELECT v.mod_id, v.author_id, v.name, v.version_number,\n v.changelog_url, v.date_published, v.downloads,\n release_channels.channel\n FROM versions v\n INNER JOIN release_channels ON v.release_channel = release_channels.id\n WHERE v.id = $1\n ",
|
"query": "\n SELECT v.mod_id, v.author_id, v.name, v.version_number,\n v.changelog_url, v.date_published, v.downloads,\n release_channels.channel\n FROM versions v\n INNER JOIN release_channels ON v.release_channel = release_channels.id\n WHERE v.id = $1\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
@ -484,26 +424,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"275939f581a82197b45b0d56248926063f09ef86754498a720c5568cdb1f5ae0": {
|
|
||||||
"query": "SELECT user_id FROM team_members WHERE team_id=$1",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "user_id",
|
|
||||||
"type_info": "Int8"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Int8"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"29e657d26f0fb24a766f5b5eb6a94d01d1616884d8ca10e91536e974d5b585a6": {
|
"29e657d26f0fb24a766f5b5eb6a94d01d1616884d8ca10e91536e974d5b585a6": {
|
||||||
"query": "\n INSERT INTO loaders_versions (loader_id, version_id)\n VALUES ($1, $2)\n ",
|
"query": "\n INSERT INTO loaders_versions (loader_id, version_id)\n VALUES ($1, $2)\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
@ -579,26 +499,6 @@
|
|||||||
"nullable": []
|
"nullable": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"40597b84607e77809c13ffa9c6b0b1674bd6378a4737a8f6118e91ae2ede7e4a": {
|
|
||||||
"query": "\n SELECT id\n FROM release_channels\n WHERE channel = $1\n ",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "id",
|
|
||||||
"type_info": "Int4"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Text"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"42e072309779598d0c213280dd8052d1b4889cb24ef5204ca13b74f693b94328": {
|
"42e072309779598d0c213280dd8052d1b4889cb24ef5204ca13b74f693b94328": {
|
||||||
"query": "\n SELECT user_id FROM team_members tm\n INNER JOIN mods ON mods.team_id = tm.team_id\n WHERE mods.id = $1\n ",
|
"query": "\n SELECT user_id FROM team_members tm\n INNER JOIN mods ON mods.team_id = tm.team_id\n WHERE mods.id = $1\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
@ -654,26 +554,6 @@
|
|||||||
"nullable": []
|
"nullable": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"4c98e4441f8168d00bc7ff47951f15b44ff884cff6fc484645c74bfe3e7e7020": {
|
|
||||||
"query": "\n SELECT id\n FROM statuses\n WHERE status = $1\n ",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "id",
|
|
||||||
"type_info": "Int4"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Text"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"4c99c0840159d18e88cd6094a41117258f2337346c145d926b5b610c76b5125f": {
|
"4c99c0840159d18e88cd6094a41117258f2337346c145d926b5b610c76b5125f": {
|
||||||
"query": "\n SELECT c.category\n FROM mods_categories mc\n INNER JOIN categories c ON mc.joining_category_id=c.id\n WHERE mc.joining_mod_id = $1\n ",
|
"query": "\n SELECT c.category\n FROM mods_categories mc\n INNER JOIN categories c ON mc.joining_category_id=c.id\n WHERE mc.joining_mod_id = $1\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
@ -980,6 +860,44 @@
|
|||||||
"nullable": []
|
"nullable": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"91d7e437c6dfb9b95e68aca92154bd2af4de13eeb9611e08dcad2717d0c41ed9": {
|
||||||
|
"query": "\n SELECT id, user_id, member_name, role\n FROM team_members\n WHERE team_id = $1\n ",
|
||||||
|
"describe": {
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"ordinal": 0,
|
||||||
|
"name": "id",
|
||||||
|
"type_info": "Int8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 1,
|
||||||
|
"name": "user_id",
|
||||||
|
"type_info": "Int8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 2,
|
||||||
|
"name": "member_name",
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 3,
|
||||||
|
"name": "role",
|
||||||
|
"type_info": "Varchar"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"parameters": {
|
||||||
|
"Left": [
|
||||||
|
"Int8"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"nullable": [
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
"9a41d6c1d5c250df6114157edf5621a88bc336c5c628ba89182ba999e0af3ba8": {
|
"9a41d6c1d5c250df6114157edf5621a88bc336c5c628ba89182ba999e0af3ba8": {
|
||||||
"query": "\n SELECT id, title, description, downloads,\n icon_url, body_url, published,\n updated, status,\n issues_url, source_url, wiki_url,\n team_id\n FROM mods\n WHERE id IN (SELECT * FROM UNNEST($1::bigint[]))\n ",
|
"query": "\n SELECT id, title, description, downloads,\n icon_url, body_url, published,\n updated, status,\n issues_url, source_url, wiki_url,\n team_id\n FROM mods\n WHERE id IN (SELECT * FROM UNNEST($1::bigint[]))\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
@ -1213,26 +1131,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"adecffb1c41f9ddddf60c7c3c5a6be129aa8c49c53a698c6f4c2ee9ba15d6347": {
|
|
||||||
"query": "\n SELECT id\n FROM statuses\n WHERE status = $1\n ",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "id",
|
|
||||||
"type_info": "Int4"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Text"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"b0e3d1c70b87bb54819e3fac04b684a9b857aeedb4dcb7cb400c2af0dbb12922": {
|
"b0e3d1c70b87bb54819e3fac04b684a9b857aeedb4dcb7cb400c2af0dbb12922": {
|
||||||
"query": "\n DELETE FROM teams\n WHERE id = $1\n ",
|
"query": "\n DELETE FROM teams\n WHERE id = $1\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
@ -1414,33 +1312,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"c7ee59f31b20790b6e865b2ec14ecd9985cacb0a84e40f087d0f908033566166": {
|
|
||||||
"query": "\n SELECT u.id, u.username FROM users u\n INNER JOIN team_members tm ON tm.role = $1\n WHERE tm.team_id = $2\n ",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "id",
|
|
||||||
"type_info": "Int8"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 1,
|
|
||||||
"name": "username",
|
|
||||||
"type_info": "Varchar"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Text",
|
|
||||||
"Int8"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false,
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"c82eb1b059b62444ab1d17e5a0bd7ef8acea4b05c6f3576c07d20c4ca7635a11": {
|
"c82eb1b059b62444ab1d17e5a0bd7ef8acea4b05c6f3576c07d20c4ca7635a11": {
|
||||||
"query": "\n INSERT INTO dependencies (dependent_id, dependency_id)\n VALUES ($1, $2)\n ",
|
"query": "\n INSERT INTO dependencies (dependent_id, dependency_id)\n VALUES ($1, $2)\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
@ -1546,26 +1417,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"d0172d12dce3d8ddc888893ec1cdd93ad232685e80f706e70dea22c85d96df63": {
|
|
||||||
"query": "SELECT team_id FROM mods WHERE id=$1",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "team_id",
|
|
||||||
"type_info": "Int8"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Int8"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"d12bc07adb4dc8147d0ddccd72a4f23ed38cd31d7db3d36ebbe2c9b627130f0b": {
|
"d12bc07adb4dc8147d0ddccd72a4f23ed38cd31d7db3d36ebbe2c9b627130f0b": {
|
||||||
"query": "\n DELETE FROM team_members\n WHERE team_id = $1\n ",
|
"query": "\n DELETE FROM team_members\n WHERE team_id = $1\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
@ -1618,26 +1469,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"d88b160963bffbf3297de4418a38f4c914819fff94b912fab451b892c7494370": {
|
|
||||||
"query": "\n SELECT id\n FROM release_channels\n WHERE channel = $1\n ",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "id",
|
|
||||||
"type_info": "Int4"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Text"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"d8b4e7e382c77a05395124d5a6a27cccb687d0e2c31b76d49b03aa364d099d42": {
|
"d8b4e7e382c77a05395124d5a6a27cccb687d0e2c31b76d49b03aa364d099d42": {
|
||||||
"query": "\n DELETE FROM files\n WHERE files.version_id = $1\n ",
|
"query": "\n DELETE FROM files\n WHERE files.version_id = $1\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
|
|||||||
@ -73,3 +73,38 @@ pub struct TeamMember {
|
|||||||
pub name: String,
|
pub name: String,
|
||||||
pub role: 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,
|
downloads: row.downloads,
|
||||||
|
|
||||||
release_channel: row.channel,
|
release_channel: row.channel,
|
||||||
files: Vec::<QueryFile>::new(),
|
files,
|
||||||
loaders,
|
loaders,
|
||||||
game_versions,
|
game_versions,
|
||||||
}))
|
}))
|
||||||
|
|||||||
@ -233,6 +233,7 @@ async fn main() -> std::io::Result<()> {
|
|||||||
.configure(routes::tags_config)
|
.configure(routes::tags_config)
|
||||||
.configure(routes::mods_config)
|
.configure(routes::mods_config)
|
||||||
.configure(routes::versions_config)
|
.configure(routes::versions_config)
|
||||||
|
.configure(routes::teams_config)
|
||||||
.configure(routes::users_config),
|
.configure(routes::users_config),
|
||||||
)
|
)
|
||||||
.default_service(web::get().to(routes::not_found))
|
.default_service(web::get().to(routes::not_found))
|
||||||
|
|||||||
@ -6,6 +6,7 @@ mod mod_creation;
|
|||||||
mod mods;
|
mod mods;
|
||||||
mod not_found;
|
mod not_found;
|
||||||
mod tags;
|
mod tags;
|
||||||
|
mod teams;
|
||||||
mod users;
|
mod users;
|
||||||
mod version_creation;
|
mod version_creation;
|
||||||
mod versions;
|
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)]
|
#[derive(thiserror::Error, Debug)]
|
||||||
pub enum ApiError {
|
pub enum ApiError {
|
||||||
#[error("Internal server error")]
|
#[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))
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user