redhare-demo/helpers/db-repo/product-repo.js

123 lines
2.9 KiB
JavaScript

import { db } from '..'
import Category from 'models/Category'
import Product from 'models/Product'
const getAll = async ({ page, page_size }, filter = {}, sort = {}) => {
await db.connect()
const products = await Product.find(filter)
.select(
'-description -info -specification -category -category_levels -sizes -reviews -numReviews'
)
.skip((page - 1) * page_size)
.limit(page_size)
.sort(sort)
const productsLength = await Product.countDocuments(filter)
const mainMaxPrice = Math.max(
...(await Product.find({
...filter.categoryFilter,
inStock: { $gte: 1 },
}).distinct('price'))
)
const mainMinPrice = Math.min(
...(await Product.find({
...filter.categoryFilter,
inStock: { $gte: 1 },
}).distinct('price'))
)
await db.disconnect()
return {
mainMaxPrice,
mainMinPrice,
products,
productsLength,
pagination: {
currentPage: page,
nextPage: page + 1,
previousPage: page - 1,
hasNextPage: page_size * page < productsLength,
hasPreviousPage: page > 1,
lastPage: Math.ceil(productsLength / page_size),
},
}
}
const getById = async id => {
await db.connect()
const result = await Product.findById(id)
if (!result) throw '产品不存在'
await db.disconnect()
return result
}
const create = async params => {
await db.connect()
const newProduct = new Product(params)
const mainCategory = await Category.findOne({
parent: undefined,
})
if (mainCategory) newProduct.category.unshift(mainCategory?._id)
await newProduct.save()
await db.disconnect()
}
const _delete = async id => {
await db.connect()
const product = await Product.findById(id)
if (!product) throw '产品不存在'
await Product.findByIdAndDelete(id)
await db.disconnect()
}
const update = async (id, params) => {
await db.connect()
const product = await Product.findById(id)
if (!product) throw '产品不存在'
await Product.findByIdAndUpdate({ _id: id }, { ...params })
await db.disconnect()
}
const getItemDetail = async id => {
await db.connect()
const product = await Product.findById({ _id: id })
.populate('category_levels.level_one')
.populate('category_levels.level_two')
.populate('category_levels.Level_three')
.lean()
if (!product) return { notFound: true }
const productCategoryID = product.category.pop()
const smilarProducts = await Product.find({
category: { $in: productCategoryID },
inStock: { $gte: 1 },
_id: { $ne: product._id },
})
.select(
'-description -info -specification -category -category_levels -sizes -reviews -numReviews'
)
.limit(11)
.lean()
await db.disconnect()
return {
product,
smilarProducts: {
title: '类似商品',
products: smilarProducts,
},
}
}
export const productRepo = {
getAll,
getById,
create,
update,
delete: _delete,
getItemDetail,
}