You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1789 lines
55 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

//Get the data models
const { Supplier, DeliveryBoy, profilePictureSupplier } = require("../models/supplier");
const { FriendRequest } = require("../models/supplier");
const { Tanker,Tankerbooking } = require("../models/tankers");
const { ProfilePicture, User } = require("../models/User");
const supplierController = require("../controllers/supplierController");
const customJwtAuth = require("../customAuthJwt");
const fastify = require("fastify")({
logger: true,
//disableRequestLogging: true,
genReqId(req) {
// you get access to the req here if you need it - must be a synchronous function
return uuidv4();
},
});
const moment = require('moment');
const fastifyEnv = require("fastify-env");
const boom = require("boom");
const emailValidator = require("email-validator");
const libphonenumberjs = require("libphonenumber-js");
fastify.register(customJwtAuth);
const schema = {
type: "object",
required: ["PORT"],
properties: {
PORT: {
type: "string",
default: 3000,
},
APIVERSION: {
type: "string",
default: "1.0.0",
},
},
};
const options = {
confKey: "config", // optional, default: 'config'
schema: schema,
// data: data // optional, default: process.env
};
fastify.register(fastifyEnv, options).ready((err) => {
if (err) console.error(err);
console.log(fastify.config.PORT); // or fastify[options.confKey]
// output: { PORT: 3000 }
fastify.decorate("conf", {
port: fastify.config.PORT,
APIVERSION: fastify.config.APIVERSION,
});
});
const apiversion = "1.0.0";
// fastify.register(require('fastify-cookie'))
// fastify.register(require('fastify-session'), {
// secret: 'my-secret-key',
// cookie: { secure: true }
// });
isSupplierFormUrlEncoded = (req) => {
var isSupplierFormUrlEncoded = false;
console.log("check is Supplier encoe url funtion");
// This iterates through the req headers object.
// could not access req.headers.content-type due to the hyphen in the content-type key.
// console.log(`${key}: ${value}`);
for (const [key, value] of Object.entries(req.headers)) {
if (`${key}` === "content-type") {
if (`${value}` == "application/x-www-form-urlencoded") {
// console.log( "data supplied is with content type," , `${value}`)
// set isUserFormUrlEncoded value to true
isSupplierFormUrlEncoded = true;
// create user object with form variables . Password is used from the request object directly.
s_data = {
suppliername: req.body.suppliername,
phone: req.body.phone,
office_address: req.body.office_address,
password: req.body.password,
emails: [
{
email: req.body.email,
},
],
profile: {
firstName: req.body.firstName,
lastName: req.body.lastName,
},
};
return {
isSupplierFormUrlEncoded: isSupplierFormUrlEncoded,
supplier: s_data,
};
} else {
return { isSupplierFormUrlEncoded: false, s_data: "" };
}
}
}
};
fastify.register((fastify, opts, done) => {
fastify.addContentTypeParser(
"application/json",
{ parseAs: "buffer" },
function (_req, body, done) {
try {
done(null, body);
} catch (error) {
error.statusCode = 400;
done(error, undefined);
}
}
);
done(null);
});
//Login Supplier Handler
exports.loginSupplier = async (request, reply) => {
loginObject = await supplierController.loginSupplier(request);
console.log("loginObject...", loginObject);
if (loginObject.same) {
const phoneVerified = loginObject.supplier.phoneVerified;
const oneTimePasswordSetFlag = loginObject.supplier.oneTimePasswordSetFlag;
console.log(
"oneTimePasswordSetFlag is ......",
oneTimePasswordSetFlag,
typeof oneTimePasswordSetFlag,
typeof phoneVerified
);
if (!phoneVerified) {
reply.send({
simplydata: {
error: false,
phoneVerified: false,
phone: loginObject.supplier.phone,
oneTimePasswordSetFlag: oneTimePasswordSetFlag,
message: "Please Verify your phone number",
},
});
} else if (oneTimePasswordSetFlag) {
reply.send({
simplydata: {
error: false,
phoneVerified: phoneVerified,
phone: loginObject.supplier.phone,
oneTimePasswordSetFlag: true,
message: "Password must be reset",
},
});
} else {
const token = fastify.jwt.sign(
{
suppliername: loginObject.supplier.suppliername,
supplierId: loginObject.supplier._id,
roles: loginObject.supplier.profile.role,
},
//expiresIn: expressed in seconds or a string describing a time span zeit/ms. Eg: 60, "2 days", "10h", "7d".
//A numeric value is interpreted as a seconds count. If you use a string be sure you provide the time units (days, hours, etc),
//otherwise milliseconds unit is used by default ("120" is equal to "120ms").
{ expiresIn: "30d" }
);
console.log(token, "..token");
var arr = loginObject.supplier.profile.role;
var arrayToString = JSON.stringify(Object.assign({}, arr)); // convert array to string
var stringToJsonObject = JSON.parse(arrayToString); // convert string to json object
var s_id = loginObject.supplier.supplierId;
console.log(s_id, "supplierId");
var profilePicture = await profilePictureSupplier.findOne({ supplierId: s_id });
// request.session.set('supplierId', loginObject.supplier._id)
if (!profilePicture) {
reply.send({
simplydata: {
error: false,
apiversion: fastify.config.APIVERSION,
access_token: token,
email: loginObject.supplier.emails,
phone: loginObject.supplier.phone,
supplierId: loginObject.supplier.supplierId,
suppliername: loginObject.supplier.suppliername,
office_address: loginObject.supplier.profile.office_address,
phoneVerified: loginObject.supplier.phoneVerified,
oneTimePasswordSetFlag: loginObject.supplier.oneTimePasswordSetFlag,
latitude: loginObject.supplier.latitude,
longitude: loginObject.supplier.longitude,
type: loginObject.supplier.profile.role,
description : loginObject.supplier.description,
typeasobj: stringToJsonObject,
},
});
}
if (profilePicture) {
reply.send({
simplydata: {
error: false,
apiversion: fastify.config.APIVERSION,
access_token: token,
picture: profilePicture.picture,
email: loginObject.supplier.emails,
phone: loginObject.supplier.phone,
supplierId: loginObject.supplier.supplierId,
suppliername: loginObject.supplier.suppliername,
office_address: loginObject.supplier.profile.office_address,
phoneVerified: loginObject.supplier.phoneVerified,
oneTimePasswordSetFlag: loginObject.supplier.oneTimePasswordSetFlag,
latitude: loginObject.supplier.latitude,
longitude: loginObject.supplier.longitude,
description : loginObject.supplier.description,
type: loginObject.supplier.profile.role,
typeasobj: stringToJsonObject,
},
});
}
}
} else {
error = {
simplydata: {
error: true,
code: 400,
message: "Invalid SupplierId , Password supplied",
},
};
reply.send(error);
}
};
//Login Delivery Handler
exports.loginDeliveryBoy = async (request, reply) => {
phone = request.body.phone;
phoneVerificationCode = request.body.phoneVerificationCode;
// check if user exists in the system. If user exists , display message that
// username is not available
console.log(
"this is the phone and verification code",
phone,
phoneVerificationCode
);
deliveryBoyExists = await DeliveryBoy.findOne({
phone: phone,
phoneVerified: false,
phoneVerificationCode: phoneVerificationCode,
});
console.log(deliveryBoyExists);
if (deliveryBoyExists) {
// update the phoneVerified flag to true.
const filter = {
phone: phone,
phoneVerificationCode: phoneVerificationCode,
};
const update = { phoneVerified: true };
const doc = await DeliveryBoy.findOneAndUpdate(filter, update);
updatedDeliveryBoy = await DeliveryBoy.findOne({ phone: phone });
}
loginObject = await supplierController.loginDeliveryBoy(request);
console.log("loginObject...", loginObject);
if (loginObject.same) {
const phoneVerified = loginObject.delivery.phoneVerified;
const oneTimePasswordSetFlag = loginObject.delivery.oneTimePasswordSetFlag;
console.log(
"oneTimePasswordSetFlag is ......",
oneTimePasswordSetFlag,
typeof oneTimePasswordSetFlag,
typeof phoneVerified
);
if (!phoneVerified) {
reply.send({
simplydata: {
error: false,
phoneVerified: false,
phone: loginObject.delivery.phone,
oneTimePasswordSetFlag: oneTimePasswordSetFlag,
message: "Please Verify your phone number",
},
});
} else if (oneTimePasswordSetFlag) {
reply.send({
simplydata: {
error: false,
phoneVerified: phoneVerified,
phone: loginObject.delivery.phone,
oneTimePasswordSetFlag: true,
message: "Password must be reset",
},
});
} else {
const token = fastify.jwt.sign(
{
deliveryBoyname: loginObject.delivery.name,
deliveryBoyId: loginObject.delivery._id,
},
//expiresIn: expressed in seconds or a string describing a time span zeit/ms. Eg: 60, "2 days", "10h", "7d".
//A numeric value is interpreted as a seconds count. If you use a string be sure you provide the time units (days, hours, etc),
//otherwise milliseconds unit is used by default ("120" is equal to "120ms").
{ expiresIn: "30d" }
);
console.log(token, "..token");
var d_id = loginObject.delivery._id;
console.log(d_id, "deliveryId");
var profilePicture = await ProfilePicture.findOne({
deliveryBoyId: d_id,
});
// request.session.set('supplierId', loginObject.supplier._id)
if (!profilePicture) {
reply.send({
simplydata: {
error: false,
apiversion: fastify.config.APIVERSION,
access_token: token,
phone: loginObject.delivery.phone,
deliveryBoyId: loginObject.delivery.deliveryBoyId,
deliveryBoyname: loginObject.delivery.name,
address: loginObject.delivery.address,
phoneVerified: loginObject.delivery.phoneVerified,
oneTimePasswordSetFlag: loginObject.delivery.oneTimePasswordSetFlag,
supplierId: loginObject.delivery.supplierId,
suppliername: loginObject.delivery.suppliername,
longitude: loginObject.delivery.longitude,
latitude: loginObject.delivery.latitude,
},
});
}
if (profilePicture) {
reply.send({
simplydata: {
error: false,
apiversion: fastify.config.APIVERSION,
access_token: token,
picture: profilePicture.picture,
phone: loginObject.delivery.phone,
deliveryBoyId: loginObject.delivery.deliveryBoyId,
deliveryBoyname: loginObject.delivery.name,
address: loginObject.delivery.address,
phoneVerified: loginObject.delivery.phoneVerified,
oneTimePasswordSetFlag: loginObject.delivery.oneTimePasswordSetFlag,
supplierId: loginObject.delivery.supplierId,
suppliername: loginObject.delivery.suppliername,
longitude: loginObject.delivery.longitude,
latitude: loginObject.delivery.latitude,
},
});
}
}
} else {
error = {
simplydata: {
error: true,
code: 400,
message: "Invalid Details",
},
};
reply.send(error);
}
};
exports.deliveryBoyVerifyPhone = async (req, reply) => {
console.log("-------------------------------------------------");
try {
phone = req.body.phone;
phoneVerificationCode = req.body.phoneVerificationCode;
// check if user exists in the system. If user exists , display message that
// username is not available
console.log(
"this is the phone and verification code",
phone,
phoneVerificationCode
);
deliveryBoyExists = await DeliveryBoy.findOne({
phone: phone,
//phoneVerified: false,
phoneVerificationCode: phoneVerificationCode,
});
console.log(deliveryBoyExists);
if (deliveryBoyExists) {
// update the phoneVerified flag to true.
const filter = {
phone: phone,
phoneVerificationCode: phoneVerificationCode,
};
const update = { phoneVerified: true };
const doc = await DeliveryBoy.findOneAndUpdate(filter, update);
updatedDeliveryBoy = await DeliveryBoy.findOne({ phone: phone });
if (updatedDeliveryBoy.phoneVerified) {
loginObject = await supplierController.loginDeliveryBoy(req);
console.log("loginObject...", loginObject);
if (loginObject.same) {
const phoneVerified = loginObject.delivery.phoneVerified;
const oneTimePasswordSetFlag =
loginObject.delivery.oneTimePasswordSetFlag;
console.log(
"oneTimePasswordSetFlag is ......",
oneTimePasswordSetFlag,
typeof oneTimePasswordSetFlag,
typeof phoneVerified
);
if (!phoneVerified) {
reply.send({
simplydata: {
error: false,
phoneVerified: false,
phone: loginObject.delivery.phone,
oneTimePasswordSetFlag: oneTimePasswordSetFlag,
message: "Please Verify your phone number",
},
});
} else if (oneTimePasswordSetFlag) {
reply.send({
simplydata: {
error: false,
phoneVerified: phoneVerified,
phone: loginObject.delivery.phone,
oneTimePasswordSetFlag: true,
message: "Password must be reset",
},
});
} else {
const token = fastify.jwt.sign(
{
deliveryBoyname: loginObject.delivery.name,
deliveryBoyId: loginObject.delivery._id,
},
//expiresIn: expressed in seconds or a string describing a time span zeit/ms. Eg: 60, "2 days", "10h", "7d".
//A numeric value is interpreted as a seconds count. If you use a string be sure you provide the time units (days, hours, etc),
//otherwise milliseconds unit is used by default ("120" is equal to "120ms").
{ expiresIn: "30d" }
);
console.log(token, "..token");
var d_id = loginObject.delivery._id;
console.log(d_id, "deliveryId");
var profilePicture = await ProfilePicture.findOne({
deliveryBoyId: d_id,
});
// request.session.set('supplierId', loginObject.supplier._id)
if (!profilePicture) {
reply.send({
simplydata: {
error: false,
apiversion: fastify.config.APIVERSION,
access_token: token,
phone: loginObject.delivery.phone,
deliveryBoyId: loginObject.delivery.deliveryBoyId,
deliveryBoyname: loginObject.delivery.name,
address: loginObject.delivery.address,
phoneVerified: loginObject.delivery.phoneVerified,
oneTimePasswordSetFlag:
loginObject.delivery.oneTimePasswordSetFlag,
supplierId: loginObject.delivery.supplierId,
suppliername: loginObject.delivery.suppliername,
longitude: loginObject.delivery.longitude,
latitude: loginObject.delivery.latitude,
},
});
}
if (profilePicture) {
reply.send({
simplydata: {
error: false,
apiversion: fastify.config.APIVERSION,
access_token: token,
picture: profilePicture.picture,
phone: loginObject.delivery.phone,
deliveryBoyId: loginObject.delivery.deliveryBoyId,
deliveryBoyname: loginObject.delivery.name,
address: loginObject.delivery.address,
phoneVerified: loginObject.delivery.phoneVerified,
oneTimePasswordSetFlag:
loginObject.delivery.oneTimePasswordSetFlag,
supplierId: loginObject.delivery.supplierId,
suppliername: loginObject.delivery.suppliername,
longitude: loginObject.delivery.longitude,
latitude: loginObject.delivery.latitude,
},
});
}
}
} else {
error = {
simplydata: {
error: true,
code: 400,
message: "Invalid Details",
},
};
reply.send(error);
}
}
}else {
error = {
armintatankdata: {
error: true,
code: 10005,
message: "10005 - Verification code entered cannot be validated.",
},
};
req.body.regError = error;
reply.send(error);
}
} catch (err) {
throw boom.boomify(err);
}
};
// Check if all the required fields are supplied by the user
exports.fieldCheck = async (req, reply) => {
try {
s_Data = {
suppliername: req.body.suppliername,
emails: req.body.emails,
password: req.body.password,
services: { password: { bcrypt: req.body.password } },
phone: req.body.phone,
profile: {
firstName: req.body.firstName,
lastName: req.body.lastName,
contactNumber: req.body.phone,
alternativeContactNumber: req.body.alternativeContactNumber,
country: req.body.country,
state: req.body.state,
city: req.body.city,
office_address: req.body.office_adress,
zip: req.body.zip,
},
};
var supplier = new Supplier(s_Data);
console.log(supplier, "..supplier");
//password is not at the top level in the collection.
password = req.body.password;
// capture fields if data is sent via form instead of json encoding
checkFormEncoding = isSupplierFormUrlEncoded(req);
if (checkFormEncoding.isSupplierFormUrlEncoded) {
suppliertobeInserted = checkFormEncoding.supplier;
supplier.suppliername = suppliertobeInserted.suppliername;
supplier.phone = suppliertobeInserted.phone;
supplier.emails = suppliertobeInserted.emails;
password = suppliertobeInserted.password;
}
console.log(
"User to be inserted is ",
supplier.suppliername,
password,
supplier.phone,
supplier.profile
);
// check if all rerquired fields are passed.
if (
!(
supplier.suppliername &&
password &&
supplier.phone &&
// user.profile.firstName &&
// user.profile.lastName &&
// user.profile.address1 &&
supplier.emails[0].email
)
) {
console.log(
supplier.suppliername,
password,
supplier.phone,
// user.profile.firstName,
// user.profile.lastName,
supplier.emails[0].email
);
// Required Fields are missing
suppliedvalues =
supplier.suppliername +
" ," +
password +
" ," +
supplier.phone +
" ," +
supplier.firstName +
" ," +
supplier.lastName +
" ," +
supplier.emails[0].email;
error = {
armintatankdata: {
error: true,
code: 10004,
message:
"10004 - suppliername, password, phone , firstname , lastname email city country state address1 and zip are required fields. Supplied values are " +
suppliedvalues,
},
};
req.body.regError = error;
reply.send(error);
}
} catch (err) {
throw boom.boomify(err);
}
};
exports.validatePhoneFormat = async (req, reply) => {
try {
var supplier = new Supplier(req.body);
// check if user supplied phone is of the right format.
// Handle if the user data is supplied via a url encoded form
// capture fields if data is sent via form instead of json encoding
checkFormEncoding = isSupplierFormUrlEncoded(req);
console.log(checkFormEncoding);
if (checkFormEncoding.isSupplierFormUrlEncoded) {
suppliertobeInserted = checkFormEncoding.supplier;
supplier.suppliername = suppliertobeInserted.suppliername;
supplierser.firstName = suppliertobeInserted.firstName;
supplier.lastName = suppliertobeInserted.lastName;
supplier.phone = suppliertobeInserted.phone;
supplier.emails = suppliertobeInserted.emails;
}
if (supplier) {
const phoneNumber = libphonenumberjs.parsePhoneNumber(supplier.phone);
if (phoneNumber) {
// access returned collection
if (!phoneNumber.isValid()) {
error = {
armintatankdata: {
error: true,
code: 10002,
message:
"10002 - Phone # " +
supplier.phone +
" is not a valid phone number",
},
};
req.body.regError = error;
reply.status(406).send(error);
}
}
}
} catch (err) {
throw boom.boomify(err);
}
};
exports.verifySupplier = async (req, reply) => {
try {
var supplier = new Supplier(req.body);
// Handle if the user data is supplied via a url encoded form
// capture fields if data is sent via form instead of json encoding
checkFormEncoding = isSupplierFormUrlEncoded(req);
if (checkFormEncoding.isSupplierFormUrlEncoded) {
suppliertobeInserted = checkFormEncoding.supplier;
supplier.suppliername = suppliertobeInserted.suppliername;
supplier.firstName = suppliertobeInserted.firstName;
supplier.lastName = suppliertobeInserted.lastName;
supplierr.phone = suppliertobeInserted.phone;
supplier.emails = suppliertobeInserted.emails;
}
phone = supplier.phone;
supplierpass = req.body.password;
// check if user exists in the system. If user exists , display message that
// phone number is not available
supplierExists = await Supplier.findOne({ phone: phone });
if (supplierExists) {
// return user exists message
error = {
armintatankdata: {
error: true,
code: 10001,
message:
"10001 - Phone " +
supplierExists.phone +
" is not available. please use a different phone number",
},
};
req.body.regError = error;
reply.send(error);
}
} catch (err) {
throw boom.boomify(err);
}
};
exports.validateEmailFormat = async (req, reply) => {
try {
var supplier = new Supplier(req.body);
// Handle if the user data is supplied via a url encoded form
// capture fields if data is sent via form instead of json encoding
checkFormEncoding = isSupplierFormUrlEncoded(req);
if (checkFormEncoding.isSupplierFormUrlEncoded) {
suppliertobeInserted = checkFormEncoding.supplier;
supplier.suppliername = suppliertobeInserted.suppliername;
supplier.firstName = suppliertobeInserted.firstName;
supplier.lastName = suppliertobeInserted.lastName;
supplierr.phone = suppliertobeInserted.phone;
supplier.emails = suppliertobeInserted.emails;
}
supplieremail = await supplier.emails[0].email;
// check if user supplied email is of the right format.
if (supplier) {
const isValidEmail = emailValidator.validate(supplieremail.trim());
if (!isValidEmail) {
// Return email invalid format message
error = {
armintatankdata: {
error: true,
code: 10003,
message:
"10003 - Email " +
supplier.emails[0].email +
" is not a valid email",
},
};
req.body.regError = error;
reply.send(error);
}
}
} catch (err) {
throw boom.boomify(err);
}
};
exports.logoutsupplier = async (request, reply) => {
// request.session.delete();
// // send response to clear token
// reply.send({ message: 'Successfully logged out' })
const invalidatedTokens = {};
const accessToken =
request.headers.authorization && request.body.access_token;
invalidatedTokens[accessToken] = true;
// // localStorage.removeItem(invalidatedTokens[accessToken])
reply.send({ message: "Logout successful" });
};
exports.verifyPhone = async (req, reply) => {
console.log("-------------------------------------------------");
try {
phone = req.body.phone;
phoneVerificationCode = req.body.phoneVerificationCode;
// check if user exists in the system. If user exists , display message that
// username is not available
console.log(
"this is the phone and verification code",
phone,
phoneVerificationCode
);
supplierExists = await Supplier.findOne({
phone: phone,
phoneVerified: false,
phoneVerificationCode: phoneVerificationCode,
});
console.log(supplierExists);
if (supplierExists) {
// update the phoneVerified flag to true.
const filter = {
phone: phone,
phoneVerificationCode: phoneVerificationCode,
};
const update = { phoneVerified: true };
const doc = await Supplier.findOneAndUpdate(filter, update);
updatedSupplier = await Supplier.findOne({ phone: phone });
if (updatedSupplier.phoneVerified) {
reply.send('{"armintatankdata":{"error":false,"verified": true}}');
} else {
error = {
armintatankdata: {
error: true,
code: 10005,
message: "10005 - Verification code entered cannot be validated.",
},
};
req.body.regError = error;
reply.send(error);
}
} else {
error = {
armintatankdata: {
error: true,
code: 10005,
message: "10005 - Verification code entered cannot be validated.",
},
};
req.body.regError = error;
reply.send(error);
}
} catch (err) {
throw boom.boomify(err);
}
};
// exports.deliveryBoyVerifyPhone = async (req, reply) => {
// console.log("-------------------------------------------------");
// try {
// phone = req.body.phone;
// phoneVerificationCode = req.body.phoneVerificationCode;
// // check if user exists in the system. If user exists , display message that
// // username is not available
// console.log(
// "this is the phone and verification code",
// phone,
// phoneVerificationCode
// );
// deliveryBoyExists = await DeliveryBoy.findOne({
// phone: phone,
// phoneVerified: false,
// phoneVerificationCode: phoneVerificationCode,
// });
// console.log(deliveryBoyExists);
// if (deliveryBoyExists) {
// // update the phoneVerified flag to true.
// const filter = {
// phone: phone,
// phoneVerificationCode: phoneVerificationCode,
// };
// const update = { phoneVerified: true };
// const doc = await DeliveryBoy.findOneAndUpdate(filter, update);
// updatedDeliveryBoy = await DeliveryBoy.findOne({ phone: phone });
// if (updatedDeliveryBoy.phoneVerified) {
// reply.send('{"armintatankdata":{"error":false,"verified": true}}');
// } else {
// error = {
// armintatankdata: {
// error: true,
// code: 10005,
// message: "10005 - Verification code entered cannot be validated.",
// },
// };
// req.body.regError = error;
// reply.send(error);
// }
// }
// } catch (err) {
// throw boom.boomify(err);
// }
// };
//delete selected deliveryboy
exports.deleteDeliveryBoy = async (req, reply) => {
try {
var supplierId = req.params.supplierId;
var phone = req.query.phone;
const delivery = await DeliveryBoy.findOneAndDelete({
phone: phone,
supplierId: supplierId,
});
reply.send({ status_code: 200, data: delivery });
// return tank;
} catch (err) {
throw boom.boomify(err);
}
};
//update selected Delivery Boy Details
exports.updateDeliveryBoy = async (req, reply) => {
try {
var supplierId = req.params.supplierId;
var phone = req.query.phone;
const delivery = req.body;
const { ...updateData } = delivery;
const update = await DeliveryBoy.findOneAndUpdate(
{ phone: phone, supplierId: supplierId },
updateData,
{ new: true }
);
console.log(update);
//return update;
reply.send({ status_code: 200, data: update });
} catch (err) {
throw boom.boomify(err);
}
};
// Get current supplier
exports.getCurrentSupplier = async (req, reply) => {
try {
const supplierId = req.body.supplierId;
const suppliers = await Supplier.findOne({ supplierId: supplierId });
return suppliers;
} catch (err) {
throw boom.boomify(err);
}
};
// Get all suppliers
// exports.getSuppliers = async (req, reply) => {
// const limit = parseInt(req.query.limit) || 100;
// const page = parseInt(req.query.page) || 1;
// const startindex = (page - 1) * limit;
// try {
// await Supplier.find()
// .limit(limit)
// .skip(startindex)
// .exec()
// .then((docs) => {
// reply.send({ status_code: 200, data: docs, count: docs.length });
// })
// .catch((err) => {
// console.log(err);
// reply.send({ error: err });
// });
// } catch (err) {
// throw boom.boomify(err);
// }
// };
exports.getSuppliers = async (req, reply) => {
const customerId = req.params.customerId;
const {
type_of_water,
capacity: requestedCapacityStr,
quantity: requestedQuantityStr,
date,
time
} = req.body;
const parseCapacity = (value) => parseFloat((value || "0").toString().replace(/,/g, ""));
const requestedCapacity = parseCapacity(requestedCapacityStr);
const requestedQuantity = parseInt(requestedQuantityStr || "0");
const totalRequiredCapacity = requestedCapacity * requestedQuantity;
try {
const tankerBookings = await Tankerbooking.find({ date });
const bookedTankerSet = new Set(
tankerBookings.map(booking => `${booking.supplierId}_${booking.tankerName}`)
);
// 1⃣ Only filter typeofwater first
let tankers = await Tanker.find({ typeofwater: type_of_water });
// 2⃣ Exclude booked tankers
tankers = tankers.filter(tanker => {
const key = `${tanker.supplierId}_${tanker.tankerName}`;
return !bookedTankerSet.has(key);
});
// 3⃣ Group by supplierId
const supplierTankerMap = {};
for (let tanker of tankers) {
if (!supplierTankerMap[tanker.supplierId]) {
supplierTankerMap[tanker.supplierId] = [];
}
supplierTankerMap[tanker.supplierId].push(tanker);
}
// 4⃣ Aggregate supplier capacities
const qualifiedSuppliers = [];
for (let [supplierId, supplierTankers] of Object.entries(supplierTankerMap)) {
const totalAvailableCapacity = supplierTankers.reduce(
(sum, t) => sum + parseCapacity(t.capacity),
0
);
if (totalAvailableCapacity >= totalRequiredCapacity) {
qualifiedSuppliers.push({ supplierId, tankers: supplierTankers });
}
}
const connected_suppliers = [];
const non_connected_suppliers = [];
for (let supplierObj of qualifiedSuppliers) {
const supplierData = await Supplier.findOne({ supplierId: supplierObj.supplierId });
const responseData = {
supplier: supplierData,
tankers: supplierObj.tankers
};
// 🔥 The correct friend request check:
const friendRequest = await FriendRequest.findOne({
customerId: customerId,
supplierId: supplierObj.supplierId
});
if (friendRequest && friendRequest.status === "accepted") {
connected_suppliers.push(responseData);
} else {
non_connected_suppliers.push(responseData);
}
}
reply.send({
status_code: 200,
connected_suppliers,
non_connected_suppliers
});
} catch (err) {
console.error(err);
reply.send({
status_code: 500,
message: "Something went wrong",
error: err.message
});
}
};
// Get single user by ID
exports.getSingleSupplier = async (req, reply) => {
try {
const supplierId = req.params.supplierId;
const supplier = await Supplier.findOne({ supplierId: supplierId });
return supplier;
} catch (err) {
throw boom.boomify(err);
}
};
// exports.getConnectedSuppliers = async (req, reply) => {
// const limit = parseInt(req.query.limit) || 100;
// const page = parseInt(req.query.page) || 1;
// const startindex = (page - 1) * limit;
// const customerId = req.params.customerId; // Assuming you have already authenticated the user and stored their ID in the request object
// try {
// const friendRequests = await FriendRequest.find({
// customerId,
// status: "accepted",
// });
// // console.log(friendRequests,customerId)
// const supplierIdsToInclude = friendRequests.map(
// (request) => request.supplierId
// );
// await Supplier.find({ supplierId: { $in: supplierIdsToInclude } })
// .limit(limit)
// .skip(startindex)
// .exec()
// .then((docs) => {
// reply.send({ status_code: 200, data: docs, count: docs.length });
// })
// .catch((err) => {
// console.log(err);
// reply.send({ error: err });
// });
// } catch (err) {
// throw boom.boomify(err);
// }
// };
exports.getConnectedSuppliers = async (req, reply) => {
const limit = parseInt(req.query.limit) || 100;
const page = parseInt(req.query.page) || 1;
const startindex = (page - 1) * limit;
const customerId = req.params.customerId;
try {
// Get user's favorite suppliers
const user = await User.findOne({ customerId }, 'favorate_suppliers');
const favorateSuppliers = user?.favorate_suppliers || [];
// Get accepted friend requests
const friendRequests = await FriendRequest.find({
customerId,
status: "accepted",
});
const supplierIdsToInclude = friendRequests.map(req => req.supplierId);
// Get suppliers
const suppliers = await Supplier.find({
supplierId: { $in: supplierIdsToInclude }
})
.limit(limit)
.skip(startindex)
.exec();
const supplierIds = suppliers.map(s => s.supplierId);
// Get profile pictures
const profilePictures = await profilePictureSupplier.find({
supplierId: { $in: supplierIds }
});
// Construct final response
const data = suppliers.map((supplier) => {
const profilePicture = profilePictures.find(
(pic) => pic.supplierId === supplier.supplierId
);
const isFavorate = favorateSuppliers.includes(supplier.supplierId);
return {
...supplier.toObject(),
picture: profilePicture ? profilePicture.picture : null,
favorate: isFavorate,
};
});
reply.send({ status_code: 200, data, count: data.length });
} catch (err) {
throw boom.boomify(err);
}
};
// exports.getPendingSuppliers = async (req, reply) => {
// const limit = parseInt(req.query.limit) || 100;
// const page = parseInt(req.query.page) || 1;
// const startindex = (page - 1) * limit;
// const customerId = req.params.customerId; // Assuming you have already authenticated the user and stored their ID in the request object
// try {
// const friendRequests = await FriendRequest.find({
// customerId,
// status: ["pending"],
// });
// // console.log(friendRequests,customerId)
// const supplierIdsToInclude = friendRequests.map(
// (request) => request.supplierId
// );
// console.log(supplierIdsToInclude, "SUPLIERINCLUDE");
// const timestamps = friendRequests.map(request => request.timestamp);
// console.log(timestamps, "timestamps");
// await Supplier.find({ supplierId: { $in: supplierIdsToInclude } })
// .limit(limit)
// .skip(startindex)
// .exec()
// .then((docs) => {
// const customerDataWithTimestamp = docs.map((doc, index) => ({
// ...doc._doc,
// timestamp: timestamps[index],
// }));
// reply.send({
// status_code: 200,
// data: customerDataWithTimestamp,
// count: docs.length,
// });
// //reply.send({ status_code: 200, data: docs, count: docs.length });
// })
// .catch((err) => {
// console.log(err);
// reply.send({ error: err });
// });
// } catch (err) {
// throw boom.boomify(err);
// }
// };
exports.getPendingSuppliers = async (req, reply) => {
const limit = parseInt(req.query.limit) || 100;
const page = parseInt(req.query.page) || 1;
const startindex = (page - 1) * limit;
const customerId = req.params.customerId; // Assuming you have already authenticated the user and stored their ID in the request object
try {
const friendRequests = await FriendRequest.find({
customerId,
status: ["pending"],
});
const supplierIdsToInclude = friendRequests.map(
(request) => request.supplierId
);
const timestamps = friendRequests.map((request) => request.timestamp);
const suppliers = await Supplier.find({
supplierId: { $in: supplierIdsToInclude },
})
.limit(limit)
.skip(startindex)
.exec();
const supplierIds = suppliers.map((supplier) => supplier.supplierId);
const profilePictures = await profilePictureSupplier.find({
supplierId: { $in: supplierIds },
}).exec();
const data = suppliers.map((supplier, index) => {
const profilePicture = profilePictures.find(
(picture) => picture.supplierId === supplier.supplierId
);
return {
...supplier.toObject(),
timestamp: timestamps[index],
picture: profilePicture ? profilePicture.picture : null,
};
});
reply.send({ status_code: 200, data, count: data.length });
} catch (err) {
throw boom.boomify(err);
}
};
// exports.getRejectSuppliers = async (req, reply) => {
// const limit = parseInt(req.query.limit) || 100;
// const page = parseInt(req.query.page) || 1;
// const startindex = (page - 1) * limit;
// const customerId = req.params.customerId; // Assuming you have already authenticated the user and stored their ID in the request object
// try {
// const friendRequests = await FriendRequest.find({
// customerId,
// status: ["rejected"],
// });
// // console.log(friendRequests,customerId)
// const supplierIdsToInclude = friendRequests.map(
// (request) => request.supplierId
// );
// // console.log(supplierIdsToInclude)
// await Supplier.find({ supplierId: { $in: supplierIdsToInclude } })
// .limit(limit)
// .skip(startindex)
// .exec()
// .then((docs) => {
// reply.send({ status_code: 200, data: docs, count: docs.length });
// })
// .catch((err) => {
// console.log(err);
// reply.send({ error: err });
// });
// } catch (err) {
// throw boom.boomify(err);
// }
// };
exports.getRejectSuppliers = async (req, reply) => {
const limit = parseInt(req.query.limit) || 100;
const page = parseInt(req.query.page) || 1;
const startindex = (page - 1) * limit;
const customerId = req.params.customerId; // Assuming you have already authenticated the user and stored their ID in the request object
try {
const friendRequests = await FriendRequest.find({
customerId,
status: ["rejected"],
});
const supplierIdsToInclude = friendRequests.map(
(request) => request.supplierId
);
const suppliers = await Supplier.find({
supplierId: { $in: supplierIdsToInclude },
})
.limit(limit)
.skip(startindex)
.exec();
const supplierIds = suppliers.map((supplier) => supplier.supplierId);
const profilePictures = await profilePictureSupplier.find({
supplierId: { $in: supplierIds },
}).exec();
const data = suppliers.map((supplier) => {
const profilePicture = profilePictures.find(
(picture) => picture.supplierId === supplier.supplierId
);
return {
...supplier.toObject(),
picture: profilePicture ? profilePicture.picture : null,
};
});
reply.send({ status_code: 200, data, count: data.length });
} catch (err) {
throw boom.boomify(err);
}
};
exports.getPendingCustomers = async (req, reply) => {
const limit = parseInt(req.query.limit) || 100;
const page = parseInt(req.query.page) || 1;
const startindex = (page - 1) * limit;
const supplierId = req.params.supplierId;
try {
const friendRequests = await FriendRequest.find({
supplierId,
status: ["pending"],
});
const supplierIdsToInclude = friendRequests.map(
(request) => request.customerId
);
// const timestamps = friendRequests.map(request =>
// moment(request.timestamp, "DD-MM-YYYYTHH:mm:ss.SSSZ").format("DD-MM-YYYY hh:mm:ss")
// );
const timestamps = friendRequests.map(request => request.timestamp);
console.log(timestamps, "timestamps");
await User.find({ customerId: { $in: supplierIdsToInclude } })
.limit(limit)
.skip(startindex)
.exec()
.then((docs) => {
const customerDataWithTimestamp = docs.map((doc, index) => ({
...doc._doc,
timestamp: timestamps[index],
}));
reply.send({
status_code: 200,
data: customerDataWithTimestamp,
count: docs.length,
});
})
.catch((err) => {
console.log(err);
reply.send({ error: err });
});
} catch (err) {
throw boom.boomify(err);
}
};
exports.getRejectCustomers = async (req, reply) => {
const limit = parseInt(req.query.limit) || 100;
const page = parseInt(req.query.page) || 1;
const startindex = (page - 1) * limit;
const supplierId = req.params.supplierId; // Assuming you have already authenticated the user and stored their ID in the request object
try {
const friendRequests = await FriendRequest.find({
supplierId,
status: ["rejected"],
});
console.log(friendRequests, supplierId, "su....");
const supplierIdsToInclude = friendRequests.map(
(request) => request.customerId
);
console.log(supplierIdsToInclude, "supplierIdsToInclude..");
await User.find({ customerId: { $in: supplierIdsToInclude } })
.limit(limit)
.skip(startindex)
.exec()
.then((docs) => {
reply.send({ status_code: 200, data: docs, count: docs.length });
})
.catch((err) => {
console.log(err);
reply.send({ error: err });
});
} catch (err) {
throw boom.boomify(err);
}
};
exports.getconnectedCustomers = async (req, reply) => {
const limit = parseInt(req.query.limit) || 100;
const page = parseInt(req.query.page) || 1;
const startindex = (page - 1) * limit;
const supplierId = req.params.supplierId; // Assuming you have already authenticated the user and stored their ID in the request object
try {
const friendRequests = await FriendRequest.find({
supplierId,
status: ["accepted"],
});
console.log(friendRequests, supplierId, "su....");
const supplierIdsToInclude = friendRequests.map(
(request) => request.customerId
);
console.log(supplierIdsToInclude, "supplierIdsToInclude..");
await User.find({ customerId: { $in: supplierIdsToInclude } })
.limit(limit)
.skip(startindex)
.exec()
.then((docs) => {
reply.send({ status_code: 200, data: docs, count: docs.length });
})
.catch((err) => {
console.log(err);
reply.send({ error: err });
});
} catch (err) {
throw boom.boomify(err);
}
};
// exports.uploadProfilePicture = async (req, reply) => {
// try {
// const supplierId = req.params.supplierId;
// const picture = req.body.picture;
// let profilePicture = await profilePictureSupplier.findOne({ supplierId });
// console.log(profilePicture,"profile===")
// if (!profilePicture) {
// profilePicture = new profilePictureSupplier({
// supplierId,
// picture,
// });
// } else {
// profilePicture.picture = picture;
// }
// await profilePicture.save();
// reply.send({ message: 'Profile picture uploaded successfully' });
// } catch (error) {
// reply.status(500).send({ error: error.message });
// }
// };
// const multer = require('multer');
// const fs = require('fs');
// // Multer storage configuration
// const storage = multer.diskStorage({
// destination: function (req, file, cb) {
// // Specify the destination folder for storing uploaded files
// cb(null, './uploads');
// },
// filename: function (req, file, cb) {
// // Generate a unique filename for the uploaded file
// cb(null, file.originalname);
// },
// });
// // Multer upload configuration
// const upload = multer({ storage: storage }).single('picture');
// // Handler for uploading profile picture
// exports.uploadProfilePicture = async (req, res) => {
// try {
// upload(req, res, async (err) => {
// if (err) {
// return res.status(400).send({ error: 'Failed to upload profile picture' });
// }
// const supplierId = req.params.supplierId;
// const picture = req.file.filename;
// let profilePicture = await ProfilePictureSupplier.findOne({ supplierId });
// if (!profilePicture) {
// profilePicture = new ProfilePictureSupplier({
// supplierId,
// picture,
// });
// } else {
// profilePicture.picture = picture;
// }
// await profilePicture.save();
// res.send({ message: 'Profile picture uploaded successfully' });
// });
// } catch (error) {
// res.status(500).send({ error: error.message });
// }
// };
// const { Storage } = require('@google-cloud/storage');
// const storage = new Storage({
// keyFilename :`/home/bhaskar/Downloads/arminta-tank-0f492875da39.json`,
// projectId : `arminta-tank`
// });
// const bucketName = 'armintaprofile_picture';
// exports.uploadProfilePicture = async (req, res) => {
// try {
// const supplierId = req.params.supplierId;
// const file = req.body.picture;
// // Check if the required properties are present
// if (!file) {
// return res.status(400).send({ error: 'No picture file provided' });
// }
// // Upload the file to the GCS bucket
// const bucket = storage.bucket(bucketName);
// const fileName = `${supplierId}/${file.originalname}`;
// const fileOptions = {
// metadata: {
// contentType: 'multipart/form-data',
// },
// };
// await bucket.upload(file.path, {
// destination: `armintaprofile_picture/${fileName}`,
// ...fileOptions,
// });
// const imageUrl = `https://storage.googleapis.com/${bucketName}/${fileName}`;
// console.log(imageUrl);
// let profilePicture = await ProfilePictureSupplier.findOne({ supplierId });
// console.log("profilePicture", profilePicture);
// if (!profilePicture) {
// profilePicture = new ProfilePictureSupplier({
// supplierId,
// picture: imageUrl,
// });
// } else {
// profilePicture.picture = imageUrl;
// }
// await profilePicture.save();
// // Delete the temporary file after uploading to GCS
// fs.unlinkSync(file.path);
// res.send({ message: 'Profile picture uploaded successfully' });
// } catch (error) {
// res.status(500).send({ error: error.message });
// }
// },
// const { Storage } = require('@google-cloud/storage');
// const storage = new Storage({
// keyFilename: '/home/bhaskar/Downloads/arminta-tank-0f492875da39.json',
// projectId: 'arminta-tank',
// });
// const bucketName = 'armintaprofile_picture';
// exports.uploadProfilePicture = async (req, res) => {
// try {
// const supplierId = req.params.supplierId;
// // Check if the required properties are present
// if (!req.files || !req.files.picture) {
// return res.status(400).send({ error: 'No picture file provided' });
// }
// const file = req.files.picture;
// console.log("file", file)
// // Upload the file to the GCS bucket
// const bucket = storage.bucket(bucketName);
// const fileName = `${supplierId}/${file.name}`;
// const fileOptions = {
// metadata: {
// contentType: file.mimetype,
// },
// };
// await bucket.upload(file.tempFilePath, {
// destination: fileName,
// ...fileOptions,
// });
// const imageUrl = `https://storage.googleapis.com/${bucketName}/${fileName}`;
// console.log(imageUrl);
// let profilePicture = await ProfilePictureSupplier.findOne({ supplierId });
// console.log('profilePicture', profilePicture);
// if (!profilePicture) {
// profilePicture = new ProfilePictureSupplier({
// supplierId,
// picture: imageUrl,
// });
// } else {
// profilePicture.picture = imageUrl;
// }
// await profilePicture.save();
// // Delete the temporary file after uploading to GCS
// fs.unlinkSync(file.tempFilePath);
// res.send({ message: 'Profile picture uploaded successfully' });
// } catch (error) {
// res.status(500).send({ error: error.message });
// }
// };
const { Storage } = require('@google-cloud/storage');
const fs = require('fs');
const storage = new Storage({
keyFilename: '/home/bhaskar/Downloads/arminta-tank-3c665db761bc.json',
projectId: 'arminta-tank',
});
const bucketName = 'armintaprofile_picture';
// exports.uploadProfilePicture = async (req, res) => {
// try {
// const supplierId = req.body.supplierId;
// // Check if the required properties are present
// if (!req.files || !req.files.picture) {
// return res.status(400).send({ error: 'No picture file provided' });
// }
// const file = `/home/bhaskar/Desktop/download.jpeg`;
// console.log("file", file)
// console.log("supplierId", supplierId)
// // Upload the file to the GCS bucket
// const bucket = storage.bucket(bucketName);
// const fileName = `${supplierId}/${file.name}`;
// const fileOptions = {
// metadata: {
// contentType: file.mimetype,
// },
// };
// await bucket.upload(file.tempFilePath, {
// destination: fileName,
// ...fileOptions,
// });
// const imageUrl = `https://storage.googleapis.com/${bucketName}/${fileName}`;
// let profilePicture = await profilePictureSupplier.findOne({ supplierId });
// if (!profilePicture) {
// profilePicture = new profilePictureSupplier({
// supplierId,
// picture: imageUrl,
// });
// } else {
// profilePicture.picture = imageUrl;
// }
// await profilePicture.save();
// // Delete the temporary file after uploading to GCS
// fs.unlinkSync(file.tempFilePath);
// res.send({ message: 'Profile picture uploaded successfully' });
// } catch (error) {
// res.status(500).send({ error: error.message });
// }
// };
// exports.uploadProfilePicture = async (req, res) => {
// try {
// upload(req, res, async (err) => {
// if (err) {
// return res.status(400).send({ error: 'Failed to upload profile picture' });
// }
// const supplierId = req.params.supplierId;
// const picture = req.file; // Assuming the file field in the request is named 'picture'
// // Upload the file to the GCS bucket
// const bucket = storage.bucket(bucketName);
// const fileName = `${supplierId}/${file.originalname}`;
// const fileOptions = {
// metadata: {
// contentType: file.mimetype,
// },
// };
// await bucket.upload(filepath, {
// destination: `armintaprofile_picture/${picture}`,
// ...fileOptions,
// });
// const imageUrl = `https://storage.googleapis.com/${bucketName}/${fileName}`;
// console.log(imageUrl)
// let profilePicture = await ProfilePictureSupplier.findOne({ supplierId });
// console.log("profilePicture", profilePicture)
// if (!profilePicture) {
// profilePicture = new ProfilePictureSupplier({
// supplierId,
// picture: imageUrl,
// });
// } else {
// profilePicture.picture = imageUrl;
// }
// await profilePicture.save();
// // Delete the temporary file after uploading to GCS
// fs.unlinkSync(file.path);
// res.send({ message: 'Profile picture uploaded successfully' });
// });
// } catch (error) {
// res.status(500).send({ error: error.message });
// }
// };
// exports.uploadProfilePicture = async (req, res) => {
// try {
// upload(req, res, async (err) => {
// if (err) {
// return res.status(400).send({ error: 'Failed to upload profile picture' });
// }
// const supplierId = req.params.supplierId;
// const picture = req.file.filename; // Assuming the file field in the request is named 'picture'
// // Upload the picture to the GCP bucket
// const bucketName = 'armintaprofile_picture';
// const bucket = storage.bucket(bucketName);
// const uploadPath = `armintaprofile_picture/${picture}`;
// await bucket.upload(req.file.path, {
// destination: uploadPath,
// });
// console.log("bucket",bucket)
// console.log(uploadPath, "uploadPath")
// // Get the public URL of the uploaded picture
// const file = bucket.file(uploadPath);
// const [metadata] = await file.getMetadata();
// const pictureUrl = metadata.mediaLink;
// let profilePicture = await profilePictureSupplier.findOne({ supplierId });
// if (!profilePicture) {
// profilePicture = new profilePictureSupplier({
// supplierId,
// picture: pictureUrl,
// });
// } else {
// profilePicture.picture = pictureUrl;
// }
// await profilePicture.save();
// res.send({ message: 'Profile picture uploaded successfully' });
// });
// } catch (error) {
// res.status(500).send({ error: error.message });
// }
// };
// Route for fetching profile picture data
fastify.get('/api/users/profile-picture-supplier/:supplierId', async (req, res) => {
try {
const supplierId = req.params.supplierId;
const profilePicture = await ProfilePictureSupplier.findOne({ supplierId });
if (!profilePicture) {
return res.status(404).send({ error: 'Profile picture not found' });
}
// Send the profile picture data as a response
res.send({ picture: profilePicture.picture });
} catch (error) {
res.status(500).send({ error: error.message });
}
});