diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 9a0fe39..a060ccb 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -339,9 +339,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af" dependencies = [ "cfg-if", "crc32fast", @@ -508,9 +508,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if", "libc", @@ -525,9 +525,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "h2" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62eeb471aa3e3c9197aa4bfeabfe02982f6dc96f750486c0bb0009ac58b26d2b" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ "bytes", "fnv", @@ -551,20 +551,6 @@ dependencies = [ "ahash", ] -[[package]] -name = "hello_world" -version = "0.1.0" -dependencies = [ - "bcrypt", - "hyper", - "mysql", - "rand 0.3.23", - "serde", - "serde_derive", - "serde_json", - "tokio", -] - [[package]] name = "hermit-abi" version = "0.1.19" @@ -598,9 +584,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" +checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba" [[package]] name = "httpdate" @@ -610,9 +596,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.17" +version = "0.14.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043f0e083e9901b6cc658a77d1eb86f4fc650bbb977a4337dd63192826aa85dd" +checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" dependencies = [ "bytes", "futures-channel", @@ -645,9 +631,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ "autocfg", "hashbrown", @@ -776,9 +762,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.121" +version = "0.2.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" +checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" [[package]] name = "libloading" @@ -803,10 +789,11 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] @@ -821,13 +808,27 @@ dependencies = [ [[package]] name = "lru" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb87f3080f6d1d69e8c564c0fcfde1d7aa8cc451ce40cae89479111f03bc0eb" +checksum = "32613e41de4c47ab04970c348ca7ae7382cf116625755af070b008a15516a889" dependencies = [ "hashbrown", ] +[[package]] +name = "main" +version = "0.1.0" +dependencies = [ + "bcrypt", + "hyper", + "mysql", + "rand 0.3.23", + "serde", + "serde_derive", + "serde_json", + "tokio", +] + [[package]] name = "matches" version = "0.1.9" @@ -857,12 +858,11 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" dependencies = [ "adler", - "autocfg", ] [[package]] @@ -963,9 +963,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" dependencies = [ "lazy_static", "libc", @@ -1111,9 +1111,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" dependencies = [ "cfg-if", "libc", @@ -1157,9 +1157,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "ppv-lite86" @@ -1175,18 +1175,18 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4af2ec4714533fcdf07e886f17025ace8b997b9ce51204ee69b6da831c3da57" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] @@ -1276,9 +1276,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] @@ -1311,9 +1311,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.22.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37baa70cf8662d2ba1c1868c5983dda16ef32b105cce41fb5c47e72936a90b3" +checksum = "22dc69eadbf0ee2110b8d20418c0c6edbaefec2811c4963dc17b6344e11fe0f8" dependencies = [ "arrayvec", "num-traits", @@ -1444,9 +1444,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "smallvec" @@ -1482,9 +1482,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54" +checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" dependencies = [ "proc-macro2", "quote", @@ -1533,9 +1533,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "004cbc98f30fa233c61a38bc77e96a9106e65c88f2d3bef182ae952027e5753d" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" dependencies = [ "libc", "num_threads", @@ -1589,16 +1589,16 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" dependencies = [ "bytes", "futures-core", "futures-sink", - "log", "pin-project-lite", "tokio", + "tracing", ] [[package]] @@ -1609,20 +1609,32 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" dependencies = [ "cfg-if", "pin-project-lite", + "tracing-attributes", "tracing-core", ] [[package]] -name = "tracing-core" -version = "0.1.23" +name = "tracing-attributes" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" +checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" dependencies = [ "lazy_static", ] @@ -1747,9 +1759,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" dependencies = [ "windows_aarch64_msvc", "windows_i686_gnu", @@ -1760,33 +1772,33 @@ dependencies = [ [[package]] name = "windows_aarch64_msvc" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" [[package]] name = "windows_i686_gnu" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" [[package]] name = "windows_i686_msvc" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" [[package]] name = "windows_x86_64_gnu" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" [[package]] name = "windows_x86_64_msvc" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" [[package]] name = "wyz" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 854afdf..6bdad27 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "hello_world" +name = "main" version = "0.1.0" edition = "2018" diff --git a/backend/src/main.rs b/backend/src/main.rs index 2e08fb8..a1e0e93 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -8,6 +8,17 @@ use hyper::{Body, Client, Method, Request, Response, Server, StatusCode}; use hyper::service::{make_service_fn, service_fn}; use bcrypt::{DEFAULT_COST, hash, verify}; use rand::{OsRng, Rng}; +use serde_json::Map; + +#[derive(Serialize, Deserialize)] +struct Proposal { + id: i32, + ladderid: i32, + winner: String, + proposer: i32, + approver: i32, + score: String, +} #[derive(Serialize, Deserialize)] struct User { @@ -18,16 +29,37 @@ struct User { login: String, phone: String, mail: String, + ranking: i32, +} + +#[derive(Serialize, Deserialize)] +struct leaderboard { + name: String, + surname: String, + ranking: i32, +} + +#[derive(Serialize, Deserialize)] +struct ladderRaw { + id: i32, + inAtype: String, + inA: String, + inBtype: String, + inB: String, + winner: String, + round: String, + scores: String, } #[derive(Serialize, Deserialize)] struct Registration { id: i32, - userid: String, + userid: i32, tournamentid: String, paymenttype: String, paymentstatus: String, approval: String, + partner: i32, } #[derive(Serialize, Deserialize)] @@ -40,6 +72,7 @@ struct Usera { phone: String, mail: String, deleted: i32, + ranking: i32, } #[derive(Serialize, Deserialize)] @@ -52,6 +85,8 @@ struct tournament { roles: String, creator: i32, approved: i32, + state: i32, + currentRound: i32, } #[derive(Serialize, Deserialize)] @@ -65,14 +100,45 @@ struct tournamenta { creator: i32, approved: i32, deleted: i32, + state: i32, + currentRound: i32, } -thread_local!(static POOL: Pool = Pool::new(Opts::from_url("mysql://inz:*****!@10.1.6.101:3306/inz").unwrap()).unwrap()); +thread_local!(static POOL: Pool = Pool::new(Opts::from_url("mysql://inz:HaLzqw68CbabS8Smz3Vx!@10.1.6.101:3306/inz").unwrap()).unwrap()); async fn hello_world(req: Request) -> Result> { let mut response = Response::new(Body::empty()); match (req.method(), req.uri().path()) { - (&Method::POST, "/registrations/approve") => { + (&Method::GET, "/proposals/pending") => { + if req.headers().contains_key("Authorization") { + let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); + let aa = tmp.next().unwrap(); + if aa != "Bearer" { + *response.status_mut() = StatusCode::UNAUTHORIZED; + return Ok(response); + } + let token = tmp.next().unwrap().to_string(); + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut result = con.exec_iter("Select id from users where id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + let row = it.next(); + let urow = row.unwrap().unwrap(); + let uid: i32 = urow.get(0).unwrap(); + let res = poola.get_conn().unwrap() + .exec_map( + "SELECT * FROM inz.winProposals where proposer in (Select id from registrations where ? = userid or ? = partner ) or approver in (Select id from registrations where ? = userid or ? = partner );", (&uid, &uid, &uid, &uid), + |(id, ladderid, winner, proposer, approver, score)| { + Proposal { id, ladderid, winner, proposer, approver, score } + }, + ); + *response.body_mut() = serde_json::to_string(&res.unwrap()).unwrap().into(); + }); + } else { + *response.status_mut() = StatusCode::UNAUTHORIZED; + } + } + (&Method::POST, "/proposal/approve") => { if req.headers().contains_key("Authorization") { let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); let aa = tmp.next().unwrap(); @@ -83,7 +149,493 @@ async fn hello_world(req: Request) -> Result> { let token = tmp.next().unwrap().to_string(); let byte_stream = hyper::body::to_bytes(req).await.unwrap(); let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); - if !s.contains_key("id"){ + let mut row: Option> = None; + let mut row2: Option> = None; + let mut row3: Option> = None; + if !s.contains_key("id") { + *response.body_mut() = "{\"error\":\"id is required\"}".into(); + return Ok(response); + } + let id = s.get("id").unwrap().to_string(); + + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut result = con.exec_iter("Select id from users where id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + row = it.next(); + let mut con2 = poola.get_conn().unwrap(); + let mut result2 = con2.exec_iter("Select ladderid, winner, score from winProposals where id =?;", (&id, )).unwrap(); + let mut it2 = result2.iter().unwrap(); + row2 = it2.next(); + let mut con3 = poola.get_conn().unwrap(); + let mut result3 = con3.exec_iter("Select userid, partner from registrations where id =(Select approver from winProposals where id =?);", (&id, )).unwrap(); + let mut it3 = result3.iter().unwrap(); + row3 = it3.next(); + }); + if row.is_none() { + *response.status_mut() = StatusCode::FORBIDDEN; + return Ok(response); + } + if row2.is_none() { + *response.status_mut() = StatusCode::BAD_REQUEST; + return Ok(response); + } + let urow = row.unwrap().unwrap(); + let urow2 = row2.unwrap().unwrap(); + let urow3 = row3.unwrap().unwrap(); + let uid: i32 = urow.get(0).unwrap(); + let user: i32 = urow3.get(0).unwrap(); + let partner: i32 = urow3.get(1).unwrap(); + if !(uid == user || uid == partner) { + *response.status_mut() = StatusCode::BAD_REQUEST; + return Ok(response); + } + let ladderid: i32 = urow2.get(0).unwrap(); + let winner: String = urow2.get(1).unwrap(); + let score: String = urow2.get(2).unwrap(); + POOL.with(|poola| { + poola.get_conn().unwrap().exec_drop("Update ladder set winner =?, scores=? where id = ?", (winner, score, ladderid)).unwrap(); + poola.get_conn().unwrap().exec_drop("delete from winProposals where id = ?", (id, )).unwrap(); + }); + } else { + *response.status_mut() = StatusCode::UNAUTHORIZED; + } + } + (&Method::PUT, "/proposal") => { + if req.headers().contains_key("Authorization") { + let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); + let aa = tmp.next().unwrap(); + if aa != "Bearer" { + *response.status_mut() = StatusCode::UNAUTHORIZED; + return Ok(response); + } + let token = tmp.next().unwrap().to_string(); + let byte_stream = hyper::body::to_bytes(req).await.unwrap(); + let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); + let mut row: Option> = None; + let mut row2: Option> = None; + let ladderid = s.get("ladderid").unwrap().to_string(); + + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut result = con.exec_iter("Select id from users where id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + row = it.next(); + let mut con2 = poola.get_conn().unwrap(); + let mut result2 = con2.exec_iter("Select inAtype, inA, inBtype, inB from ladder where deleted = 0 and id =? and winner ='0';", (&ladderid, )).unwrap(); + let mut it2 = result2.iter().unwrap(); + row2 = it2.next(); + }); + if row.is_none() { + *response.status_mut() = StatusCode::FORBIDDEN; + return Ok(response); + } + if row2.is_none() { + *response.status_mut() = StatusCode::BAD_REQUEST; + return Ok(response); + } + let urow = row.unwrap().unwrap(); + let urow2 = row2.unwrap().unwrap(); + let id: i32 = urow.get(0).unwrap(); + let inAtype: String = urow2.get(0).unwrap(); + let mut inA: String = urow2.get(1).unwrap(); + let inBtype: String = urow2.get(2).unwrap(); + let mut inB: String = urow2.get(3).unwrap(); + if s.contains_key("score") && s.contains_key("winner") { + if s.get("winner").unwrap() != "A" && s.get("winner").unwrap() != "B" { + *response.body_mut() = "{\"error\":\"winner must be A or B\"}".into(); + return Ok(response); + } + if inAtype != "R" { + let mut res3: Option> = None; + POOL.with(|poola| { + res3 = poola.get_conn().unwrap() + .exec_iter("WITH RECURSIVE menu_tree +AS ( +SELECT if('A' ='A', inAtype, inBtype) as 'type', if('A' ='A', inA, inB) as 'val' from ladder where id =? + UNION ALL + SELECT if(mn.type ='W', if(la.winner ='A', inAtype, if(la.winner ='B', la.inBtype, null)), if(la.winner ='A', la.inBtype, if(la.winner ='B', la.inAtype, null))) , if(mn.type ='W', if(la.winner ='A', la.inA, if(la.winner ='B', la.inB, null)), if(la.winner ='A', la.inB, if(la.winner ='B', la.inA, null))) + FROM menu_tree mn, inz.ladder la + WHERE mn.val= la.id and mn.type != 'R' +) + SELECT * FROM menu_tree where type = 'R'", (&ladderid, ), + ).unwrap().iter().unwrap().next(); + }); + if !res3.is_none() { + let urow3 = res3.unwrap().unwrap(); + inA = urow3.get(1).unwrap(); + } else { + *response.status_mut() = StatusCode::BAD_REQUEST; + return Ok(response); + } + } + if inBtype != "R" { + let mut res3: Option> = None; + POOL.with(|poola| { + res3 = poola.get_conn().unwrap() + .exec_iter("WITH RECURSIVE menu_tree +AS ( +SELECT if('B' ='A', inAtype, inBtype) as 'type', if('B' ='A', inA, inB) as 'val' from ladder where id =? + UNION ALL + SELECT if(mn.type ='W', if(la.winner ='A', inAtype, if(la.winner ='B', la.inBtype, null)), if(la.winner ='A', la.inBtype, if(la.winner ='B', la.inAtype, null))) , if(mn.type ='W', if(la.winner ='A', la.inA, if(la.winner ='B', la.inB, null)), if(la.winner ='A', la.inB, if(la.winner ='B', la.inA, null))) + FROM menu_tree mn, inz.ladder la + WHERE mn.val= la.id and mn.type != 'R' +) + SELECT * FROM menu_tree where type = 'R'", (&ladderid, ), + ).unwrap().iter().unwrap().next(); + }); + if !res3.is_none() { + let urow3 = res3.unwrap().unwrap(); + inB = urow3.get(1).unwrap(); + } else { + *response.status_mut() = StatusCode::BAD_REQUEST; + return Ok(response); + } + } + let mut res3: Option> = None; + let mut res4: Option> = None; + POOL.with(|poola| { + res3 = poola.get_conn().unwrap() + .exec_iter("SELECT userid, partner FROM inz.registrations where id = ?;", (&inA, ), + ).unwrap().iter().unwrap().next(); + res4 = poola.get_conn().unwrap() + .exec_iter("SELECT userid, partner FROM inz.registrations where id = ?;", (&inB, ), + ).unwrap().iter().unwrap().next(); + }); + let urow3 = res3.unwrap().unwrap(); + let urow4 = res4.unwrap().unwrap(); + let mut prop = ""; + let mut acc = ""; + let u1: i32 = urow3.get(0).unwrap(); + let u2: i32 = urow3.get(1).unwrap(); + let u3: i32 = urow4.get(0).unwrap(); + let u4: i32 = urow4.get(1).unwrap(); + if u1 == id || u2 == id { + prop = &inA; + acc = &inB; + } else { + if u3 == id || u4 == id { + prop = &inB; + acc = &inA; + } else { + *response.status_mut() = StatusCode::BAD_REQUEST; + return Ok(response); + } + } + POOL.with(|poola| { + let nid = "{\"id\":".to_owned() + &poola.get_conn().unwrap().exec_iter("INSERT INTO `inz`.`winProposals`(ladderid, winner, proposer, approver, score) VALUES (?,?,?,?,?);", (&ladderid, s.get("winner"), prop, acc, s.get("score"))).unwrap().last_insert_id().unwrap().to_string() + "\"}"; + *response.body_mut() = nid.into(); + }); + } else { + *response.body_mut() = "{\"error\":\"not all fields\"}".into(); + } + } else { + *response.status_mut() = StatusCode::UNAUTHORIZED; + } + } + (&Method::GET, "/ladders/solved") => { + let query: &str = req.uri().query().unwrap(); + let mut splited = query.split("="); + + let id = splited.next().unwrap(); + let val = splited.next().unwrap(); + if id != "id" { + *response.body_mut() = "{\"error\":\"id required\"}".into(); + return Ok(response); + } + POOL.with(|poola| { + let res = poola.get_conn().unwrap() + .exec_iter( + "SELECT id, inAtype, inA, inBtype, inB, winner, round, scores from ladder where deleted =0 and id = ?", (val, ), + ).unwrap().iter().unwrap().next(); + let res2 = poola.get_conn().unwrap() + .exec_iter("WITH RECURSIVE menu_tree +AS ( +SELECT if('A' ='A', inAtype, inBtype) as 'type', if('A' ='A', inA, inB) as 'val' from ladder where id =? + UNION ALL + SELECT if(mn.type ='W', if(la.winner ='A', inAtype, if(la.winner ='B', la.inBtype, null)), if(la.winner ='A', la.inBtype, if(la.winner ='B', la.inAtype, null))) , if(mn.type ='W', if(la.winner ='A', la.inA, if(la.winner ='B', la.inB, null)), if(la.winner ='A', la.inB, if(la.winner ='B', la.inA, null))) + FROM menu_tree mn, inz.ladder la + WHERE mn.val= la.id and mn.type != 'R' +) + SELECT * FROM menu_tree where type = 'R'", (val, ), + ).unwrap().iter().unwrap().next(); + let res3 = poola.get_conn().unwrap() + .exec_iter("WITH RECURSIVE menu_tree +AS ( +SELECT if('B' ='A', inAtype, inBtype) as 'type', if('B' ='A', inA, inB) as 'val' from ladder where id =? + UNION ALL + SELECT if(mn.type ='W', if(la.winner ='A', inAtype, if(la.winner ='B', la.inBtype, null)), if(la.winner ='A', la.inBtype, if(la.winner ='B', la.inAtype, null))) , if(mn.type ='W', if(la.winner ='A', la.inA, if(la.winner ='B', la.inB, null)), if(la.winner ='A', la.inB, if(la.winner ='B', la.inA, null))) + FROM menu_tree mn, inz.ladder la + WHERE mn.val= la.id and mn.type != 'R' +) + SELECT * FROM menu_tree where type = 'R'", (val, ), + ).unwrap().iter().unwrap().next(); + let ur = res.unwrap().unwrap(); + let id1: i32 = ur.get(0).unwrap(); + let mut inAtype: String = ur.get(1).unwrap(); + let mut inA: String = ur.get(2).unwrap(); + let mut inBtype: String = ur.get(3).unwrap(); + let mut inB: String = ur.get(4).unwrap(); + let winner: String = ur.get(5).unwrap(); + let round: String = ur.get(6).unwrap(); + let scores: String = ur.get(7).unwrap(); + if !res2.is_none() { + let urow3 = res2.unwrap().unwrap(); + inAtype = urow3.get(0).unwrap(); + inA = urow3.get(1).unwrap(); + } + if !res3.is_none() { + let urow4 = res3.unwrap().unwrap(); + inBtype = urow4.get(0).unwrap(); + inB = urow4.get(1).unwrap(); + } + let res = ladderRaw { id: id1, inAtype: inAtype, inA: inA, inBtype: inBtype, inB: inB, winner: winner, round: round, scores: scores }; + *response.body_mut() = serde_json::to_string(&res).unwrap().into(); + }); + } + (&Method::GET, "/ladders/raw") => { + let query: &str = req.uri().query().unwrap(); + let mut splited = query.split("="); + + let id = splited.next().unwrap(); + let val = splited.next().unwrap(); + if id != "tournamentid" { + *response.body_mut() = "{\"error\":\"tournamentid required\"}".into(); + return Ok(response); + } + POOL.with(|poola| { + let res = poola.get_conn().unwrap() + .exec_map( + "SELECT id, inAtype, inA, inBtype, inB, winner, round, scores from ladder where deleted =0 and tournamentid = ?", (val, ), + |(id, inAtype, inA, inBtype, inB, winner, round, scores)| { + ladderRaw { id, inAtype, inA, inBtype, inB, winner, round, scores } + }, + ); + *response.body_mut() = serde_json::to_string(&res.unwrap()).unwrap().into(); + }); + } + (&Method::POST, "/ladder") => { + if req.headers().contains_key("Authorization") { + let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); + let aa = tmp.next().unwrap(); + if aa != "Bearer" { + *response.status_mut() = StatusCode::UNAUTHORIZED; + return Ok(response); + } + let token = tmp.next().unwrap().to_string(); + let byte_stream = hyper::body::to_bytes(req).await.unwrap(); + let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); + if !s.contains_key("id") { + *response.body_mut() = "{\"error\":\"id is required\"}".into(); + return Ok(response); + } + + let mut row: Option> = None; + let mut row3: Option> = None; + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut result = con.exec_iter("Select id, role from users where (role='2' or role='3' )and id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + row = it.next(); + }); + if row.is_none() { + *response.status_mut() = StatusCode::FORBIDDEN; + return Ok(response); + } + + let urow = row.unwrap().unwrap(); + let id: i32 = urow.get(0).unwrap(); + let role: String = urow.get(1).unwrap(); + let tournamentid = s.get("id"); + if role == "2" { + POOL.with(|poola| { + let mut con3 = poola.get_conn().unwrap(); + let mut result3 = con3.exec_iter("Select creator from tournaments where id = (Select tournamentid from ladder where id =?);", (&tournamentid, )).unwrap(); + let mut it3 = result3.iter().unwrap(); + row3 = it3.next(); + }); + let urow3 = row3.unwrap().unwrap(); + let creator: i32 = urow3.get(0).unwrap(); + if creator != id { + *response.status_mut() = StatusCode::NOT_FOUND; + return Ok(response); + } + } + POOL.with(|poola| { + if s.contains_key("inAtype") { + if s.get("inAtype").unwrap() != "R" && s.get("inAtype").unwrap() != "W" && s.get("inAtype").unwrap() != "L" { + *response.body_mut() = "{\"error\":\"inAtype must be R, W or L\"}".into(); + return; + } + poola.get_conn().unwrap().exec_drop("Update ladder set inAtype =? where id = ? and deleted =0", (s.get("inAtype"), &tournamentid)).unwrap(); + } + if s.contains_key("inBtype") { + if s.get("inBtype").unwrap() != "R" && s.get("inBtype").unwrap() != "W" && s.get("inBtype").unwrap() != "L" { + *response.body_mut() = "{\"error\":\"inBtype must be R, W or L\"}".into(); + return; + } + poola.get_conn().unwrap().exec_drop("Update ladder set inBtype =? where id = ? and deleted =0", (s.get("inBtype"), &tournamentid)).unwrap(); + } + if s.contains_key("inA") { + poola.get_conn().unwrap().exec_drop("Update ladder set inA =? where id = ? and deleted =0", (s.get("inA"), &tournamentid)).unwrap(); + } + if s.contains_key("inB") { + poola.get_conn().unwrap().exec_drop("Update ladder set inB =? where id = ? and deleted =0", (s.get("inB"), &tournamentid)).unwrap(); + } + if s.contains_key("winner") { + poola.get_conn().unwrap().exec_drop("Update ladder set winner =? where id = ? and deleted =0", (s.get("winner"), &tournamentid)).unwrap(); + } + if s.contains_key("round") { + poola.get_conn().unwrap().exec_drop("Update ladder set round =? where id = ? and deleted =0", (s.get("round"), &tournamentid)).unwrap(); + } + if s.contains_key("scores") { + poola.get_conn().unwrap().exec_drop("Update ladder set scores =? where id = ? and deleted =0", (s.get("scores"), &tournamentid)).unwrap(); + } + }); + } else { + *response.status_mut() = StatusCode::UNAUTHORIZED; + } + } + (&Method::DELETE, "/ladder") => { + if req.headers().contains_key("Authorization") { + let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); + let aa = tmp.next().unwrap(); + if aa != "Bearer" { + *response.status_mut() = StatusCode::UNAUTHORIZED; + return Ok(response); + } + let token = tmp.next().unwrap().to_string(); + let byte_stream = hyper::body::to_bytes(req).await.unwrap(); + let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); + if !s.contains_key("id") { + *response.body_mut() = "{\"error\":\"id is required\"}".into(); + return Ok(response); + } + + let mut row: Option> = None; + let mut row3: Option> = None; + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut result = con.exec_iter("Select id, role from users where (role='2' or role='3' )and id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + row = it.next(); + }); + if row.is_none() { + *response.status_mut() = StatusCode::FORBIDDEN; + return Ok(response); + } + + let urow = row.unwrap().unwrap(); + let id: i32 = urow.get(0).unwrap(); + let role: String = urow.get(1).unwrap(); + let tournamentid = s.get("id"); + if role == "2" { + POOL.with(|poola| { + let mut con3 = poola.get_conn().unwrap(); + let mut result3 = con3.exec_iter("Select creator from tournaments where id = (Select tournamentid from ladder where id =?);", (&tournamentid, )).unwrap(); + let mut it3 = result3.iter().unwrap(); + row3 = it3.next(); + }); + let urow3 = row3.unwrap().unwrap(); + let creator: i32 = urow3.get(0).unwrap(); + if creator != id { + *response.status_mut() = StatusCode::NOT_FOUND; + return Ok(response); + } + } + POOL.with(|poola| { + poola.get_conn().unwrap().exec_drop("Update ladder set deleted =1 where id = ?", (&s.get("id"), )).unwrap(); + }); + } else { + *response.status_mut() = StatusCode::UNAUTHORIZED; + } + } + (&Method::PUT, "/ladder") => { + if req.headers().contains_key("Authorization") { + let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); + let aa = tmp.next().unwrap(); + if aa != "Bearer" { + *response.status_mut() = StatusCode::UNAUTHORIZED; + return Ok(response); + } + let token = tmp.next().unwrap().to_string(); + let byte_stream = hyper::body::to_bytes(req).await.unwrap(); + let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); + if !s.contains_key("inAtype") || !s.contains_key("inA") || !s.contains_key("inBtype") || !s.contains_key("inB") || !s.contains_key("round") || !s.contains_key("tournamentid") { + *response.body_mut() = "{\"error\":\"no all fields\"}".into(); + return Ok(response); + } + if s.get("inBtype").unwrap() != "R" && s.get("inBtype").unwrap() != "W" && s.get("inBtype").unwrap() != "L" { + *response.body_mut() = "{\"error\":\"inBtype must be R, W or L\"}".into(); + return Ok(response); + } + if s.get("inAtype").unwrap() != "R" && s.get("inAtype").unwrap() != "W" && s.get("inAtype").unwrap() != "L" { + *response.body_mut() = "{\"error\":\"inAtype must be R, W or L\"}".into(); + return Ok(response); + } + let mut row: Option> = None; + let mut row3: Option> = None; + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut result = con.exec_iter("Select id, role from users where (role='2' or role='3' )and id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + row = it.next(); + }); + if row.is_none() { + *response.status_mut() = StatusCode::FORBIDDEN; + return Ok(response); + } + + let urow = row.unwrap().unwrap(); + let id: i32 = urow.get(0).unwrap(); + let role: String = urow.get(1).unwrap(); + let tournamentid = s.get("tournamentid"); + if role == "2" { + POOL.with(|poola| { + let mut con3 = poola.get_conn().unwrap(); + let mut result3 = con3.exec_iter("Select creator from tournaments where id = ?;", (&tournamentid, )).unwrap(); + let mut it3 = result3.iter().unwrap(); + row3 = it3.next(); + }); + let urow3 = row3.unwrap().unwrap(); + let creator: i32 = urow3.get(0).unwrap(); + if creator != id { + *response.status_mut() = StatusCode::NOT_FOUND; + return Ok(response); + } + } + POOL.with(|poola| { + let nid = "{\"id\":".to_owned() + &poola.get_conn().unwrap().exec_iter("INSERT INTO `inz`.`ladder`(`inAtype`,`inA`,`inBtype`,`inB`,`winner`,`round`,`scores`,`tournamentid`,`deleted`) VALUES (?,?,?,?,'0',?,'-1',?,0);", (s.get("inAtype"), s.get("inA"), s.get("inBtype"), s.get("inB"), s.get("round"), s.get("tournamentid"))).unwrap().last_insert_id().unwrap().to_string() + "\"}"; + *response.body_mut() = nid.into(); + }); + } else { + *response.status_mut() = StatusCode::UNAUTHORIZED; + } + } + (&Method::GET, "/leaderboard") => { + POOL.with(|poola| { + let res = poola.get_conn().unwrap() + .query_map( + "SELECT name, surname, ranking from users where deleted =0 order by ranking DESC", + |(name, surname, ranking)| { + leaderboard { name, surname, ranking } + }, + ); + *response.body_mut() = serde_json::to_string(&res.unwrap()).unwrap().into(); + }); + } + (&Method::POST, "/tournament/cancelTournament") => { + if req.headers().contains_key("Authorization") { + let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); + let aa = tmp.next().unwrap(); + if aa != "Bearer" { + *response.status_mut() = StatusCode::UNAUTHORIZED; + return Ok(response); + } + let token = tmp.next().unwrap().to_string(); + let byte_stream = hyper::body::to_bytes(req).await.unwrap(); + let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); + if !s.contains_key("id") { *response.body_mut() = "{\"error\":\"id required\"}".into(); return Ok(response); } @@ -91,7 +643,7 @@ async fn hello_world(req: Request) -> Result> { let mut con = poola.get_conn().unwrap(); let mut result = con.exec_iter("Select id,role from users where (role = '2' OR role = '3')AND id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); let mut it = result.iter().unwrap(); - let mut row = it.next(); + let row = it.next(); if row.is_none() { *response.status_mut() = StatusCode::FORBIDDEN; return; @@ -99,20 +651,233 @@ async fn hello_world(req: Request) -> Result> { let urow = row.unwrap().unwrap(); let id: i32 = urow.get(0).unwrap(); let role: String = urow.get(1).unwrap(); - if (role == "2") { - let mut conn1 = poola.get_conn().unwrap(); - let mut result1 = conn1.exec_iter("Select userid from registrations where id = ?", (&s.get("id"), )).unwrap(); - let mut it1 = result1.iter().unwrap(); - let mut row1 = it1.next(); - let urow1 = row1.unwrap().unwrap(); - let userid: String = urow1.get(0).unwrap(); - if userid != id.to_string() { - return; - } - poola.get_conn().unwrap().exec_drop("Update registrations set approval ='1' where id = ?", (&s.get("id"), )).unwrap(); - } else { - poola.get_conn().unwrap().exec_drop("Update registrations set approval ='1' where id = ?", (&s.get("id"), )).unwrap(); + let mut conn1 = poola.get_conn().unwrap(); + let mut result1 = conn1.exec_iter("Select creator, state from tournaments where id = ?", (&s.get("id"), )).unwrap(); + let mut it1 = result1.iter().unwrap(); + let row1 = it1.next(); + let urow1 = row1.unwrap().unwrap(); + let creator: i32 = urow1.get(0).unwrap(); + let state: i32 = urow1.get(1).unwrap(); + if state == 3 { + *response.status_mut() = StatusCode::BAD_REQUEST; + return; + } + if role == "2" { + if creator != id { + return; } + poola.get_conn().unwrap().exec_drop("Update tournaments set state =4 where id = ?", (&s.get("id"), )).unwrap(); + } else { + poola.get_conn().unwrap().exec_drop("Update tournaments set state =4 where id = ?", (&s.get("id"), )).unwrap(); + } + }); + } else { + *response.status_mut() = StatusCode::UNAUTHORIZED; + } + } + (&Method::POST, "/tournament/endTournament") => { + if req.headers().contains_key("Authorization") { + let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); + let aa = tmp.next().unwrap(); + if aa != "Bearer" { + *response.status_mut() = StatusCode::UNAUTHORIZED; + return Ok(response); + } + let token = tmp.next().unwrap().to_string(); + let byte_stream = hyper::body::to_bytes(req).await.unwrap(); + + let parsed: serde_json::Value = serde_json::from_slice(&byte_stream).unwrap(); + if parsed.get("id") == None { + *response.body_mut() = "{\"error\":\"id required\"}".into(); + return Ok(response); + } + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut result = con.exec_iter("Select id,role from users where (role = '2' OR role = '3')AND id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + let row = it.next(); + if row.is_none() { + *response.status_mut() = StatusCode::FORBIDDEN; + return; + } + let urow = row.unwrap().unwrap(); + let id: i32 = urow.get(0).unwrap(); + let role: String = urow.get(1).unwrap(); + let mut conn1 = poola.get_conn().unwrap(); + let mut result1 = conn1.exec_iter("Select creator, state, approved from tournaments where id = ? b", (&parsed.get("id"), )).unwrap(); + let mut it1 = result1.iter().unwrap(); + let row1 = it1.next(); + let urow1 = row1.unwrap().unwrap(); + let creator: i32 = urow1.get(0).unwrap(); + let state: i32 = urow1.get(1).unwrap(); + let approved: i32 = urow1.get(2).unwrap(); + if state != 2 { + *response.status_mut() = StatusCode::BAD_REQUEST; + return; + } + if role == "2" { + if creator != id { + return; + } + poola.get_conn().unwrap().exec_drop("Update tournaments set state =3 where id = ?", (&parsed.get("id"), )).unwrap(); + } else { + poola.get_conn().unwrap().exec_drop("Update tournaments set state =3 where id = ?", (&parsed.get("id"), )).unwrap(); + } + if approved == 2 { + let arr: &Vec = parsed.get("results").unwrap().as_array().unwrap(); + for i in 0..arr.len() { + let cur: &Map = arr.get(i).unwrap().as_object().unwrap(); + poola.get_conn().unwrap().exec_drop("Update users set ranking =ranking+? where id = (Select userid from registrations where id = ?) or id = (Select partner from registrations where id = ?)", (&cur.get("points"), &cur.get("rid"), &cur.get("rid"))).unwrap(); + } + } + }); + } else { + *response.status_mut() = StatusCode::UNAUTHORIZED; + } + } + (&Method::POST, "/tournament/startTournament") => { + if req.headers().contains_key("Authorization") { + let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); + let aa = tmp.next().unwrap(); + if aa != "Bearer" { + *response.status_mut() = StatusCode::UNAUTHORIZED; + return Ok(response); + } + let token = tmp.next().unwrap().to_string(); + let byte_stream = hyper::body::to_bytes(req).await.unwrap(); + let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); + if !s.contains_key("id") { + *response.body_mut() = "{\"error\":\"id required\"}".into(); + return Ok(response); + } + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut result = con.exec_iter("Select id,role from users where (role = '2' OR role = '3')AND id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + let row = it.next(); + if row.is_none() { + *response.status_mut() = StatusCode::FORBIDDEN; + return; + } + let urow = row.unwrap().unwrap(); + let id: i32 = urow.get(0).unwrap(); + let role: String = urow.get(1).unwrap(); + let mut conn1 = poola.get_conn().unwrap(); + let mut result1 = conn1.exec_iter("Select creator, state from tournaments where id = ?", (&s.get("id"), )).unwrap(); + let mut it1 = result1.iter().unwrap(); + let row1 = it1.next(); + let urow1 = row1.unwrap().unwrap(); + let creator: i32 = urow1.get(0).unwrap(); + let state: i32 = urow1.get(1).unwrap(); + if state != 1 { + *response.status_mut() = StatusCode::BAD_REQUEST; + return; + } + if role == "2" { + if creator != id { + return; + } + poola.get_conn().unwrap().exec_drop("Update tournaments set state =2 where id = ?", (&s.get("id"), )).unwrap(); + } else { + poola.get_conn().unwrap().exec_drop("Update tournaments set state =2 where id = ?", (&s.get("id"), )).unwrap(); + } + }); + } else { + *response.status_mut() = StatusCode::UNAUTHORIZED; + } + } + (&Method::POST, "/tournament/closeRegistrations") => { + if req.headers().contains_key("Authorization") { + let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); + let aa = tmp.next().unwrap(); + if aa != "Bearer" { + *response.status_mut() = StatusCode::UNAUTHORIZED; + return Ok(response); + } + let token = tmp.next().unwrap().to_string(); + let byte_stream = hyper::body::to_bytes(req).await.unwrap(); + let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); + if !s.contains_key("id") { + *response.body_mut() = "{\"error\":\"id required\"}".into(); + return Ok(response); + } + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut result = con.exec_iter("Select id,role from users where (role = '2' OR role = '3')AND id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + let row = it.next(); + if row.is_none() { + *response.status_mut() = StatusCode::FORBIDDEN; + return; + } + let urow = row.unwrap().unwrap(); + let id: i32 = urow.get(0).unwrap(); + let role: String = urow.get(1).unwrap(); + let mut conn1 = poola.get_conn().unwrap(); + let mut result1 = conn1.exec_iter("Select creator, state from tournaments where id = ?", (&s.get("id"), )).unwrap(); + let mut it1 = result1.iter().unwrap(); + let row1 = it1.next(); + let urow1 = row1.unwrap().unwrap(); + let creator: i32 = urow1.get(0).unwrap(); + let state: i32 = urow1.get(1).unwrap(); + if state != 0 { + *response.status_mut() = StatusCode::BAD_REQUEST; + return; + } + if role == "2" { + if creator != id { + return; + } + poola.get_conn().unwrap().exec_drop("Update tournaments set state =1 where id = ?", (&s.get("id"), )).unwrap(); + } else { + poola.get_conn().unwrap().exec_drop("Update tournaments set state =1 where id = ?", (&s.get("id"), )).unwrap(); + } + }); + } else { + *response.status_mut() = StatusCode::UNAUTHORIZED; + } + } + (&Method::POST, "/registration/approve") => { + if req.headers().contains_key("Authorization") { + let mut tmp = req.headers().get("Authorization").unwrap().to_str().unwrap().split(" "); + let aa = tmp.next().unwrap(); + if aa != "Bearer" { + *response.status_mut() = StatusCode::UNAUTHORIZED; + return Ok(response); + } + let token = tmp.next().unwrap().to_string(); + let byte_stream = hyper::body::to_bytes(req).await.unwrap(); + let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); + if !s.contains_key("id") { + *response.body_mut() = "{\"error\":\"id required\"}".into(); + return Ok(response); + } + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut result = con.exec_iter("Select id,role from users where (role = '2' OR role = '3')AND id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + let row = it.next(); + if row.is_none() { + *response.status_mut() = StatusCode::FORBIDDEN; + return; + } + let urow = row.unwrap().unwrap(); + let id: i32 = urow.get(0).unwrap(); + let role: String = urow.get(1).unwrap(); + if role == "2" { + let mut conn1 = poola.get_conn().unwrap(); + let mut result1 = conn1.exec_iter("Select userid from registrations where id = ?", (&s.get("id"), )).unwrap(); + let mut it1 = result1.iter().unwrap(); + let row1 = it1.next(); + let urow1 = row1.unwrap().unwrap(); + let userid: i32 = urow1.get(0).unwrap(); + if userid != id { + return; + } + poola.get_conn().unwrap().exec_drop("Update registrations set approval ='1' where id = ?", (&s.get("id"), )).unwrap(); + } else { + poola.get_conn().unwrap().exec_drop("Update registrations set approval ='1' where id = ?", (&s.get("id"), )).unwrap(); + } }); } else { *response.status_mut() = StatusCode::UNAUTHORIZED; @@ -140,7 +905,7 @@ async fn hello_world(req: Request) -> Result> { let mut con = poola.get_conn().unwrap(); let mut result = con.exec_iter("Select id,role from users where id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); let mut it = result.iter().unwrap(); - let mut row = it.next(); + let row = it.next(); if row.is_none() { *response.status_mut() = StatusCode::FORBIDDEN; return; @@ -149,29 +914,29 @@ async fn hello_world(req: Request) -> Result> { let urow = row.unwrap().unwrap(); let id: i32 = urow.get(0).unwrap(); let role: String = urow.get(1).unwrap(); - if (role == "1") { + if role == "1" { let res = poola.get_conn().unwrap() .exec_map( - "SELECT `registrations`.`id`,`registrations`.`userid`,`registrations`.`tournamentid`,`registrations`.`paymenttype`,`registrations`.`paymentstatus`,`registrations`.`approval`FROM `inz`.`registrations` where tournamentid= ? and userid=?;", (&val, id), - |(id, userid, tournamentid, paymenttype, paymentstatus, approval)| { - Registration { id, userid, tournamentid, paymenttype, paymentstatus, approval } + "SELECT `registrations`.`id`,`registrations`.`userid`,`registrations`.`tournamentid`,`registrations`.`paymenttype`,`registrations`.`paymentstatus`,`registrations`.`approval`,`registrations`.`partner` FROM `inz`.`registrations` where tournamentid= ? and (userid=? or partner -?);", (&val, id, id), + |(id, userid, tournamentid, paymenttype, paymentstatus, approval, partner)| { + Registration { id, userid, tournamentid, paymenttype, paymentstatus, approval, partner } }, ); *response.body_mut() = serde_json::to_string(&res.unwrap()).unwrap().into(); } else { - if (role == "2") { + if role == "2" { let mut conn1 = poola.get_conn().unwrap(); - let mut result1 = conn1.exec_iter("Select userid from registrations where id = ?", (&val, )).unwrap(); + let mut result1 = conn1.exec_iter("Select creator from tournaments where id = ?", (&val, )).unwrap(); let mut it1 = result1.iter().unwrap(); - let mut row1 = it1.next(); + let row1 = it1.next(); let urow1 = row1.unwrap().unwrap(); - let userid: String = urow1.get(0).unwrap(); - if userid != id.to_string() { + let userid: i32 = urow1.get(0).unwrap(); + if userid != id { let res = poola.get_conn().unwrap() .exec_map( - "SELECT `registrations`.`id`,`registrations`.`userid`,`registrations`.`tournamentid`,`registrations`.`paymenttype`,`registrations`.`paymentstatus`,`registrations`.`approval`FROM `inz`.`registrations` where tournamentid= ? and userid=?;", (&val, id), - |(id, userid, tournamentid, paymenttype, paymentstatus, approval)| { - Registration { id, userid, tournamentid, paymenttype, paymentstatus, approval } + "SELECT `registrations`.`id`,`registrations`.`userid`,`registrations`.`tournamentid`,`registrations`.`paymenttype`,`registrations`.`paymentstatus`,`registrations`.`approval`,`registrations`.`partner` FROM `inz`.`registrations` where tournamentid= ? and (userid=? or partner -?);", (&val, id, id), + |(id, userid, tournamentid, paymenttype, paymentstatus, approval, partner)| { + Registration { id, userid, tournamentid, paymenttype, paymentstatus, approval, partner } }, ); *response.body_mut() = serde_json::to_string(&res.unwrap()).unwrap().into(); @@ -181,18 +946,18 @@ async fn hello_world(req: Request) -> Result> { let res = poola.get_conn().unwrap() .exec_map( - "SELECT `registrations`.`id`,`registrations`.`userid`,`registrations`.`tournamentid`,`registrations`.`paymenttype`,`registrations`.`paymentstatus`,`registrations`.`approval`FROM `inz`.`registrations` where tournamentid= ?;", (&val, ), - |(id, userid, tournamentid, paymenttype, paymentstatus, approval)| { - Registration { id, userid, tournamentid, paymenttype, paymentstatus, approval } + "SELECT `registrations`.`id`,`registrations`.`userid`,`registrations`.`tournamentid`,`registrations`.`paymenttype`,`registrations`.`paymentstatus`,`registrations`.`approval`,`registrations`.`partner` FROM `inz`.`registrations` where tournamentid= ?;", (&val, ), + |(id, userid, tournamentid, paymenttype, paymentstatus, approval, partner)| { + Registration { id, userid, tournamentid, paymenttype, paymentstatus, approval, partner } }, ); *response.body_mut() = serde_json::to_string(&res.unwrap()).unwrap().into(); } else { let res = poola.get_conn().unwrap() .exec_map( - "SELECT `registrations`.`id`,`registrations`.`userid`,`registrations`.`tournamentid`,`registrations`.`paymenttype`,`registrations`.`paymentstatus`,`registrations`.`approval`FROM `inz`.`registrations` where tournamentid= ?;", (&val, ), - |(id, userid, tournamentid, paymenttype, paymentstatus, approval)| { - Registration { id, userid, tournamentid, paymenttype, paymentstatus, approval } + "SELECT `registrations`.`id`,`registrations`.`userid`,`registrations`.`tournamentid`,`registrations`.`paymenttype`,`registrations`.`paymentstatus`,`registrations`.`approval` ,`registrations`.`partner` FROM `inz`.`registrations` where tournamentid= ?;", (&val, ), + |(id, userid, tournamentid, paymenttype, paymentstatus, approval, partner)| { + Registration { id, userid, tournamentid, paymenttype, paymentstatus, approval, partner } }, ); *response.body_mut() = serde_json::to_string(&res.unwrap()).unwrap().into(); @@ -277,7 +1042,7 @@ async fn hello_world(req: Request) -> Result> { *response.body_mut() = Body::from("{\"error\":\"id is required\"}"); return; } - poola.get_conn().unwrap().exec_drop("Update users set deleted =1 where id = ?", (&s.contains_key("id"), )).unwrap(); + poola.get_conn().unwrap().exec_drop("Update users set deleted =1 where id = ?", (&s.get("id"), )).unwrap(); }); } else { *response.status_mut() = StatusCode::UNAUTHORIZED; @@ -304,9 +1069,9 @@ async fn hello_world(req: Request) -> Result> { } let res = poola.get_conn().unwrap() .query_map( - "SELECT `id`, `name`, `surname`, `role`, `login`, `mail`, `phone`,`deleted` from users ", - |(id, name, surname, role, login, mail, phone, deleted)| { - Usera { id, name, surname, role, login, mail, phone, deleted } + "SELECT `id`, `name`, `surname`, `role`, `login`, `mail`, `phone`,`deleted`, `ranking` from users ", + |(id, name, surname, role, login, mail, phone, deleted, ranking)| { + Usera { id, name, surname, role, login, mail, phone, deleted, ranking } }, ); *response.body_mut() = serde_json::to_string(&res.unwrap()).unwrap().into(); @@ -386,6 +1151,9 @@ async fn hello_world(req: Request) -> Result> { if s.contains_key("roles") { poola.get_conn().unwrap().exec_drop("Update tournaments set roles =? where id = ?", (s.get("roles"), &s.get("id"))).unwrap(); } + if s.contains_key("currentRound") { + poola.get_conn().unwrap().exec_drop("Update tournaments set currentRound =? where id = ?", (s.get("currentRound"), &s.get("id"))).unwrap(); + } }); } else { *response.status_mut() = StatusCode::UNAUTHORIZED; @@ -412,9 +1180,9 @@ async fn hello_world(req: Request) -> Result> { } let res = poola.get_conn().unwrap() .query_map( - "SELECT id, name, typeOfLadder, pointsForTournament, places, roles, creator,approved,deleted from tournaments ", - |(id, name, type_of_ladder, points_for_tournament, places, roles, creator, approved, deleted)| { - tournamenta { id, name, typeOfLadder: type_of_ladder, places, roles, creator, pointsForTournament: points_for_tournament, approved, deleted } + "SELECT id, name, typeOfLadder, pointsForTournament, places, roles, creator,approved,deleted, state, currentRound from tournaments ", + |(id, name, type_of_ladder, points_for_tournament, places, roles, creator, approved, deleted, state, currentRound)| { + tournamenta { id, name, typeOfLadder: type_of_ladder, places, roles, creator, pointsForTournament: points_for_tournament, approved, deleted, state, currentRound } }, ); *response.body_mut() = serde_json::to_string(&res.unwrap()).unwrap().into(); @@ -453,7 +1221,7 @@ async fn hello_world(req: Request) -> Result> { } let urow2 = row2.unwrap().unwrap(); let approved: i32 = urow2.get(0).unwrap(); - if (approved == 1) { + if approved == 1 { POOL.with(|poola| { poola.get_conn().unwrap().exec_drop("Update tournaments set approved =2 where id = ?", (s.get("id").unwrap(), )).unwrap(); }); @@ -511,7 +1279,7 @@ async fn hello_world(req: Request) -> Result> { let role: String = urow.get(1).unwrap(); let paymenttype: String = urow2.get(0).unwrap(); let tournamentid: String = urow2.get(1).unwrap(); - if (role == "2") { + if role == "2" { POOL.with(|poola| { let mut con3 = poola.get_conn().unwrap(); let mut result3 = con3.exec_iter("Select creator from tournaments where id = ?;", (&tournamentid, )).unwrap(); @@ -519,8 +1287,8 @@ async fn hello_world(req: Request) -> Result> { row3 = it3.next(); }); let urow3 = row3.unwrap().unwrap(); - let creator: String = urow3.get(0).unwrap(); - if creator != id.to_string() { + let creator: i32 = urow3.get(0).unwrap(); + if creator != id { *response.status_mut() = StatusCode::NOT_FOUND; return Ok(response); } @@ -537,7 +1305,7 @@ async fn hello_world(req: Request) -> Result> { *response.status_mut() = StatusCode::UNAUTHORIZED; } } - (&Method::GET, "/registration/paymentstatus") => { + (&Method::GET, "/registration/paymentstatus") => { if req.headers().contains_key("Authorization") { let query: &str = req.uri().query().unwrap(); let mut splited = query.split("="); @@ -580,10 +1348,10 @@ async fn hello_world(req: Request) -> Result> { let role: String = urow.get(1).unwrap(); let paymentstatus: String = urow2.get(0).unwrap(); let paymentreference: String = urow2.get(1).unwrap(); - let userid: String = urow2.get(2).unwrap(); + let userid: i32 = urow2.get(2).unwrap(); let paymenttype: String = urow2.get(3).unwrap(); if role == "1" || role == "2" { - if userid != id.to_string() { + if userid != id { *response.status_mut() = StatusCode::NOT_FOUND; return Ok(response); } @@ -593,9 +1361,9 @@ async fn hello_world(req: Request) -> Result> { let client = Client::new(); let req = Request::builder() .method(Method::GET) - .uri("http://10.1.6.101:8082/api/v1/stores/*****/invoices/".to_owned() + &paymentreference) + .uri("http://10.1.6.101:8082/api/v1/stores/6N6yuxW7HGSbHnsLM1csvFqRz72DP2EkY5YFBz4jGdQK/invoices/".to_owned() + &paymentreference) .header("content-type", "application/json") - .header("Authorization", "token ******").body(Body::empty()).unwrap(); + .header("Authorization", "token 305562c7ec5f6d6870e534abf86084b085696f92").body(Body::empty()).unwrap(); let resp = client.request(req).await.unwrap(); let parsed: serde_json::Value = serde_json::from_slice(hyper::body::to_bytes(resp.into_body()).await.unwrap().as_ref()).unwrap(); let stat: String = parsed.get("status").unwrap().as_str().unwrap().into(); @@ -645,35 +1413,47 @@ async fn hello_world(req: Request) -> Result> { let byte_stream = hyper::body::to_bytes(req).await.unwrap(); let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); let mut row: Option> = None; - POOL.with(|poola| { - let mut con = poola.get_conn().unwrap(); - - let mut result = con.exec_iter("Select id from users where id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); - let mut it = result.iter().unwrap(); - row = it.next(); - }); - if row.is_none() { - *response.status_mut() = StatusCode::FORBIDDEN; - return Ok(response); - } - let urow = row.unwrap().unwrap(); - let id: i32 = urow.get(0).unwrap(); - if s.contains_key("tournament") && s.contains_key("paymentmethod") { + let mut row2: Option> = None; + if s.contains_key("tournament") && s.contains_key("paymentmethod") && s.contains_key("partner") { let tournament = s.get("tournament").unwrap().to_string(); + let partner = s.get("partner").unwrap().to_string(); + + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + + let mut result = con.exec_iter("Select id from users where id =(SELECT user FROM `inz`.`sessions` where token = ? and expire > NOW());", (&token, )).unwrap(); + let mut it = result.iter().unwrap(); + row = it.next(); + let mut con2 = poola.get_conn().unwrap(); + + let mut result2 = con2.exec_iter("Select id from tournaments where state = 0 and id =?;", (&tournament, )).unwrap(); + let mut it2 = result2.iter().unwrap(); + row2 = it2.next(); + }); + if row.is_none() { + *response.status_mut() = StatusCode::FORBIDDEN; + return Ok(response); + } + if row2.is_none() { + *response.status_mut() = StatusCode::BAD_REQUEST; + return Ok(response); + } + let urow = row.unwrap().unwrap(); + let id: i32 = urow.get(0).unwrap(); let paymentmethod = s.get("paymentmethod").unwrap().to_string(); if paymentmethod == "btc" { let client = Client::new(); let req = Request::builder() .method(Method::POST) - .uri("http://10.1.6.101:8082/api/v1/stores/****/invoices") + .uri("http://10.1.6.101:8082/api/v1/stores/6N6yuxW7HGSbHnsLM1csvFqRz72DP2EkY5YFBz4jGdQK/invoices") .header("content-type", "application/json") - .header("Authorization", "token *****") + .header("Authorization", "token 305562c7ec5f6d6870e534abf86084b085696f92") .body(Body::from("{\"metadata\": {\"orderId\": \"id123\"},\"checkout\": {\"speedPolicy\": \"LowMediumSpeed\",\"redirectURL\":\"https://www.google.com\"},\"amount\": \"1.00\",\"currency\": \"PLN\"}")).unwrap(); let resp = client.request(req).await.unwrap(); let parsed: serde_json::Value = serde_json::from_slice(hyper::body::to_bytes(resp.into_body()).await.unwrap().as_ref()).unwrap(); POOL.with(|poola| { let tmp: String = parsed.get("id").unwrap().as_str().unwrap().into(); - let nid: String = poola.get_conn().unwrap().exec_iter("INSERT INTO `inz`.`registrations`(`userid`,`tournamentid`,`paymenttype`,`paymentstatus`,`approval`,`paymentreference`)VALUES(?,?,'btc','PENDING',0,?);", (id, tournament, &tmp)).unwrap().last_insert_id().unwrap().to_string(); + let nid: String = poola.get_conn().unwrap().exec_iter("INSERT INTO `inz`.`registrations`(`userid`,`tournamentid`,`paymenttype`,`paymentstatus`,`approval`,`paymentreference`, `partner`)VALUES(?,?,'btc','PENDING',0,?,?);", (id, tournament, &tmp, partner)).unwrap().last_insert_id().unwrap().to_string(); let mut checkout: String = parsed.get("checkoutLink").unwrap().as_str().unwrap().into(); checkout = checkout.replace("http://10.1.6.101:8082/", "https://btcpay.dragonmaster.pl/"); *response.body_mut() = Body::from("{\"id\":\"".to_owned() + &nid + "\",\"url\":\"" + &*checkout + "\"}"); @@ -681,7 +1461,7 @@ async fn hello_world(req: Request) -> Result> { } else { if paymentmethod == "cash" { POOL.with(|poola| { - let nid = "{\"id\":".to_owned() + &poola.get_conn().unwrap().exec_iter("INSERT INTO `inz`.`registrations`(`userid`,`tournamentid`,`paymenttype`,`paymentstatus`,`approval`,`paymentreference`)VALUES(?,?,'cash','PENDING',0,'N/A');", (id, tournament)).unwrap().last_insert_id().unwrap().to_string() + "\"}"; + let nid = "{\"id\":\"".to_owned() + &poola.get_conn().unwrap().exec_iter("INSERT INTO `inz`.`registrations`(`userid`,`tournamentid`,`paymenttype`,`paymentstatus`,`approval`,`paymentreference`, `partner`)VALUES(?,?,'cash','PENDING',0,'N/A',?);", (id, tournament, partner)).unwrap().last_insert_id().unwrap().to_string() + "\"}"; *response.body_mut() = nid.into(); }); } else { @@ -746,6 +1526,9 @@ async fn hello_world(req: Request) -> Result> { if s.contains_key("roles") { poola.get_conn().unwrap().exec_drop("Update tournaments set roles =? where id = ? and deleted =0", (s.get("roles"), &tid)).unwrap(); } + if s.contains_key("currentRound") { + poola.get_conn().unwrap().exec_drop("Update tournaments set currentRound =? where id = ? and deleted =0", (s.get("currentRound"), &tid)).unwrap(); + } *response.body_mut() = "{}".into(); } else { *response.body_mut() = "{\"error\":\"not all fields\"}".into(); @@ -806,9 +1589,9 @@ async fn hello_world(req: Request) -> Result> { POOL.with(|poola| { let res = poola.get_conn().unwrap() .query_map( - "SELECT id, name, typeOfLadder, pointsForTournament, places, roles, creator,approved from tournaments where deleted =0", - |(id, name, type_of_ladder, points_for_tournament, places, roles, creator, approved)| { - tournament { id, name, typeOfLadder: type_of_ladder, places, roles, creator, pointsForTournament: points_for_tournament, approved } + "SELECT id, name, typeOfLadder, pointsForTournament, places, roles, creator,approved, state, currentRound from tournaments where deleted =0", + |(id, name, type_of_ladder, points_for_tournament, places, roles, creator, approved, state, currentRound)| { + tournament { id, name, typeOfLadder: type_of_ladder, places, roles, creator, pointsForTournament: points_for_tournament, approved, state, currentRound } }, ); *response.body_mut() = serde_json::to_string(&res.unwrap()).unwrap().into(); @@ -852,7 +1635,7 @@ async fn hello_world(req: Request) -> Result> { if ranked != "0" && ranked != "1" { ranked = String::from("0"); } - let str = "{\"id\":".to_owned() + &poola.get_conn().unwrap().exec_iter("INSERT INTO `inz`.`tournaments`(`name`,`typeOfLadder`,`pointsForTournament`,`places`,`roles`,`creator`,`deleted`,`approved`) VALUES (?,?,?,?,?,?,0,?);", (name, type_of_ladder, points_for_tournament, places, roles, id, ranked)).unwrap().last_insert_id().unwrap().to_string() + "}"; + let str = "{\"id\":".to_owned() + &poola.get_conn().unwrap().exec_iter("INSERT INTO `inz`.`tournaments`(`name`,`typeOfLadder`,`pointsForTournament`,`places`,`roles`,`creator`,`deleted`,`approved`,`state`,`currentRound`) VALUES (?,?,?,?,?,?,0,?,0,0);", (name, type_of_ladder, points_for_tournament, places, roles, id, ranked)).unwrap().last_insert_id().unwrap().to_string() + "}"; *response.body_mut() = str.into(); } else { *response.body_mut() = "{\"error\":\"not all fields\"}".into(); @@ -898,7 +1681,7 @@ async fn hello_world(req: Request) -> Result> { poola.get_conn().unwrap().exec_drop("Update users set mail =? where id = ?", (s.get("mail"), idi)).unwrap(); } if s.contains_key("phone") { - poola.get_conn().unwrap().exec_drop("Update users set phone =? where id = ?", (s.get("phone "), idi)).unwrap(); + poola.get_conn().unwrap().exec_drop("Update users set phone =? where id = ?", (s.get("phone"), idi)).unwrap(); } }); } else { @@ -924,7 +1707,7 @@ async fn hello_world(req: Request) -> Result> { return; } let urow = row.unwrap().unwrap(); - let a = User { id: urow.get(0).unwrap(), name: urow.get(1).unwrap(), surname: urow.get(2).unwrap(), role: urow.get(3).unwrap(), login: urow.get(4).unwrap(), phone: urow.get(7).unwrap(), mail: urow.get(6).unwrap() }; + let a = User { id: urow.get(0).unwrap(), name: urow.get(1).unwrap(), surname: urow.get(2).unwrap(), role: urow.get(3).unwrap(), login: urow.get(4).unwrap(), phone: urow.get(7).unwrap(), mail: urow.get(6).unwrap(), ranking: urow.get(8).unwrap() }; *response.body_mut() = serde_json::to_string(&a).unwrap().into(); }); @@ -935,27 +1718,22 @@ async fn hello_world(req: Request) -> Result> { (&Method::PUT, "/user/create") => { let byte_stream = hyper::body::to_bytes(req).await.unwrap(); let s: HashMap = serde_json::from_slice(&byte_stream).unwrap(); - if s.contains_key("username") && s.contains_key("name") && s.contains_key("surname") && s.contains_key("password") && s.contains_key("role") && s.contains_key("mail") && s.contains_key("phone") { + if s.contains_key("username") && s.contains_key("name") && s.contains_key("surname") && s.contains_key("password") && s.contains_key("mail") && s.contains_key("phone") { let username = s.get("username").unwrap().to_string(); let name = s.get("name").unwrap().to_string(); let surname = s.get("surname").unwrap().to_string(); let password = hash(s.get("password").unwrap().to_string(), DEFAULT_COST - 6).unwrap(); - let role = s.get("role").unwrap().to_string(); let mail = s.get("mail").unwrap().to_string(); let phone = s.get("phone").unwrap().to_string(); - if role == "1" || role == "2" { - POOL.with(|poola| { - let mut con = poola.get_conn().unwrap() ; - let mut a = con.exec_iter("select `login` from users where login = ?", (&username,)).unwrap(); - let it = a.iter().unwrap().next(); - if(it.is_none()) { - poola.get_conn().unwrap().exec_drop("INSERT INTO `inz`.`users`(`name`,`surname`,`role`,`login`,`password`,`mail`,`phone`,`deleted`)VALUES (?,?,?,?,?,?,?,0);", (name, surname, role, username, password, mail, phone)).unwrap(); - } - }); - *response.body_mut() = "{}".into(); - } else { - *response.body_mut() = "{\"error\":\"bad role\"}".into(); - } + POOL.with(|poola| { + let mut con = poola.get_conn().unwrap(); + let mut a = con.exec_iter("select `login` from users where login = ?", (&username, )).unwrap(); + let it = a.iter().unwrap().next(); + if it.is_none() { + poola.get_conn().unwrap().exec_drop("INSERT INTO `inz`.`users`(`name`,`surname`,`role`,`login`,`password`,`mail`,`phone`,`deleted`,`ranking`)VALUES (?,?,1,?,?,?,?,0,0);", (name, surname, username, password, mail, phone)).unwrap(); + } + }); + *response.body_mut() = "{}".into(); } else { *response.body_mut() = "{\"error\":\"not all fields\"}".into(); } diff --git a/backend/src/main1.rs b/backend/src/main1.rs deleted file mode 100644 index db48c7a..0000000 --- a/backend/src/main1.rs +++ /dev/null @@ -1,55 +0,0 @@ -use serde_derive::{Serialize, Deserialize}; -use mysql::*; -use mysql::prelude::*; -use std::convert::Infallible; -use std::net::SocketAddr; -use hyper::{Body, Request, Response, Server}; -use hyper::service::{make_service_fn, service_fn}; -#[derive(Serialize, Deserialize)] -struct dane { - id:i32, - data:String -} - -fn getJson() -> Vec { - let url = "mysql://inz:HaLzqw68CbabS8Smz3Vx!@localhost:3306/inz"; - -let opts = Opts::from_url(url).unwrap(); -let pool = Pool::new(opts).unwrap(); -let mut conn = pool.get_conn().unwrap(); -let res = conn - .query_map( - "SELECT id, data from dane", - |(id,data)| { - dane { id,data } - }, - ); - return res.unwrap(); -} -async fn hello_world(_req: Request) -> Result> { - let path :String = _req.uri().path().to_string(); - if path != "/mysql"{ -return Ok(Response::new(path.into())); -}else{ - return Ok(Response::new(serde_json::to_string(&getJson()).unwrap().into())) - } -} -#[tokio::main] -async fn main() { - let addr = SocketAddr::from(([0, 0, 0, 0], 1000)); - - // A `Service` is needed for every connection, so this - // creates one from our `hello_world` function. - let make_svc = make_service_fn(|_conn| async { - // service_fn converts our function into a `Service` - Ok::<_, Infallible>(service_fn(hello_world)) - }); - - let server = Server::bind(&addr).serve(make_svc); - - // Run this server for... forever! - if let Err(e) = server.await { - eprintln!("server error: {}", e); - } - -}