UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

96 lines (95 loc) 3.44 kB
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, }); } }