UNPKG

integreat

Version:
55 lines 2.56 kB
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