diff options
-rw-r--r-- | Cargo.lock | 39 | ||||
-rw-r--r-- | Cargo.toml | 3 | ||||
-rw-r--r-- | README.md | 57 | ||||
-rw-r--r-- | src/main.rs | 90 |
4 files changed, 176 insertions, 13 deletions
@@ -913,6 +913,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] name = "polyval" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1137,11 +1143,12 @@ dependencies = [ [[package]] name = "rocket_test" -version = "0.1.0" +version = "0.1.1" dependencies = [ "chrono", "rocket", "serde", + "sqlite", ] [[package]] @@ -1266,6 +1273,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" [[package]] +name = "sqlite" +version = "0.30.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1908664131c21a38e5b531344d52a196ec338af5bf44f7fa2c83d539e9561d" +dependencies = [ + "libc", + "sqlite3-sys", +] + +[[package]] +name = "sqlite3-src" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1815a7a02c996eb8e5c64f61fcb6fd9b12e593ce265c512c5853b2513635691" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "sqlite3-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d47c99824fc55360ba00caf28de0b8a0458369b832e016a64c13af0ad9fbb9ee" +dependencies = [ + "libc", + "sqlite3-src", +] + +[[package]] name = "stable-pattern" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1,6 +1,6 @@ [package] name = "rocket_test" -version = "0.1.0" +version = "0.1.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -8,6 +8,7 @@ edition = "2021" [dependencies] serde = "1.0.130" chrono = "0.4.23" +sqlite = "0.30.4" [dependencies.rocket] version = "0.5.0-rc.2" diff --git a/README.md b/README.md new file mode 100644 index 0000000..95e8f7e --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# API +The api is available on `/api`. + +GET `/` +Gets information about the server +- Return type: JSON +- Returns: <information> + +GET `/ping` +Pings the server +- Return type: JSON +- Returns: pong + +GET `/create_user/<name>` +Creates a new user with name +- Return type: JSON +- Returns: <user> + +GET `/get_user/<id>` +Gets a user from id +- Return type: JSON +- Returns: <user> + +GET `/get_user_by_name/<name>` +Gets a user from name +- Return type: JSON +- Returns: <user> + +GET `/get_message/<id>` +Gets a message by id +- Return type: JSON +- Returns: <message> + +GET `/get_message_id_newest` +Gets the newest message id +- Return type: JSON +- Returns: <message_id> + +GET `/get_message_id_list/<from_id>/<to_id>` +Gets a list of messages from_id to to_id inclusive +- Return type: JSON +- Returns: <Array<message_id>> + +GET `/send_message/<user_id>/<message>` +Sends a message +- Return type: JSON +- Returns: <message_id> + +GET `/send_reply/<user_id>/<message_id>/<message>` +Sends a reply to a message +- Return type: JSON +- Returns: <message_id> + +GET `/delete_message/<message_id>` +Deletes a message +- Return type: JSON +- Returns: Deleted
\ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 150f297..f6163ab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,22 +29,48 @@ fn get_message_id_list(id_start: usize, id_end: usize, db: &State<SharedDB>) -> Json(Response(Ok(list))) } } +#[get("/get_message_id_newest")] +fn get_message_id_newest(db: &State<SharedDB>) -> Json<Response<usize, &'static str>> { + let lock = db.sdb.lock().unwrap(); + match lock.get_message_newest_id() { + Some(n) => Json(Response(Ok(n))), + None => Json(Response(Err("No messages"))) + } +} + #[get("/send_message/<user_id>/<msg>")] -fn send_message(user_id: usize, msg: String, db: &State<SharedDB>) -> Json<Response<Message, &'static str>> { +fn send_message(user_id: usize, msg: String, db: &State<SharedDB>) -> Json<Response<usize, &'static str>> { let mut lock = db.sdb.lock().unwrap(); let user = match lock.get_user(user_id) { Some(n) => n, None => return Json(Response(Err("User not found"))) }; - let msg = Message{ - sender: user.clone(), - message: msg, - date: Date::now(), - id: lock.get_next_message_id(), + let msg = Message::new(msg, user, lock.get_next_message_id(), None); + + lock.send_message(&msg); + Json(Response(Ok(msg.id))) +} + +#[get("/send_reply/<user_id>/<message_id>/<msg>")] +fn send_reply(user_id: usize, message_id: usize, msg: String, db: &State<SharedDB>) -> Json<Response<usize, &'static str>> { + let mut lock = db.sdb.lock().unwrap(); + + let user = match lock.get_user(user_id) { + Some(n) => n, + None => return Json(Response(Err("User not found"))) }; - lock.send_message(msg.clone()); - Json(Response(Ok(msg))) + let msg = Message::new(msg, user, lock.get_next_message_id(), Some(message_id)); + + lock.send_message(&msg); + Json(Response(Ok(msg.id))) +} + +#[get("/delete_message/<id>")] +fn delete_message(id: usize, db: &State<SharedDB>) -> Json<Response<&'static str, &'static str>> { + let mut lock = db.sdb.lock().unwrap(); + + Json(Response(lock.delete_message(id))) } #[get("/get_user/<id>")] @@ -100,11 +126,31 @@ impl Database { fn get_next_message_id(&self) -> usize { self.messagemap.len() } - fn send_message(&mut self, msg: Message) { - self.messagemap.insert(msg.id, msg); + fn get_message_newest_id(&self) -> Option<usize> { + let newest = self.get_next_message_id() as isize - 1; + let newest = if newest < 0 {0} else {newest as usize}; + match self.messagemap.get(&newest) { + Some(_) => Some(newest), + None => None, + } + } + + fn send_message(&mut self, msg: &Message) { + self.messagemap.insert(msg.id, msg.clone()); println!("{:?}", self.messagemap.get(&0)); } + fn delete_message(&mut self, id: usize) -> Result<&'static str, &'static str> { + let msg = match self.messagemap.get_mut(&id) { + Some(n) => n, + None => return Err("Message not found"), + }; + + msg.delete(); + + Ok("Deleted") + } + fn get_user(&self, id: usize) -> Option<User> { match self.usermap.get(&id) { Some(n) => Some(n.to_owned()), @@ -185,6 +231,25 @@ struct Message { message: String, sender: User, id: usize, + reply_to: Option<usize>, // Message ID + deleted: bool, +} +impl Message { + pub fn new(msg: String, sender: User, id: usize, reply_to: Option<usize>) -> Message { + Message { + date: Date::now(), + sender: sender, + message: msg, + id: id, + reply_to: reply_to, + deleted: false, + } + } + + fn delete(&mut self) { + self.message.clear(); + self.deleted = true; + } } #[derive(serde::Serialize)] @@ -228,7 +293,10 @@ fn rocket() -> _ { ping, get_user, create_user, - get_user_by_name + get_user_by_name, + get_message_id_newest, + send_reply, + delete_message, ]) .mount("/", routes![api_index]) .manage(SharedDB{sdb: Mutex::new(Database::new())}) |