const asyncHandler = require("express-async-handler"); const moment = require('moment-timezone'); const { ObjectId } = require('mongodb'); const { SaleDb } = require("../services/saleDb"); const saleDb = new SaleDb(); const { LotDb } = require("../services/lotDb"); const lotDb = new LotDb(); const agenda = require('../services/agenda'); const {Agent} = require('../services/agent'); const agent = new Agent(); exports.getSaleInfos = asyncHandler(async (req, res, next) => { let url = req.params.url agent.getSaleInfos(url) .then(data => { return res.status(200).json(data); }) .catch(error => { console.error(error); return res.status(500).send(error); }); // url = encodeURIComponent(url); // fetch(ApiAgentURL+'/sale/getSaleInfos/'+url) // .then(response => response.json()) // .then(data => { // res.json(data); // }) // .catch(error => { // console.error(error); // }); }); exports.prepareSale = asyncHandler(async (req, res, next) => { try{ const id = req.params.id; agent.prepareSale(id) .then(data => { return res.status(200).json({"message": "Lots created"}); }) .catch(error => { console.error(error); return res.status(500).send(error); }); // url = encodeURIComponent(url); // fetch(ApiAgentURL+'/sale/getLotList/'+url) // .then(response => response.json()) // .then(async data => { // console.log(data); // for (let lot of data) { // lot.sale_id = Sale._id // await lotDb.post(lot); // } // res.status(200).send({"message": "Lots created"}) // }) // .catch(error => { // console.error(error); // return res.status(500).send(error); // }); }catch(err){ console.error(err); return res.status(500).send(err); } }); exports.followSale = asyncHandler(async (req, res, next) => { try{ const id = req.params.id; agent.followSale(id) .then(data => { res.status(200).send(data); }) .catch(error => { console.error(error); return res.status(500).send(error); }); }catch(err){ console.error(err); return res.status(500).send(err); } }); // DB exports.get = asyncHandler(async (req, res, next) => { try{ const id = req.params.id; let result = await saleDb.get(id); res.status(200).send(result); }catch(err){ console.log(err); return res.status(500).send(err); } }); exports.post = asyncHandler(async (req, res, next) => { try{ // check if double let Sale = await saleDb.getByIDPlatform(req.body.idPlatform, req.body.platform); if(Sale){ return res.status(500).send("Sale already exists"); } let createData = await saleDb.post(req.body); console.log(createData.insertedId); const NowParis = moment.tz(new Date(),"Europe/Paris") // Scheduling the Prepare job const dateSaleMinus24Hours = moment.tz(req.body.date, "Europe/Paris").subtract(24, 'hours'); if(dateSaleMinus24Hours.isAfter(NowParis)){ const jobPrepare = agenda.create('prepareSale', { saleId: createData.insertedId }); jobPrepare.schedule(dateSaleMinus24Hours.toDate()); await jobPrepare.save(); }else{ console.log("Sale is less than 24 hours away, no Prepare Job");} // Scheduling the Follow job const dateSale = moment.tz(req.body.date, "Europe/Paris"); if(dateSale.isAfter(NowParis)){ const jobFollow = agenda.create('followSale', { saleId: createData.insertedId }); jobFollow.schedule(dateSale.toDate()); await jobFollow.save(); }else{ console.log("Sale is in the past, no Follow Job");} res.status(204).send(); }catch(err){ console.log(err); return res.status(500).send(err); } }); exports.put = asyncHandler(async (req, res, next) => { try{ const id = req.params.id; let updatedDocument = { ...req.body }; delete updatedDocument._id; console.log(updatedDocument); let result = await saleDb.put(id, updatedDocument); console.log(result); res.status(200).send(result); }catch(err){ console.log(err); return res.status(500).send(err); } }); exports.delete = asyncHandler(async (req, res, next) => { try{ const id = req.params.id; // Remove all lots linked to the sale console.log("Deleting lots sale_id: "+id); await lotDb.deleteAllLotBySaleId(id); // Remove the sale await saleDb.remove(id); //remove the Jobs const JobSale = await agenda.jobs({ 'data.saleId': new ObjectId(id) }); for (const job of JobSale) { await job.remove(); } res.status(200).send({"message": "Sale and Lots deleted"}); }catch(err){ console.log(err); return res.status(500).send(err); } }); // Fucntions exports.getAll = asyncHandler(async (req, res, next) => { try{ let result = await saleDb.getAll(); res.status(200).send(result); }catch(err){ console.log(err); return res.status(500).send(err); } }); exports.getByUrl = asyncHandler(async (req, res, next) => { try{ let url = req.params.url url = decodeURIComponent(url); let result = await saleDb.getByUrl(url); //console.log(result); res.status(200).send(result); }catch(err){ console.log(err); return res.status(500).send(err); } }); exports.postProcessing = asyncHandler(async (req, res, next) => { try{ const id = req.params.id; Sale = await saleDb.get(id); if(!Sale){ console.error("Sale not found"); return res.status(404).send("Sale not found"); } Lots = await lotDb.getBySaleId(Sale._id.toString(),Sale.platform); let startTime = 0; if (Array.isArray(Lots[0].Bids)) { startTime = Lots[0].Bids[0].timestamp; }else{ startTime = Lots[0].timestamp; } let LastBid = [...Lots].reverse().find(lot => lot.auctioned !== undefined); let endTime = 0; if (Array.isArray(LastBid.Bids)) { endTime = LastBid.Bids[LastBid.Bids.length-1].timestamp; }else{ endTime = LastBid.timestamp; } console.log("Start Time: "+startTime); console.log("End Time: "+endTime); let duration = endTime-startTime; let totalAmount = 0; for (let lot of Lots) { if (lot.auctioned) { totalAmount += lot.auctioned.amount; } } function calculateMedian(array) { array.sort((a, b) => a - b); let middleIndex = Math.floor(array.length / 2); if (array.length % 2 === 0) { // array has an even length return (array[middleIndex - 1] + array[middleIndex]) / 2; } else { // array has an odd length return array[middleIndex]; } } const amounts = Lots.map(lot => lot.auctioned?.amount).filter(Boolean); //console.error(Lots); let postProcessing = { nbrLots: Lots.length, duration: duration, durationPerLots: (duration/Lots.length).toFixed(0), totalAmount: totalAmount, averageAmount: (totalAmount/Lots.length).toFixed(2), medianAmount: calculateMedian(amounts).toFixed(2), } console.log(postProcessing); Sale.postProcessing = postProcessing; await saleDb.put(Sale._id, Sale); res.status(200).send({"message": "Post Processing done"}); }catch(err){ console.log(err); return res.status(500).send(err); } });