52 lines
1.2 KiB
TypeScript
52 lines
1.2 KiB
TypeScript
import type { AppError } from '@/lib/errors';
|
|
import type { ContentfulStatusCode } from 'hono/utils/http-status';
|
|
import type { ProblemDetails } from './problem-details';
|
|
|
|
function statusFromError(error: AppError): ContentfulStatusCode {
|
|
switch (error.type) {
|
|
case 'validation':
|
|
return 400;
|
|
case 'unauthorized':
|
|
return 401;
|
|
case 'forbidden':
|
|
return 403;
|
|
case 'not_found':
|
|
return 404;
|
|
case 'conflict':
|
|
return 409;
|
|
case 'unexpected':
|
|
return 500;
|
|
default:
|
|
return 500;
|
|
}
|
|
}
|
|
|
|
function titleFromStatus(status: ContentfulStatusCode): string {
|
|
switch (status) {
|
|
case 400:
|
|
return 'Bad Request';
|
|
case 401:
|
|
return 'Unauthorized';
|
|
case 403:
|
|
return 'Forbidden';
|
|
case 404:
|
|
return 'Not Found';
|
|
case 409:
|
|
return 'Conflict';
|
|
default:
|
|
return 'Internal Server Error';
|
|
}
|
|
}
|
|
|
|
export function mapAppErrorToProblem(error: AppError, instance?: string): ProblemDetails {
|
|
const status = statusFromError(error);
|
|
|
|
return {
|
|
type: `https://api.myapp.dev/problems/${error.type}`,
|
|
title: titleFromStatus(status),
|
|
status,
|
|
detail: status === 500 ? 'Internal server error' : error.message,
|
|
instance,
|
|
};
|
|
}
|