feat: allow optional fields argument on db.getObject(s) (#9385)

v1.18.x
Barış Soner Uşaklı 4 years ago committed by GitHub
parent 754965b572
commit 4327a09d76
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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()', () => {

Loading…
Cancel
Save