parent
2321ea6077
commit
0742bc6469
@ -0,0 +1,150 @@
|
|||||||
|
const fastify = require("fastify")({
|
||||||
|
logger: true,
|
||||||
|
});
|
||||||
|
const boom = require("boom");
|
||||||
|
const customJwtAuth = require("../customAuthJwt");
|
||||||
|
|
||||||
|
const bcrypt = require("bcrypt");
|
||||||
|
const saltRounds = 10;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Get the data models
|
||||||
|
const { Supplier ,ProfilePicture, generateSupplierId} = require('../models/supplier');
|
||||||
|
|
||||||
|
|
||||||
|
async function bcryptPassword(password) {
|
||||||
|
encryptedPwd = bcrypt.hash(password, saltRounds);
|
||||||
|
return encryptedPwd;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function bcryptComparePassword(pwd, encpassword) {
|
||||||
|
isSame = bcrypt.compare(pwd, encpassword);
|
||||||
|
return isSame;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Supplier Login Controller
|
||||||
|
|
||||||
|
exports.loginSupplier = async (req) => {
|
||||||
|
try {
|
||||||
|
const phone = req.body.phone;
|
||||||
|
const password = req.body.password;
|
||||||
|
|
||||||
|
const supplier = await Supplier.findOne({ phone: phone });
|
||||||
|
// compare supplier password with what is supplied
|
||||||
|
if (supplier) {
|
||||||
|
isSame = await bcryptComparePassword(
|
||||||
|
password,
|
||||||
|
supplier.services.password.bcrypt
|
||||||
|
);
|
||||||
|
// if password supplied matches return object
|
||||||
|
if (isSame) {
|
||||||
|
return { same: true, supplier: supplier };
|
||||||
|
} else {
|
||||||
|
return { same: false };
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return { same: false };
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
throw boom.boomify(err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
exports.addSupplier = async (req, reply) => {
|
||||||
|
try {
|
||||||
|
// await resetCounter();//to set customer id back to 0
|
||||||
|
var s_id = await generateSupplierId()
|
||||||
|
var building= ((req.body.suppliername).slice(0, 3)).toUpperCase();
|
||||||
|
var supplier_id = `AWS${building}${s_id}`
|
||||||
|
// console.log("This is the reply in the handler after the validations", reply);
|
||||||
|
s_data = {
|
||||||
|
supplierId: supplier_id,
|
||||||
|
suppliername: req.body.suppliername,
|
||||||
|
emails: req.body.emails,
|
||||||
|
password: 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_adress: req.body.office_adress,
|
||||||
|
zip: req.body.zip,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var supplier = new Supplier(s_data);
|
||||||
|
|
||||||
|
//password is not at the top level in the collection.
|
||||||
|
supplierpass = req.body.password;
|
||||||
|
|
||||||
|
// If fields are sent via form encoding , capture the fields and assign them to the user Object.
|
||||||
|
|
||||||
|
checkFormEncoding = isSupplierFormUrlEncoded(req);
|
||||||
|
if (checkFormEncoding.isSupplierFormUrlEncoded) {
|
||||||
|
suppliertobeInserted = checkFormEncoding.supplier;
|
||||||
|
console.log("thsi true url string");
|
||||||
|
supplier.suppliername = suppliertobeInserted.suppliername;
|
||||||
|
supplier.firstName = suppliertobeInserted.firstName;
|
||||||
|
supplier.lastName = suppliertobeInserted.lastName;
|
||||||
|
supplier.phone = suppliertobeInserted.phone;
|
||||||
|
supplier.emails = suppliertobeInserted.emails;
|
||||||
|
supplier.passsword = suppliertobeInserted.password;
|
||||||
|
supplier.supplierId = suppliertobeInserted.supplier_id;
|
||||||
|
supplier.office_adress = suppliertobeInserted.office_adress;
|
||||||
|
supplier.alternativeContactNumber = suppliertobeInserted.alternativeContactNumber;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("---------checkurl ecnoded string-----------------------");
|
||||||
|
|
||||||
|
// Store hash in your password DB.
|
||||||
|
hash = await bcryptPassword(supplierpass);
|
||||||
|
|
||||||
|
if (hash) {
|
||||||
|
supplier.services.password.bcrypt = hash;
|
||||||
|
if (req.body.role) {
|
||||||
|
supplier.profile.role = req.body.role;
|
||||||
|
console.log("******************************************************");
|
||||||
|
console.log(supplier);
|
||||||
|
} else {
|
||||||
|
role = ["supplier"];
|
||||||
|
supplier.profile.role = role;
|
||||||
|
}
|
||||||
|
|
||||||
|
insertedSupplier = await supplier.save();
|
||||||
|
console.log(insertedSupplier);
|
||||||
|
if (insertedSupplier) {
|
||||||
|
// Prepare supplier object and wrap it inside the armintatankdata
|
||||||
|
var retSupplier = {
|
||||||
|
armintatankdata: {
|
||||||
|
suppliername: insertedSupplier.suppliername,
|
||||||
|
phone: insertedSupplier.phone,
|
||||||
|
supplierId: insertedSupplier.supplierId,
|
||||||
|
office_adress: insertedSupplier.office_adress,
|
||||||
|
emails: [
|
||||||
|
{
|
||||||
|
email: insertedSupplier.emails[0].email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
profile: insertedSupplier.profile,
|
||||||
|
},
|
||||||
|
status_code: 200,
|
||||||
|
};
|
||||||
|
|
||||||
|
return retSupplier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
throw boom.boomify(err);
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,467 @@
|
|||||||
|
//Get the data models
|
||||||
|
const { Supplier } = require('../models/supplier');
|
||||||
|
const { ProfilePicture } = 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 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.address1,
|
||||||
|
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 ProfilePicture.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.address1,
|
||||||
|
phoneVerified: loginObject.supplier.phoneVerified,
|
||||||
|
oneTimePasswordSetFlag: loginObject.supplier.oneTimePasswordSetFlag,
|
||||||
|
type: loginObject.supplier.profile.role,
|
||||||
|
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.address1,
|
||||||
|
phoneVerified: loginObject.supplier.phoneVerified,
|
||||||
|
oneTimePasswordSetFlag: loginObject.supplier.oneTimePasswordSetFlag,
|
||||||
|
type: loginObject.supplier.profile.role,
|
||||||
|
typeasobj: stringToJsonObject,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error = {
|
||||||
|
simplydata: {
|
||||||
|
error: true,
|
||||||
|
code: 400,
|
||||||
|
message: "Invalid SupplierId , Password supplied",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
reply.send(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 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 # " +
|
||||||
|
user.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' })
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,89 @@
|
|||||||
|
const mongoose = require("mongoose");
|
||||||
|
|
||||||
|
const Schema = mongoose.Schema;
|
||||||
|
const ObjectId = Schema.Types.ObjectId;
|
||||||
|
|
||||||
|
const code = Math.floor(100000 + Math.random() * 900000);
|
||||||
|
|
||||||
|
const { User,Counter, generateBookingId,resetCounter,generateCustomerId,ProfilePicture} = require('../models/User')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const generateSupplierId = async () => {
|
||||||
|
var result = await Counter.findOneAndUpdate(
|
||||||
|
{ _id: 'supplier_id' },
|
||||||
|
{ $inc: { seq: 1 } },
|
||||||
|
{ upsert: true, new: true }
|
||||||
|
);
|
||||||
|
|
||||||
|
return result.seq;
|
||||||
|
};
|
||||||
|
|
||||||
|
const supplierSchema = new mongoose.Schema(
|
||||||
|
{
|
||||||
|
suppliername: { type: String },
|
||||||
|
phone: { type: String, unique: true, trim: true },
|
||||||
|
supplierId: {type : String, default: null},
|
||||||
|
phoneVerified: { type: Boolean, default: false },
|
||||||
|
phoneVerificationCode: { type: Number, default: 11111 },
|
||||||
|
passwordResetCode: { type: Number, default: code },
|
||||||
|
oneTimePasswordSetFlag: { type: Boolean, default: false },
|
||||||
|
emails: [{ email: String, verified: { type: Boolean, default: false } }],
|
||||||
|
services: { password: { bcrypt: String } },
|
||||||
|
|
||||||
|
profile: {
|
||||||
|
role: [{ type: String, default: "supplier" }],
|
||||||
|
firstName: { type: String, default: null },
|
||||||
|
lastName: { type: String, default: null },
|
||||||
|
contactNumber: { type: String, default: null },
|
||||||
|
alternativeContactNumber : { type: String, default: null },
|
||||||
|
office_address: { type: String, default: null },
|
||||||
|
city: { type: String, default: null },
|
||||||
|
state: { type: String, default: null },
|
||||||
|
country: { type: String, default: null },
|
||||||
|
zip: { type: String, default: null },
|
||||||
|
},
|
||||||
|
status: {
|
||||||
|
type: String,
|
||||||
|
enum: ['accept', 'pending', 'reject'],
|
||||||
|
default: 'pending'
|
||||||
|
},
|
||||||
|
|
||||||
|
currentGPS: {
|
||||||
|
// It's important to define type within type field, because
|
||||||
|
// mongoose use "type" to identify field's object type.
|
||||||
|
|
||||||
|
gpsType: { type: String, default: "Point" },
|
||||||
|
// Default value is needed. Mongoose pass an empty array to
|
||||||
|
// array type by default, but it will fail MongoDB's pre-save
|
||||||
|
// validation.
|
||||||
|
coordinates: { type: [Number], default: [0, 0] },
|
||||||
|
},
|
||||||
|
|
||||||
|
isActive: Boolean,
|
||||||
|
tenantId: ObjectId,
|
||||||
|
createdAt: {
|
||||||
|
type: Date,
|
||||||
|
default: function () {
|
||||||
|
return Date.now();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
createdBy: ObjectId,
|
||||||
|
updatedAt: {
|
||||||
|
type: Date,
|
||||||
|
default: function () {
|
||||||
|
return Date.now();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
updatedBy: ObjectId,
|
||||||
|
},
|
||||||
|
{ versionKey: false }
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const Supplier = mongoose.model("Supplier", supplierSchema);
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = { Supplier, generateSupplierId}
|
@ -0,0 +1,99 @@
|
|||||||
|
const fastify = require("fastify");
|
||||||
|
const supplierController = require("../controllers/supplierController");
|
||||||
|
const validationHandler = require("../handlers/supplierHandler");
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = function (fastify, opts, next) {
|
||||||
|
|
||||||
|
fastify.post("/api/supplierlogin", {
|
||||||
|
schema: {
|
||||||
|
description: "This is for Login Supplier",
|
||||||
|
tags: ["Supplier-Data"],
|
||||||
|
summary: "This is for Login Supplier",
|
||||||
|
body: {
|
||||||
|
type: "object",
|
||||||
|
required: ["phone", "password"],
|
||||||
|
properties: {
|
||||||
|
phone: { type: "string" },
|
||||||
|
password: { type: "string" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
handler: validationHandler.loginSupplier,
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
fastify.route({
|
||||||
|
method: "POST",
|
||||||
|
url: "/api/supplierlogout",
|
||||||
|
schema: {
|
||||||
|
description: "This is for Supplier logout",
|
||||||
|
tags: ["Supplier-Data"],
|
||||||
|
summary: "This is for Supplier logout",
|
||||||
|
params: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
supplierId: {
|
||||||
|
type: "string",
|
||||||
|
description: "supplierId",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// preHandler: fastify.auth([fastify.authenticate]),
|
||||||
|
handler: validationHandler.logoutsupplier,
|
||||||
|
// onResponse: (request,reply) => {validationHandler.resetPassword(request,reply)}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fastify.route({
|
||||||
|
method: "POST",
|
||||||
|
url: "/api/suppliers",
|
||||||
|
schema: {
|
||||||
|
tags: ["Supplier-Data"],
|
||||||
|
description: "This is for cretae New supplier",
|
||||||
|
summary: "This is for Create New supplier.",
|
||||||
|
body: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
suppliername: { type: "string" },
|
||||||
|
phone: { type: "string" },
|
||||||
|
alternativeContactNumber : { type : "string" },
|
||||||
|
password: { type: "string" },
|
||||||
|
emails: {
|
||||||
|
type: "array",
|
||||||
|
maxItems: 2,
|
||||||
|
items: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
email: { type: "string", default: null },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
office_address: { type: "string", default: null },
|
||||||
|
city: { type: "string", default: null },
|
||||||
|
state: { type: "string", default: null },
|
||||||
|
zip: { type: "string", default: null },
|
||||||
|
country: { type: "string", default: null },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
security: [
|
||||||
|
{
|
||||||
|
basicAuth: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
preHandler: [
|
||||||
|
validationHandler.fieldCheck,
|
||||||
|
validationHandler.verifySupplier,
|
||||||
|
// validationHandler.validatePhoneFormat,
|
||||||
|
validationHandler.validateEmailFormat,
|
||||||
|
],
|
||||||
|
handler: supplierController.addSupplier,
|
||||||
|
});
|
||||||
|
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in new issue