262 lines
6.2 KiB
JavaScript
262 lines
6.2 KiB
JavaScript
const path = require("path");
|
|
const historyRepository = require(path.join(__dirname, "../history"));
|
|
|
|
const sortOptions = ["desc", "asc"];
|
|
const includeWinesOptions = ["true", "false"];
|
|
|
|
const all = (req, res) => {
|
|
const { sort, includeWines } = req.query;
|
|
|
|
if (sort !== undefined && !sortOptions.includes(sort)) {
|
|
return res.status(400).send({
|
|
message: `Sort option must be: '${sortOptions.join(", ")}'`,
|
|
success: false
|
|
});
|
|
}
|
|
|
|
if (includeWines !== undefined && !includeWinesOptions.includes(includeWines)) {
|
|
return res.status(400).send({
|
|
message: `includeWines option must be: '${includeWinesOptions.join(", ")}'`,
|
|
success: false
|
|
});
|
|
}
|
|
|
|
return historyRepository
|
|
.all(includeWines == "true")
|
|
.then(winners =>
|
|
res.send({
|
|
winners: sort !== "asc" ? winners : winners.reverse(),
|
|
success: true
|
|
})
|
|
)
|
|
.catch(error => {
|
|
const { statusCode, message } = error;
|
|
|
|
return res.status(statusCode || 500).send({
|
|
success: false,
|
|
message: message || "Unable to fetch winners."
|
|
});
|
|
});
|
|
};
|
|
|
|
const byDate = (req, res) => {
|
|
let { date } = req.params;
|
|
|
|
const regexDate = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
|
|
if (!isNaN(date)) {
|
|
date = new Date(new Date(parseInt(date * 1000)).setHours(0, 0, 0, 0));
|
|
} else if (regexDate.test(date)) {
|
|
date = new Date(date);
|
|
} else if (date !== undefined) {
|
|
return res.status(400).send({
|
|
message: "Invalid date parameter, allowed epoch seconds or YYYY-MM-DD.",
|
|
success: false
|
|
});
|
|
}
|
|
|
|
return historyRepository
|
|
.byDate(date)
|
|
.then(winners =>
|
|
res.send({
|
|
date: date,
|
|
winners: winners,
|
|
success: true
|
|
})
|
|
)
|
|
.catch(error => {
|
|
const { statusCode, message } = error;
|
|
|
|
return res.status(statusCode || 500).send({
|
|
success: false,
|
|
message: message || "Unable to fetch winner by date."
|
|
});
|
|
});
|
|
};
|
|
|
|
const groupByDate = (req, res) => {
|
|
const { sort, includeWines } = req.query;
|
|
|
|
if (sort !== undefined && !sortOptions.includes(sort)) {
|
|
return res.status(400).send({
|
|
message: `Sort option must be: '${sortOptions.join(", ")}'`,
|
|
success: false
|
|
});
|
|
}
|
|
|
|
if (includeWines !== undefined && !includeWinesOptions.includes(includeWines)) {
|
|
return res.status(400).send({
|
|
message: `includeWines option must be: '${includeWinesOptions.join(", ")}'`,
|
|
success: false
|
|
});
|
|
}
|
|
|
|
return historyRepository
|
|
.groupByDate(includeWines == "true", sort)
|
|
.then(lotteries =>
|
|
res.send({
|
|
lotteries: lotteries,
|
|
success: true
|
|
})
|
|
)
|
|
.catch(error => {
|
|
const { statusCode, message } = error;
|
|
|
|
return res.status(statusCode || 500).send({
|
|
success: false,
|
|
message: message || "Unable to fetch winner by date."
|
|
});
|
|
});
|
|
};
|
|
|
|
const latest = (req, res) => {
|
|
return historyRepository
|
|
.latest()
|
|
.then(winners =>
|
|
res.send({
|
|
...winners,
|
|
success: true
|
|
})
|
|
)
|
|
.catch(error => {
|
|
const { statusCode, message } = error;
|
|
|
|
return res.status(statusCode || 500).send({
|
|
success: false,
|
|
message: message || "Unable to fetch winner by date."
|
|
});
|
|
});
|
|
};
|
|
|
|
const byName = (req, res) => {
|
|
const { name } = req.params;
|
|
const { sort } = req.query;
|
|
|
|
if (sort !== undefined && !sortOptions.includes(sort)) {
|
|
return res.status(400).send({
|
|
message: `Sort option must be: '${sortOptions.join(", ")}'`,
|
|
success: false
|
|
});
|
|
}
|
|
|
|
return historyRepository
|
|
.byName(name, sort)
|
|
.then(winner =>
|
|
res.send({
|
|
winner: winner,
|
|
success: true
|
|
})
|
|
)
|
|
.catch(error => {
|
|
const { statusCode, message } = error;
|
|
|
|
return res.status(statusCode || 500).send({
|
|
success: false,
|
|
message: message || "Unable to fetch winner by name."
|
|
});
|
|
});
|
|
};
|
|
|
|
const search = (req, res) => {
|
|
const { name, sort } = req.query;
|
|
|
|
if (sort !== undefined && !sortOptions.includes(sort)) {
|
|
return res.status(400).send({
|
|
message: `Sort option must be: '${sortOptions.join(", ")}'`,
|
|
success: false
|
|
});
|
|
}
|
|
|
|
return historyRepository
|
|
.search(name, sort)
|
|
.then(winners =>
|
|
res.send({
|
|
winners: winners || [],
|
|
success: true
|
|
})
|
|
)
|
|
.catch(error => {
|
|
const { statusCode, message } = error;
|
|
|
|
return res.status(statusCode || 500).send({
|
|
success: false,
|
|
message: message || "Unable to fetch winner by name."
|
|
});
|
|
});
|
|
};
|
|
|
|
const groupByColor = (req, res) => {
|
|
const { includeWines } = req.query;
|
|
|
|
if (includeWines !== undefined && !includeWinesOptions.includes(includeWines)) {
|
|
return res.status(400).send({
|
|
message: `includeWines option must be: '${includeWinesOptions.join(", ")}'`,
|
|
success: false
|
|
});
|
|
}
|
|
|
|
return historyRepository
|
|
.groupByColor(includeWines == "true")
|
|
.then(colors =>
|
|
res.send({
|
|
colors: colors,
|
|
success: true
|
|
})
|
|
)
|
|
.catch(error => {
|
|
const { statusCode, message } = error;
|
|
|
|
return res.status(statusCode || 500).send({
|
|
success: false,
|
|
message: message || "Unable to fetch winners by color."
|
|
});
|
|
});
|
|
};
|
|
|
|
const orderByWins = (req, res) => {
|
|
let { includeWines, limit } = req.query;
|
|
|
|
if (includeWines !== undefined && !includeWinesOptions.includes(includeWines)) {
|
|
return res.status(400).send({
|
|
message: `includeWines option must be: '${includeWinesOptions.join(", ")}'`,
|
|
success: false
|
|
});
|
|
}
|
|
|
|
if (limit && isNaN(limit)) {
|
|
return res.status(400).send({
|
|
message: "If limit query parameter is provided it must be a number",
|
|
success: false
|
|
});
|
|
} else if (!!!isNaN(limit)) {
|
|
limit = Number(limit);
|
|
}
|
|
|
|
return historyRepository
|
|
.orderByWins(includeWines == "true", limit)
|
|
.then(winners =>
|
|
res.send({
|
|
winners: winners,
|
|
success: true
|
|
})
|
|
)
|
|
.catch(error => {
|
|
const { statusCode, message } = error;
|
|
|
|
return res.status(statusCode || 500).send({
|
|
success: false,
|
|
message: message || "Unable to fetch winners by color."
|
|
});
|
|
});
|
|
};
|
|
|
|
module.exports = {
|
|
all,
|
|
byDate,
|
|
groupByDate,
|
|
latest,
|
|
byName,
|
|
search,
|
|
groupByColor,
|
|
orderByWins
|
|
};
|