integreat
Version:
Node.js integration layer
55 lines • 2.56 kB
JavaScript
import debugLib from 'debug';
import { createErrorResponse, setOrigin } from '../utils/response.js';
import getHandler from './get.js';
import { isObject } from '../utils/is.js';
const debug = debugLib('great');
const isMetaField = (key) => key !== 'id' && !key.startsWith('$');
const extractAllMetaFields = (meta) => Object.keys(meta).filter(isMetaField);
const extractMeta = (meta, keys) => isObject(meta)
? typeof keys === 'string' || Array.isArray(keys)
? []
.concat(keys)
.filter((key) => key !== 'createdAt' && key !== 'updatedAt')
.reduce((ret, key) => ({ ...ret, [key]: (meta && meta[key]) || null }), {})
: extractMeta(meta, extractAllMetaFields(meta))
: {};
const joinTypes = (types) => Array.isArray(types) ? types.join('|') : types;
export const generateMetaId = (serviceId, type, metaKey) => ['meta', serviceId, joinTypes(type), metaKey].filter(Boolean).join(':');
export default async function getMeta(action, resources) {
debug('Action: GET_META');
const { payload: { type, keys = undefined, metaKey, targetService: serviceId, endpoint: endpointId, }, } = action;
const metaId = generateMetaId(serviceId, type, metaKey);
const { getService } = resources;
const service = getService(undefined, serviceId);
if (!service) {
debug(`GET_META: Service '${serviceId}' doesn't exist`);
return createErrorResponse(`Service '${serviceId}' doesn't exist`, 'handler:GET_META');
}
const metaType = service.meta;
const metaService = getService(metaType);
if (!metaService) {
return createErrorResponse(`Service '${service.id}' doesn't support metadata (setting was '${service.meta}')`, 'handler:GET_META', 'noaction');
}
const endpointDebug = endpointId
? `endpoint '${endpointId}'`
: `endpoint matching ${metaType} and ${metaId}`;
debug("GET_META: Get meta %s for service '%s' on service '%s' at %s", keys, service.id, metaService.id, endpointDebug);
const nextAction = {
...action,
type: 'GET',
payload: { keys, type: metaType, id: metaId, endpoint: endpointId },
};
const response = await getHandler(nextAction, resources);
if (response?.status === 'ok') {
const { data } = response || {};
const meta = extractMeta(data, keys);
return {
status: 'ok',
data: { service: serviceId, meta },
};
}
else {
return setOrigin(response, 'handler:GET_META');
}
}
//# sourceMappingURL=getMeta.js.map