/* * Copyright (C) 2019 StApps * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ import { SCMultiSearchRequest, SCMultiSearchResponse, SCMultiSearchRoute, SCSearchResponse, SCTooManyRequestsErrorResponse, } from '@openstapps/core'; import {configFile} from '../common'; import {BulkStorage} from '../storage/BulkStorage'; import {createRoute} from './Route'; const multiSearchRouteModel = new SCMultiSearchRoute(); /** * Implementation of the multi search route (SCMultiSearchRoute) */ export const multiSearchRouter = createRoute( multiSearchRouteModel, async (request: SCMultiSearchRequest, app) => { const bulkMemory: BulkStorage = app.get('bulk'); const queryNames = Object.keys(request); if (queryNames.length > configFile.backend.maxMultiSearchRouteQueries) { throw new SCTooManyRequestsErrorResponse(app.get('isProductiveEnvironment')); } // get a map of promises for each query const searchRequests = queryNames.map((queryName) => { return bulkMemory.database.search(request[queryName]); }); const listOfSearchResponses = await Promise.all(searchRequests); const response: { [queryName: string]: SCSearchResponse } = {}; queryNames.forEach((queryName, index) => { response[queryName] = listOfSearchResponses[index]; }); return response; }, );