From 735ab03d6e1a155daf248fc701c46ff1ab414868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luc=C3=A0s?= <86352901+LucasVbr@users.noreply.github.com> Date: Mon, 16 Dec 2024 18:50:43 +0100 Subject: [PATCH] feat: Launch Server and database async --- src/index.ts | 9 ++--- src/routes/randomize.ts | 42 ++++++++--------------- src/services/dataset/Dataset.ts | 2 +- src/services/dataset/DatasetCollection.ts | 27 +++++++-------- 4 files changed, 31 insertions(+), 49 deletions(-) diff --git a/src/index.ts b/src/index.ts index 25f936a..13e7aa3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,14 +5,9 @@ import { TypeOrmDataSource } from "./TypeOrmDataSource"; dotenv.config(); -// 1. initialize database connexions - -// 2. Load all datasets - -// 3. Start the server - TypeOrmDataSource.initialize() .then(() => DatasetCollection.loadAll()) .then(() => console.log("All datasets are loaded")) - .then(() => new Server().start()) .catch(console.error); + +new Server().start(); diff --git a/src/routes/randomize.ts b/src/routes/randomize.ts index 3d390fe..7eddf6c 100644 --- a/src/routes/randomize.ts +++ b/src/routes/randomize.ts @@ -4,40 +4,28 @@ import axios from "axios"; const router = Router(); -router.post("/randomize", (req: Request, res: Response) => { +router.post("/randomize", async (req: Request, res: Response) => { const size: number = req.query.size ? parseInt(req.query.size as string) : 10; - DatasetCollection.getDatasetByMatchingSchema(req.body) - .then((endpoints) => { - // Split evenly the size between the datasets - const sizePerDataset = Math.floor(size / endpoints.length); + const data = await Promise.all( + DatasetCollection.datasets.map((dataset) => + axios + .post(dataset.endpoint, req.body, { params: { size } }) + .then((res) => res.data.data) + ) + ).then((r) => + r + .flat() + .sort(() => Math.random() - 0.5) + .slice(0, size) + ); - return Promise.all( - endpoints.map(async (endpoint) => { - const params = { size: sizePerDataset }; - - return axios - .post(endpoint, req.body, { params }) - .then((res) => res.data.data); - }) - ); - }) - .then((r) => { - const data = r - .flat() - .sort(() => Math.random() - 0.5) - .slice(0, size); - - res.status(200).json({ status: "RANDOMIZED", data }); - }); + res.status(200).json({ status: "RANDOMIZED", data }); }); router.post("/randomize/:id", async (req: Request, res: Response) => { const { id } = req.params; - - const size: number | undefined = req.query.size - ? parseInt(req.query.size as string) - : undefined; + const size: number = req.query.size ? parseInt(req.query.size as string) : 10; const dataset = DatasetCollection.datasets.find( (dataset) => dataset.id === id diff --git a/src/services/dataset/Dataset.ts b/src/services/dataset/Dataset.ts index c1ec821..db081d3 100644 --- a/src/services/dataset/Dataset.ts +++ b/src/services/dataset/Dataset.ts @@ -121,7 +121,7 @@ export default class Dataset { ); } - async get(length: number = 10, schema: any) { + async get(length: number, schema: any) { const db = await getDatabaseConnexion(); // Convert JSON schema to projection diff --git a/src/services/dataset/DatasetCollection.ts b/src/services/dataset/DatasetCollection.ts index 598e43c..7f9a01b 100644 --- a/src/services/dataset/DatasetCollection.ts +++ b/src/services/dataset/DatasetCollection.ts @@ -4,7 +4,6 @@ import WorldCitiesDataTransformer from "../data_transformer/WorldCitiesDataTrans import { ExtractorType } from "../archive_extractor/ExtractorFactory"; import NudgerDataTransformer from "../data_transformer/NudgerDataTransformer"; import OpenfoodfactsDataTransformer from "../data_transformer/OpenfoodfactsDataTransformer"; -import axios from "axios"; class DatasetCollection { public static datasets: Dataset[] = [ @@ -42,19 +41,19 @@ class DatasetCollection { return Promise.all(this.datasets.map((dataset) => dataset.load())); } - public static async getDatasetByMatchingSchema( - schema: any - ): Promise { - return await Promise.all( - this.datasets.map((dataset) => - axios - .post(dataset.endpoint, schema, { - params: { size: 1 }, - }) - .then((res) => (res.data.data.length > 0 ? dataset.endpoint : null)) - ) - ).then((endpoints) => endpoints.filter((endpoint) => endpoint !== null)); - } + // public static async getDatasetByMatchingSchema( + // schema: any + // ): Promise { + // return await Promise.all( + // this.datasets.map((dataset) => + // axios + // .post(dataset.endpoint, schema, { + // params: { size: 1 }, + // }) + // .then((res) => (res.data.data.length > 0 ? dataset.endpoint : null)) + // ) + // ).then((endpoints) => endpoints.filter((endpoint) => endpoint !== null)); + // } } export default DatasetCollection;