diff --git a/backend-assemblyscript/step1-json-api/assembly/request.ts b/backend-assemblyscript/step1-json-api/assembly/request.ts index 4eeb80e..8d8a2a8 100644 --- a/backend-assemblyscript/step1-json-api/assembly/request.ts +++ b/backend-assemblyscript/step1-json-api/assembly/request.ts @@ -83,7 +83,7 @@ class RequestJSONEventsHandler extends JSONHandler { setString(name: string, value: string): void { this.offset = 0; - this.count = 0; + this.count = 100; if (name == "action") { this.action = value; diff --git a/backend-assemblyscript/step3-finished-app/assembly/request.ts b/backend-assemblyscript/step3-finished-app/assembly/request.ts index 4eeb80e..8d8a2a8 100644 --- a/backend-assemblyscript/step3-finished-app/assembly/request.ts +++ b/backend-assemblyscript/step3-finished-app/assembly/request.ts @@ -83,7 +83,7 @@ class RequestJSONEventsHandler extends JSONHandler { setString(name: string, value: string): void { this.offset = 0; - this.count = 0; + this.count = 100; if (name == "action") { this.action = value; diff --git a/backend-assemblyscript/step3-finished-app/run.sh b/backend-assemblyscript/step3-finished-app/run.sh index b244d6d..2f169cc 100755 --- a/backend-assemblyscript/step3-finished-app/run.sh +++ b/backend-assemblyscript/step3-finished-app/run.sh @@ -65,7 +65,7 @@ echo "$RESPONSE" | jq . 2>/dev/null || echo "$RESPONSE" # Assign json to a variable using heredoc technique JSON=$(cat < }, + Post { + message: String, + username: String, + }, + Fetch { + username: Option, + offset: Option, + count: Option, + }, } #[derive(Serialize, Debug)] diff --git a/backend-rust/step1-json-api/src/lib.rs b/backend-rust/step1-json-api/src/lib.rs index a3bd0c7..456ed0c 100644 --- a/backend-rust/step1-json-api/src/lib.rs +++ b/backend-rust/step1-json-api/src/lib.rs @@ -21,7 +21,11 @@ fn run(arg: String) -> String { // Parse and username JSON request let result = api::parse(arg).and_then(|request| match request { Request::Post { message, username } => add_post(message, username), - Request::Fetch { username } => fetch_posts(username), + Request::Fetch { + username, + offset, + count, + } => fetch_posts(username, offset, count), }); let result = match result { @@ -44,12 +48,18 @@ fn add_post(message: String, username: String) -> AppResult { Ok(Response::Post { count }) } -fn fetch_posts(username: Option) -> AppResult { +fn fetch_posts( + username: Option, + offset: Option, + count: Option, +) -> AppResult { + let count = count.unwrap_or(0); + let offset = offset.unwrap_or(0); let posts_str = match username { // Get all posts if no filter username was passed - None => model::get_all_posts()?, + None => model::get_all_posts(count, offset)?, // Or get only posts from specified author - Some(h) => model::get_posts_by_username(h)?, + Some(h) => model::get_posts_by_username(h, count, offset)?, }; // Some Rust-specific detail to play nice with serialization, doesn't matter diff --git a/backend-rust/step1-json-api/src/model.rs b/backend-rust/step1-json-api/src/model.rs index 3af5e03..29a5747 100644 --- a/backend-rust/step1-json-api/src/model.rs +++ b/backend-rust/step1-json-api/src/model.rs @@ -10,12 +10,12 @@ pub fn add_post(message: String, username: String) -> AppResult<()> { Ok(log::info!("add post {} {}", message, username)) } -pub fn get_all_posts() -> AppResult { +pub fn get_all_posts(offset: u32, count: u32) -> AppResult { log::info!("get all posts"); Ok("[]".to_string()) } -pub fn get_posts_by_username(username: String) -> AppResult { +pub fn get_posts_by_username(username: String, offset: u32, count: u32) -> AppResult { log::info!("get all posts by username {}", username); Ok("[]".to_string()) } diff --git a/backend-rust/step3-finished-app/run.sh b/backend-rust/step3-finished-app/run.sh index abfabb2..6d14008 100755 --- a/backend-rust/step3-finished-app/run.sh +++ b/backend-rust/step3-finished-app/run.sh @@ -56,7 +56,7 @@ echo "$RESPONSE" | jq . 2>/dev/null || echo "$RESPONSE" # Assign json to a variable using heredoc technique JSON=$(cat < }, + Post { + message: String, + username: String, + }, + Fetch { + username: Option, + offset: Option, + count: Option, + }, } #[derive(Serialize, Debug)] diff --git a/backend-rust/step3-finished-app/src/lib.rs b/backend-rust/step3-finished-app/src/lib.rs index 5cdefde..e3583a8 100644 --- a/backend-rust/step3-finished-app/src/lib.rs +++ b/backend-rust/step3-finished-app/src/lib.rs @@ -22,7 +22,11 @@ fn run(arg: String) -> String { // Parse and username JSON request let result = api::parse(arg).and_then(|request| match request { Request::Post { message, username } => add_post(message, username), - Request::Fetch { username } => fetch_posts(username), + Request::Fetch { + username, + offset, + count, + } => fetch_posts(username, offset, count), }); let result = match result { @@ -45,12 +49,18 @@ fn add_post(message: String, username: String) -> AppResult { Ok(Response::Post { count }) } -fn fetch_posts(username: Option) -> AppResult { +fn fetch_posts( + username: Option, + offset: Option, + count: Option, +) -> AppResult { + let count = count.unwrap_or(100); + let offset = offset.unwrap_or(0); let posts_str = match username { // Get all posts if no filter username was passed - None => model::get_all_posts()?, + None => model::get_all_posts(offset, count)?, // Or get only posts from specified author - Some(h) => model::get_posts_by_username(h)?, + Some(h) => model::get_posts_by_username(h, offset, count)?, }; // Some Rust-specific detail to play nice with serialization, doesn't matter diff --git a/backend-rust/step3-finished-app/src/model.rs b/backend-rust/step3-finished-app/src/model.rs index 2c49e6e..21c8333 100644 --- a/backend-rust/step3-finished-app/src/model.rs +++ b/backend-rust/step3-finished-app/src/model.rs @@ -19,21 +19,29 @@ pub fn add_post(message: String, username: String) -> AppResult<()> { .map(drop) } -pub fn get_all_posts() -> AppResult { - database::query( - "SELECT json_group_array( - json_object('message', message, 'username', username) - ) AS json_result FROM (SELECT * FROM messages)", - ) -} - -pub fn get_posts_by_username(username: String) -> AppResult { +pub fn get_all_posts(offset: u32, count: u32) -> AppResult { database::query( format!( "SELECT json_group_array( json_object('message', message, 'username', username) - ) AS json_result FROM (SELECT * FROM messages where username = '{}')", - username + ) AS json_result FROM ( + SELECT * FROM messages LIMIT {} OFFSET {} + )", + count, offset, + ) + .as_str(), + ) +} + +pub fn get_posts_by_username(username: String, offset: u32, count: u32) -> AppResult { + database::query( + format!( + "SELECT json_group_array( + json_object('message', message, 'username', username) + ) AS json_result FROM ( + SELECT * FROM messages where username = '{}' LIMIT {} OFFSET {} + )", + username, count, offset ) .as_str(), )