mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-26 10:20:23 +01:00
98 lines
2.3 KiB
JavaScript
98 lines
2.3 KiB
JavaScript
'use strict';
|
|
|
|
const helpers = module.exports;
|
|
|
|
helpers.valueToString = function (value) {
|
|
return String(value);
|
|
};
|
|
|
|
helpers.removeDuplicateValues = function (values, ...others) {
|
|
for (let i = 0; i < values.length; i++) {
|
|
if (values.lastIndexOf(values[i]) !== i) {
|
|
values.splice(i, 1);
|
|
for (let j = 0; j < others.length; j++) {
|
|
others[j].splice(i, 1);
|
|
}
|
|
i -= 1;
|
|
}
|
|
}
|
|
};
|
|
|
|
helpers.ensureLegacyObjectType = async function (db, key, type) {
|
|
await db.query({
|
|
name: 'ensureLegacyObjectTypeBefore',
|
|
text: `
|
|
DELETE FROM "legacy_object"
|
|
WHERE "expireAt" IS NOT NULL
|
|
AND "expireAt" <= CURRENT_TIMESTAMP`,
|
|
});
|
|
|
|
await db.query({
|
|
name: 'ensureLegacyObjectType1',
|
|
text: `
|
|
INSERT INTO "legacy_object" ("_key", "type")
|
|
VALUES ($1::TEXT, $2::TEXT::LEGACY_OBJECT_TYPE)
|
|
ON CONFLICT
|
|
DO NOTHING`,
|
|
values: [key, type],
|
|
});
|
|
|
|
const res = await db.query({
|
|
name: 'ensureLegacyObjectType2',
|
|
text: `
|
|
SELECT "type"
|
|
FROM "legacy_object_live"
|
|
WHERE "_key" = $1::TEXT`,
|
|
values: [key],
|
|
});
|
|
|
|
if (res.rows[0].type !== type) {
|
|
throw new Error(`database: cannot insert ${JSON.stringify(key)} as ${type} because it already exists as ${res.rows[0].type}`);
|
|
}
|
|
};
|
|
|
|
helpers.ensureLegacyObjectsType = async function (db, keys, type) {
|
|
await db.query({
|
|
name: 'ensureLegacyObjectTypeBefore',
|
|
text: `
|
|
DELETE FROM "legacy_object"
|
|
WHERE "expireAt" IS NOT NULL
|
|
AND "expireAt" <= CURRENT_TIMESTAMP`,
|
|
});
|
|
|
|
await db.query({
|
|
name: 'ensureLegacyObjectsType1',
|
|
text: `
|
|
INSERT INTO "legacy_object" ("_key", "type")
|
|
SELECT k, $2::TEXT::LEGACY_OBJECT_TYPE
|
|
FROM UNNEST($1::TEXT[]) k
|
|
ON CONFLICT
|
|
DO NOTHING`,
|
|
values: [keys, type],
|
|
});
|
|
|
|
const res = await db.query({
|
|
name: 'ensureLegacyObjectsType2',
|
|
text: `
|
|
SELECT "_key", "type"
|
|
FROM "legacy_object_live"
|
|
WHERE "_key" = ANY($1::TEXT[])`,
|
|
values: [keys],
|
|
});
|
|
|
|
const invalid = res.rows.filter(r => r.type !== type);
|
|
|
|
if (invalid.length) {
|
|
const parts = invalid.map(r => `${JSON.stringify(r._key)} is ${r.type}`);
|
|
throw new Error(`database: cannot insert multiple objects as ${type} because they already exist: ${parts.join(', ')}`);
|
|
}
|
|
|
|
const missing = keys.filter(k => !res.rows.some(r => r._key === k));
|
|
|
|
if (missing.length) {
|
|
throw new Error(`database: failed to insert keys for objects: ${JSON.stringify(missing)}`);
|
|
}
|
|
};
|
|
|
|
helpers.noop = function () {};
|