aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock39
-rw-r--r--Cargo.toml3
-rw-r--r--README.md57
-rw-r--r--src/main.rs90
4 files changed, 176 insertions, 13 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 00730d5..1aebdb4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/Cargo.toml b/Cargo.toml
index 3600437..d4538e6 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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())})