From 65a42a18bfd840c182a1fb8cac7fb85bc2ae8fbf Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Sat, 14 Dec 2024 17:02:58 +0000 Subject: [PATCH] Implement "since" query for fetch_latest_documents --- .../src/server/fetch_latest_documents.rs | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/backend/sync_server/src/server/fetch_latest_documents.rs b/backend/sync_server/src/server/fetch_latest_documents.rs index d5235a7..b376f26 100644 --- a/backend/sync_server/src/server/fetch_latest_documents.rs +++ b/backend/sync_server/src/server/fetch_latest_documents.rs @@ -1,5 +1,5 @@ use axum::{ - extract::{Path, State}, + extract::{Path, Query, State}, Json, }; use axum_extra::{ @@ -9,10 +9,10 @@ use axum_extra::{ use schemars::JsonSchema; use serde::Deserialize; -use super::auth::auth; +use super::{auth::auth, responses::FetchLatestDocumentsResponse}; use crate::{ app_state::AppState, - database::models::{DocumentVersionWithoutContent, VaultId}, + database::models::{VaultId, VaultUpdateId}, errors::{server_error, SyncServerError}, }; @@ -22,19 +22,41 @@ pub struct PathParams { vault_id: VaultId, } +// This is required for aide to infer the path parameter types and names +#[derive(Deserialize, JsonSchema)] +pub struct QueryParams { + since_update_id: Option, +} + #[axum::debug_handler] pub async fn fetch_latest_documents( TypedHeader(auth_header): TypedHeader>, Path(PathParams { vault_id }): Path, + Query(QueryParams { since_update_id }): Query, State(state): State, -) -> Result>, SyncServerError> { +) -> Result, SyncServerError> { auth(&state, auth_header.token())?; - let latest_version = state - .database - .get_latest_documents(&vault_id, None) - .await - .map_err(server_error)?; + let documents = if let Some(since_update_id) = since_update_id { + state + .database + .get_latest_documents_since(&vault_id, since_update_id, None) + .await + .map_err(server_error) + } else { + state + .database + .get_latest_documents(&vault_id, None) + .await + .map_err(server_error) + }?; - Ok(Json(latest_version)) + Ok(Json(FetchLatestDocumentsResponse { + last_update_id: documents + .iter() + .map(|doc| doc.vault_update_id) + .max() + .unwrap_or(since_update_id.unwrap_or(0)), + latest_documents: documents, + })) }