From 0dd64681ff8ad6153eb94704d6e22aa694c73146 Mon Sep 17 00:00:00 2001 From: Ldoppea Date: Thu, 3 Aug 2023 11:38:09 +0200 Subject: [PATCH] fix: Better check for Upload error type in `uploadMedias()` Previous implementation would throw if the received error do not contain any `errors` array. this can happen if the error is not thrown by cozy-client Also this commit improve type check to ensure the receive error is the one we expect. Casting objects using `as` should be avoided as this will never ensure type compatibility --- src/app/domain/backup/helpers/error.ts | 12 +++++++++++- src/app/domain/backup/services/uploadMedias.ts | 10 ++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/app/domain/backup/helpers/error.ts b/src/app/domain/backup/helpers/error.ts index 5de7ddd54..7dcf8638b 100644 --- a/src/app/domain/backup/helpers/error.ts +++ b/src/app/domain/backup/helpers/error.ts @@ -15,10 +15,20 @@ export class BackupError extends Error { } } +export const isUploadError = (error: unknown): error is UploadError => { + return ( + typeof error === 'object' && + error !== null && + 'statusCode' in error && + 'errors' in error && + Array.isArray(error.errors) + ) +} + export const isQuotaExceededError = (error: UploadError): boolean => { return ( error.statusCode === 413 && - error.errors[0].detail === 'The file is too big and exceeds the disk quota' + error.errors[0]?.detail === 'The file is too big and exceeds the disk quota' ) } diff --git a/src/app/domain/backup/services/uploadMedias.ts b/src/app/domain/backup/services/uploadMedias.ts index 785a5bb71..3d834e375 100644 --- a/src/app/domain/backup/services/uploadMedias.ts +++ b/src/app/domain/backup/services/uploadMedias.ts @@ -13,7 +13,7 @@ import { } from '/app/domain/backup/models' import { UploadError } from '/app/domain/upload/models' import { getBackupInfo } from '/app/domain/backup/services/manageBackup' -import { BackupError, isFatalError } from '/app/domain/backup/helpers/error' +import { BackupError, isFatalError, isUploadError } from '/app/domain/backup/helpers/error' import { areAlbumsEnabled } from '/app/domain/backup/services/manageAlbums' import type CozyClient from 'cozy-client' @@ -101,13 +101,15 @@ export const uploadMedias = async ( await setMediaAsBackuped(client, mediaToUpload, documentCreated) log.debug(`✅ ${mediaToUpload.name} set as backuped`) - } catch (e) { + } catch (error) { log.debug( `❌ ${mediaToUpload.name} not uploaded or set as backuped correctly` ) - log.debug(e) + log.debug(error) - const error = e as UploadError + if (!isUploadError(error)) { + return + } if (isFatalError(error)) { await setBackupAsReady(client)