Files
bigcapital/packages/server/src/api/exceptions/ObjectionErrorException.ts
2024-05-22 19:30:41 +02:00

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);
}
}