90 lines
2.7 KiB
JavaScript
90 lines
2.7 KiB
JavaScript
import Product from "../models/Product.js";
|
|
import ProductStat from "../models/ProductStat.js";
|
|
import Transaction from "../models/Transaction.js";
|
|
import User from "../models/User.js"
|
|
import getCountryIso3 from "country-iso-2-to-3"
|
|
|
|
|
|
export const getProducts = async(req, res) => {
|
|
try {
|
|
const products = await Product.find();
|
|
const productStats = await Promise.all(
|
|
products.map(async(product) => {
|
|
const stat = await ProductStat.find({
|
|
productId: product._id
|
|
})
|
|
return{
|
|
...product._doc, stat,
|
|
}
|
|
})
|
|
);
|
|
res.status(200).json(productStats)
|
|
|
|
} catch (error) {
|
|
res.status(404).json({message: error.message})
|
|
}
|
|
};
|
|
|
|
export const getCustomers = async(req, res) => {
|
|
try {
|
|
const customers = await User.find({role: "user"}).select("-password");
|
|
res.status(200).json(customers);
|
|
|
|
} catch (error) {
|
|
res.status(404).json({message: error.message})
|
|
}
|
|
};
|
|
|
|
export const getTransactions = async(req, res) => {
|
|
try {
|
|
const {page = 1, pageSize = 25, sort = null, search = ""} = req.query;
|
|
const generateSort = () => {
|
|
const sortParsed = JSON.parse(sort);
|
|
const sortFormatted = {
|
|
[sortParsed.field]: (sortParsed.sort = "asc" ? 1 : -1),
|
|
};
|
|
return sortFormatted;
|
|
};
|
|
const sortFormatted = Boolean(sort) ? generateSort() : {};
|
|
const transactions = await Transaction.find({
|
|
$or: [
|
|
{cost: {$regex: new RegExp(search, "i")}},
|
|
{userId: {$regex: new RegExp(search, "i")}},
|
|
],
|
|
})
|
|
.sort(sortFormatted).skip(page * pageSize).limit(pageSize);
|
|
|
|
const total = await Transaction.countDocuments({
|
|
name: {$regex: search, $options: "i"},
|
|
});
|
|
res.status(200).json({transactions, total,});
|
|
|
|
} catch (error) {
|
|
res.status(404).json({message: error.message})
|
|
}
|
|
};
|
|
|
|
export const getGeography = async(req, res) => {
|
|
try {
|
|
const users = await User.find();
|
|
const mapLocations = users.reduce((acc, {country}) => {
|
|
const countryISO3 = getCountryIso3(country);
|
|
if(!acc [countryISO3]){
|
|
acc[countryISO3] = 0;
|
|
}
|
|
acc[countryISO3]++;
|
|
return acc;
|
|
}, {});
|
|
|
|
const formattedLocations = Object.entries(mapLocations).map(
|
|
([country, count]) => {
|
|
return{id: country, value: count}
|
|
}
|
|
);
|
|
res.status(200).json(formattedLocations)
|
|
|
|
} catch (error) {
|
|
res.status(404).json({message: error.message})
|
|
}
|
|
}
|
|
|