From 55fd1c72f7361ea787dbff3f63eb6aad66135740 Mon Sep 17 00:00:00 2001
From: pawan-dot <71133473+pawan-dot@users.noreply.github.com>
Date: Thu, 9 Feb 2023 18:04:15 +0530
Subject: [PATCH] franchisee edit
---
app.js | 7 +-
resources/Franchisee/FranchiseeModel.js | 69 +++++
resources/Franchisee/FranchiseeRoute.js | 30 ++
resources/Franchisee/Franchisee_controller.js | 280 ++++++++++++++++++
resources/Temple/TempleModel.js | 29 --
resources/Temple/TempleRoute.js | 30 --
resources/Temple/Temple_controller.js | 219 --------------
7 files changed, 383 insertions(+), 281 deletions(-)
create mode 100644 resources/Franchisee/FranchiseeModel.js
create mode 100644 resources/Franchisee/FranchiseeRoute.js
create mode 100644 resources/Franchisee/Franchisee_controller.js
delete mode 100644 resources/Temple/TempleModel.js
delete mode 100644 resources/Temple/TempleRoute.js
delete mode 100644 resources/Temple/Temple_controller.js
diff --git a/app.js b/app.js
index 1fcdf29..dc9dcad 100644
--- a/app.js
+++ b/app.js
@@ -29,9 +29,10 @@ app.use("/api", ProductRouter);
//Order
import orderRoute from './resources/Orders/orderRoute.js'
app.use("/api", orderRoute);
-//Temple
-import TempleRouter from "./resources/Temple/TempleRoute.js";
-app.use("/api/temple", TempleRouter);
+
+//Franchisee
+import FranchiseeRouter from "./resources/Franchisee/FranchiseeRoute.js";
+app.use("/api/franchisee", FranchiseeRouter);
//state
import StateRouter from "./resources/setting/state/state_routes.js";
app.use("/api/state", StateRouter);
diff --git a/resources/Franchisee/FranchiseeModel.js b/resources/Franchisee/FranchiseeModel.js
new file mode 100644
index 0000000..26bc635
--- /dev/null
+++ b/resources/Franchisee/FranchiseeModel.js
@@ -0,0 +1,69 @@
+import mongoose from "mongoose";
+import validator from "validator"
+import bcrypt from "bcryptjs"
+import jwt from "jsonwebtoken"
+import crypto from "crypto"
+const { Schema, model } = mongoose;
+
+const FranchiseeSchema = new Schema(
+ {
+ name: {
+ type: String,
+ required: [true, "Please Enter Your Name"],
+ maxLength: [30, "Name cannot exceed 30 characters"],
+ minLength: [3, "Name should have more than 3 characters"],
+ }, email: {
+ type: String,
+ required: [true, "Please Enter Your Email"],
+ unique: true,
+ validate: [validator.isEmail, "Please Enter a valid Email"],
+ },
+ password: {
+ type: String,
+ required: [true, "Please Enter Your Password"],
+ minLength: [6, "Password should be greater than 6 characters"],
+ select: false,//find not got passpord
+ },
+ address_line_1: { type: String, required: true },
+ address_line_2: { type: String, required: true },
+ contact_Number: { type: Number, required: true },
+ contact_Person_Name: { type: String, required: true },
+ city: { type: mongoose.Schema.ObjectId, ref: "City" },
+
+
+ products: [
+ {
+ type: mongoose.Schema.ObjectId,
+ ref: "Product",
+ },
+ ],
+ price_Lable: { type: String, default: "" },
+ url: { type: String, default: "" },
+ pin_Code: { type: Number, required: true },
+ short_url: { type: String, default: "" },
+ banner: { type: Object, default: { url: "", public_id: "" } },
+ },
+ { timestamps: true }
+);
+
+FranchiseeSchema.pre("save", async function (next) {
+ if (!this.isModified("password")) {
+ next();
+ }
+
+ this.password = await bcrypt.hash(this.password, 12);
+});
+
+// JWT TOKEN
+FranchiseeSchema.methods.getJWTToken = function () {
+ return jwt.sign({ id: this._id }, process.env.JWT_SECRET);
+};
+
+
+// Compare Password
+
+FranchiseeSchema.methods.comparePassword = async function (password) {
+ return await bcrypt.compare(password, this.password);
+};
+
+export const Franchisee = model("Franchisee", FranchiseeSchema);
diff --git a/resources/Franchisee/FranchiseeRoute.js b/resources/Franchisee/FranchiseeRoute.js
new file mode 100644
index 0000000..d4a4dab
--- /dev/null
+++ b/resources/Franchisee/FranchiseeRoute.js
@@ -0,0 +1,30 @@
+import { Router } from "express";
+const router = Router();
+import {
+ addFranchisee,
+ getAllFranchisees,
+ getFranchiseeById,
+ updateFranchisee,
+ deleteFranchiseeById,
+ getFranchiseeByIdWithoutPopulate,
+ getAllFranchiseesPopulated,
+ // getAllFranchiseesPopulatedWithOption,
+ addProductToFranchisee,
+ // addGradeToFranchisee,
+ getFranchiseeByIdPopulated,
+} from "./Franchisee_controller.js";
+import { authorizeRoles, isAuthenticatedUser } from "../../middlewares/auth.js";
+
+router.get("/", getAllFranchisees);
+router.get("/withpopulate", isAuthenticatedUser, getAllFranchiseesPopulated);
+// router.get("/withpopulate/:option", getAllFranchiseesPopulatedWithOption);
+router.get("/withoutpopulate/:id", isAuthenticatedUser, getFranchiseeByIdWithoutPopulate);
+router.get("/:id", isAuthenticatedUser, getFranchiseeById);
+router.get("/arrayspopulate/:id", getFranchiseeByIdPopulated);
+router.post("/", isAuthenticatedUser, authorizeRoles("admin"), addFranchisee);
+router.patch("/product/:id", isAuthenticatedUser, addProductToFranchisee);
+// router.patch("/grade/:id", addGradeToFranchisee);
+router.patch("/:id", isAuthenticatedUser, authorizeRoles("admin"), updateFranchisee);
+router.delete("/:id", isAuthenticatedUser, authorizeRoles("admin"), deleteFranchiseeById);
+
+export default router;
diff --git a/resources/Franchisee/Franchisee_controller.js b/resources/Franchisee/Franchisee_controller.js
new file mode 100644
index 0000000..c8a3a80
--- /dev/null
+++ b/resources/Franchisee/Franchisee_controller.js
@@ -0,0 +1,280 @@
+import { Franchisee } from "./FranchiseeModel.js";
+import sendEmail from "../../Utils/sendEmail.js"
+import cloudinary from "../../Utils/cloudinary.js";
+import fs from "fs";
+import bcrypt from "bcryptjs"
+import password from 'secure-random-password'
+
+import mongoose from "mongoose";
+
+const addFranchisee = async (req, res) => {
+ const image_file = req?.files?.image;
+ try {
+ const { email } = req.body
+ let franchisee = await Franchisee.findOne({ email });
+ if (franchisee) {
+ return res
+ .status(400)
+ .json({ success: false, message: "franchisee already exists" });
+ }
+ const FranchiseeWithURL = await Franchisee.findOne({
+ short_url: req.body?.short_url,
+ });
+ if (FranchiseeWithURL?._id) {
+ if (req?.files?.image?.tempFilePath)
+ fs.unlinkSync(image_file?.tempFilePath);
+ return res.status(400).json({ message: "Franchisee URL is not available!" });
+ }
+ if (image_file?.tempFilePath) {
+ const result = await cloudinary.v2.uploader.upload(
+ image_file?.tempFilePath,
+ {
+ folder: "ATP/Franchisee_banners",
+ }
+ );
+ const image = { url: result?.secure_url, public_id: result?.public_id };
+ req.body.banner = image;
+ fs.unlinkSync(image_file?.tempFilePath);
+ }
+ //generate password
+ const passwords = password.randomPassword({
+ length: 10,
+ characters: [
+ { characters: password.upper, exactly: 1 },
+ { characters: password.symbols, exactly: 1 },
+ password.lower,
+ password.digits]
+ })
+
+ req.body.password = passwords;
+ const entity = await Franchisee.create(req.body);
+ await sendEmail({
+
+ to: `${req.body.email}`, // Change to your recipient
+
+ from: `${process.env.SEND_EMAIL_FROM}`, // Change to your verified sender
+
+ subject: `ATP Franchisee Created`,
+ html: `your franchisee Url is:${req.body.url}
your login email is: ${req.body.email}
and password is: ${passwords}
Thank You
`
+
+ });
+ return res.status(200).json({
+ success: true,
+ data: entity,
+ message: `Franchisee added successfully and Email sent to ${req.body.email} successfully`,
+ });
+ } catch (err) {
+ // console.log(err)
+ fs.unlinkSync(image_file?.tempFilePath);
+ return res.status(500).json({ message: err.message ? err.message : "Unable to create." });
+ }
+};
+
+const addProductToFranchisee = async (req, res) => {
+ try {
+ const Franchisee = await Franchisee.findByIdAndUpdate(
+ req.params.id,
+ {
+ $push: { products: req.body.product_id },
+ },
+ { new: true }
+ );
+ res
+ .status(200)
+ .json({ status: "ok", message: "Product added to Franchisee successfully" });
+ } catch (err) {
+ return res.status(500).json({ message: "Unable to get ID." });
+ }
+};
+
+
+
+const getFranchiseeById = async (req, res) => {
+ try {
+ const entity = await Franchisee.findById(req.params.id)
+ .populate("city")
+ .populate("products");
+ return res.status(200).json({ status: "OK", data: entity });
+ } catch (err) {
+ console.log(err);
+ return res.status(500).json({ message: "Unable to get menu items." });
+ }
+};
+
+const getFranchiseeByIdPopulated = async (req, res) => {
+ try {
+ const entity = await Franchisee.findById(req.params.id).populate({
+ path: "city",
+ select: "city_name state -_id",
+ populate: {
+ path: "state",
+ select: "state_name state_code -_id",
+ },
+ });
+ return res.status(200).json({ status: "OK", data: entity });
+ } catch (err) {
+ return res.status(500).json({ message: "Unable to get franchiee ." });
+ }
+};
+
+const getFranchiseeByIdWithoutPopulate = async (req, res) => {
+ try {
+ const entity = await Franchisee.findById(req.params.id);
+ return res.status(200).json({ status: "OK", data: entity });
+ } catch (err) {
+ console.log(err);
+ return res.status(500).json({ message: "Unable to get menu items." });
+ }
+};
+
+const getAllFranchisees = async (req, res) => {
+ try {
+ const entity = await Franchisee.find({}).populate("city");
+ return res.status(200).json({ status: "OK", data: entity });
+ } catch (err) {
+ return res.status(500).json({ message: "Unable to get menu items." });
+ }
+};
+
+const getAllFranchiseesPopulated = async (req, res) => {
+ try {
+ const entity = await Franchisee.find({})
+ .populate("city");
+ return res.status(200).json({ status: "OK", data: entity });
+ } catch (err) {
+ return res.status(500).json({ message: "Unable to get menu items." });
+ }
+};
+
+
+
+const updateFranchisee = async (req, res) => {
+ const image_file = req?.files?.image;
+ try {
+ const FranchiseeWithURL = await Franchisee.findOne({
+ short_url: req.body?.short_url,
+ });
+ if (
+ FranchiseeWithURL?._id &&
+ FranchiseeWithURL?._id?.toString() !== req.params.id
+ ) {
+ if (req?.files?.image?.tempFilePath)
+ fs.unlinkSync(image_file?.tempFilePath);
+ return res.status(400).json({ message: "Franchisee URL is not available!" });
+ }
+ const getFranchisee = await Franchisee.findById(req.params.id);
+ if (image_file?.tempFilePath) {
+ if (getFranchisee?.banner) {
+ const imageId = getFranchisee?.banner?.public_id;
+
+ await cloudinary.uploader.destroy(imageId)
+ }
+ const result = await cloudinary.v2.uploader.upload(
+ image_file?.tempFilePath,
+ {
+ folder: "ATP/Franchisee_banners",
+ }
+ );
+ const image = { url: result?.secure_url, public_id: result?.public_id };
+ req.body.banner = image;
+ fs.unlinkSync(image_file?.tempFilePath);
+ await cloudinary.v2.uploader.destroy(getFranchisee.banner.public_id);
+ }
+ //generate password
+ const passwords = password.randomPassword({
+ length: 10,
+ characters: [
+ { characters: password.upper, exactly: 1 },
+ { characters: password.symbols, exactly: 1 },
+ password.lower,
+ password.digits]
+ })
+
+ req.body.password = await bcrypt.hash(passwords, 12)
+ const entity = await Franchisee.findByIdAndUpdate(req.params.id, req.body);
+ await sendEmail({
+
+ to: `${req.body.email}`, // Change to your recipient
+
+ from: `${process.env.SEND_EMAIL_FROM}`, // Change to your verified sender
+
+ subject: `ATP Franchisee Updated`,
+ html: `your franchisee Url is:${req.body.url}
your login email is: ${req.body.email}
and password is: ${passwords}
Thank You
`
+
+ });
+ return res.status(200).json({
+ success: true,
+ data: entity,
+ message: `Franchisee Updated successfully and Email sent to ${req.body.email} successfully`,
+ });
+ } catch (err) {
+ console.log(err);
+ if (req?.files?.image?.tempFilePath)
+ fs.unlinkSync(image_file?.tempFilePath);
+ return res.status(500).json({ message: "Unable to create." });
+ }
+};
+
+const deleteFranchiseeById = async (req, res) => {
+ try {
+ const findFranchisee = await Franchisee.findById(req.params.id);
+ if (findFranchisee?.banner?.public_id)
+ await cloudinary.v2.uploader.destroy(findFranchisee?.banner?.public_id);
+
+
+ const franchisee = await Franchisee.findByIdAndDelete(req.params.id)
+ if (!franchisee) {
+ return res.status(400).json({ message: 'franchisee Not Found' });
+ }
+ await franchisee.remove();
+
+ res.status(200).json({ status: "OK", msg: 'Deteted successfully' });
+ } catch (err) {
+ return res.status(500).json({ message: err.message ? err.message : "Unable to delete." });
+ }
+};
+
+//website requests
+const findFranchiseeByURL = async (req, res) => {
+ try {
+ const entity = await Franchisee.findOne({ short_url: req.params.url })
+ .populate({
+ path: "city",
+ select: "city_name state -_id",
+ populate: {
+ path: "state",
+ select: "state_name state_code -_id",
+ },
+ })
+ .select(
+ " -products -url -short_url -state_name -createdAt -updatedAt"
+ );
+ if (entity?._id) {
+ return res.status(200).json({ status: "OK", data: entity });
+ } else {
+ return res.status(404).json({ message: "Franchisee not found" });
+ }
+ } catch (err) {
+ console.log(err);
+ return res.status(500).json({ message: "Franchisee not found" });
+ }
+};
+
+
+
+export {
+ addFranchisee,
+ getAllFranchisees,
+ getAllFranchiseesPopulated,
+ getFranchiseeById,
+ getFranchiseeByIdPopulated,
+ updateFranchisee,
+ deleteFranchiseeById,
+ getFranchiseeByIdWithoutPopulate,
+ // getAllFranchiseesPopulatedWithOption,
+ findFranchiseeByURL,
+ // getFranchiseeProductsForChild,
+ addProductToFranchisee,
+ // addGradeToFranchisee,
+ // getFranchiseeGradesAndHousesByParent,
+};
diff --git a/resources/Temple/TempleModel.js b/resources/Temple/TempleModel.js
deleted file mode 100644
index 9bc6304..0000000
--- a/resources/Temple/TempleModel.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import mongoose from "mongoose";
-const { Schema, model } = mongoose;
-
-const TempleSchema = new Schema(
- {
- name: { type: String, required: true },
-
- address_line_1: { type: String, required: true },
- address_line_2: { type: String, required: true },
- contact_Number: { type: Number, required: true },
- contact_Person_Name: { type: String, required: true },
- city: { type: mongoose.Schema.ObjectId, ref: "City" },
-
-
- products: [
- {
- type: mongoose.Schema.ObjectId,
- ref: "Product",
- },
- ],
- price_Lable: { type: String, default: "" },
- url: { type: String, default: "" },
- short_url: { type: String, default: "" },
- banner: { type: Object, default: { url: "", public_id: "" } },
- },
- { timestamps: true }
-);
-
-export const Temple = model("Temple", TempleSchema);
diff --git a/resources/Temple/TempleRoute.js b/resources/Temple/TempleRoute.js
deleted file mode 100644
index 6ba36c9..0000000
--- a/resources/Temple/TempleRoute.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Router } from "express";
-const router = Router();
-import {
- addTemple,
- getAllTemples,
- getTempleById,
- updateTemple,
- deleteTempleById,
- getTempleByIdWithoutPopulate,
- getAllTemplesPopulated,
- // getAllTemplesPopulatedWithOption,
- addProductToTemple,
- // addGradeToTemple,
- getTempleByIdPopulated,
-} from "./Temple_controller.js";
-import { authorizeRoles, isAuthenticatedUser } from "../../middlewares/auth.js";
-
-router.get("/", getAllTemples);
-router.get("/withpopulate", isAuthenticatedUser, getAllTemplesPopulated);
-// router.get("/withpopulate/:option", getAllTemplesPopulatedWithOption);
-router.get("/withoutpopulate/:id", isAuthenticatedUser, getTempleByIdWithoutPopulate);
-router.get("/:id", isAuthenticatedUser, getTempleById);
-router.get("/arrayspopulate/:id", getTempleByIdPopulated);
-router.post("/", isAuthenticatedUser, authorizeRoles("admin"), addTemple);
-router.patch("/product/:id", isAuthenticatedUser, addProductToTemple);
-// router.patch("/grade/:id", addGradeToTemple);
-router.patch("/:id", isAuthenticatedUser, authorizeRoles("admin"), updateTemple);
-router.delete("/:id", isAuthenticatedUser, authorizeRoles("admin"), deleteTempleById);
-
-export default router;
diff --git a/resources/Temple/Temple_controller.js b/resources/Temple/Temple_controller.js
deleted file mode 100644
index 63d1a0c..0000000
--- a/resources/Temple/Temple_controller.js
+++ /dev/null
@@ -1,219 +0,0 @@
-import { Temple } from "./TempleModel.js";
-
-import cloudinary from "../../Utils/cloudinary.js";
-import fs from "fs";
-import mongoose from "mongoose";
-
-const addTemple = async (req, res) => {
- const image_file = req?.files?.image;
- try {
- const TempleWithURL = await Temple.findOne({
- short_url: req.body?.short_url,
- });
- if (TempleWithURL?._id) {
- if (req?.files?.image?.tempFilePath)
- fs.unlinkSync(image_file?.tempFilePath);
- return res.status(400).json({ message: "Temple URL is not available!" });
- }
- if (image_file?.tempFilePath) {
- const result = await cloudinary.v2.uploader.upload(
- image_file?.tempFilePath,
- {
- folder: "ATP/Temple_banners",
- }
- );
- const image = { url: result?.secure_url, public_id: result?.public_id };
- req.body.banner = image;
- fs.unlinkSync(image_file?.tempFilePath);
- }
- const entity = await Temple.create(req.body);
- res.status(200).json({ status: "OK", data: entity });
- } catch (err) {
- fs.unlinkSync(image_file?.tempFilePath);
- return res.status(500).json({ message: "Unable to create." });
- }
-};
-
-const addProductToTemple = async (req, res) => {
- try {
- const Temple = await Temple.findByIdAndUpdate(
- req.params.id,
- {
- $push: { products: req.body.product_id },
- },
- { new: true }
- );
- res
- .status(200)
- .json({ status: "ok", message: "Product added to Temple successfully" });
- } catch (err) {
- return res.status(500).json({ message: "Unable to get ID." });
- }
-};
-
-
-
-const getTempleById = async (req, res) => {
- try {
- const entity = await Temple.findById(req.params.id)
- .populate("city")
- .populate("products");
- return res.status(200).json({ status: "OK", data: entity });
- } catch (err) {
- console.log(err);
- return res.status(500).json({ message: "Unable to get menu items." });
- }
-};
-
-const getTempleByIdPopulated = async (req, res) => {
- try {
- const entity = await Temple.findById(req.params.id).populate({
- path: "city",
- select: "city_name state -_id",
- populate: {
- path: "state",
- select: "state_name state_code -_id",
- },
- });
- return res.status(200).json({ status: "OK", data: entity });
- } catch (err) {
- return res.status(500).json({ message: "Unable to get franchiee ." });
- }
-};
-
-const getTempleByIdWithoutPopulate = async (req, res) => {
- try {
- const entity = await Temple.findById(req.params.id);
- return res.status(200).json({ status: "OK", data: entity });
- } catch (err) {
- console.log(err);
- return res.status(500).json({ message: "Unable to get menu items." });
- }
-};
-
-const getAllTemples = async (req, res) => {
- try {
- const entity = await Temple.find({}).populate("city");
- return res.status(200).json({ status: "OK", data: entity });
- } catch (err) {
- return res.status(500).json({ message: "Unable to get menu items." });
- }
-};
-
-const getAllTemplesPopulated = async (req, res) => {
- try {
- const entity = await Temple.find({})
- .populate("city");
- return res.status(200).json({ status: "OK", data: entity });
- } catch (err) {
- return res.status(500).json({ message: "Unable to get menu items." });
- }
-};
-
-
-
-const updateTemple = async (req, res) => {
- const image_file = req?.files?.image;
- try {
- const TempleWithURL = await Temple.findOne({
- short_url: req.body?.short_url,
- });
- if (
- TempleWithURL?._id &&
- TempleWithURL?._id?.toString() !== req.params.id
- ) {
- if (req?.files?.image?.tempFilePath)
- fs.unlinkSync(image_file?.tempFilePath);
- return res.status(400).json({ message: "Temple URL is not available!" });
- }
- const getTemple = await Temple.findById(req.params.id);
- if (image_file?.tempFilePath) {
- if (getTemple?.banner) {
- const imageId = getTemple?.banner?.public_id;
-
- await cloudinary.uploader.destroy(imageId)
- }
- const result = await cloudinary.v2.uploader.upload(
- image_file?.tempFilePath,
- {
- folder: "ATP/Temple_banners",
- }
- );
- const image = { url: result?.secure_url, public_id: result?.public_id };
- req.body.banner = image;
- fs.unlinkSync(image_file?.tempFilePath);
- await cloudinary.v2.uploader.destroy(getTemple.banner.public_id);
- }
- const entity = await Temple.findByIdAndUpdate(req.params.id, req.body);
- res.status(200).json({ status: "OK", data: entity });
- } catch (err) {
- console.log(err);
- if (req?.files?.image?.tempFilePath)
- fs.unlinkSync(image_file?.tempFilePath);
- return res.status(500).json({ message: "Unable to create." });
- }
-};
-
-const deleteTempleById = async (req, res) => {
- try {
- const findTemple = await Temple.findById(req.params.id);
- if (findTemple?.banner?.public_id)
- await cloudinary.v2.uploader.destroy(findTemple?.banner?.public_id);
-
-
- const temple = await Temple.findByIdAndDelete(req.params.id)
- if (!temple) {
- return res.status(400).json({ message: 'temple Not Found' });
- }
- await temple.remove();
-
- res.status(200).json({ status: "OK", msg: 'Deteted successfully' });
- } catch (err) {
- return res.status(500).json({ message: err.message ? err.message : "Unable to delete." });
- }
-};
-
-//website requests
-const findTempleByURL = async (req, res) => {
- try {
- const entity = await Temple.findOne({ short_url: req.params.url })
- .populate({
- path: "city",
- select: "city_name state -_id",
- populate: {
- path: "state",
- select: "state_name state_code -_id",
- },
- })
- .select(
- " -products -url -short_url -state_name -createdAt -updatedAt"
- );
- if (entity?._id) {
- return res.status(200).json({ status: "OK", data: entity });
- } else {
- return res.status(404).json({ message: "Temple not found" });
- }
- } catch (err) {
- console.log(err);
- return res.status(500).json({ message: "Temple not found" });
- }
-};
-
-
-
-export {
- addTemple,
- getAllTemples,
- getAllTemplesPopulated,
- getTempleById,
- getTempleByIdPopulated,
- updateTemple,
- deleteTempleById,
- getTempleByIdWithoutPopulate,
- // getAllTemplesPopulatedWithOption,
- findTempleByURL,
- // getTempleProductsForChild,
- addProductToTemple,
- // addGradeToTemple,
- // getTempleGradesAndHousesByParent,
-};