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

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) {