fix(back-end): revert changes in uplad file
All checks were successful
Build, Test and Deploy / test-backend (push) Successful in 1m22s
Build, Test and Deploy / build-and-push (push) Successful in 15s
Build, Test and Deploy / deploy (push) Successful in 6s

This commit is contained in:
2026-02-16 14:05:43 +01:00
parent bb276b6504
commit ef6a5278a7

View File

@@ -180,24 +180,26 @@ export class QuoteEstimatorService {
const sessionId = sessionRes.id; const sessionId = sessionRes.id;
const sessionSetupCost = sessionRes.setupCostChf || 0; const sessionSetupCost = sessionRes.setupCostChf || 0;
// 2. Process items SEQUENTIALLY to avoid timeouts/overload // 2. Upload files to this session
const totalItems = request.items.length; const totalItems = request.items.length;
const allProgress: number[] = new Array(totalItems).fill(0); const allProgress: number[] = new Array(totalItems).fill(0);
const finalResponses: any[] = []; const finalResponses: any[] = [];
let completedCount = 0; let completedRequests = 0;
const processNextItem = (index: number) => { const checkCompletion = () => {
if (index >= totalItems) { const avg = Math.round(allProgress.reduce((a, b) => a + b, 0) / totalItems);
// All done observer.next(avg);
finalize(finalResponses, sessionSetupCost, sessionId);
return; if (completedRequests === totalItems) {
} finalize(finalResponses, sessionSetupCost, sessionId);
}
};
const item = request.items[index]; request.items.forEach((item, index) => {
const formData = new FormData(); const formData = new FormData();
formData.append('file', item.file); formData.append('file', item.file);
const settings = { const settings = {
complexityMode: request.mode.toUpperCase(), complexityMode: request.mode.toUpperCase(),
material: this.mapMaterial(request.material), material: this.mapMaterial(request.material),
quality: request.quality, quality: request.quality,
@@ -207,48 +209,36 @@ export class QuoteEstimatorService {
infillDensity: request.mode === 'advanced' ? request.infillDensity : null, infillDensity: request.mode === 'advanced' ? request.infillDensity : null,
infillPattern: request.mode === 'advanced' ? request.infillPattern : null, infillPattern: request.mode === 'advanced' ? request.infillPattern : null,
nozzleDiameter: request.mode === 'advanced' ? request.nozzleDiameter : null nozzleDiameter: request.mode === 'advanced' ? request.nozzleDiameter : null
}; };
const settingsBlob = new Blob([JSON.stringify(settings)], { type: 'application/json' });
formData.append('settings', settingsBlob);
const settingsBlob = new Blob([JSON.stringify(settings)], { type: 'application/json' }); this.http.post<any>(`${environment.apiUrl}/api/quote-sessions/${sessionId}/line-items`, formData, {
formData.append('settings', settingsBlob); headers,
reportProgress: true,
this.http.post<any>(`${environment.apiUrl}/api/quote-sessions/${sessionId}/line-items`, formData, { observe: 'events'
headers, }).subscribe({
reportProgress: true,
observe: 'events'
}).subscribe({
next: (event) => { next: (event) => {
if (event.type === HttpEventType.UploadProgress && event.total) { if (event.type === HttpEventType.UploadProgress && event.total) {
allProgress[index] = Math.round((100 * event.loaded) / event.total); allProgress[index] = Math.round((100 * event.loaded) / event.total);
reportProgress(); checkCompletion();
} else if (event.type === HttpEventType.Response) { } else if (event.type === HttpEventType.Response) {
allProgress[index] = 100; allProgress[index] = 100;
finalResponses[index] = { ...event.body, success: true, fileName: item.file.name, originalQty: item.quantity, originalItem: item }; finalResponses[index] = { ...event.body, success: true, fileName: item.file.name, originalQty: item.quantity, originalItem: item };
completedCount++; completedRequests++;
reportProgress(); checkCompletion();
// Next
processNextItem(index + 1);
} }
}, },
error: (err) => { error: (err) => {
console.error('Item upload failed', err); console.error('Item upload failed', err);
const errorMsg = err.error?.code === 'VIRUS_DETECTED' ? 'VIRUS_DETECTED' : 'UPLOAD_FAILED'; const errorMsg = err.error?.code === 'VIRUS_DETECTED' ? 'VIRUS_DETECTED' : 'UPLOAD_FAILED';
finalResponses[index] = { success: false, fileName: item.file.name, error: errorMsg }; finalResponses[index] = { success: false, fileName: item.file.name, error: errorMsg };
completedCount++; completedRequests++;
reportProgress(); checkCompletion();
// Next even if error
processNextItem(index + 1);
} }
}); });
}; });
const reportProgress = () => {
const avg = Math.round(allProgress.reduce((a, b) => a + b, 0) / totalItems);
observer.next(avg);
};
// Start first item
processNextItem(0);
}, },
error: (err) => { error: (err) => {
console.error('Failed to create session', err); console.error('Failed to create session', err);
@@ -278,8 +268,10 @@ export class QuoteEstimatorService {
unitTime: res.printTimeSeconds || 0, unitTime: res.printTimeSeconds || 0,
unitWeight: res.materialGrams || 0, unitWeight: res.materialGrams || 0,
quantity: quantity, quantity: quantity,
material: this.mapMaterial(request.material), // Uses session material material: request.material,
color: res.originalItem.color || 'Default' color: res.originalItem.color || 'Default'
// Store ID if needed for updates? QuoteItem interface might need update
// or we map it in component
}); });
grandTotal += unitPrice * quantity; grandTotal += unitPrice * quantity;
@@ -288,6 +280,7 @@ export class QuoteEstimatorService {
}); });
if (validCount === 0) { if (validCount === 0) {
// Check if any failed due to virus
const virusError = responses.find(r => r.error === 'VIRUS_DETECTED'); const virusError = responses.find(r => r.error === 'VIRUS_DETECTED');
if (virusError) { if (virusError) {
observer.error('VIRUS_DETECTED'); observer.error('VIRUS_DETECTED');