@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
96 lines (95 loc) • 3.44 kB
JavaScript
import { ContainsNullValuesError, InvalidForeignKeyError, NotNullViolationError, RecordNotUniqueError, ValueOutOfRangeError, ValueTooLongError, } from '@directus/errors';
var PostgresErrorCodes;
(function (PostgresErrorCodes) {
PostgresErrorCodes["FOREIGN_KEY_VIOLATION"] = "23503";
PostgresErrorCodes["NOT_NULL_VIOLATION"] = "23502";
PostgresErrorCodes["NUMERIC_VALUE_OUT_OF_RANGE"] = "22003";
PostgresErrorCodes["UNIQUE_VIOLATION"] = "23505";
PostgresErrorCodes["VALUE_LIMIT_VIOLATION"] = "22001";
})(PostgresErrorCodes || (PostgresErrorCodes = {}));
export function extractError(error, data) {
switch (error.code) {
case PostgresErrorCodes.UNIQUE_VIOLATION:
return uniqueViolation();
case PostgresErrorCodes.NUMERIC_VALUE_OUT_OF_RANGE:
return numericValueOutOfRange();
case PostgresErrorCodes.VALUE_LIMIT_VIOLATION:
return valueLimitViolation();
case PostgresErrorCodes.NOT_NULL_VIOLATION:
return notNullViolation();
case PostgresErrorCodes.FOREIGN_KEY_VIOLATION:
return foreignKeyViolation();
default:
return error;
}
function uniqueViolation() {
const { table, detail } = error;
const betweenParens = /\(([^)]+)\)/g;
const matches = detail.match(betweenParens);
if (!matches)
return error;
const collection = table;
const field = matches[0].slice(1, -1);
return new RecordNotUniqueError({
collection,
field,
value: field ? data[field] : null,
});
}
function numericValueOutOfRange() {
const regex = /"(.*?)"/g;
const matches = error.message.match(regex);
if (!matches)
return error;
const collection = matches[0].slice(1, -1);
const field = matches[1]?.slice(1, -1) ?? null;
return new ValueOutOfRangeError({
collection,
field,
value: field ? data[field] : null,
});
}
function valueLimitViolation() {
/**
* NOTE:
* Postgres doesn't return the offending column
*/
const regex = /"(.*?)"/g;
const matches = error.message.match(regex);
if (!matches)
return error;
const collection = matches[0].slice(1, -1);
const field = matches[1]?.slice(1, -1) ?? null;
return new ValueTooLongError({
collection,
field,
value: field ? data[field] : null,
});
}
function notNullViolation() {
const { table, column } = error;
if (!column)
return error;
if (error.message.endsWith('contains null values')) {
return new ContainsNullValuesError({ collection: table, field: column });
}
return new NotNullViolationError({
collection: table,
field: column,
});
}
function foreignKeyViolation() {
const { table, detail } = error;
const betweenParens = /\(([^)]+)\)/g;
const matches = detail.match(betweenParens);
if (!matches)
return error;
const collection = table;
const field = matches[0].slice(1, -1);
return new InvalidForeignKeyError({
collection,
field,
value: field ? data[field] : null,
});
}
}