folder create idempotency

This commit is contained in:
2025-10-30 02:15:53 +01:00
parent f89c6bb259
commit e5d44c13b4
3 changed files with 45 additions and 27 deletions
+4 -1
View File
@@ -502,7 +502,10 @@ mod doc {
post,
path = "/api/folders",
request_body = CreateFolderRequest,
responses((status = 200, description = "Folder created", body = FolderResponse)),
responses(
(status = 201, description = "Folder created", body = FolderResponse),
(status = 200, description = "Folder already existed", body = FolderResponse)
),
tag = "Folders"
)]
pub(super) fn create_folder() {}
+34 -19
View File
@@ -179,7 +179,7 @@ pub async fn create_folder(
..
}: TenantScopedConn,
Json(payload): Json<CreateFolderRequest>,
) -> AppResult<Json<FolderResponse>> {
) -> AppResult<(StatusCode, Json<FolderResponse>)> {
if payload.name.trim().is_empty() {
return Err(AppError::bad_request("name must not be empty"));
}
@@ -202,8 +202,8 @@ pub async fn create_folder(
.optional()?
};
let folder: Folder = if let Some(folder) = existing {
folder
let (folder, created): (Folder, bool) = if let Some(folder) = existing {
(folder, false)
} else {
let new_folder = NewFolder {
id: Uuid::new_v4(),
@@ -220,28 +220,43 @@ pub async fn create_folder(
.optional()?;
if let Some(id) = inserted_id {
folders::table
.find(id)
.filter(folders::tenant_id.eq(tenant_id))
.first(&mut conn)?
(
folders::table
.find(id)
.filter(folders::tenant_id.eq(tenant_id))
.first(&mut conn)?,
true,
)
} else if let Some(parent_id) = payload.parent_id {
folders::table
.filter(folders::tenant_id.eq(tenant_id))
.filter(folders::parent_id.eq(Some(parent_id)))
.filter(folders::name.eq(name))
.first(&mut conn)?
(
folders::table
.filter(folders::tenant_id.eq(tenant_id))
.filter(folders::parent_id.eq(Some(parent_id)))
.filter(folders::name.eq(name))
.first(&mut conn)?,
false,
)
} else {
folders::table
.filter(folders::tenant_id.eq(tenant_id))
.filter(folders::parent_id.is_null())
.filter(folders::name.eq(name))
.first(&mut conn)?
(
folders::table
.filter(folders::tenant_id.eq(tenant_id))
.filter(folders::parent_id.is_null())
.filter(folders::name.eq(name))
.first(&mut conn)?,
false,
)
}
};
Ok(Json(FolderResponse {
let response = Json(FolderResponse {
folder: folder_to_info(folder),
}))
});
if created {
Ok((StatusCode::CREATED, response))
} else {
Ok((StatusCode::OK, response))
}
}
pub async fn list_folder_contents(