Improve error messages

This improves error messages throughout. It might sometimes be too verbose, but that's better than being opaque (#74).

Also upgrades Deno's patch version.

Fixes #74
This commit is contained in:
Bruno Bernardino
2025-06-23 08:57:02 +01:00
parent cb95085ea3
commit e0ad428a9f
16 changed files with 188 additions and 13 deletions

2
.dvmrc
View File

@@ -1 +1 @@
2.3.5
2.3.6

View File

@@ -1,4 +1,4 @@
FROM denoland/deno:ubuntu-2.3.5
FROM denoland/deno:ubuntu-2.3.6
EXPOSE 8000

View File

@@ -165,10 +165,15 @@ export default function MainExpenses({ initialBudgets, initialExpenses, initialM
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to export expenses. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as ExportResponseBody;
if (!result.success) {
throw new Error('Failed to get contact!');
throw new Error('Failed to export expenses!');
}
const exportContents = JSON.stringify(result.jsonContents, null, 2);

View File

@@ -123,6 +123,11 @@ export default function MainFiles(
method: 'POST',
body: requestBody,
});
if (!response.ok) {
throw new Error(`Failed to upload file. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as UploadResponseBody;
if (!result.success) {
@@ -170,6 +175,11 @@ export default function MainFiles(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to create directory. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as CreateDirectoryResponseBody;
if (!result.success) {
@@ -239,6 +249,11 @@ export default function MainFiles(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to rename directory. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as RenameDirectoryResponseBody;
if (!result.success) {
@@ -273,6 +288,11 @@ export default function MainFiles(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to rename file. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as RenameResponseBody;
if (!result.success) {
@@ -327,6 +347,11 @@ export default function MainFiles(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to move directory. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as MoveDirectoryResponseBody;
if (!result.success) {
@@ -359,6 +384,11 @@ export default function MainFiles(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to move file. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as MoveResponseBody;
if (!result.success) {
@@ -391,6 +421,11 @@ export default function MainFiles(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to delete directory. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as DeleteDirectoryResponseBody;
if (!result.success) {
@@ -423,6 +458,11 @@ export default function MainFiles(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to delete file. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as DeleteResponseBody;
if (!result.success) {
@@ -536,6 +576,11 @@ export default function MainFiles(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to create share. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as CreateShareResponseBody;
if (!result.success) {
@@ -587,6 +632,11 @@ export default function MainFiles(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to update share. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as UpdateShareResponseBody;
if (!result.success) {
@@ -624,6 +674,11 @@ export default function MainFiles(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to delete file share. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as DeleteShareResponseBody;
if (!result.success) {

View File

@@ -40,6 +40,11 @@ export default function ManageShareModal(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to get file share. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as ResponseBody;
if (!result.success) {

View File

@@ -42,6 +42,11 @@ export default function MoveDirectoryOrFileModal(
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to get directories. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as ResponseBody;
if (!result.success) {

View File

@@ -41,6 +41,11 @@ export default function SearchFiles({}: SearchFilesProps) {
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to search files. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as ResponseBody;
if (!result.success) {

View File

@@ -64,6 +64,11 @@ export default function MainNotes({ initialDirectories, initialFiles, initialPat
method: 'POST',
body: requestBody,
});
if (!response.ok) {
throw new Error(`Failed to create note. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as UploadResponseBody;
if (!result.success) {
@@ -114,6 +119,11 @@ export default function MainNotes({ initialDirectories, initialFiles, initialPat
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to create directory. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as CreateDirectoryResponseBody;
if (!result.success) {
@@ -155,6 +165,11 @@ export default function MainNotes({ initialDirectories, initialFiles, initialPat
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to delete directory. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as DeleteDirectoryResponseBody;
if (!result.success) {
@@ -187,6 +202,11 @@ export default function MainNotes({ initialDirectories, initialFiles, initialPat
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to delete note. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as DeleteResponseBody;
if (!result.success) {

View File

@@ -58,6 +58,11 @@ export default function MainPhotos({ initialDirectories, initialFiles, initialPa
method: 'POST',
body: requestBody,
});
if (!response.ok) {
throw new Error(`Failed to upload photo. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as UploadResponseBody;
if (!result.success) {
@@ -104,6 +109,11 @@ export default function MainPhotos({ initialDirectories, initialFiles, initialPa
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to create directory. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as CreateDirectoryResponseBody;
if (!result.success) {

View File

@@ -1,6 +1,6 @@
services:
website:
image: ghcr.io/bewcloud/bewcloud:v2.2.0
image: ghcr.io/bewcloud/bewcloud:v2.2.2
restart: always
ports:
- 127.0.0.1:8000:8000

View File

@@ -100,7 +100,7 @@ export default function MultiFactorAuthSettings({ methods }: MultiFactorAuthSett
const beginData = await beginResponse.json() as PasskeySetupBeginResponseBody;
if (!beginData.success) {
throw new Error(beginData.error || 'Failed to begin passkey registration');
throw new Error(beginData.error || 'Failed to begin passkey registration.');
}
const registrationResponse = await startRegistration({ optionsJSON: beginData.options! });
@@ -125,7 +125,7 @@ export default function MultiFactorAuthSettings({ methods }: MultiFactorAuthSett
const completeData = await completeResponse.json() as PasskeySetupCompleteResponseBody;
if (!completeData.success) {
throw new Error(completeData.error || 'Failed to complete passkey registration');
throw new Error(completeData.error || 'Failed to complete passkey registration.');
}
setupData.value = {
@@ -142,10 +142,16 @@ export default function MultiFactorAuthSettings({ methods }: MultiFactorAuthSett
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(
`Failed to setup TOTP multi-factor authentication. ${response.statusText} ${await response.text()}`,
);
}
const data = await response.json() as TOTPSetupResponseBody;
if (!data.success || !data.data) {
throw new Error(data.error || 'Failed to setup TOTP multi-factor authentication');
throw new Error(data.error || 'Failed to setup TOTP multi-factor authentication.');
}
setupData.value = {
@@ -165,10 +171,17 @@ export default function MultiFactorAuthSettings({ methods }: MultiFactorAuthSett
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(
`Failed to setup email multi-factor authentication. Please check your SMTP settings are valid and try again. ${response.statusText} ${await response
.text()}`,
);
}
const data = await response.json() as EmailSetupResponseBody;
if (!data.success || !data.data) {
throw new Error(data.error || 'Failed to setup email multi-factor authentication');
throw new Error(data.error || 'Failed to setup email multi-factor authentication.');
}
setupData.value = {
@@ -221,13 +234,19 @@ export default function MultiFactorAuthSettings({ methods }: MultiFactorAuthSett
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(
`Failed to enable multi-factor authentication method. ${response.statusText} ${await response.text()}`,
);
}
const data = await response.json() as MultiFactorAuthEnableResponseBody;
if (!data.success) {
throw new Error(data.error || 'Failed to enable multi-factor authentication');
throw new Error(data.error || 'Failed to enable multi-factor authentication method.');
}
success.value = 'Multi-factor authentication has been enabled successfully! Reloading...';
success.value = 'Multi-factor authentication method has been enabled successfully! Reloading...';
setupData.value = null;
verificationToken.value = '';
@@ -262,13 +281,19 @@ export default function MultiFactorAuthSettings({ methods }: MultiFactorAuthSett
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(
`Failed to disable multi-factor authentication method. ${response.statusText} ${await response.text()}`,
);
}
const data = await response.json() as MultiFactorAuthDisableResponseBody;
if (!data.success) {
throw new Error(data.error || 'Failed to disable multi-factor authentication');
throw new Error(data.error || 'Failed to disable multi-factor authentication method.');
}
success.value = 'Multi-factor authentication has been disabled successfully! Reloading...';
success.value = 'Multi-factor authentication method has been disabled successfully! Reloading...';
showDisableForm.value = null;
disablePassword.value = '';

View File

@@ -33,10 +33,15 @@ export default function Links({ initialLinks }: LinksProps) {
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to save link. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as ResponseBody;
if (!result.success) {
throw new Error('Failed to save notes!');
throw new Error('Failed to save link!');
}
} catch (error) {
console.error(error);

View File

@@ -28,6 +28,11 @@ export default function Notes({ initialNotes }: NotesProps) {
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to save notes. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as ResponseBody;
if (!result.success) {

View File

@@ -37,6 +37,11 @@ export default function Articles({ initialArticles }: ArticlesProps) {
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to refresh articles. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as RefreshResponseBody;
if (!result.success) {
@@ -87,6 +92,11 @@ export default function Articles({ initialArticles }: ArticlesProps) {
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to mark article as read. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as ReadResponseBody;
if (!result.success) {
@@ -114,6 +124,11 @@ export default function Articles({ initialArticles }: ArticlesProps) {
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to mark all articles as read. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as ReadResponseBody;
if (!result.success) {

View File

@@ -84,6 +84,11 @@ export default function Feeds({ initialFeeds }: FeedsProps) {
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to add feed. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as AddResponseBody;
if (!result.success) {
@@ -116,6 +121,11 @@ export default function Feeds({ initialFeeds }: FeedsProps) {
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to delete feed. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as DeleteResponseBody;
if (!result.success) {
@@ -168,6 +178,11 @@ export default function Feeds({ initialFeeds }: FeedsProps) {
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to import feeds. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as ImportResponseBody;
if (!result.success) {

View File

@@ -31,6 +31,11 @@ export default function Note({ fileName, currentPath, contents }: NoteProps) {
method: 'POST',
body: JSON.stringify(requestBody),
});
if (!response.ok) {
throw new Error(`Failed to save note. ${response.statusText} ${await response.text()}`);
}
const result = await response.json() as ResponseBody;
if (!result.success) {