64 lines
1.4 KiB
JavaScript
64 lines
1.4 KiB
JavaScript
const isMissingPositionColumn = (error) =>
|
|
error &&
|
|
error.code === "ER_BAD_FIELD_ERROR" &&
|
|
String(error.sqlMessage || "").includes("position");
|
|
|
|
const moveByPosition = async ({
|
|
db,
|
|
table,
|
|
id,
|
|
direction,
|
|
selectQuery,
|
|
missingColumnMessage,
|
|
notFoundMessage,
|
|
}) => {
|
|
if (direction !== "up" && direction !== "down") {
|
|
return { status: 400, body: { error: "Ungueltige Richtung" } };
|
|
}
|
|
|
|
let rows;
|
|
|
|
try {
|
|
await db.query(
|
|
`UPDATE ${table} SET position = id WHERE position IS NULL`
|
|
);
|
|
|
|
;[rows] = await db.query(selectQuery);
|
|
} catch (error) {
|
|
if (isMissingPositionColumn(error)) {
|
|
return { status: 400, body: { error: missingColumnMessage } };
|
|
}
|
|
|
|
throw error;
|
|
}
|
|
|
|
const index = rows.findIndex((row) => row.id == id);
|
|
|
|
if (index === -1) {
|
|
return { status: 404, body: { error: notFoundMessage } };
|
|
}
|
|
|
|
const swapIndex = direction === "up" ? index - 1 : index + 1;
|
|
|
|
if (swapIndex < 0 || swapIndex >= rows.length) {
|
|
return { status: 200, body: { success: true } };
|
|
}
|
|
|
|
const moved = rows.splice(index, 1)[0];
|
|
rows.splice(swapIndex, 0, moved);
|
|
|
|
for (let i = 0; i < rows.length; i++) {
|
|
await db.query(
|
|
`UPDATE ${table} SET position = ? WHERE id = ?`,
|
|
[i + 1, rows[i].id]
|
|
);
|
|
}
|
|
|
|
return { status: 200, body: { success: true } };
|
|
};
|
|
|
|
module.exports = {
|
|
moveByPosition,
|
|
isMissingPositionColumn,
|
|
};
|