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