115 lines
2.6 KiB
JavaScript
115 lines
2.6 KiB
JavaScript
import joi from 'joi'
|
|
|
|
import { setJson, apiHandler } from '@/helpers/api'
|
|
import { db, getQuery, productRepo } from '@/helpers'
|
|
import Category from '@/models/Category'
|
|
|
|
const getAllProduct = apiHandler(async req => {
|
|
const query = getQuery(req)
|
|
|
|
const page = query.page ? +query.page : 1
|
|
const page_size = query.page_size ? +query.page_size : 10
|
|
const sort = query.sort ? +query.sort : 1
|
|
|
|
const { category, search, inStock, discount, price } = query
|
|
|
|
//? Filters
|
|
await db.connect()
|
|
const currentCategory = await Category.findOne({ slug: category })
|
|
await db.disconnect()
|
|
|
|
const categoryFilter = currentCategory
|
|
? {
|
|
category: { $in: currentCategory._id.toString() },
|
|
}
|
|
: {}
|
|
|
|
const searchFilter = search
|
|
? {
|
|
title: {
|
|
$regex: search,
|
|
$options: 'i',
|
|
},
|
|
}
|
|
: {}
|
|
|
|
const inStockFilter = inStock === 'true' ? { inStock: { $gte: 1 } } : {}
|
|
|
|
const discountFilter = discount === 'true' ? { discount: { $gte: 1 }, inStock: { $gte: 1 } } : {}
|
|
|
|
const priceFilter = price
|
|
? {
|
|
price: {
|
|
$gte: +price.split('-')[0],
|
|
$lte: +price.split('-')[1],
|
|
},
|
|
}
|
|
: {}
|
|
|
|
//? Sort
|
|
const order =
|
|
sort === 3
|
|
? { price: 1 }
|
|
: sort === 4
|
|
? { price: -1 }
|
|
: sort === 2
|
|
? { sold: -1 }
|
|
: sort === 1
|
|
? { createdAt: -1 }
|
|
: sort === 5
|
|
? { rating: -1 }
|
|
: sort === 6
|
|
? { discount: -1 }
|
|
: { _id: -1 }
|
|
|
|
const result = await productRepo.getAll(
|
|
{
|
|
page,
|
|
page_size,
|
|
},
|
|
{
|
|
...categoryFilter,
|
|
...inStockFilter,
|
|
...discountFilter,
|
|
...priceFilter,
|
|
...searchFilter,
|
|
},
|
|
order
|
|
)
|
|
return setJson({
|
|
data: result,
|
|
})
|
|
})
|
|
|
|
const createProduct = apiHandler(
|
|
async req => {
|
|
const body = await req.json()
|
|
await productRepo.create(body)
|
|
return setJson({
|
|
message: '新增商品成功',
|
|
})
|
|
},
|
|
{
|
|
isJwt: true,
|
|
identity: 'admin',
|
|
schema: joi.object({
|
|
title: joi.string().required(),
|
|
price: joi.number().required(),
|
|
category: joi.array().required(),
|
|
images: joi.array().required(),
|
|
info: joi.array().required(),
|
|
specification: joi.array().required(),
|
|
inStock: joi.number(),
|
|
description: joi.string().allow(''),
|
|
discount: joi.number(),
|
|
sizes: joi.array(),
|
|
colors: joi.array(),
|
|
category_levels: joi.object(),
|
|
}),
|
|
}
|
|
)
|
|
|
|
export const GET = getAllProduct
|
|
export const POST = createProduct
|
|
export const dynamic = 'force-dynamic'
|