From f518d5a6ebfb36b7eb8cef0f6c7812e623ff7b87 Mon Sep 17 00:00:00 2001 From: git-directory-deploy <> Date: Tue, 8 Mar 2022 16:11:44 +0100 Subject: [PATCH] fix promises --- src/targets/services/fluidsPrices.ts | 204 ++++++++++++++++----------- 1 file changed, 119 insertions(+), 85 deletions(-) diff --git a/src/targets/services/fluidsPrices.ts b/src/targets/services/fluidsPrices.ts index 68c97c41d..bb0b4acb9 100644 --- a/src/targets/services/fluidsPrices.ts +++ b/src/targets/services/fluidsPrices.ts @@ -43,69 +43,75 @@ const synchroPricesToUpdate = async ( const fps = new FluidPricesService(client) const remotePrices = await getRemotePricesByfluid(client, fluidType) let firstEditedPrice: string | null = null - const promises = remotePrices.map(async remotePrice => { - return new Promise<void>(async resolve => { - //Check if price exist in database - log('info', `Price remote ${JSON.stringify(remotePrice)}`) - const existingPrice = await fps.checkIfPriceExists(remotePrice) - log('info', `Existing ?Price remote ${JSON.stringify(existingPrice)}`) - if (existingPrice) { - //Check if the remote price is more recent - if ( - existingPrice.UpdatedAt && - remotePrice.UpdatedAt && - existingPrice.UpdatedAt < remotePrice.UpdatedAt - ) { - log( - 'info', - `Price exist in db but not up to date, updating ${existingPrice}` - ) - log('info', `startDate ${remotePrice.startDate}`) - //If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation - if (firstEditedPrice === null) { - firstEditedPrice = remotePrice.startDate - } - if (firstEditedPrice >= remotePrice.startDate) { - firstEditedPrice = remotePrice.startDate - } - log( - 'info', - `firstEditedPrice ${firstEditedPrice}, fluidTypeeee : ${fluidType}` - ) + await Promise.all( + remotePrices.map(async remotePrice => { + return new Promise<void>(async resolve => { + try { + //Check if price exist in database + const existingPrice = await fps.checkIfPriceExists(remotePrice) + if (existingPrice) { + //Check if the remote price is more recent + if ( + existingPrice.UpdatedAt && + remotePrice.UpdatedAt && + existingPrice.UpdatedAt < remotePrice.UpdatedAt + ) { + log( + 'info', + `Price exist in db but not up to date, updating ${existingPrice}` + ) + //If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation + if (firstEditedPrice === null) { + firstEditedPrice = remotePrice.startDate + } + if (firstEditedPrice >= remotePrice.startDate) { + firstEditedPrice = remotePrice.startDate + } + log( + 'debug', + `firstEditedPrice ${firstEditedPrice}, fluidTypeeee : ${fluidType}` + ) - //update this price in db - await fps.updatePrice(existingPrice, { - price: remotePrice.price, - UpdatedAt: remotePrice.UpdatedAt, - startDate: remotePrice.startDate, - endDate: remotePrice.endDate, - }) - } else if (!existingPrice.UpdatedAt && remotePrice.UpdatedAt) { - //updatedAt key doesn't exist in db - await fps.updatePrice(existingPrice, { - UpdatedAt: remotePrice.UpdatedAt, - }) - } else { - log('info', `Price up to date`) + //update this price in db + await fps.updatePrice(existingPrice, { + price: remotePrice.price, + UpdatedAt: remotePrice.UpdatedAt, + startDate: remotePrice.startDate, + endDate: remotePrice.endDate, + }) + } else if (!existingPrice.UpdatedAt && remotePrice.UpdatedAt) { + //updatedAt key doesn't exist in db + await fps.updatePrice(existingPrice, { + UpdatedAt: remotePrice.UpdatedAt, + }) + } else { + log('info', `Price up to date`) + } + } else { + log('info', `Price doesn't exist in db, creating new price`) + //create price in db + await fps.createPrice(remotePrice) + } + } catch (err) { + log('error', `Error: ${err}`) + } finally { + resolve() } - } else { - log('info', `Price doesn't exist in db, creating new price`) - //create price in db - await fps.createPrice(remotePrice) - } - resolve() + }) }) - }) - await Promise.all(promises) + ) return firstEditedPrice } -const price = (item: DataloadEntity): number | null => { - return item.price ? item.price : null +const price = (item: DataloadEntity): number => { + return item.price ? item.price : 0 } const sum = (prev: number, next: number): number => { - return prev + next + if (prev) { + return prev + next + } + return next } const getTimePeriod = async ( @@ -147,40 +153,58 @@ const aggregatePrices = async ( 'debug', `Aggregation started for fluid: ${fluidType}, from ${firstDate} ` ) - const aggregatePromises = tsa.map(async ts => { - return new Promise<void>(async resolve => { - let date: DateTime = DateTime.local() - Object.assign(date, firstDate) - do { - log( - 'info', - `Step: ${ts} | Fluid: ${fluidType} | Date: ${date.day}/${date.month}/${date.year}` - ) - const tp = await getTimePeriod(ts, date) - // Get doc for aggregation - const data = await qr.fetchFluidRawDoctype(tp, TimeStep.DAY, fluidType) + await Promise.all( + tsa.map(async ts => { + return new Promise<void>(async resolve => { + let date: DateTime = DateTime.local() + Object.assign(date, firstDate) + try { + do { + log( + 'info', + `Step: ${ts} | Fluid: ${fluidType} | Date: ${date.day}/${date.month}/${date.year}` + ) + const tp = await getTimePeriod(ts, date) + // Get doc for aggregation + const data = await qr.fetchFluidRawDoctype( + tp, + TimeStep.DAY, + fluidType + ) + log( + 'info', + `DATAAAAAA: ${JSON.stringify(data)} for PERIOD : ${JSON.stringify( + tp + )} Date: ${date.day}/${date.month}/${ + date.year + } for TIMESTEP ${ts}` + ) - // Get doc to update - const docToUpdate = await qr.fetchFluidRawDoctype(tp, ts, fluidType) + // Get doc to update + const docToUpdate = await qr.fetchFluidRawDoctype(tp, ts, fluidType) + log('info', `docToUpdateEEEE: ${JSON.stringify(docToUpdate)}`) - if (docToUpdate && data && docToUpdate.data && data.data) { - docToUpdate.data[0].price = data.data.map(price).reduce(sum) - } + if (docToUpdate && data && docToUpdate.data && data.data) { + docToUpdate.data[0].price = data.data.map(price).reduce(sum) + // Save updated docs + await cdm.saveDocs(docToUpdate.data) + } - // Save updated docs - await cdm.saveDocs(docToUpdate.data) - // Update date according to timestep - if (ts === TimeStep.YEAR) { - date = date.plus({ year: 1 }).startOf('month') - } else { - date = date.plus({ month: 1 }).startOf('month') + // Update date according to timestep + if (ts === TimeStep.YEAR) { + date = date.plus({ year: 1 }).startOf('month') + } else { + date = date.plus({ month: 1 }).startOf('month') + } + } while (date < today) + } catch (err) { + log('error', `Error : ${err}`) + } finally { + resolve() } - } while (date < today) - resolve() + }) }) - }) - - await Promise.all(aggregatePromises) + ) log('debug', `Aggregation done`) } @@ -227,6 +251,8 @@ const applyPrices = async (client: Client, fluidType: FluidType) => { const firstMinuteData = await cdm.getFirstDataDateFromDoctypeWithPrice( getDoctypeTypeByFluid(fluidType) ) + // const firstDoctypeData = await cdm.getFirsDataDateFromDoctype() + // If there is data, update hourly data and daily data if (firstMinuteData || firstEditedPriceDate !== null) { const today = DateTime.now() @@ -291,7 +317,8 @@ const applyPrices = async (client: Client, fluidType: FluidType) => { ) // If lastItem has a price, skip this day (in order to save perf) - const lastItem = data.data[data.data.length - 1] + const lastItem = + data && data.data && data.data[data.data.length - 1] if (lastItem && priceData) { //if a price has been updated in backoffice re-calculates all price from the firstEditedPriceDate data && @@ -310,11 +337,18 @@ const applyPrices = async (client: Client, fluidType: FluidType) => { } while (date < today) } catch (err) { log('error', `ERROR : ${err} `) + } finally { + resolve() } - resolve() }) }) ) + log( + 'info', + `SHOULD LAUNCH AGGREGATION for ${fluidType} with ${JSON.stringify( + firstDate + )}` + ) // Call aggregation method await aggregatePrices(qr, cdm, firstDate, today, fluidType) } else log('info', `No data found for fluid ${fluidType}`) -- GitLab