first commit

This commit is contained in:
2024-05-16 16:05:41 +02:00
commit adf8283ae0
197 changed files with 26666 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
const asyncHandler = require("express-async-handler");
const { save, getAll } = require("../services/favorites");
exports.save = asyncHandler(async (req, res, next) => {
try{
let result = await save(req.body);
console.log(result);
res.status(204).send();
}catch(err){
console.log(err);
return res.status(500).send(err);
}
});
exports.getAll = asyncHandler(async (req, res, next) => {
console.log("controller getAll");
try{
let result = await getAll();
console.log(result);
res.status(200).send(result);
}catch(err){
console.log(err);
return res.status(500).send(err);
}
});
+167
View File
@@ -0,0 +1,167 @@
const asyncHandler = require("express-async-handler");
const fetch = require('node-fetch');
const { LotDb } = require("../services/lotDb");
const lotDb = new LotDb();
const { SaleDb } = require("../services/saleDb");
const saleDb = new SaleDb();
const ApiURL = "http://host.docker.internal:3020/api";
// scrapping
exports.getInfos = asyncHandler(async (req, res, next) => {
let url = req.params.url
url = encodeURIComponent(url);
fetch(ApiURL+'/lot/getInfos/'+url)
.then(response => response.json())
.then(data => {
res.json(data);
})
.catch(error => {
console.error(error);
});
});
exports.getPictures = asyncHandler(async (req, res, next) => {
let url = req.params.url
url = encodeURIComponent(url);
fetch(ApiURL+'/lot/getPictures/'+url)
.then(response => response.json())
.then(data => {
res.json(data);
})
.catch(error => {
console.error(error);
});
});
exports.getLotsBySale = asyncHandler(async (req, res, next) => {
let id = req.params.id
const 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);
res.json(Lots);
});
// Follow Sale
exports.NextItem = asyncHandler(async (req, res, next) => {
try{
Sale = await saleDb.getByIDPlatform(req.body.idSalePlatform, req.body.platform);
if(!Sale){
console.error("Sale not found");
return res.status(404).send("Sale not found");
}
let Lot = await lotDb.getByIDPlatform(req.body.idPlatform, req.body.platform);
if(Lot == null){
console.log("Creating new Lot");
Lot = {
idPlatform: String(req.body.idPlatform),
platform: req.body.platform,
timestamp: req.body.timestamp,
lotNumber: String(req.body.lotNumber),
title: req.body.title,
description: req.body.description,
EstimateLow: req.body.EstimateLow,
EstimateHigh: req.body.EstimateHigh,
RawData: req.body.RawData,
sale_id: Sale._id,
}
await lotDb.post(Lot);
}else{
console.log("Updating Lot");
Lot.timestamp = req.body.timestamp;
Lot.lotNumber = String(req.body.lotNumber);
Lot.title = req.body.title;
Lot.description = req.body.description;
Lot.EstimateLow = req.body.EstimateLow;
Lot.EstimateHigh = req.body.EstimateHigh;
Lot.RawData = req.body.RawData;
await lotDb.put(Lot._id, Lot);
}
res.status(204).send();
}catch(err){
console.log(err);
return res.status(500).send(err);
}
});
exports.Bid = asyncHandler(async (req, res, next) => {
try{
let Lot = await lotDb.getByIDPlatform(req.body.idPlatform, req.body.platform);
if(Lot){
console.log("Update Lot Bid");
BidInfo = {
timestamp: req.body.timestamp,
amount: req.body.amount,
auctioned_type: req.body.auctioned_type,
}
// If Lot.BidInfo doesn't exist, initialize it as an empty array
if (!Lot.Bids) {
Lot.Bids = [];
}
// Add BidInfo to the array
Lot.Bids.push(BidInfo);
await lotDb.put(Lot._id, Lot);
}else{
console.error("Lot not found");
return res.status(404).send("Lot not found");
}
res.status(204).send();
}catch(err){
console.log(err);
return res.status(500).send(err);
}
});
exports.AuctionedItem = asyncHandler(async (req, res, next) => {
try{
let Lot = await lotDb.getByIDPlatform(req.body.idPlatform, req.body.platform);
if(Lot){
console.log("Update Lot AuctionedItem");
Lot.auctioned = {
timestamp: req.body.timestamp,
amount: req.body.amount,
auctioned_type: req.body.auctioned_type,
sold: req.body.sold,
}
await lotDb.put(Lot._id, Lot);
}else{
console.error("Lot not found");
return res.status(404).send("Lot not found");
}
res.status(204).send();
}catch(err){
console.log(err);
return res.status(500).send(err);
}
});
+282
View File
@@ -0,0 +1,282 @@
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);
}
});