461 lines
16 KiB
JavaScript
461 lines
16 KiB
JavaScript
import is from '@sindresorhus/is'
|
|
import { destr } from 'destr'
|
|
import { rest } from 'msw'
|
|
import { db } from '@db/apps/ecommerce/db'
|
|
import { paginateArray } from '@api-utils/paginateArray'
|
|
|
|
export const handlerAppsEcommerce = [
|
|
// 👉 Products
|
|
// Get Product List
|
|
rest.get('/api/apps/ecommerce/products', (req, res, ctx) => {
|
|
const q = req.url.searchParams.get('q')
|
|
const stock = req.url.searchParams.get('stock')
|
|
const category = req.url.searchParams.get('category')
|
|
const status = req.url.searchParams.get('status')
|
|
const sortBy = req.url.searchParams.get('sortBy')
|
|
const orderBy = req.url.searchParams.get('orderBy')
|
|
const itemsPerPage = req.url.searchParams.get('itemsPerPage')
|
|
const page = req.url.searchParams.get('page')
|
|
const searchQuery = is.string(q) ? q : undefined
|
|
const queryLower = (searchQuery ?? '').toString().toLowerCase()
|
|
const parsedStock = destr(stock)
|
|
const stockLocal = is.boolean(parsedStock) ? parsedStock : undefined
|
|
const parsedSortBy = destr(sortBy)
|
|
const sortByLocal = is.string(parsedSortBy) ? parsedSortBy : ''
|
|
const parsedOrderBy = destr(orderBy)
|
|
const orderByLocal = is.string(parsedOrderBy) ? parsedOrderBy : ''
|
|
const parsedItemsPerPage = destr(itemsPerPage)
|
|
const parsedPage = destr(page)
|
|
const itemsPerPageLocal = is.number(parsedItemsPerPage) ? parsedItemsPerPage : 10
|
|
const pageLocal = is.number(parsedPage) ? parsedPage : 1
|
|
|
|
// Filtering Products
|
|
let filteredProducts = db.products.filter(product => ((product.productName.toLowerCase().includes(queryLower) || product.productBrand.toLowerCase().includes(queryLower))
|
|
&& product.category === (category || product.category)
|
|
&& (product.status === (status || product.status))
|
|
&& (typeof stockLocal === 'undefined' ? true : (product.stock === stockLocal)))).reverse()
|
|
|
|
// Sort
|
|
if (sortByLocal) {
|
|
if (sortByLocal === 'product') {
|
|
filteredProducts = filteredProducts.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.productName.toLowerCase() > b.productName.toLowerCase() ? 1 : -1
|
|
else if (orderByLocal === 'desc')
|
|
return a.productName.toLowerCase() < b.productName.toLowerCase() ? 1 : -1
|
|
|
|
return 0
|
|
})
|
|
}
|
|
if (sortByLocal === 'category') {
|
|
filteredProducts = filteredProducts.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.category > b.category ? 1 : -1
|
|
else if (orderByLocal === 'desc')
|
|
return a.category < b.category ? 1 : -1
|
|
|
|
return 0
|
|
})
|
|
}
|
|
if (sortByLocal === 'status') {
|
|
filteredProducts = filteredProducts.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.status > b.status ? 1 : -1
|
|
else if (orderByLocal === 'desc')
|
|
return a.status < b.status ? 1 : -1
|
|
|
|
return 0
|
|
})
|
|
}
|
|
if (sortByLocal === 'price') {
|
|
filteredProducts = filteredProducts.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return Number(a.price.slice(1)) > Number(b.price.slice(1)) ? 1 : -1
|
|
else if (orderByLocal === 'desc')
|
|
return Number(a.price.slice(1)) < Number(b.price.slice(1)) ? 1 : -1
|
|
|
|
return 0
|
|
})
|
|
}
|
|
if (sortByLocal === 'qty') {
|
|
filteredProducts = filteredProducts.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.qty > b.qty ? 1 : -1
|
|
else if (orderByLocal === 'desc')
|
|
return a.qty < b.qty ? 1 : -1
|
|
|
|
return 0
|
|
})
|
|
}
|
|
if (sortByLocal === 'sku') {
|
|
filteredProducts = filteredProducts.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.sku > b.sku ? 1 : -1
|
|
else if (orderByLocal === 'desc')
|
|
return a.sku < b.sku ? 1 : -1
|
|
|
|
return 0
|
|
})
|
|
}
|
|
}
|
|
|
|
return res(ctx.status(200), ctx.json({
|
|
products: paginateArray(filteredProducts, itemsPerPageLocal, pageLocal), total: filteredProducts.length,
|
|
}))
|
|
}),
|
|
|
|
// 👉 Delete Product
|
|
rest.delete('/api/apps/ecommerce/products/:id', (req, res, ctx) => {
|
|
const id = Number(req.params.id)
|
|
const productIndex = db.products.findIndex(e => e.id === id)
|
|
if (productIndex >= 0) {
|
|
db.products.splice(productIndex, 1)
|
|
|
|
return res(ctx.status(204))
|
|
}
|
|
|
|
return res(ctx.status(404))
|
|
}),
|
|
|
|
// 👉 Orders
|
|
// Get Order List
|
|
rest.get('/api/apps/ecommerce/orders', (req, res, ctx) => {
|
|
const q = req.url.searchParams.get('q')
|
|
const sortBy = req.url.searchParams.get('sortBy')
|
|
const orderBy = req.url.searchParams.get('orderBy')
|
|
const itemsPerPage = req.url.searchParams.get('itemsPerPage')
|
|
const page = req.url.searchParams.get('page')
|
|
const searchQuery = is.string(q) ? q : undefined
|
|
const queryLower = (searchQuery ?? '').toString().toLowerCase()
|
|
const parsedSortBy = destr(sortBy)
|
|
const sortByLocal = is.string(parsedSortBy) ? parsedSortBy : ''
|
|
const parsedOrderBy = destr(orderBy)
|
|
const orderByLocal = is.string(parsedOrderBy) ? parsedOrderBy : ''
|
|
const parsedItemsPerPage = destr(itemsPerPage)
|
|
const parsedPage = destr(page)
|
|
const itemsPerPageLocal = is.number(parsedItemsPerPage) ? parsedItemsPerPage : 10
|
|
const pageLocal = is.number(parsedPage) ? parsedPage : 1
|
|
|
|
const filterOrders = db.orderData.filter(order => {
|
|
return (order.customer.toLowerCase().includes(queryLower)
|
|
|| order.email.toLowerCase().includes(queryLower)
|
|
|| order.order.toString().includes(queryLower))
|
|
}).reverse()
|
|
|
|
if (sortByLocal) {
|
|
if (sortByLocal === 'order') {
|
|
filterOrders.sort((a, b) => {
|
|
if (orderByLocal === 'desc')
|
|
return b.order - a.order
|
|
else
|
|
return a.order - b.order
|
|
})
|
|
}
|
|
if (sortByLocal === 'customers') {
|
|
filterOrders.sort((a, b) => {
|
|
if (orderByLocal === 'desc')
|
|
return b.customer.localeCompare(a.customer)
|
|
else
|
|
return a.customer.localeCompare(b.customer)
|
|
})
|
|
}
|
|
if (sortByLocal === 'date') {
|
|
filterOrders.sort((a, b) => {
|
|
if (orderByLocal === 'desc')
|
|
return Number(new Date(b.date)) - Number(new Date(a.date))
|
|
else
|
|
return Number(new Date(a.date)) - Number(new Date(b.date))
|
|
})
|
|
}
|
|
if (sortByLocal === 'status') {
|
|
filterOrders.sort((a, b) => {
|
|
if (orderByLocal === 'desc')
|
|
return b.status.localeCompare(a.status)
|
|
else
|
|
return a.status.localeCompare(b.status)
|
|
})
|
|
}
|
|
}
|
|
if (sortByLocal === 'spent') {
|
|
filterOrders.sort((a, b) => {
|
|
if (orderByLocal === 'desc')
|
|
return Number(b.spent) - Number(a.spent)
|
|
else
|
|
return Number(a.spent) - Number(b.spent)
|
|
})
|
|
}
|
|
|
|
return res(ctx.status(200), ctx.json({
|
|
orders: paginateArray(filterOrders, itemsPerPageLocal, pageLocal), total: filterOrders.length,
|
|
}))
|
|
}),
|
|
|
|
// Delete Order
|
|
rest.delete('/api/apps/ecommerce/orders/:id', (req, res, ctx) => {
|
|
const id = Number(req.params.id)
|
|
const orderIndex = db.orderData.findIndex(e => e.id === id)
|
|
if (orderIndex >= 0)
|
|
db.orderData.splice(orderIndex, 1)
|
|
|
|
return res(ctx.status(204))
|
|
}),
|
|
|
|
// 👉 Customers
|
|
// Get single Customer
|
|
rest.get(('/api/apps/ecommerce/customers/:id'), (req, res, ctx) => {
|
|
const customerId = Number(req.params.id)
|
|
const customerIndex = db.customerData.findIndex(e => e.customerId === customerId)
|
|
const customer = db.customerData[customerIndex]
|
|
|
|
Object.assign(customer, {
|
|
status: 'Active',
|
|
contact: '+1 (234) 567 890',
|
|
})
|
|
if (customer) {
|
|
return res(ctx.status(200), ctx.json(customer))
|
|
}
|
|
else {
|
|
return res(ctx.status(404))
|
|
}
|
|
}),
|
|
|
|
// Get Customer List
|
|
rest.get(('/api/apps/ecommerce/customers'), (req, res, ctx) => {
|
|
const q = req.url.searchParams.get('q')
|
|
const sortBy = req.url.searchParams.get('sortBy')
|
|
const orderBy = req.url.searchParams.get('orderBy')
|
|
const itemsPerPage = req.url.searchParams.get('itemsPerPage')
|
|
const page = req.url.searchParams.get('page')
|
|
const parsedSortBy = destr(sortBy)
|
|
const sortByLocal = is.string(parsedSortBy) ? parsedSortBy : ''
|
|
const parsedOrderBy = destr(orderBy)
|
|
const orderByLocal = is.string(parsedOrderBy) ? parsedOrderBy : ''
|
|
const parsedItemsPerPage = destr(itemsPerPage)
|
|
const parsedPage = destr(page)
|
|
const itemsPerPageLocal = is.number(parsedItemsPerPage) ? parsedItemsPerPage : 10
|
|
const pageLocal = is.number(parsedPage) ? parsedPage : 1
|
|
const searchQuery = is.string(q) ? q : undefined
|
|
const queryLowered = (searchQuery ?? '').toString().toLowerCase()
|
|
|
|
const filteredCustomers = db.customerData.filter(customer => {
|
|
return (customer.customer.toLowerCase().includes(queryLowered)
|
|
|| customer.country.toLowerCase().includes(queryLowered)
|
|
|| customer.email.toLowerCase().includes(queryLowered))
|
|
}).reverse()
|
|
|
|
|
|
// Sort Customers
|
|
if (sortByLocal) {
|
|
if (sortByLocal === 'customer') {
|
|
filteredCustomers.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.customer.localeCompare(b.customer)
|
|
|
|
return b.customer.localeCompare(a.customer)
|
|
})
|
|
}
|
|
if (sortByLocal === 'country') {
|
|
filteredCustomers.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.country.localeCompare(b.country)
|
|
|
|
return b.country.localeCompare(a.country)
|
|
})
|
|
}
|
|
if (sortByLocal === 'customerId') {
|
|
filteredCustomers.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.customerId - b.customerId
|
|
|
|
return b.customerId - a.customerId
|
|
})
|
|
}
|
|
if (sortByLocal === 'orders') {
|
|
filteredCustomers.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.order - b.order
|
|
|
|
return b.order - a.order
|
|
})
|
|
}
|
|
}
|
|
if (sortByLocal === 'totalSpent') {
|
|
filteredCustomers.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.totalSpent - b.totalSpent
|
|
|
|
return b.totalSpent - a.totalSpent
|
|
})
|
|
}
|
|
|
|
return res(ctx.status(200), ctx.json({
|
|
customers: paginateArray(filteredCustomers, itemsPerPageLocal, pageLocal), total: filteredCustomers.length,
|
|
}))
|
|
}),
|
|
|
|
// 👉 Manage Reviews.
|
|
// Get Reviews
|
|
rest.get(('/api/apps/ecommerce/reviews'), (req, res, ctx) => {
|
|
const q = req.url.searchParams.get('q')
|
|
const sortBy = req.url.searchParams.get('sortBy')
|
|
const orderBy = req.url.searchParams.get('orderBy')
|
|
const itemsPerPage = req.url.searchParams.get('itemsPerPage')
|
|
const status = req.url.searchParams.get('status')
|
|
const page = req.url.searchParams.get('page')
|
|
const parsedSortBy = destr(sortBy)
|
|
const sortByLocal = is.string(parsedSortBy) ? parsedSortBy : ''
|
|
const parsedOrderBy = destr(orderBy)
|
|
const orderByLocal = is.string(parsedOrderBy) ? parsedOrderBy : ''
|
|
const parsedItemsPerPage = destr(itemsPerPage)
|
|
const parsedPage = destr(page)
|
|
const itemsPerPageLocal = is.number(parsedItemsPerPage) ? parsedItemsPerPage : 10
|
|
const pageLocal = is.number(parsedPage) ? parsedPage : 1
|
|
const searchQuery = is.string(q) ? q : undefined
|
|
const queryLower = (searchQuery ?? '').toString().toLowerCase()
|
|
|
|
|
|
// Filtering Reviews
|
|
const filteredReviews = db.reviews.filter(review => {
|
|
const { product, reviewer, email } = review
|
|
|
|
return ((product.toLowerCase().includes(queryLower) || reviewer.toLowerCase().includes(queryLower) || email.toLowerCase().includes(queryLower) || review.head.toLowerCase().includes(queryLower) || review.para.toLowerCase().includes(queryLower))
|
|
&& (review.status === status || status === 'All'))
|
|
})
|
|
|
|
|
|
// Sort
|
|
if (sortByLocal) {
|
|
if (sortByLocal === 'product') {
|
|
filteredReviews.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.product.toLowerCase() > b.product.toLowerCase() ? 1 : -1
|
|
else if (orderByLocal === 'desc')
|
|
return a.product.toLowerCase() < b.product.toLowerCase() ? 1 : -1
|
|
|
|
return 0
|
|
})
|
|
}
|
|
if (sortByLocal === 'reviewer') {
|
|
filteredReviews.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.reviewer.toLowerCase() > b.reviewer.toLowerCase() ? 1 : -1
|
|
else if (orderByLocal === 'desc')
|
|
return a.reviewer.toLowerCase() < b.reviewer.toLowerCase() ? 1 : -1
|
|
|
|
return 0
|
|
})
|
|
}
|
|
if (sortByLocal === 'date') {
|
|
filteredReviews.sort((a, b) => {
|
|
if (orderByLocal === 'desc')
|
|
return Number(new Date(b.date)) - Number(new Date(a.date))
|
|
else if (orderByLocal === 'asc')
|
|
return Number(new Date(a.date)) - Number(new Date(b.date))
|
|
|
|
return 0
|
|
})
|
|
}
|
|
}
|
|
if (sortByLocal === 'status') {
|
|
filteredReviews.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.status.toLowerCase() > b.status.toLowerCase() ? 1 : -1
|
|
else if (orderByLocal === 'desc')
|
|
return a.status.toLowerCase() < b.status.toLowerCase() ? 1 : -1
|
|
else
|
|
return 0
|
|
})
|
|
}
|
|
|
|
return res(ctx.status(200), ctx.json({
|
|
reviews: paginateArray(filteredReviews, itemsPerPageLocal, pageLocal), total: filteredReviews.length,
|
|
}))
|
|
}),
|
|
|
|
// Delete Review
|
|
rest.delete(('/api/apps/ecommerce/reviews/:id'), (req, res, ctx) => {
|
|
const id = Number(req.params.id)
|
|
const reviewIndex = db.reviews.findIndex(e => e.id === id)
|
|
if (reviewIndex !== -1) {
|
|
db.reviews.splice(reviewIndex, 1)
|
|
|
|
return res(ctx.status(200))
|
|
}
|
|
|
|
return res(ctx.status(404))
|
|
}),
|
|
|
|
// 👉 Referrals
|
|
// Get Referrals
|
|
rest.get(('/api/apps/ecommerce/referrals'), (req, res, ctx) => {
|
|
const sortBy = req.url.searchParams.get('sortBy')
|
|
const orderBy = req.url.searchParams.get('orderBy')
|
|
const itemsPerPage = req.url.searchParams.get('itemsPerPage')
|
|
const page = req.url.searchParams.get('page')
|
|
const parsedSortBy = destr(sortBy)
|
|
const sortByLocal = is.string(parsedSortBy) ? parsedSortBy : ''
|
|
const parsedOrderBy = destr(orderBy)
|
|
const orderByLocal = is.string(parsedOrderBy) ? parsedOrderBy : ''
|
|
const parsedItemsPerPage = destr(itemsPerPage)
|
|
const parsedPage = destr(page)
|
|
const itemsPerPageLocal = is.number(parsedItemsPerPage) ? parsedItemsPerPage : 10
|
|
const pageLocal = is.number(parsedPage) ? parsedPage : 1
|
|
const filteredReferrals = [...db.referrals]
|
|
if (sortByLocal) {
|
|
if (sortByLocal === 'users') {
|
|
filteredReferrals.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.user.localeCompare(b.user)
|
|
else
|
|
return b.user.localeCompare(a.user)
|
|
})
|
|
}
|
|
if (sortByLocal === 'referred-id') {
|
|
filteredReferrals.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.referredId - b.referredId
|
|
else if (orderByLocal === 'desc')
|
|
return b.referredId - a.referredId
|
|
|
|
return 0
|
|
})
|
|
}
|
|
if (sortByLocal === 'earning') {
|
|
filteredReferrals.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return Number(a.earning.slice(1)) - Number(b.earning.slice(1))
|
|
else if (orderByLocal === 'desc')
|
|
return Number(b.earning.slice(1)) - Number(a.earning.slice(1))
|
|
|
|
return 0
|
|
})
|
|
}
|
|
if (sortByLocal === 'value') {
|
|
filteredReferrals.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return Number(a.value.slice(1)) - Number(b.value.slice(1))
|
|
else if (orderByLocal === 'desc')
|
|
return Number(b.value.slice(1)) - Number(a.value.slice(1))
|
|
|
|
return 0
|
|
})
|
|
}
|
|
if (sortByLocal === 'status') {
|
|
filteredReferrals.sort((a, b) => {
|
|
if (orderByLocal === 'asc')
|
|
return a.status.toLowerCase() > b.status.toLowerCase() ? 1 : -1
|
|
else if (orderByLocal === 'desc')
|
|
return a.status.toLowerCase() < b.status.toLowerCase() ? 1 : -1
|
|
|
|
return 0
|
|
})
|
|
}
|
|
}
|
|
|
|
return res(ctx.status(200), ctx.json({
|
|
referrals: paginateArray(filteredReferrals, itemsPerPageLocal, pageLocal),
|
|
total: filteredReferrals.length,
|
|
}))
|
|
}),
|
|
]
|