From 488efee51610e2fe529ff2de3e9a09c3479fb7de Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Wed, 24 Jun 2020 17:00:12 -0400 Subject: [PATCH] Init system loaders --- src/loaders.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/loaders.ts diff --git a/src/loaders.ts b/src/loaders.ts new file mode 100644 index 0000000000..cb8f56fd72 --- /dev/null +++ b/src/loaders.ts @@ -0,0 +1,30 @@ +/** + * Loaders are individual DataLoader instances that can be used to query often used information more + * efficiently. This is relied on for fetching field information for example, seeing that's an + * operation we'll do often in various middleware checks + */ + +import DataLoader from 'dataloader'; +import database, { schemaInspector } from './database'; + +async function getFields(keys: { collection: string; field: string }[]) { + const records = await database + .select('*') + .from('directus_fields') + .whereIn( + ['collection', 'field'], + keys.map((key) => [key.collection, key.field]) + ); + return keys.map((key) => + records.find((record) => record.collection === key.collection && record.field === key.field) + ); +} + +export default function createSystemLoaders() { + return { + fields: new DataLoader(getFields, { + cacheKeyFn: (key: { collection: string; field: string }) => + key.collection + '__' + key.field, + }), + }; +}