northwind-rest-api
Version:
Local REST API Exposing 'Northwind Traders' Database.
86 lines (78 loc) • 3.24 kB
JavaScript
const dal = require("../data-access-layer/dal");
const imageHelper = require("../helpers/image-helper");
async function getAllProducts() {
const products = await dal.getAllProducts();
return products;
};
async function getOneProduct(id) {
const products = await dal.getAllProducts();
const product = products.find(p => p.id === id);
return product;
};
async function addProduct(product, image) {
const products = await dal.getAllProducts();
const maxId = products.reduce((maxId, p) => p.id > maxId ? p.id : maxId, 0);
product.id = maxId + 1;
const fileName = await imageHelper.saveProductImage(image);
product.imageUrl = fileName ? "http://localhost:3030/api/products/images/" + fileName : null;
products.push(product);
await dal.saveAllProducts(products);
return product;
};
async function updateProduct(newProduct, image) {
const products = await dal.getAllProducts();
const existingProduct = products.find(p => p.id === newProduct.id);
if (!existingProduct) return null;
for (const prop in newProduct) {
if (newProduct[prop] !== undefined) {
existingProduct[prop] = newProduct[prop];
}
}
const currentFileName = existingProduct.imageUrl ? existingProduct.imageUrl.substring(existingProduct.imageUrl.lastIndexOf("/") + 1) : null;
const newFileName = await imageHelper.updateProductImage(currentFileName, image);
if (newFileName) {
existingProduct.imageUrl = "http://localhost:3030/api/products/images/" + newFileName;
}
await dal.saveAllProducts(products);
return existingProduct;
};
async function deleteProduct(id) {
const products = await dal.getAllProducts();
const index = products.findIndex(p => p.id === id);
if (index === -1) return;
const existingProduct = products[index];
const currentFileName = existingProduct.imageUrl ? existingProduct.imageUrl.substring(existingProduct.imageUrl.lastIndexOf("/") + 1) : null;
await imageHelper.deleteProductImage(currentFileName)
products.splice(index, 1);
await dal.saveAllProducts(products);
};
async function getTopProducts() {
const products = await dal.getAllProducts();
const now = new Date();
const base1 = now.getDate();
const base2 = base1 + 1;
const base3 = base1 + 2;
const knuthMultiplicativeHashConstant = 2654435761;
const index1 = (base1 * knuthMultiplicativeHashConstant) % products.length;
const index2 = (base2 * knuthMultiplicativeHashConstant) % products.length;
const index3 = (base3 * knuthMultiplicativeHashConstant) % products.length;
const product1 = products[index1];
const product2 = products[index2];
const product3 = products[index3];
const topProducts = [product1, product2, product3];
return topProducts;
};
async function getOutOfStockProducts() {
const products = await dal.getAllProducts();
const outOfStock = products.filter(p => p.stock === 0);
return outOfStock;
};
module.exports = {
getAllProducts,
getOneProduct,
addProduct,
updateProduct,
deleteProduct,
getTopProducts,
getOutOfStockProducts
};