Files
threshold-ui/addons/api/addon/handlers/client-daemon-handler.js
T

68 lines
2.0 KiB
JavaScript

import { pluralize } from 'ember-inflector';
/**
* Not all types are yet supported by the client daemon so we'll
* just whitelist the ones we need to start with.
* @type {string[]}
*/
const supportedTypes = ['target', 'session'];
/**
* Handler to sit in front of the API request layer
* so we can request from the daemon first
*/
const ClientDaemonHandler = {
async request(context, next) {
switch (context.request.op) {
case 'query': {
const { store, data } = context.request;
const { type, query } = data;
const isClientDaemonRunning = await this.ipc.invoke(
'isClientDaemonRunning'
);
if (!supportedTypes.includes(type) || !isClientDaemonRunning) {
return next(context.request);
}
// TODO: Remove usages of recursive from callers and scope_id since
// all calls to daemon are recursive, scope_id can be part of search query instead
// eslint-disable-next-line no-unused-vars
let { recursive, scope_id, ...modifiedQuery } = query;
const auth_token_id = this.session.data?.authenticated?.id;
modifiedQuery = {
...modifiedQuery,
auth_token_id,
resource: pluralize(type),
};
// Currently returns with a singular top level field with resource name
// e.g. { targets: [...] } or { sessions: [..] }
// So this just unwraps to the array, or undefined
const [results] = Object.values(
await this.ipc.invoke('searchClientDaemon', modifiedQuery)
);
const payload = { items: results ?? [] };
const schema = store.modelFor(type);
const serializer = store.serializerFor(type);
const normalizedPayload = serializer.normalizeResponse(
store,
schema,
payload,
null,
'query'
);
// TODO: Add some pagination
return store.push(normalizedPayload);
}
default:
return next(context.request);
}
},
};
export default ClientDaemonHandler;