diff --git a/sqlx-data.json b/sqlx-data.json index 097163cb1..ca8fe2897 100644 --- a/sqlx-data.json +++ b/sqlx-data.json @@ -1,25 +1,5 @@ { "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": { "query": "\n SELECT status FROM statuses\n WHERE id = $1\n ", "describe": { @@ -59,26 +39,6 @@ "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": { "query": "\n SELECT id FROM statuses\n WHERE status = $1\n ", "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": { "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": { @@ -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": { "query": "\n INSERT INTO loaders_versions (loader_id, version_id)\n VALUES ($1, $2)\n ", "describe": { @@ -579,26 +499,6 @@ "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": { "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": { @@ -654,26 +554,6 @@ "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": { "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": { @@ -980,6 +860,44 @@ "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": { "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": { @@ -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": { "query": "\n DELETE FROM teams\n WHERE id = $1\n ", "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": { "query": "\n INSERT INTO dependencies (dependent_id, dependency_id)\n VALUES ($1, $2)\n ", "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": { "query": "\n DELETE FROM team_members\n WHERE team_id = $1\n ", "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": { "query": "\n DELETE FROM files\n WHERE files.version_id = $1\n ", "describe": { diff --git a/src/database/models/team_item.rs b/src/database/models/team_item.rs index 13c0c3f5a..33f593cbf 100644 --- a/src/database/models/team_item.rs +++ b/src/database/models/team_item.rs @@ -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, 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::>() + .await?; + + Ok(team_members) + } +} diff --git a/src/database/models/version_item.rs b/src/database/models/version_item.rs index 9d404caa1..f526ff3b8 100644 --- a/src/database/models/version_item.rs +++ b/src/database/models/version_item.rs @@ -504,7 +504,7 @@ impl Version { downloads: row.downloads, release_channel: row.channel, - files: Vec::::new(), + files, loaders, game_versions, })) diff --git a/src/main.rs b/src/main.rs index 48bbff298..213283243 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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)) diff --git a/src/routes/mod.rs b/src/routes/mod.rs index bbf215643..1dc07eea7 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -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")] diff --git a/src/routes/teams.rs b/src/routes/teams.rs new file mode 100644 index 000000000..d2e5aa8f7 --- /dev/null +++ b/src/routes/teams.rs @@ -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, +) -> Result { + let id = info.into_inner().0; + let members_data = TeamMember::get_from_team(id.into(), &**pool).await?; + + let team_members: Vec = 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)) +}