| Current Path : /var/node/inatote/qa_inatote/rating/ |
| Current File : /var/node/inatote/qa_inatote/rating/rating-list.js |
import makeRating from './ratings.js'
import { UniqueConstraintError } from '../helpers/errors.js'
import makeHttpError from '../helpers/http-error.js'
export default function makeratingList({ database }) {
return Object.freeze({
add,
findByEmail,
findById,
getItems,
remove,
replace,
update,
updateVendorOrProduct
})
async function getItems({ max = 100, page = 1, userId, objectId, type } = {}) {
const db = await database
var query = {}
if (userId) {
query = { userId: db.makeId(userId) }
}
if (objectId) {
query = {...query , objectId: db.makeId(objectId) }
}
if (type) {
query = {...query , type: db.makeId(type) }
}
try {
//console.log("query", query);
var res = await db
.collection('ratings')
.find(query)
.limit(Number(max))
.skip(max * (page - 1))
.toArray();
//console.log("res", res);
return res
} catch (err) {
//console.log("er", err);
}
}
async function add({ userId, objectId ,...rating }) {
const db = await database
try {
rating.userId = db.makeId(userId) ;
// rating.objectId = db.makeId(objectId) ;
rating.createdDate = new Date()
rating.lastUpdatedDate = new Date()
const { result, ops } = await db
.collection('ratings')
.insertOne(rating)
.catch(mongoError => {
const [errorCode] = mongoError.message.split(' ')
if (errorCode === 'E11000') {
const [_, mongoIndex] = mongoError.message.split(':')[2].split(' ')
throw new UniqueConstraintError(
mongoIndex === 'vendorEmailIndex' ? 'emailAddress' : 'vendorId'
)
}
throw mongoError
})
return {
success: result.ok === 1,
created: rating
}
}
catch (err) {
//console.log("err", err);
return makeHttpError({
statusCode: 400,
errorMessage: err.message
})
}
// const { result, ops } = await db
// .collection('products')
// .insertOne(product)
// .catch(mongoError => {
// const [errorCode] = mongoError.message.split(' ')
// if (errorCode === 'E11000') {
// const [_, mongoIndex] = mongoError.message.split(':')[2].split(' ')
// throw new UniqueConstraintError(
// mongoIndex === 'productEmailIndex' ? 'emailAddress' : 'productId'
// )
// }
// throw mongoError
// })
}
async function findById(id) {
const db = await database
//console.log(id)
const result = await db
.collection('ratings')
.findOne({_id : db.makeId(id)})
//console.log("result" , result);
if (result) {
return result
}
return
}
async function findByEmail({ emailAddress }) {
return {
emailAddress: emailAddress
}
}
async function remove({ productId, ...product }) {
return {
productId: productId
}
}
// todo:
async function replace(product) {
}
// todo:
async function update({ riderId, vendorId, products , order , ratingInfo}) {
const db = await database
var q = {};
var s = {}
for (var item in products) {
q[`products.$.ratingSum`] = ratingInfo.products;
q[`products.$.ratingCount`] = 1;
const query = {
$inc: q,
// $set : {ratingAverage : }
}
var result = await db.collection('categories').findOneAndUpdate({
// _id: db.makeId(categoryId),
"products.productId": db.makeId(products[item])
}, query, { new: true , returnNewDocument: true})
//console.log(result )
let prod = result.value.products;
updateAverage(prod[0])
}
var vendorResult = await db.collection('vendors').findOne({ _id : db.makeId(vendorId)});
vendorResult.ratingCount = vendorResult.ratingCount? vendorResult.ratingCount+1 : 1;
vendorResult.ratingSum = vendorResult.ratingSum? vendorResult.ratingSum + ratingInfo.vendor : ratingInfo.vendor ;
vendorResult.ratingAverage = vendorResult.ratingSum / vendorResult.ratingCount;
//console.log("vendorResult" ,vendorResult);
let update = await db.collection("vendors").save(vendorResult);
//console.log("update" , update);
var riderResult = await db.collection('users').findOne({ _id : db.makeId(riderId)});
riderResult.ratingCount = riderResult.ratingCount? riderResult.ratingCount+1 : 1;
riderResult.ratingSum = riderResult.ratingSum? riderResult.ratingSum + ratingInfo.vendor : ratingInfo.vendor ;
riderResult.ratingAverage = riderResult.ratingSum / riderResult.ratingCount;
//console.log("riderResult" ,riderResult);
let updateRider = await db.collection("users").save(riderResult);
order.ratingCount = order.ratingCount? order.ratingCount+1 : 1;
order.ratingSum = order.ratingSum? order.ratingSum + ratingInfo.order : ratingInfo.order ;
order.ratingAverage = order.ratingSum / order.ratingCount;
//console.log("order" ,order);
let updateOrder = await db.collection("orders").save(order);
return result.created
}
async function updateAverage(product){
//console.log("product" , product);
const db = await database
try{
var { result } = await db.collection('categories').update({
// _id: db.makeId(categoryId),
"products.productId": db.makeId(product.productId)
}, {
$set : {'products.$.ratingAverage' :product.ratingSum / product.ratingCount }
}, { new: true })
}
catch(err){
//console.log("err" , err);
}
}
async function updateVendorOrProduct({ id, items , ratingType }) {
const db = await database
//console.log(id)
//console.log(items)
items.lastUpdatedDate = new Date();
var q = {};
if(ratingType == "product"){
for (var item in items) {
//console.log(item)
q[`products.$.${item}`] = items[item]
}
const query = {
$set: q
}
let result;
//console.log(query)
result = await db.collection("categories").updateOne({
"products.productId": db.makeId(id)
}
,query, {})
//console.log("result" , result);
}
else{
result = await db.collection('vendors').updateOne({
_id: db.makeId(id)
}, query, {})
}
// //console.log("res",result)
// if (result.nModified != 1) {
// return {
// success: false,
// error: "Something went wrong when performing this operation."
// }
// }
return {
success: true,
vendor: items
};
}
function documentToRating({ _id: productId, ...doc }, markup) {
return makeRating({ productId, ...doc })
}
}