Take document id
This commit is contained in:
parent
d5ff50a1b0
commit
f894cd6bd8
3 changed files with 35 additions and 3 deletions
|
|
@ -16,7 +16,7 @@ use super::{
|
||||||
requests::{CreateDocumentVersion, CreateDocumentVersionMultipart},
|
requests::{CreateDocumentVersion, CreateDocumentVersionMultipart},
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
database::models::{DocumentVersionWithoutContent, StoredDocumentVersion, VaultId},
|
database::models::{DocumentId, DocumentVersionWithoutContent, StoredDocumentVersion, VaultId},
|
||||||
errors::{SyncServerError, client_error, server_error},
|
errors::{SyncServerError, client_error, server_error},
|
||||||
utils::sanitize_path,
|
utils::sanitize_path,
|
||||||
};
|
};
|
||||||
|
|
@ -43,6 +43,7 @@ pub async fn create_document_multipart(
|
||||||
auth_header,
|
auth_header,
|
||||||
state,
|
state,
|
||||||
vault_id,
|
vault_id,
|
||||||
|
request.document_id,
|
||||||
request.relative_path,
|
request.relative_path,
|
||||||
request.content.contents.to_vec(),
|
request.content.contents.to_vec(),
|
||||||
)
|
)
|
||||||
|
|
@ -67,6 +68,7 @@ pub async fn create_document_json(
|
||||||
auth_header,
|
auth_header,
|
||||||
state,
|
state,
|
||||||
vault_id,
|
vault_id,
|
||||||
|
request.document_id,
|
||||||
request.relative_path,
|
request.relative_path,
|
||||||
content_bytes,
|
content_bytes,
|
||||||
)
|
)
|
||||||
|
|
@ -77,6 +79,7 @@ async fn internal_create_document(
|
||||||
auth_header: Authorization<Bearer>,
|
auth_header: Authorization<Bearer>,
|
||||||
state: AppState,
|
state: AppState,
|
||||||
vault_id: VaultId,
|
vault_id: VaultId,
|
||||||
|
document_id: Option<DocumentId>,
|
||||||
relative_path: String,
|
relative_path: String,
|
||||||
content: Vec<u8>,
|
content: Vec<u8>,
|
||||||
) -> Result<Json<DocumentVersionWithoutContent>, SyncServerError> {
|
) -> Result<Json<DocumentVersionWithoutContent>, SyncServerError> {
|
||||||
|
|
@ -88,6 +91,25 @@ async fn internal_create_document(
|
||||||
.await
|
.await
|
||||||
.map_err(server_error)?;
|
.map_err(server_error)?;
|
||||||
|
|
||||||
|
let document_id = match document_id {
|
||||||
|
Some(document_id) => {
|
||||||
|
let existing_version = state
|
||||||
|
.database
|
||||||
|
.get_latest_document(&vault_id, &document_id, Some(&mut transaction))
|
||||||
|
.await
|
||||||
|
.map_err(server_error)?;
|
||||||
|
|
||||||
|
if existing_version.is_some() {
|
||||||
|
return Err(client_error(anyhow::anyhow!(
|
||||||
|
"Document with the same ID already exists"
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
document_id
|
||||||
|
}
|
||||||
|
None => uuid::Uuid::new_v4(),
|
||||||
|
};
|
||||||
|
|
||||||
let last_update_id = state
|
let last_update_id = state
|
||||||
.database
|
.database
|
||||||
.get_max_update_id_in_vault(&vault_id, Some(&mut transaction))
|
.get_max_update_id_in_vault(&vault_id, Some(&mut transaction))
|
||||||
|
|
@ -99,7 +121,7 @@ async fn internal_create_document(
|
||||||
let new_version = StoredDocumentVersion {
|
let new_version = StoredDocumentVersion {
|
||||||
vault_id,
|
vault_id,
|
||||||
vault_update_id: last_update_id + 1,
|
vault_update_id: last_update_id + 1,
|
||||||
document_id: uuid::Uuid::new_v4(),
|
document_id,
|
||||||
relative_path: sanitized_relative_path,
|
relative_path: sanitized_relative_path,
|
||||||
content,
|
content,
|
||||||
updated_date: chrono::Utc::now(),
|
updated_date: chrono::Utc::now(),
|
||||||
|
|
|
||||||
|
|
@ -4,17 +4,23 @@ use axum_typed_multipart::TryFromMultipart;
|
||||||
use schemars::JsonSchema;
|
use schemars::JsonSchema;
|
||||||
use serde::{self, Deserialize};
|
use serde::{self, Deserialize};
|
||||||
|
|
||||||
use crate::database::models::VaultUpdateId;
|
use crate::database::models::{DocumentId, VaultUpdateId};
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, JsonSchema)]
|
#[derive(Debug, Deserialize, JsonSchema)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct CreateDocumentVersion {
|
pub struct CreateDocumentVersion {
|
||||||
|
/// The client can decide the document id (if it wishes to) in order
|
||||||
|
/// to help with syncing. If the client does not provide a document id,
|
||||||
|
/// the server will generate one. If the client provides a document id
|
||||||
|
/// it must not already exist in the database.
|
||||||
|
pub document_id: Option<DocumentId>,
|
||||||
pub relative_path: String,
|
pub relative_path: String,
|
||||||
pub content_base64: String,
|
pub content_base64: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, TryFromMultipart, JsonSchema)]
|
#[derive(Debug, TryFromMultipart, JsonSchema)]
|
||||||
pub struct CreateDocumentVersionMultipart {
|
pub struct CreateDocumentVersionMultipart {
|
||||||
|
pub document_id: Option<DocumentId>,
|
||||||
pub relative_path: String,
|
pub relative_path: String,
|
||||||
#[form_data(limit = "unlimited")]
|
#[form_data(limit = "unlimited")]
|
||||||
pub content: FieldData<Bytes>,
|
pub content: FieldData<Bytes>,
|
||||||
|
|
|
||||||
|
|
@ -452,10 +452,14 @@ export interface components {
|
||||||
Array_of_uint8: number[];
|
Array_of_uint8: number[];
|
||||||
CreateDocumentVersion: {
|
CreateDocumentVersion: {
|
||||||
contentBase64: string;
|
contentBase64: string;
|
||||||
|
/** Format: uuid */
|
||||||
|
documentId?: string | null;
|
||||||
relativePath: string;
|
relativePath: string;
|
||||||
};
|
};
|
||||||
CreateDocumentVersionMultipart: {
|
CreateDocumentVersionMultipart: {
|
||||||
content: components["schemas"]["Array_of_uint8"];
|
content: components["schemas"]["Array_of_uint8"];
|
||||||
|
/** Format: uuid */
|
||||||
|
document_id?: string | null;
|
||||||
relative_path: string;
|
relative_path: string;
|
||||||
};
|
};
|
||||||
DeleteDocumentVersion: {
|
DeleteDocumentVersion: {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue