remove path_cache
This commit is contained in:
@@ -30,7 +30,6 @@ pub struct Folder {
|
|||||||
pub id: Uuid,
|
pub id: Uuid,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub parent_id: Option<Uuid>,
|
pub parent_id: Option<Uuid>,
|
||||||
pub path_cache: Option<String>,
|
|
||||||
pub created_at: NaiveDateTime,
|
pub created_at: NaiveDateTime,
|
||||||
pub updated_at: NaiveDateTime,
|
pub updated_at: NaiveDateTime,
|
||||||
}
|
}
|
||||||
@@ -41,7 +40,6 @@ pub struct NewFolder {
|
|||||||
pub id: Uuid,
|
pub id: Uuid,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub parent_id: Option<Uuid>,
|
pub parent_id: Option<Uuid>,
|
||||||
pub path_cache: Option<String>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Queryable, Identifiable, Associations)]
|
#[derive(Debug, Clone, Queryable, Identifiable, Associations)]
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ pub struct FolderInfo {
|
|||||||
pub id: Uuid,
|
pub id: Uuid,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub parent_id: Option<Uuid>,
|
pub parent_id: Option<Uuid>,
|
||||||
pub path_cache: Option<String>,
|
|
||||||
pub created_at: String,
|
pub created_at: String,
|
||||||
pub updated_at: String,
|
pub updated_at: String,
|
||||||
}
|
}
|
||||||
@@ -97,12 +96,10 @@ pub async fn ensure_folder_path(
|
|||||||
let folder = if let Some(folder) = existing {
|
let folder = if let Some(folder) = existing {
|
||||||
folder
|
folder
|
||||||
} else {
|
} else {
|
||||||
let path_cache = build_path_cache(conn, current_parent, name)?;
|
|
||||||
let new_folder = NewFolder {
|
let new_folder = NewFolder {
|
||||||
id: Uuid::new_v4(),
|
id: Uuid::new_v4(),
|
||||||
name: name.to_string(),
|
name: name.to_string(),
|
||||||
parent_id: current_parent,
|
parent_id: current_parent,
|
||||||
path_cache,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
diesel::insert_into(folders::table)
|
diesel::insert_into(folders::table)
|
||||||
@@ -133,13 +130,11 @@ pub async fn create_folder(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mut conn = state.db()?;
|
let mut conn = state.db()?;
|
||||||
let path_cache = build_path_cache(&mut conn, payload.parent_id, &payload.name)?;
|
|
||||||
|
|
||||||
let new_folder = NewFolder {
|
let new_folder = NewFolder {
|
||||||
id: Uuid::new_v4(),
|
id: Uuid::new_v4(),
|
||||||
name: payload.name.trim().to_string(),
|
name: payload.name.trim().to_string(),
|
||||||
parent_id: payload.parent_id,
|
parent_id: payload.parent_id,
|
||||||
path_cache,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
diesel::insert_into(folders::table)
|
diesel::insert_into(folders::table)
|
||||||
@@ -346,49 +341,24 @@ pub async fn update_folder(
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let new_path = build_path_cache(conn, next_parent, &new_name)?;
|
|
||||||
|
|
||||||
diesel::update(folders::table.find(folder_id))
|
diesel::update(folders::table.find(folder_id))
|
||||||
.set((
|
.set((
|
||||||
folders::parent_id.eq(next_parent),
|
folders::parent_id.eq(next_parent),
|
||||||
folders::name.eq(&new_name),
|
folders::name.eq(&new_name),
|
||||||
folders::path_cache.eq(new_path),
|
|
||||||
))
|
))
|
||||||
.execute(conn)?;
|
.execute(conn)?;
|
||||||
|
|
||||||
refresh_descendant_paths(conn, folder_id)?;
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok(StatusCode::NO_CONTENT)
|
Ok(StatusCode::NO_CONTENT)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_path_cache(
|
|
||||||
conn: &mut PgConnection,
|
|
||||||
parent_id: Option<Uuid>,
|
|
||||||
name: &str,
|
|
||||||
) -> AppResult<Option<String>> {
|
|
||||||
let path = if let Some(parent_id) = parent_id {
|
|
||||||
let parent: Folder = folders::table.find(parent_id).first(conn)?;
|
|
||||||
let base = parent
|
|
||||||
.path_cache
|
|
||||||
.unwrap_or_else(|| "/".to_string())
|
|
||||||
.trim_end_matches('/')
|
|
||||||
.to_string();
|
|
||||||
format!("{}/{}", base, name)
|
|
||||||
} else {
|
|
||||||
format!("/{}", name)
|
|
||||||
};
|
|
||||||
Ok(Some(path))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn folder_to_info(folder: Folder) -> FolderInfo {
|
fn folder_to_info(folder: Folder) -> FolderInfo {
|
||||||
FolderInfo {
|
FolderInfo {
|
||||||
id: folder.id,
|
id: folder.id,
|
||||||
name: folder.name,
|
name: folder.name,
|
||||||
parent_id: folder.parent_id,
|
parent_id: folder.parent_id,
|
||||||
path_cache: folder.path_cache,
|
|
||||||
created_at: to_iso(folder.created_at),
|
created_at: to_iso(folder.created_at),
|
||||||
updated_at: to_iso(folder.updated_at),
|
updated_at: to_iso(folder.updated_at),
|
||||||
}
|
}
|
||||||
@@ -412,19 +382,3 @@ pub(super) fn gather_descendant_folder_ids(
|
|||||||
|
|
||||||
Ok(ids)
|
Ok(ids)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn refresh_descendant_paths(conn: &mut PgConnection, parent_id: Uuid) -> AppResult<()> {
|
|
||||||
let children: Vec<Folder> = folders::table
|
|
||||||
.filter(folders::parent_id.eq(Some(parent_id)))
|
|
||||||
.load(conn)?;
|
|
||||||
|
|
||||||
for child in children {
|
|
||||||
let path_cache = build_path_cache(conn, Some(parent_id), &child.name)?;
|
|
||||||
diesel::update(folders::table.find(child.id))
|
|
||||||
.set(folders::path_cache.eq(path_cache))
|
|
||||||
.execute(conn)?;
|
|
||||||
refresh_descendant_paths(conn, child.id)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -86,8 +86,6 @@ diesel::table! {
|
|||||||
#[max_length = 255]
|
#[max_length = 255]
|
||||||
name -> Varchar,
|
name -> Varchar,
|
||||||
parent_id -> Nullable<Uuid>,
|
parent_id -> Nullable<Uuid>,
|
||||||
#[max_length = 1000]
|
|
||||||
path_cache -> Nullable<Varchar>,
|
|
||||||
created_at -> Timestamptz,
|
created_at -> Timestamptz,
|
||||||
updated_at -> Timestamptz,
|
updated_at -> Timestamptz,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ struct FolderResponse {
|
|||||||
struct FolderInfo {
|
struct FolderInfo {
|
||||||
id: Uuid,
|
id: Uuid,
|
||||||
name: String,
|
name: String,
|
||||||
path_cache: Option<String>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
@@ -287,7 +286,6 @@ async fn folder_rename_updates_name_and_child_paths() -> Result<()> {
|
|||||||
.find(|f| f.id == parent.folder.id)
|
.find(|f| f.id == parent.folder.id)
|
||||||
.expect("renamed folder present");
|
.expect("renamed folder present");
|
||||||
assert_eq!(renamed.name, "Archive");
|
assert_eq!(renamed.name, "Archive");
|
||||||
assert_eq!(renamed.path_cache.as_deref(), Some("/Archive"));
|
|
||||||
|
|
||||||
let child_contents = app
|
let child_contents = app
|
||||||
.get(
|
.get(
|
||||||
@@ -299,7 +297,7 @@ async fn folder_rename_updates_name_and_child_paths() -> Result<()> {
|
|||||||
let child_contents_body = body_to_vec(child_contents.into_body()).await?;
|
let child_contents_body = body_to_vec(child_contents.into_body()).await?;
|
||||||
let child_details: FolderContents = serde_json::from_slice(&child_contents_body)?;
|
let child_details: FolderContents = serde_json::from_slice(&child_contents_body)?;
|
||||||
let child_folder = child_details.folder.expect("child folder info");
|
let child_folder = child_details.folder.expect("child folder info");
|
||||||
assert_eq!(child_folder.path_cache.as_deref(), Some("/Archive/Q1"));
|
assert_eq!(child_folder.name, "Q1");
|
||||||
|
|
||||||
app.cleanup().await?;
|
app.cleanup().await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
Reference in New Issue
Block a user