diff --git a/backend-actix/Cargo.lock b/backend-actix/Cargo.lock index c5b1c1f..a1921d4 100644 --- a/backend-actix/Cargo.lock +++ b/backend-actix/Cargo.lock @@ -211,9 +211,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" @@ -256,9 +256,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -271,33 +271,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.8" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", "once_cell_polyfill", @@ -363,9 +363,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.7.3" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bitflags" @@ -414,9 +414,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" [[package]] name = "byteorder" @@ -441,9 +441,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.25" +version = "1.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +checksum = "956a5e21988b87f372569b66183b78babf23ebc2e744b733e4350a752c4dafac" dependencies = [ "jobserver", "libc", @@ -452,9 +452,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "chrono" @@ -473,9 +473,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "cookie" @@ -730,9 +730,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -823,7 +823,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -866,9 +866,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" [[package]] name = "heck" @@ -1182,9 +1182,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "migrations_internals" @@ -1215,9 +1215,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] @@ -1230,7 +1230,7 @@ checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -1385,9 +1385,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portable-atomic-util" @@ -1587,9 +1587,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustversion" @@ -1652,9 +1652,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -1720,9 +1720,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" @@ -1754,9 +1754,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.101" +version = "2.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "f6397daf94fa90f058bd0fd88429dd9e5738999cca8d701813c80723add80462" dependencies = [ "proc-macro2", "quote", @@ -1867,9 +1867,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", @@ -1879,18 +1879,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.9" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.26" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", @@ -1902,9 +1902,9 @@ dependencies = [ [[package]] name = "toml_write" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tracing" @@ -1933,9 +1933,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662" dependencies = [ "proc-macro2", "quote", @@ -1944,9 +1944,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] @@ -2054,9 +2054,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -2268,9 +2268,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" dependencies = [ "memchr", ] diff --git a/backend-actix/gamenight-api.yaml b/backend-actix/gamenight-api.yaml index d270a3a..5a13390 100644 --- a/backend-actix/gamenight-api.yaml +++ b/backend-actix/gamenight-api.yaml @@ -38,16 +38,28 @@ paths: '422': $ref: '#/components/responses/FailureResponse' description: 'Create a new user given a registration token and user information, username and email must be unique, and password and password_repeat must match.' - parameters: [] + parameters: [] + security: + - JWT-Auth: [] get: description: 'Get a user from primary id' + requestBody: + $ref: '#/components/requestBodies/GetUserRequest' parameters: [] responses: '200': $ref: '#/components/responses/UserResponse' + '401': + $ref: '#/components/responses/FailureResponse' + '404': + $ref: '#/components/responses/FailureResponse' + '422': + $ref: '#/components/responses/FailureResponse' + security: + - JWT-Auth: [] /gamenights: get: - summary: Your GET endpoint + summary: Get a all gamenights responses: '200': $ref: '#/components/responses/GamenightsResponse' @@ -59,6 +71,21 @@ paths: security: - JWT-Auth: [] description: Retrieve the list of gamenights on this gamenight server. Requires authorization. + /participants: + get: + summary: Get all participants for a gamenight + responses: + '200': + $ref: '#/components/responses/ParticipantsResponse' + '400': + $ref: '#/components/responses/FailureResponse' + '401': + $ref: '#/components/responses/FailureResponse' + requestBody: + $ref: '#/components/requestBodies/GetParticipants' + security: + - JWT-Auth: [] + description: Retrieve the participants of a single gamenight by id. /gamenight: post: summary: '' @@ -89,6 +116,20 @@ paths: $ref: '#/components/requestBodies/GetGamenight' security: - JWT-Auth: [] + /join: + post: + responses: + '200': + description: OK + '401': + $ref: '#/components/responses/FailureResponse' + '422': + $ref: '#/components/responses/FailureResponse' + requestBody: + $ref: '#/components/requestBodies/JoinGamenight' + security: + - JWT-Auth: [] + components: schemas: Gamenight: @@ -103,15 +144,21 @@ components: type: string owner_id: type: string - participants: - type: array - items: - type: string required: - id - name - datetime - owner_id + Participants: + title: participants + type: object + properties: + participants: + type: array + items: + type: string + required: + - participants Failure: title: Failure type: object @@ -156,6 +203,14 @@ components: - password - password_repeat - registration_token + UserId: + title: UserId + type: object + properties: + user_id: + type: string + required: + - user_id AddGamenightRequestBody: title: AddGamenightRequestBody type: object @@ -164,6 +219,19 @@ components: type: string datetime: type: string + GamenightId: + title: GamenightId + type: object + properties: + gamenight_id: + type: string + required: + - gamenight_id + GetGamenightRequestBody: + type: object + properties: + id: + type: string User: type: object properties: @@ -174,6 +242,7 @@ components: email: type: string required: + - id - username requestBodies: LoginRequest: @@ -186,6 +255,11 @@ components: application/json: schema: $ref: '#/components/schemas/Registration' + GetUserRequest: + content: + application/json: + schema: + $ref: '#/components/schemas/UserId' AddGamenight: content: application/json: @@ -195,10 +269,17 @@ components: content: application/json: schema: - type: object - properties: - id: - type: string + $ref: '#/components/schemas/GetGamenightRequestBody' + GetParticipants: + content: + application/json: + schema: + $ref: '#/components/schemas/GamenightId' + JoinGamenight: + content: + application/json: + schema: + $ref: '#/components/schemas/GamenightId' responses: TokenResponse: description: Example response @@ -212,14 +293,12 @@ components: application/json: schema: $ref: '#/components/schemas/Failure' - application/xml: + ParticipantsResponse: + description: Response with a list of participant uuids + content: + application/json: schema: - type: object - properties: - message: - type: string - required: - - message + $ref: '#/components/schemas/Participants' GamenightsResponse: description: Example response content: diff --git a/backend-actix/src/main.rs b/backend-actix/src/main.rs index 335e527..f10b40a 100644 --- a/backend-actix/src/main.rs +++ b/backend-actix/src/main.rs @@ -44,6 +44,8 @@ async fn main() -> std::io::Result<()> { .service(gamenight_get) .service(get_user) .service(get_user_unauthenticated) + .service(post_join_gamenight) + .service(get_get_participants) }) .bind(("::1", 8080))? .run() diff --git a/backend-actix/src/request/gamenight_handlers.rs b/backend-actix/src/request/gamenight_handlers.rs index 4a6e30b..04adf83 100644 --- a/backend-actix/src/request/gamenight_handlers.rs +++ b/backend-actix/src/request/gamenight_handlers.rs @@ -2,15 +2,15 @@ use actix_web::{get, web, Responder, http::header::ContentType, HttpResponse, po use chrono::{DateTime, ParseError}; use uuid::Uuid; -use gamenight_database::{gamenight::Gamenight, DbPool, GetConnection}; +use gamenight_database::{gamenight, DbPool, GetConnection}; -use crate::{models::{gamenight, add_gamenight_request_body::AddGamenightRequestBody, get_gamenight_request::GetGamenightRequest}, request::authorization::AuthUser}; +use crate::{models::{add_gamenight_request_body::AddGamenightRequestBody, gamenight::Gamenight, get_gamenight_request_body::GetGamenightRequestBody}, request::authorization::AuthUser}; use crate::request::error::ApiError; impl AddGamenightRequestBody { - pub fn into_with_user(&self, user: AuthUser) -> Result { - Ok(Gamenight { + pub fn into_with_user(&self, user: AuthUser) -> Result { + Ok(gamenight::Gamenight { datetime: DateTime::parse_from_rfc3339(&self.clone().datetime.unwrap())?.with_timezone(&chrono::Utc), id: Uuid::new_v4(), name: self.clone().name.unwrap().clone(), @@ -19,8 +19,8 @@ impl AddGamenightRequestBody { } } -impl From for Uuid { - fn from(value: GetGamenightRequest) -> Self { +impl From for Uuid { + fn from(value: GetGamenightRequestBody) -> Self { Uuid::parse_str(value.id.unwrap().as_str()).unwrap() } } @@ -28,11 +28,19 @@ impl From for Uuid { #[get("/gamenights")] pub async fn gamenights(pool: web::Data, _user: AuthUser) -> Result { let mut conn = pool.get_conn(); - let gamenights: Vec = gamenight_database::gamenights(&mut conn)?; + let gamenights: Vec = gamenight_database::gamenights(&mut conn)?; + let model: Vec = gamenights.iter().map(|x| { + Gamenight { + id: x.id.to_string(), + name: x.name.clone(), + datetime: x.datetime.to_rfc3339(), + owner_id: x.owner_id.to_string() + }} + ).collect(); Ok(HttpResponse::Ok() .content_type(ContentType::json()) - .body(serde_json::to_string(&gamenights)?) + .body(serde_json::to_string(&model)?) ) } @@ -40,24 +48,20 @@ pub async fn gamenights(pool: web::Data, _user: AuthUser) -> Result, user: AuthUser, gamenight_data: web::Json) -> Result { let mut conn = pool.get_conn(); - gamenight_database::gamenight::add_gamenight(&mut conn, gamenight_data.into_with_user(user)?)?; + gamenight::add_gamenight(&mut conn, gamenight_data.into_with_user(user)?)?; Ok(HttpResponse::Ok()) } #[get("/gamenight")] -pub async fn gamenight_get(pool: web::Data, _user: AuthUser, gamenight_data: web::Json) -> Result { +pub async fn gamenight_get(pool: web::Data, _user: AuthUser, gamenight_data: web::Json) -> Result { let mut conn = pool.get_conn(); - - let gamenight = gamenight_database::gamenight::get_gamenight(&mut conn, gamenight_data.into_inner().into())?; - let participants = gamenight_database::gamenight_participants::get_participants(&mut conn, &gamenight.id)?; - - let model = gamenight::Gamenight{ + let gamenight = gamenight::get_gamenight(&mut conn, gamenight_data.into_inner().into())?; + let model = Gamenight{ id: gamenight.id.to_string(), datetime: gamenight.datetime.to_rfc3339(), name: gamenight.name, owner_id: gamenight.owner_id.to_string(), - participants: Some(participants.iter().map(|x| {x.to_string()}).collect()) }; Ok(HttpResponse::Ok() diff --git a/backend-actix/src/request/join_gamenight.rs b/backend-actix/src/request/join_gamenight.rs new file mode 100644 index 0000000..2077395 --- /dev/null +++ b/backend-actix/src/request/join_gamenight.rs @@ -0,0 +1,18 @@ +use actix_web::{post, web, HttpResponse, Responder}; +use gamenight_database::{DbPool, GetConnection, gamenight_participants::{insert_gamenight_participant, GamenightParticipant}}; +use uuid::Uuid; + +use crate::{models::gamenight_id::GamenightId, request::{authorization::AuthUser, error::ApiError}}; + +#[post("/join")] +pub async fn post_join_gamenight(pool: web::Data, user: AuthUser, gamenight_id: web::Json) -> Result { + web::block(move || -> Result { + let mut conn = pool.get_conn(); + Ok(insert_gamenight_participant(&mut conn, GamenightParticipant { + gamenight_id: Uuid::parse_str(&gamenight_id.gamenight_id)?, + user_id: user.id + })?) + }).await??; + + Ok(HttpResponse::Ok()) +} diff --git a/backend-actix/src/request/mod.rs b/backend-actix/src/request/mod.rs index bb1af71..73663fb 100644 --- a/backend-actix/src/request/mod.rs +++ b/backend-actix/src/request/mod.rs @@ -3,6 +3,8 @@ mod user_handlers; mod gamenight_handlers; mod error; mod authorization; +mod join_gamenight; +mod participant_handlers; pub use user_handlers::login; pub use user_handlers::register; @@ -10,4 +12,6 @@ pub use gamenight_handlers::gamenights; pub use gamenight_handlers::gamenight_post; pub use gamenight_handlers::gamenight_get; pub use user_handlers::get_user; -pub use user_handlers::get_user_unauthenticated; \ No newline at end of file +pub use user_handlers::get_user_unauthenticated; +pub use join_gamenight::post_join_gamenight; +pub use participant_handlers::get_get_participants; diff --git a/backend-actix/src/request/participant_handlers.rs b/backend-actix/src/request/participant_handlers.rs new file mode 100644 index 0000000..8289abc --- /dev/null +++ b/backend-actix/src/request/participant_handlers.rs @@ -0,0 +1,17 @@ +use actix_web::{get, http::header::ContentType, web, HttpResponse, Responder}; +use gamenight_database::{DbPool, GetConnection}; +use uuid::Uuid; + +use crate::{models::{gamenight_id::GamenightId, participants::Participants}, request::{authorization::AuthUser, error::ApiError}}; + +#[get("/participants")] +pub async fn get_get_participants(pool: web::Data, _user: AuthUser, gamenight_info: web::Json) -> Result { + let mut conn = pool.get_conn(); + + let users = gamenight_database::get_participants(&mut conn, &Uuid::parse_str(&gamenight_info.into_inner().gamenight_id)?)? + .iter().map(|x| x.to_string()).collect(); + + Ok(HttpResponse::Ok() + .content_type(ContentType::json()) + .body(serde_json::to_string(&Participants{participants: users})?)) +} \ No newline at end of file diff --git a/backend-actix/src/request/user_handlers.rs b/backend-actix/src/request/user_handlers.rs index 438a7a7..a91b33e 100644 --- a/backend-actix/src/request/user_handlers.rs +++ b/backend-actix/src/request/user_handlers.rs @@ -9,6 +9,7 @@ use crate::models::login::Login; use crate::models::registration::Registration; use crate::models::token::Token; use crate::models::user::User; +use crate::models::user_id::UserId; use crate::request::error::ApiError; use crate::request::authorization::get_token; use serde_json; @@ -126,34 +127,29 @@ pub async fn register(pool: web::Data, register_data: web::Json for User { fn from(value: gamenight_database::user::User) -> Self { Self { - id: Some(value.id.to_string()), + id: value.id.to_string(), username: value.username, email: None, - } } } -#[get("/user/{user_id}")] -pub async fn get_user(pool: web::Data, _user: AuthUser, path: web::Path) -> Result { +#[get("/user")] +pub async fn get_user(pool: web::Data, _user: AuthUser, user_info: web::Json) -> Result { let mut conn = pool.get_conn(); - let user = gamenight_database::user::get_user(&mut conn, Uuid::parse_str(&path.uuid)?)?; + let user = gamenight_database::user::get_user(&mut conn, Uuid::parse_str(&user_info.into_inner().user_id)?)?; + Ok(HttpResponse::Ok() - .content_type(ContentType::json()) - .body(serde_json::to_string(&user)?)) + .content_type(ContentType::json()) + .body(serde_json::to_string(&user)?)) } -#[get("/user/{user_id}")] -pub async fn get_user_unauthenticated(_path: web::Path) -> Result { +#[get("/user")] +pub async fn get_user_unauthenticated(_path: web::Path) -> Result { Ok(HttpResponse::Forbidden()) } diff --git a/gamenight-api-client-rs/.gitignore b/gamenight-api-client-rs/.gitignore index 00298ec..e4c04dd 100644 --- a/gamenight-api-client-rs/.gitignore +++ b/gamenight-api-client-rs/.gitignore @@ -1,9 +1,8 @@ /target/ -git_push.sh **/*.rs.bk Cargo.lock -docs -src -.travis.yml -.openapi-generator .openapi-generator-ignore +.openapi-generator/ +.travis.yml +docs/ +src/ diff --git a/gamenight-api-client-rs/README.md b/gamenight-api-client-rs/README.md index d1f0aa5..8fbfb82 100644 --- a/gamenight-api-client-rs/README.md +++ b/gamenight-api-client-rs/README.md @@ -28,8 +28,10 @@ All URIs are relative to *http://localhost:8080* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- *DefaultApi* | [**get_gamenight**](docs/DefaultApi.md#get_gamenight) | **GET** /gamenight | -*DefaultApi* | [**get_gamenights**](docs/DefaultApi.md#get_gamenights) | **GET** /gamenights | Your GET endpoint +*DefaultApi* | [**get_gamenights**](docs/DefaultApi.md#get_gamenights) | **GET** /gamenights | Get a all gamenights *DefaultApi* | [**get_token**](docs/DefaultApi.md#get_token) | **GET** /token | +*DefaultApi* | [**join_post**](docs/DefaultApi.md#join_post) | **POST** /join | +*DefaultApi* | [**participants_get**](docs/DefaultApi.md#participants_get) | **GET** /participants | Get all participants for a gamenight *DefaultApi* | [**post_gamenight**](docs/DefaultApi.md#post_gamenight) | **POST** /gamenight | *DefaultApi* | [**post_register**](docs/DefaultApi.md#post_register) | **POST** /user | *DefaultApi* | [**user_get**](docs/DefaultApi.md#user_get) | **GET** /user | @@ -40,12 +42,14 @@ Class | Method | HTTP request | Description - [AddGamenightRequestBody](docs/AddGamenightRequestBody.md) - [Failure](docs/Failure.md) - [Gamenight](docs/Gamenight.md) - - [GetGamenightRequest](docs/GetGamenightRequest.md) - - [GetToken401Response](docs/GetToken401Response.md) + - [GamenightId](docs/GamenightId.md) + - [GetGamenightRequestBody](docs/GetGamenightRequestBody.md) - [Login](docs/Login.md) + - [Participants](docs/Participants.md) - [Registration](docs/Registration.md) - [Token](docs/Token.md) - [User](docs/User.md) + - [UserId](docs/UserId.md) To get access to the crate's generated documentation, use: diff --git a/gamenight-cli/Cargo.lock b/gamenight-cli/Cargo.lock index 954a786..75a1824 100644 --- a/gamenight-cli/Cargo.lock +++ b/gamenight-cli/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "android-tzdata" @@ -84,9 +84,9 @@ checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" [[package]] name = "byteorder" @@ -102,18 +102,18 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.25" +version = "1.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +checksum = "956a5e21988b87f372569b66183b78babf23ebc2e744b733e4350a752c4dafac" dependencies = [ "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "chrono" @@ -264,6 +264,19 @@ dependencies = [ "gamenight-api-client-rs", "inquire", "tokio", + "uuid", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -333,9 +346,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" dependencies = [ "base64", "bytes", @@ -566,9 +579,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "mime" @@ -588,9 +601,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] @@ -603,7 +616,7 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -614,7 +627,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -719,6 +732,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "redox_syscall" version = "0.5.12" @@ -730,9 +749,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.18" +version = "0.12.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" +checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" dependencies = [ "base64", "bytes", @@ -743,12 +762,9 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", - "ipnet", "js-sys", "log", - "mime", "mime_guess", - "once_cell", "percent-encoding", "pin-project-lite", "serde", @@ -767,9 +783,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustversion" @@ -882,9 +898,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" @@ -904,9 +920,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "syn" -version = "2.0.101" +version = "2.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "f6397daf94fa90f058bd0fd88429dd9e5738999cca8d701813c80723add80462" dependencies = [ "proc-macro2", "quote", @@ -999,9 +1015,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "bitflags 2.9.1", "bytes", @@ -1039,9 +1055,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] @@ -1093,6 +1109,18 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "uuid" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +dependencies = [ + "getrandom", + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "want" version = "0.3.1" @@ -1104,9 +1132,18 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] [[package]] name = "wasm-bindgen" @@ -1418,6 +1455,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.1", +] + [[package]] name = "writeable" version = "0.6.1" diff --git a/gamenight-cli/Cargo.toml b/gamenight-cli/Cargo.toml index 3da2444..6220d06 100644 --- a/gamenight-cli/Cargo.toml +++ b/gamenight-cli/Cargo.toml @@ -9,4 +9,5 @@ tokio = { version = "1", features = ["full"] } inquire = { version = "0.7.5", features = ["date"] } async-trait = "0.1" dyn-clone = "1.0" -chrono = "0.4" \ No newline at end of file +chrono = "0.4" +uuid = { version = "1.3.0", features = ["serde", "v4"] } diff --git a/gamenight-cli/src/domain/gamenight.rs b/gamenight-cli/src/domain/gamenight.rs index 0763e60..53dd8c4 100644 --- a/gamenight-cli/src/domain/gamenight.rs +++ b/gamenight-cli/src/domain/gamenight.rs @@ -1,27 +1,20 @@ use std::fmt::Display; use chrono::{DateTime, Local}; -use gamenight_api_client_rs::models; +use uuid::Uuid; #[derive(Clone)] pub struct Gamenight { + pub id: Uuid, pub name: String, - pub start_time: DateTime + pub start_time: DateTime, + pub owner_id: Uuid, } -impl From for Gamenight { - fn from(value: models::Gamenight) -> Self { - Self { - name: value.name, - start_time: DateTime::parse_from_rfc3339(&value.datetime).unwrap().into() - } - } -} impl Display for Gamenight { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!(f, r#" + write!(f, r#" Name: {} -When: {} -"#, self.name, self.start_time.format("%d-%m-%Y %H:%M")) +When: {}"#, self.name, self.start_time.format("%d-%m-%Y %H:%M")) } } \ No newline at end of file diff --git a/gamenight-cli/src/domain/mod.rs b/gamenight-cli/src/domain/mod.rs index 08ac6bc..42a3f86 100644 --- a/gamenight-cli/src/domain/mod.rs +++ b/gamenight-cli/src/domain/mod.rs @@ -1 +1,2 @@ -pub mod gamenight; \ No newline at end of file +pub mod gamenight; +pub mod user; \ No newline at end of file diff --git a/gamenight-cli/src/domain/user.rs b/gamenight-cli/src/domain/user.rs new file mode 100644 index 0000000..8c9775f --- /dev/null +++ b/gamenight-cli/src/domain/user.rs @@ -0,0 +1,7 @@ +use uuid::Uuid; + +#[derive(Clone)] +pub struct User { + pub id: Uuid, + pub username: String +} \ No newline at end of file diff --git a/gamenight-cli/src/flows/join.rs b/gamenight-cli/src/flows/join.rs new file mode 100644 index 0000000..179cdc6 --- /dev/null +++ b/gamenight-cli/src/flows/join.rs @@ -0,0 +1,34 @@ +use std::fmt::Display; + +use async_trait::async_trait; +use gamenight_api_client_rs::{apis::default_api::join_post, models::GamenightId}; +use uuid::Uuid; + +use super::{Flow, FlowOutcome, FlowResult, GamenightState}; + +#[derive(Clone)] +pub struct Join { + gamenight_id: Uuid +} + +impl Join { + pub fn new(gamenight_id: Uuid) -> Self { + Self { + gamenight_id + } + } +} + +#[async_trait] +impl<'a> Flow<'a> for Join { + async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a> { + let _ = join_post(&state.configuration, Some(GamenightId{gamenight_id: self.gamenight_id.to_string()})).await?; + Ok((FlowOutcome::Successful, state)) + } +} + +impl Display for Join { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Join") + } +} \ No newline at end of file diff --git a/gamenight-cli/src/flows/list_gamenights.rs b/gamenight-cli/src/flows/list_gamenights.rs index 905b2fc..5030fb6 100644 --- a/gamenight-cli/src/flows/list_gamenights.rs +++ b/gamenight-cli/src/flows/list_gamenights.rs @@ -1,8 +1,10 @@ +use chrono::DateTime; use gamenight_api_client_rs::apis::default_api::get_gamenights; use inquire::Select; +use uuid::Uuid; -use crate::flows::view_gamenight::ViewGamenight; +use crate::{domain::{gamenight::Gamenight}, flows::view_gamenight::ViewGamenight}; use super::{exit::Exit, *}; @@ -22,9 +24,18 @@ impl<'a> Flow<'a> for ListGamenights { async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a> { let response = get_gamenights(&state.configuration).await?; - let mut view_flows = response.into_iter().map(|gamenight| -> Box + Send> { - Box::new(ViewGamenight::new(gamenight.into())) - }).collect:: + Send>>>(); + let mut view_flows: Vec + Send>> = vec![]; + + for response in response.iter() { + let gamenight = Gamenight { + id: Uuid::parse_str(&response.id)?, + name: response.name.clone(), + start_time:DateTime::parse_from_rfc3339(&response.datetime)?.into(), + owner_id: Uuid::parse_str(&response.owner_id)? + }; + view_flows.push(Box::new(ViewGamenight::new(gamenight))); + } + view_flows.push(Box::new(Exit::new())); let choice = Select::new("What gamenight would you like to view?", view_flows) @@ -38,5 +49,4 @@ impl Display for ListGamenights { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "List all gamenights") } -} - +} \ No newline at end of file diff --git a/gamenight-cli/src/flows/mod.rs b/gamenight-cli/src/flows/mod.rs index a6c203e..e2e935c 100644 --- a/gamenight-cli/src/flows/mod.rs +++ b/gamenight-cli/src/flows/mod.rs @@ -2,7 +2,7 @@ use std::fmt::Display; use async_trait::async_trait; use chrono::ParseError; -use gamenight_api_client_rs::apis::configuration::Configuration; +use gamenight_api_client_rs::apis::{configuration::Configuration, Error}; use inquire::InquireError; use dyn_clone::DynClone; @@ -13,6 +13,7 @@ mod exit; mod list_gamenights; mod add_gamenight; mod view_gamenight; +mod join; pub struct GamenightState { configuration: Configuration, @@ -45,16 +46,24 @@ impl From for FlowError { } } -impl From> for FlowError { - fn from(value: gamenight_api_client_rs::apis::Error) -> Self { +impl From for FlowError { + fn from(value: ParseError) -> Self { Self { error: value.to_string() } } } -impl From for FlowError { - fn from(value: ParseError) -> Self { +impl From> for FlowError { + fn from(value: Error) -> Self { + Self { + error: value.to_string() + } + } +} + +impl From for FlowError { + fn from(value: uuid::Error) -> Self { Self { error: value.to_string() } diff --git a/gamenight-cli/src/flows/view_gamenight.rs b/gamenight-cli/src/flows/view_gamenight.rs index e237770..5fef946 100644 --- a/gamenight-cli/src/flows/view_gamenight.rs +++ b/gamenight-cli/src/flows/view_gamenight.rs @@ -1,7 +1,9 @@ +use gamenight_api_client_rs::{apis::default_api::{participants_get, user_get}, models::{GamenightId, UserId}}; use inquire::Select; +use uuid::Uuid; -use crate::{domain::gamenight::Gamenight, flows::exit::Exit}; +use crate::{domain::{gamenight::Gamenight, user::User}, flows::{exit::Exit, join::Join}}; use super::*; @@ -18,12 +20,30 @@ impl ViewGamenight { } } + +fn vec_user_to_usernames_string(users: Vec) -> String { + + let string_list: Vec = users.iter().map(|x| {x.username.clone()}).collect(); + string_list.join(", ") +} + #[async_trait] impl<'a> Flow<'a> for ViewGamenight { async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a> { - print!("{}", self.gamenight); + let participants = participants_get(&state.configuration, Some(GamenightId{gamenight_id: self.gamenight.id.to_string()})).await?; + let mut users = vec![]; + for participant in participants.participants.iter() { + let user = user_get(&state.configuration, Some(UserId{user_id: participant.clone()})).await?; + users.push(User { + id: Uuid::parse_str(&user.id)?, + username: user.username + }); + } + + println!("{}\nwho: {}", self.gamenight, vec_user_to_usernames_string(users)); let options: Vec + Send>> = vec![ + Box::new(Join::new(self.gamenight.id)), Box::new(Exit::new()) ]; let choice = Select::new("What do you want to do:", options) diff --git a/gamenight-database/src/gamenight_participants.rs b/gamenight-database/src/gamenight_participants.rs index c878931..7711ab6 100644 --- a/gamenight-database/src/gamenight_participants.rs +++ b/gamenight-database/src/gamenight_participants.rs @@ -21,4 +21,8 @@ pub fn get_participants(conn: &mut DbConnection, id: &Uuid) -> Result, .filter(gamenight_participant::gamenight_id.eq(&id)) .select(gamenight_participant::user_id) .get_results(conn)?) +} + +pub fn insert_gamenight_participant(conn: &mut DbConnection, gp: GamenightParticipant) -> Result { + Ok(gp.insert_into(gamenight_participant::table).execute(conn)?) } \ No newline at end of file