41 lines
1.1 KiB
Markdown
41 lines
1.1 KiB
Markdown
|
|
---
|
||
|
|
name: dyolink-api-errors
|
||
|
|
description: Adds or migrates Dyolink API error codes with frontend translations. Use when adding backend validation errors, permission errors, or migrating catch blocks to getUserFacingError.
|
||
|
|
---
|
||
|
|
|
||
|
|
# Dyolink API errors
|
||
|
|
|
||
|
|
## Backend
|
||
|
|
|
||
|
|
1. Add to `ErrorCode` in `backend/src/common/errors/error-codes.ts`.
|
||
|
|
2. Throw with `AppException`:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
throw new AppException(ErrorCode.MY_CODE, HttpStatus.BAD_REQUEST, [
|
||
|
|
{ field: 'email', code: ErrorCode.VALIDATION_EMAIL_INVALID },
|
||
|
|
]);
|
||
|
|
```
|
||
|
|
|
||
|
|
3. DTOs: `@IsEmail({}, { message: ErrorCode.VALIDATION_EMAIL_INVALID })`
|
||
|
|
|
||
|
|
## Frontend
|
||
|
|
|
||
|
|
1. Add key under `"errors"` in `en.json`, `fa.json`, `nl.json` (key = error code string).
|
||
|
|
2. In components:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
const tErrors = useTranslations('errors');
|
||
|
|
// ...
|
||
|
|
catch (err: unknown) {
|
||
|
|
toast.showError(getUserFacingError(err, tErrors, t('fallbackKey')));
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
3. Do not use `err.message` or `(err as Error).message` for user display.
|
||
|
|
|
||
|
|
## Axios shape
|
||
|
|
|
||
|
|
Parsed in `lib/api/client` — expects `{ success: false, error: { code, details? } }`.
|
||
|
|
|
||
|
|
See rule: `.cursor/rules/api-errors-i18n.mdc`
|