121 lines
2.8 KiB
TypeScript
121 lines
2.8 KiB
TypeScript
import { Request, Response, NextFunction } from 'express';
|
|
import {
|
|
ValidationError,
|
|
NotFoundError,
|
|
DBError,
|
|
UniqueViolationError,
|
|
NotNullViolationError,
|
|
ForeignKeyViolationError,
|
|
CheckViolationError,
|
|
DataError,
|
|
} from 'objection';
|
|
|
|
/**
|
|
* Handles the Objection error exception.
|
|
* @param {Error} err
|
|
* @param {Request} req
|
|
* @param {Response} res
|
|
* @param {NextFunction} next
|
|
*/
|
|
export function ObjectionErrorException(
|
|
err: Error,
|
|
req: Request,
|
|
res: Response,
|
|
next: NextFunction
|
|
) {
|
|
if (err instanceof ValidationError) {
|
|
switch (err.type) {
|
|
case 'ModelValidation':
|
|
return res.status(400).send({
|
|
message: err.message,
|
|
type: err.type,
|
|
data: err.data,
|
|
});
|
|
case 'RelationExpression':
|
|
return res.status(400).send({
|
|
message: err.message,
|
|
type: 'RelationExpression',
|
|
data: {},
|
|
});
|
|
|
|
case 'UnallowedRelation':
|
|
return res.status(400).send({
|
|
message: err.message,
|
|
type: err.type,
|
|
data: {},
|
|
});
|
|
|
|
case 'InvalidGraph':
|
|
return res.status(400).send({
|
|
message: err.message,
|
|
type: err.type,
|
|
data: {},
|
|
});
|
|
|
|
default:
|
|
return res.status(400).send({
|
|
message: err.message,
|
|
type: 'UnknownValidationError',
|
|
data: {},
|
|
});
|
|
}
|
|
} else if (err instanceof NotFoundError) {
|
|
return res.status(404).send({
|
|
message: err.message,
|
|
type: 'NotFound',
|
|
data: {},
|
|
});
|
|
} else if (err instanceof UniqueViolationError) {
|
|
return res.status(409).send({
|
|
message: err.message,
|
|
type: 'UniqueViolation',
|
|
data: {
|
|
columns: err.columns,
|
|
table: err.table,
|
|
constraint: err.constraint,
|
|
},
|
|
});
|
|
} else if (err instanceof NotNullViolationError) {
|
|
return res.status(400).send({
|
|
message: err.message,
|
|
type: 'NotNullViolation',
|
|
data: {
|
|
column: err.column,
|
|
table: err.table,
|
|
},
|
|
});
|
|
} else if (err instanceof ForeignKeyViolationError) {
|
|
return res.status(409).send({
|
|
message: err.message,
|
|
type: 'ForeignKeyViolation',
|
|
data: {
|
|
table: err.table,
|
|
constraint: err.constraint,
|
|
},
|
|
});
|
|
} else if (err instanceof CheckViolationError) {
|
|
return res.status(400).send({
|
|
message: err.message,
|
|
type: 'CheckViolation',
|
|
data: {
|
|
table: err.table,
|
|
constraint: err.constraint,
|
|
},
|
|
});
|
|
} else if (err instanceof DataError) {
|
|
return res.status(400).send({
|
|
message: err.message,
|
|
type: 'InvalidData',
|
|
data: {},
|
|
});
|
|
} else if (err instanceof DBError) {
|
|
return res.status(500).send({
|
|
message: err.message,
|
|
type: 'UnknownDatabaseError',
|
|
data: {},
|
|
});
|
|
} else {
|
|
next(err);
|
|
}
|
|
}
|