Merge branch 'main' into leave-workspace
This commit is contained in:
commit
44ced4036e
|
|
@ -1,18 +1,13 @@
|
||||||
use crate::pg_row::AFBlobMetadataRow;
|
use crate::pg_row::AFBlobMetadataRow;
|
||||||
use crate::resource_usage::{
|
use crate::resource_usage::{
|
||||||
delete_blob_metadata, get_blob_metadata, get_workspace_usage_size, insert_blob_metadata,
|
delete_blob_metadata, get_blob_metadata, insert_blob_metadata, is_blob_metadata_exists,
|
||||||
is_blob_metadata_exists,
|
|
||||||
};
|
};
|
||||||
use app_error::AppError;
|
use app_error::AppError;
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use sqlx::PgPool;
|
use sqlx::PgPool;
|
||||||
use tracing::{event, instrument, warn};
|
use tracing::{instrument, warn};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
/// Maximum size of a blob in bytes.
|
|
||||||
pub const MAX_BLOB_SIZE: usize = 6 * 1024 * 1024;
|
|
||||||
pub const MAX_USAGE: u64 = 10 * 1024 * 1024 * 1024;
|
|
||||||
|
|
||||||
pub trait ResponseBlob {
|
pub trait ResponseBlob {
|
||||||
fn to_blob(self) -> Vec<u8>;
|
fn to_blob(self) -> Vec<u8>;
|
||||||
}
|
}
|
||||||
|
|
@ -64,22 +59,7 @@ where
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
// query the storage space of the workspace
|
|
||||||
let obj_key = format!("{}/{}", workspace_id, file_id);
|
let obj_key = format!("{}/{}", workspace_id, file_id);
|
||||||
let usage = get_workspace_usage_size(&self.pg_pool, &workspace_id).await?;
|
|
||||||
event!(
|
|
||||||
tracing::Level::TRACE,
|
|
||||||
"workspace consumed space: {}, new file:{} with size: {}",
|
|
||||||
obj_key,
|
|
||||||
file_id,
|
|
||||||
file_data.len(),
|
|
||||||
);
|
|
||||||
if usage > MAX_USAGE {
|
|
||||||
return Err(AppError::StorageSpaceNotEnough);
|
|
||||||
}
|
|
||||||
|
|
||||||
let obj_key = format!("{}/{}", workspace_id, file_id);
|
|
||||||
|
|
||||||
let mut tx = self.pg_pool.begin().await?;
|
let mut tx = self.pg_pool.begin().await?;
|
||||||
insert_blob_metadata(
|
insert_blob_metadata(
|
||||||
&mut tx,
|
&mut tx,
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,6 @@ impl WorkspaceMemberChangeset {
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize)]
|
||||||
pub struct WorkspaceSpaceUsage {
|
pub struct WorkspaceSpaceUsage {
|
||||||
pub total_capacity: u64,
|
|
||||||
pub consumed_capacity: u64,
|
pub consumed_capacity: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ use actix_web::{
|
||||||
use actix_web::{HttpResponse, Result};
|
use actix_web::{HttpResponse, Result};
|
||||||
use app_error::AppError;
|
use app_error::AppError;
|
||||||
use chrono::DateTime;
|
use chrono::DateTime;
|
||||||
use database::file::{MAX_BLOB_SIZE, MAX_USAGE};
|
|
||||||
use database::resource_usage::{get_all_workspace_blob_metadata, get_workspace_usage_size};
|
use database::resource_usage::{get_all_workspace_blob_metadata, get_workspace_usage_size};
|
||||||
use shared_entity::dto::workspace_dto::{BlobMetadata, RepeatedBlobMetaData, WorkspaceSpaceUsage};
|
use shared_entity::dto::workspace_dto::{BlobMetadata, RepeatedBlobMetaData, WorkspaceSpaceUsage};
|
||||||
use shared_entity::response::{AppResponse, AppResponseError, JsonAppResponse};
|
use shared_entity::response::{AppResponse, AppResponseError, JsonAppResponse};
|
||||||
|
|
@ -57,15 +56,6 @@ async fn put_blob_handler(
|
||||||
let content_length = content_length.into_inner().into_inner();
|
let content_length = content_length.into_inner().into_inner();
|
||||||
let content_type = content_type.into_inner().to_string();
|
let content_type = content_type.into_inner().to_string();
|
||||||
let content = {
|
let content = {
|
||||||
// Check content length, if it's too large, return error.
|
|
||||||
if content_length > MAX_BLOB_SIZE {
|
|
||||||
return Ok(
|
|
||||||
AppResponse::from(AppError::PayloadTooLarge(
|
|
||||||
"The uploading file is too large".to_string(),
|
|
||||||
))
|
|
||||||
.into(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
let mut payload_reader = payload_to_async_read(payload);
|
let mut payload_reader = payload_to_async_read(payload);
|
||||||
let mut content = vec![0; content_length];
|
let mut content = vec![0; content_length];
|
||||||
let n = payload_reader.read_exact(&mut content).await?;
|
let n = payload_reader.read_exact(&mut content).await?;
|
||||||
|
|
@ -204,7 +194,6 @@ async fn get_workspace_usage_handler(
|
||||||
.map_err(AppResponseError::from)?;
|
.map_err(AppResponseError::from)?;
|
||||||
let usage = WorkspaceSpaceUsage {
|
let usage = WorkspaceSpaceUsage {
|
||||||
consumed_capacity: current,
|
consumed_capacity: current,
|
||||||
total_capacity: MAX_USAGE,
|
|
||||||
};
|
};
|
||||||
Ok(AppResponse::Ok().with_data(usage).into())
|
Ok(AppResponse::Ok().with_data(usage).into())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue