mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
feat: allow optional fields argument on db.getObject(s) (#9385)
This commit is contained in:
committed by
GitHub
parent
754965b572
commit
4327a09d76
@@ -20,7 +20,7 @@ module.exports = function (Categories) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const keys = cids.map(cid => `category:${cid}`);
|
const keys = cids.map(cid => `category:${cid}`);
|
||||||
const categories = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
|
const categories = await db.getObjects(keys, fields);
|
||||||
const result = await plugins.hooks.fire('filter:category.getFields', {
|
const result = await plugins.hooks.fire('filter:category.getFields', {
|
||||||
cids: cids,
|
cids: cids,
|
||||||
categories: categories,
|
categories: categories,
|
||||||
|
|||||||
@@ -61,17 +61,17 @@ module.exports = function (module) {
|
|||||||
await module.setObject(key, data);
|
await module.setObject(key, data);
|
||||||
};
|
};
|
||||||
|
|
||||||
module.getObject = async function (key) {
|
module.getObject = async function (key, fields = []) {
|
||||||
if (!key) {
|
if (!key) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await module.getObjects([key]);
|
const data = await module.getObjects([key], fields);
|
||||||
return data && data.length ? data[0] : null;
|
return data && data.length ? data[0] : null;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.getObjects = async function (keys) {
|
module.getObjects = async function (keys, fields = []) {
|
||||||
return await module.getObjectsFields(keys, []);
|
return await module.getObjectsFields(keys, fields);
|
||||||
};
|
};
|
||||||
|
|
||||||
module.getObjectField = async function (key, field) {
|
module.getObjectField = async function (key, field) {
|
||||||
|
|||||||
@@ -70,11 +70,13 @@ module.exports = function (module) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
module.getObject = async function (key) {
|
module.getObject = async function (key, fields = []) {
|
||||||
if (!key) {
|
if (!key) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
if (fields.length) {
|
||||||
|
return await module.getObjectFields(key, fields);
|
||||||
|
}
|
||||||
const res = await module.pool.query({
|
const res = await module.pool.query({
|
||||||
name: 'getObject',
|
name: 'getObject',
|
||||||
text: `
|
text: `
|
||||||
@@ -91,11 +93,13 @@ SELECT h."data"
|
|||||||
return res.rows.length ? res.rows[0].data : null;
|
return res.rows.length ? res.rows[0].data : null;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.getObjects = async function (keys) {
|
module.getObjects = async function (keys, fields = []) {
|
||||||
if (!Array.isArray(keys) || !keys.length) {
|
if (!Array.isArray(keys) || !keys.length) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
if (fields.length) {
|
||||||
|
return await module.getObjectsFields(keys, fields);
|
||||||
|
}
|
||||||
const res = await module.pool.query({
|
const res = await module.pool.query({
|
||||||
name: 'getObjects',
|
name: 'getObjects',
|
||||||
text: `
|
text: `
|
||||||
@@ -170,7 +174,9 @@ SELECT (SELECT jsonb_object_agg(f, d."value")
|
|||||||
if (!Array.isArray(keys) || !keys.length) {
|
if (!Array.isArray(keys) || !keys.length) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
if (!fields.length) {
|
||||||
|
return await module.getObjects(keys);
|
||||||
|
}
|
||||||
const res = await module.pool.query({
|
const res = await module.pool.query({
|
||||||
name: 'getObjectsFields',
|
name: 'getObjectsFields',
|
||||||
text: `
|
text: `
|
||||||
|
|||||||
@@ -61,17 +61,17 @@ module.exports = function (module) {
|
|||||||
cache.del(key);
|
cache.del(key);
|
||||||
};
|
};
|
||||||
|
|
||||||
module.getObject = async function (key) {
|
module.getObject = async function (key, fields = []) {
|
||||||
if (!key) {
|
if (!key) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await module.getObjectsFields([key], []);
|
const data = await module.getObjectsFields([key], fields);
|
||||||
return data && data.length ? data[0] : null;
|
return data && data.length ? data[0] : null;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.getObjects = async function (keys) {
|
module.getObjects = async function (keys, fields = []) {
|
||||||
return await module.getObjectsFields(keys, []);
|
return await module.getObjectsFields(keys, fields);
|
||||||
};
|
};
|
||||||
|
|
||||||
module.getObjectField = async function (key, field) {
|
module.getObjectField = async function (key, field) {
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ module.exports = function (Groups) {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const keys = groupNames.map(groupName => `group:${groupName}`);
|
const keys = groupNames.map(groupName => `group:${groupName}`);
|
||||||
const groupData = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
|
const groupData = await db.getObjects(keys, fields);
|
||||||
if (ephemeralIdx.length) {
|
if (ephemeralIdx.length) {
|
||||||
ephemeralIdx.forEach((idx) => {
|
ephemeralIdx.forEach((idx) => {
|
||||||
groupData[idx] = Groups.getEphemeralGroup(groupNames[idx]);
|
groupData[idx] = Groups.getEphemeralGroup(groupNames[idx]);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ module.exports = function (Messaging) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const keys = mids.map(mid => `message:${mid}`);
|
const keys = mids.map(mid => `message:${mid}`);
|
||||||
const messages = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
|
const messages = await db.getObjects(keys, fields);
|
||||||
|
|
||||||
return await Promise.all(messages.map(
|
return await Promise.all(messages.map(
|
||||||
async (message, idx) => modifyMessage(message, fields, parseInt(mids[idx], 10))
|
async (message, idx) => modifyMessage(message, fields, parseInt(mids[idx], 10))
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ module.exports = function (Posts) {
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
const keys = pids.map(pid => `post:${pid}`);
|
const keys = pids.map(pid => `post:${pid}`);
|
||||||
const postData = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
|
const postData = await db.getObjects(keys, fields);
|
||||||
const result = await plugins.hooks.fire('filter:post.getFields', {
|
const result = await plugins.hooks.fire('filter:post.getFields', {
|
||||||
pids: pids,
|
pids: pids,
|
||||||
posts: postData,
|
posts: postData,
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ module.exports = function (Topics) {
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
const keys = tids.map(tid => `topic:${tid}`);
|
const keys = tids.map(tid => `topic:${tid}`);
|
||||||
const topics = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
|
const topics = await db.getObjects(keys, fields);
|
||||||
const result = await plugins.hooks.fire('filter:topic.getFields', {
|
const result = await plugins.hooks.fire('filter:topic.getFields', {
|
||||||
tids: tids,
|
tids: tids,
|
||||||
topics: topics,
|
topics: topics,
|
||||||
|
|||||||
@@ -161,6 +161,12 @@ describe('Hash methods', () => {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return fields if given', async () => {
|
||||||
|
const data = await db.getObject('hashTestObject', ['name', 'age']);
|
||||||
|
assert.strictEqual(data.name, 'baris');
|
||||||
|
assert.strictEqual(parseInt(data.age, 10), 99);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getObjects()', () => {
|
describe('getObjects()', () => {
|
||||||
@@ -182,6 +188,18 @@ describe('Hash methods', () => {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return fields if given', async () => {
|
||||||
|
await db.setObject('fieldsObj1', { foo: 'foo', baz: 'baz', herp: 'herp' });
|
||||||
|
await db.setObject('fieldsObj2', { foo: 'foo2', baz: 'baz2', herp: 'herp2', onlyin2: 'onlyin2' });
|
||||||
|
const data = await db.getObjects(['fieldsObj1', 'fieldsObj2'], ['baz', 'doesnotexist', 'onlyin2']);
|
||||||
|
assert.strictEqual(data[0].baz, 'baz');
|
||||||
|
assert.strictEqual(data[0].doesnotexist, null);
|
||||||
|
assert.strictEqual(data[0].onlyin2, null);
|
||||||
|
assert.strictEqual(data[1].baz, 'baz2');
|
||||||
|
assert.strictEqual(data[1].doesnotexist, null);
|
||||||
|
assert.strictEqual(data[1].onlyin2, 'onlyin2');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getObjectField()', () => {
|
describe('getObjectField()', () => {
|
||||||
@@ -295,6 +313,17 @@ describe('Hash methods', () => {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return all fields if fields is empty array', async () => {
|
||||||
|
const objects = await db.getObjectsFields(['testObject8', 'testObject9', 'doesnotexist'], []);
|
||||||
|
assert(Array.isArray(objects));
|
||||||
|
assert.strict(objects.length, 3);
|
||||||
|
assert.strictEqual(objects[0].name, 'baris');
|
||||||
|
assert.strictEqual(Number(objects[0].age), 99);
|
||||||
|
assert.strictEqual(objects[1].name, 'ginger');
|
||||||
|
assert.strictEqual(Number(objects[1].age), 3);
|
||||||
|
assert.strictEqual(!!objects[2], false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getObjectKeys()', () => {
|
describe('getObjectKeys()', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user