This commit is contained in:
che
2026-07-27 10:51:18 +05:00
parent 560b3fe44e
commit c1b24206b9
13 changed files with 405 additions and 226 deletions
+3 -73
View File
@@ -158,7 +158,7 @@ struct RemoteEmployee {
pub async fn sync_contracts(
api: &TauriApi,
app_data_dir: PathBuf,
_app_data_dir: PathBuf,
) -> Result<SyncContractsResult, ApiError> {
let state = api.state();
let token = state
@@ -205,12 +205,9 @@ pub async fn sync_contracts(
fetch_contract_detail(&client, &token, &remote.base_url, contract.id).await?;
for application in &detail.contractapplicationfile_set {
let local_path =
download_application_file(&client, &token, &app_data_dir, application).await?;
upsert_contract_application_file(api, contract.id, application, &local_path)
.await?;
upsert_contract_application_file(api, contract.id, application, "").await?;
applications += 1;
if !local_path.is_empty() {
if !application.scan.is_empty() {
files_downloaded += 1;
}
}
@@ -324,69 +321,6 @@ async fn fetch_contract_detail(
Ok(response.json::<RemoteContractDetail>().await?)
}
async fn download_application_file(
client: &reqwest::Client,
token: &str,
app_data_dir: &PathBuf,
application: &RemoteContractApplicationFile,
) -> Result<String, ApiError> {
if application.scan.is_empty() {
return Ok(String::new());
}
let directory = application_download_dir(app_data_dir);
tokio::fs::create_dir_all(&directory)
.await
.map_err(file_error)?;
let file_name = format!(
"{}_{}",
application.id,
sanitize_file_name(&application.scan_name)
);
let path = directory.join(file_name);
let response = client
.get(&application.scan)
.header(reqwest::header::AUTHORIZATION, format!("Token {token}"))
.send()
.await?;
if !response.status().is_success() {
let status = response.status();
let detail = response.text().await.unwrap_or_default();
return Err(ApiError::new(
"remote_error",
format!("file download failed with {status}: {detail}"),
));
}
let bytes = response.bytes().await?;
tokio::fs::write(&path, bytes).await.map_err(file_error)?;
Ok(path.to_string_lossy().into_owned())
}
fn application_download_dir(app_data_dir: &PathBuf) -> PathBuf {
app_data_dir.join("contract_applications")
}
fn sanitize_file_name(file_name: &str) -> String {
let sanitized = file_name
.chars()
.map(|character| match character {
'/' | '\\' | ':' | '*' | '?' | '"' | '<' | '>' | '|' => '_',
_ => character,
})
.collect::<String>();
if sanitized.is_empty() {
"application_file".to_string()
} else {
sanitized
}
}
async fn upsert_contract_dependencies(
api: &TauriApi,
contract: &RemoteContract,
@@ -604,7 +538,3 @@ async fn upsert_contract_application_file(
fn database_error(error: sqlx::Error) -> ApiError {
ApiError::new("database_error", error.to_string())
}
fn file_error(error: impl std::fmt::Display) -> ApiError {
ApiError::new("file_error", error.to_string())
}