Can rename disk image files
This commit is contained in:
		@@ -189,6 +189,46 @@ pub async fn handle_convert_request(
 | 
			
		||||
    Ok(HttpResponse::Accepted().json("Successfully converted disk file"))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(serde::Deserialize)]
 | 
			
		||||
pub struct RenameDiskImageRequest {
 | 
			
		||||
    name: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Rename disk image
 | 
			
		||||
pub async fn rename(
 | 
			
		||||
    p: web::Path<DiskFilePath>,
 | 
			
		||||
    req: web::Json<RenameDiskImageRequest>,
 | 
			
		||||
) -> HttpResult {
 | 
			
		||||
    // Check source
 | 
			
		||||
    if !files_utils::check_file_name(&p.filename) {
 | 
			
		||||
        return Ok(HttpResponse::BadRequest().json("Invalid src file name!"));
 | 
			
		||||
    }
 | 
			
		||||
    let src_path = AppConfig::get().disk_images_file_path(&p.filename);
 | 
			
		||||
    if !src_path.exists() {
 | 
			
		||||
        return Ok(HttpResponse::NotFound().json("Disk image does not exists!"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Check destination
 | 
			
		||||
    if !files_utils::check_file_name(&req.name) {
 | 
			
		||||
        return Ok(HttpResponse::BadRequest().json("Invalid dst file name!"));
 | 
			
		||||
    }
 | 
			
		||||
    let dst_path = AppConfig::get().disk_images_file_path(&req.name);
 | 
			
		||||
    if dst_path.exists() {
 | 
			
		||||
        return Ok(HttpResponse::Conflict().json("Destination name already exists!"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Check extension
 | 
			
		||||
    let disk = DiskFileInfo::load_file(&src_path)?;
 | 
			
		||||
    if !disk.format.ext().iter().any(|e| req.name.ends_with(e)) {
 | 
			
		||||
        return Ok(HttpResponse::BadRequest().json("Invalid destination file extension!"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Perform rename
 | 
			
		||||
    std::fs::rename(&src_path, &dst_path)?;
 | 
			
		||||
 | 
			
		||||
    Ok(HttpResponse::Accepted().finish())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Delete a disk image
 | 
			
		||||
pub async fn delete(p: web::Path<DiskFilePath>) -> HttpResult {
 | 
			
		||||
    if !files_utils::check_file_name(&p.filename) {
 | 
			
		||||
 
 | 
			
		||||
@@ -352,6 +352,10 @@ async fn main() -> std::io::Result<()> {
 | 
			
		||||
                "/api/disk_images/{filename}/convert",
 | 
			
		||||
                web::post().to(disk_images_controller::convert),
 | 
			
		||||
            )
 | 
			
		||||
            .route(
 | 
			
		||||
                "/api/disk_images/{filename}/rename",
 | 
			
		||||
                web::post().to(disk_images_controller::rename),
 | 
			
		||||
            )
 | 
			
		||||
            .route(
 | 
			
		||||
                "/api/disk_images/{filename}",
 | 
			
		||||
                web::delete().to(disk_images_controller::delete),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user