| Current Path : /var/node/inatote/Inatote-Backend/vendors/ |
| Current File : /var/node/inatote/Inatote-Backend/vendors/vendors-endpoint.js |
import {
UniqueConstraintError,
InvalidPropertyError,
RequiredParameterError
} from '../helpers/errors.js'
import makeHttpError from '../helpers/http-error.js'
import makeVendor from './vendor.js'
import validateHeaders from '../helpers/validate-headers.js'
import makeUserList from '../users/user-list.js'
import makeDb from '../db/index.js';
import makeCategoryList from '../categories/category-list.js'
import makeorderList from '../orders/order-list.js'
const database = makeDb()
export default function makeVendorsEndpointHandler({ vendorList }) {
return {
postVendor : postVendor,
getVendors : getVendors,
getVendorsWithCategories : getVendorsWithCategories,
updateVendor : updateVendor,
deletevendor : deleteVendor,
vendorstats : vendorStats
}
// return async function handle(httpRequest) {
// var userSession = httpRequest.user;
// try {
// validateHeaders(httpRequest.headers)
// } catch (e) {
// //console.log("e",e);
// return makeHttpError({
// errorMessage: e.message,
// statusCode: e instanceof ApiTokenError ||
// e instanceof AuthorizationTokenError
// ? 403
// : 500
// })
// }
// switch (httpRequest.method) {
// case 'POST':
// return postVendor(httpRequest, userSession)
// case 'GET':
// return getVendors(httpRequest)
// case 'DELETE':
// return deleteVendor(httpRequest, userSession)
// case 'PUT':
// return updateVendor(httpRequest)
// case 'PATCH':
// return replaceVendor(httpRequest)
// default:
// return makeHttpError({
// statusCode: 405,
// errorMessage: `${httpRequest.method} method not allowed.`
// })
// }
// }
// todo
async function updateVendor(req , res) {
const { id } = req.params || {}
let { location } = req.body;
let data = { ...req.body }
console.log("vendorInfo" ,data.timings);
if(location){
location.coordinates = [parseFloat(location.coordinates[0]) , parseFloat(location.coordinates[1]) ]
data = {...data , location}
}
if(data.timings && data.timings.length > 0);
data.timings = data.timings.map((m)=>{
if(m.openingTime){
m.openingTime = parseInt(m.openingTime)
}
if(m.closingTime){
m.closingTime = parseInt(m.closingTime)
}
return m
})
console.log("vendorInfo.timings" ,data.timings);
console.log("data" , data);
const result = await vendorList.update({ vendorId: id, vendor: data })
return res.status(200).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 200,
data: result
})
}
// todo
async function replaceVendor(httpRequest) {
}
// todo
async function postVendor(req, res) {
//console.log("req " , req.body , req.body.location);
req.body.location['coordinates'] = [parseFloat(req.body.location["coordinates"][0]) , parseFloat(req.body.location["coordinates"][1])]
let httpRequest = req
let session = req.user
let vendorInfo = httpRequest.body
if (!(session.userType == "Admin")) {
return res.status(403).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 403,
errorMessage: `Access not granted.`
})
}
if (!vendorInfo) {
return res.status(400).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 400,
errorMessage: 'Bad request. No POST body.'
})
}
if (typeof httpRequest.body === 'string') {
try {
vendorInfo = JSON.parse(vendorInfo)
} catch {
return res.status(400).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 400,
errorMessage: 'Bad request. POST body must be valid JSON.'
})
}
}
try {
vendorInfo['imageURL'] = []
if(vendorInfo.isOpened == "true" || vendorInfo.isOpened == true ){
vendorInfo.isOpened = true
}else{
vendorInfo.isOpened = false
}
if(vendorInfo.timings && vendorInfo.timings.length > 0){
vendorInfo.timings = vendorInfo.timings.map((m)=>{
if(m.openingTime){
m.openingTime = parseInt(m.openingTime)
}
if(m.closingTime){
m.closingTime = parseInt(m.closingTime)
}
return m
})
console.log("vendorInfo.timings" ,vendorInfo.timings);
}
// if(vendorInfo.openingTime){
// vendorInfo.openingTime = parseInt(vendorInfo.openingTime)
// }
// if(vendorInfo.closingTime){
// vendorInfo.closingTime = parseInt(vendorInfo.closingTime)
// }
if(req.files && req.files.length > 0){
for (var i = 0; i < req.files.length; i++) {
var file = req.files[i]
vendorInfo['imageURL'].push(file.path)
}
//console.log(vendorInfo , req.files);
}
const vendor = makeVendor(vendorInfo)
const result = await vendorList.add(vendor)
return res.status(200).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 201,
data: result
})
} catch (e) {
console.log("e" , e);
return res.status(400).json({
errorMessage: e.message,
statusCode:
e instanceof UniqueConstraintError
? 409
: e instanceof InvalidPropertyError ||
e instanceof RequiredParameterError
? 400
: 500
})
}
}
// async function getVendor(httpRequest) {
// switch
// }
async function vendorStats(req , res){
try{
let {id} = req.params;
//console.log("ID", id);
let product = 0;
let userlist = makeUserList({database});
let categoryList = makeCategoryList({database});
let orderList = makeorderList({database})
let userCount = await userlist.getItems({companyId : id});
let categoriesCount = await categoryList.getItems({ vendorID : id});
let order = await orderList.getItems({vendorId : id})
categoriesCount.forEach(element => {
product += element.products.length;
});
let initialSale = 0;
let sale = order.reduce((a,b)=> parseInt(a) + parseInt(b.subTotal) , initialSale );
res.status(200).json({
user : userCount.length,
category : categoriesCount.length,
product ,
order : order.length,
sale
})
}
catch(err){
//console.log("ERR" , err);
return res.status(400).json({
headers: {
'Content-Type': 'application/json'
},
data: err
})
}
}
// todo
async function getVendors(req , res) {
let httpRequest = req
//console.log("req" , req.user);
const { id } = httpRequest.params || {}
const { max, before, after , latitude , longitude, name } = httpRequest.query || {}
let sorted_result = [];
let featured_result = []
const result = id
? await vendorList.findById({ vendorId: id })
:latitude && longitude ? await vendorList.getVendorByLocation({ latitude, longitude , max, userId : req.user.userId , name}) :
await vendorList.getItems({ max, before, after, name })
// name ? await vendorList.searchVendors(name)
if (result && result.length == 0){
return res.status(200).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 200,
data: []
})
}
sorted_result = result;
if(latitude && longitude){
sorted_result.sort((a,b)=> (a.ratingAverage < b.ratingAverage ? 1 : -1));
sorted_result = sorted_result.slice(0,5)
featured_result = result.filter(i=>i.featured)
return res.status(200).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 200,
data: { vendors : result , popular_vendors : sorted_result||[] , featured_vendors : featured_result || []}
})
}
return res.status(200).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 200,
data: result
})
}
async function getVendorsWithCategories(req , res){
let {id } = req.params || {};
let {name } = req.query || {};
try{
let vendor = await vendorList.findById({vendorId : id});
if( vendor.isEnabled == false){
return res.status(400).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 400,
errorMessage: 'Vendor is not enabled'
})
}
const user = await vendorList.getVendorsWithCategories({id : id, name , userId: req.user.userId});
//console.log("result" , user);
return res.status(200).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 200,
data: user
})
}
catch(err){
console.log("err" , err);
res.status(400).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 400,
errorMessage: err
})
}
}
// todo
async function deleteVendor(req , res) {
const { id } = req.params || {}
//console.log("req" , req.user);
if (!(req.user.userType == "Admin")) {
return makeHttpError({
statusCode: 403,
errorMessage: `Access not granted.`
})
}
const result = await vendorList.remove(id);
//console.log("result" , result);
return res.status(200).json({
headers: {
'Content-Type': 'application/json'
},
statusCode: 200,
data: "Sucessfully deleted"
})
}
}