diff --git a/sync-server/src/app_state/database/queries.rs b/sync-server/src/app_state/database/queries.rs index 10b65d93..f345a2bc 100644 --- a/sync-server/src/app_state/database/queries.rs +++ b/sync-server/src/app_state/database/queries.rs @@ -61,6 +61,19 @@ impl Database { }) } + pub async fn get_latest_document_metadata( + tx: &mut Transaction<'_>, + id: &DocumentId, + ) -> Result> { + Ok(sqlx::query_as::<_, DocumentVersionWithoutContent>( + "SELECT vault_update_id, document_id, updated_date, user_id, device_id, length(content) AS content_size + FROM documents WHERE document_id = ? ORDER BY vault_update_id DESC LIMIT 1", + ) + .bind(id.hyphenated()) + .fetch_optional(&mut **tx) + .await?) + } + pub async fn get_document_version( &self, vault: &VaultId, diff --git a/sync-server/src/server/endpoints/fetch_latest_document_metadata.rs b/sync-server/src/server/endpoints/fetch_latest_document_metadata.rs new file mode 100644 index 00000000..75b1a1e5 --- /dev/null +++ b/sync-server/src/server/endpoints/fetch_latest_document_metadata.rs @@ -0,0 +1,39 @@ +use anyhow::anyhow; +use axum::{ + Json, + extract::{Path, State}, +}; +use log::debug; + +use super::VaultPath; +use crate::{ + app_state::{ + AppState, + database::{ + Database, + models::{DocumentId, DocumentVersionWithoutContent}, + }, + }, + errors::{SyncServerError, not_found_error, server_error}, +}; + +#[axum::debug_handler] +pub async fn fetch_latest_document_metadata( + Path((VaultPath(vault_id), document_id)): Path<(VaultPath, DocumentId)>, + State(state): State, +) -> Result, SyncServerError> { + debug!("Fetching latest document metadata for document `{document_id}` in vault `{vault_id}`"); + + let mut tx = state + .database + .create_readonly_transaction(&vault_id) + .await + .map_err(server_error)?; + + let metadata = Database::get_latest_document_metadata(&mut tx, &document_id) + .await + .map_err(server_error)? + .ok_or_else(|| not_found_error(anyhow!("Document does not exist")))?; + + Ok(Json(metadata)) +}