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