You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.1 KiB
JavaScript
59 lines
2.1 KiB
JavaScript
'use strict';
|
|
|
|
const createError = require("create-error");
|
|
const pgErrorCodes = require("pg-error-codes");
|
|
const DatabaseError = require("../database-error.js");
|
|
const splitValues = require("../split-values");
|
|
|
|
let UniqueConstraintViolationError = createError(DatabaseError, "UniqueConstraintViolationError");
|
|
|
|
let detailsRegex = /Key \(([^\)]+)\)=\(([^\)]+)\) already exists\./;
|
|
|
|
module.exports = {
|
|
error: UniqueConstraintViolationError,
|
|
errorName: "UniqueConstraintViolationError",
|
|
check: function checkType(error) {
|
|
return (
|
|
// PostgreSQL (via `pg`):
|
|
(error.length != null && error.file != null && error.line != null && error.routine != null && error.code === "23505")
|
|
)
|
|
},
|
|
convert: function convertError(error) {
|
|
let [_, columnValue, valueValue] = detailsRegex.exec(error.detail);
|
|
|
|
let column, columns, value, values, messageColumn, messageValue, isComposite;
|
|
|
|
if (columnValue.includes(",")) {
|
|
columns = splitValues(columnValue);
|
|
messageColumn = `columns ${columns.map(column => `'${column}'`).join(", ")}`;
|
|
isComposite = true;
|
|
} else {
|
|
column = columnValue;
|
|
messageColumn = `column '${column}'`;
|
|
isComposite = false;
|
|
}
|
|
|
|
if (valueValue.includes(",")) {
|
|
values = splitValues(valueValue);
|
|
messageValue = `Values ${values.map(value => `'${value}'`).join(", ")} already exist`;
|
|
} else {
|
|
value = valueValue;
|
|
messageValue = `Value '${value}' already exists`;
|
|
}
|
|
|
|
return new UniqueConstraintViolationError(`${messageValue} for ${messageColumn} in table '${error.table}'`, {
|
|
originalError: error,
|
|
pgCode: error.code,
|
|
code: pgErrorCodes[error.code],
|
|
schema: error.schema,
|
|
table: error.table,
|
|
column: column,
|
|
columns: columns,
|
|
value: value,
|
|
values: values,
|
|
isComposite: isComposite,
|
|
constraint: error.constraint
|
|
});
|
|
}
|
|
};
|