123 lines
2.9 KiB
JavaScript
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,
|
|
}
|