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.

51 lines
1.6 KiB
JavaScript

'use strict';
const createError = require("create-error");
const pgErrorCodes = require("pg-error-codes");
const DatabaseError = require("../database-error.js");
const getTable = require("../get-table");
let EnumError = createError(DatabaseError, "EnumError");
let messageRegex = /^(.+) - invalid input value for enum ([^:]+): "([^"]+)"$/;
module.exports = {
error: EnumError,
errorName: "EnumError",
check: function checkType(error) {
return (
// PostgreSQL (via `pg`):
(error.length != null && error.file != null && error.line != null && error.routine != null && error.code === "22P02" && error.message.includes("invalid input value for enum"))
)
},
convert: function convertError(error) {
let messageMatch = messageRegex.exec(error.message);
if (messageMatch == null) {
throw new Error("Encountered unknown error format");
}
let [_, query, enumType, value] = messageMatch;
let table = getTable(query);
let message;
if (table != null) {
message = `Value '${value}' is not an allowed value for the ENUM type '${enumType}' (in table '${table}')`;
} else {
message = `Value '${value}' is not an allowed value for the ENUM type '${enumType}'`;
}
return new EnumError(message, {
originalError: error,
pgCode: error.code,
code: pgErrorCodes[error.code],
query: query,
table: table,
enumType: enumType,
value: value
});
}
};