import { Franchisee } from "./FranchiseeModel.js"; import sendEmail from "../../Utils/sendEmail.js" import cloudinary from "../../Utils/cloudinary.js"; import { Order } from '../Orders/orderModel.js' import fs from "fs"; import bcrypt from "bcryptjs" import password from 'secure-random-password' import { generate } from "generate-password"; import { Product } from "../Products/ProductModel.js"; 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; req.user.role === 'admin' ? req.body.verify = true : req.body.verify = false 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) req.user.role === 'admin' ? req.body.verify = true : req.body.verify = false 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: err.message ? err.message : "Unable to Update." }); } }; 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" }); } }; //------------------------------Franchisee Auth----------------------// export const FranchiseeLogin = async (req, res) => { try { const { email, password } = req.body; const franchisee = await Franchisee.findOne({ email }) .select("+password") if (!franchisee) { return res.status(400).json({ success: false, message: "Franchisee does not exist", }); } const isMatch = await franchisee.comparePassword(password); if (!isMatch) { return res.status(400).json({ success: false, message: "Incorrect password", }); } const token = await franchisee.getJWTToken(); res.status(200).json({ success: true, franchisee, token, }); } catch (error) { res.status(500).json({ success: false, message: error.message, }); } }; //6.Get User Detail export const getFransiDetails = async (req, res) => { try { const franchisee = await Franchisee.findById(req.franchi._id); res.status(200).json({ success: true, franchisee, }); } catch (error) { res.status(500).json({ success: false, message: error.message, }) } }; export const franchiseeUpdatePassword = async (req, res) => { try { const franchisee = await Franchisee.findById(req.franchi._id).select("+password"); const { oldPassword, newPassword } = req.body; if (!oldPassword || !newPassword) { return res.status(400).json({ success: false, message: "Please provide old and new password", }); } const isMatch = await franchisee.comparePassword(oldPassword); if (!isMatch) { return res.status(400).json({ success: false, message: "Incorrect Old password", }); } franchisee.password = newPassword; await franchisee.save(); res.status(200).json({ success: true, message: "Password Updated", }); } catch (error) { res.status(500).json({ success: false, message: error.message, }); } }; export const franchiseeForgotPassword = async (req, res, next) => { const franchisee = await Franchisee.findOne({ email: req.body.email }); if (!franchisee) { return res.status(404).json({ message: "Franchisee not found" }); } const passwords = password.randomPassword({ length: 12, characters: [ { characters: password.upper, exactly: 1 }, { characters: password.symbols, exactly: 1 }, password.lower, password.digits] }) franchisee.password = passwords; // req.body.password = await bcrypt.hash(passwords, 12) await franchisee.save() try { await sendEmail({ to: `${franchisee.email}`, // Change to your recipient from: `${process.env.SEND_EMAIL_FROM}`, // Change to your verified sender subject: `ATP Franchisee Password Recovery`, html: `your new password is:
${passwords}

If you have not requested this email then, please ignore it.` }); res.status(200).json({ success: true, message: `Password sent to ${franchisee.email} successfully`, }); } catch (error) { return res.status(500).json({ message: error?.message || "Something went wrong!" }); } } //edit franchi profile self export const EditFranchiseeProfile = 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.franchi._id.toString() ) { 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.franchi._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); } req.body.verify = false const entity = await Franchisee.findByIdAndUpdate(req.franchi._id, req.body); return res.status(200).json({ success: true, data: entity, message: `Franchisee Edited successfully and varified by admin soon !`, }); } catch (err) { console.log(err); if (req?.files?.image?.tempFilePath) fs.unlinkSync(image_file?.tempFilePath); return res.status(500).json({ message: err.message }); } } //franchisee varification export const FranchiseeVarificationFromAdmin = async (req, res) => { try { const getFranchisee = await Franchisee.findById(req.params.id); if (getFranchisee.verify === false) { if (req.user.role === 'admin') { getFranchisee.verify = true getFranchisee.save() await sendEmail({ to: `${getFranchisee.email}`, // Change to your recipient from: `${process.env.SEND_EMAIL_FROM}`, // Change to your verified sender subject: `Cakestick Franchisee Varification`, html: `your franchisee ${getFranchisee.name} is Varified !!

Thank You

` }); return res.status(200).json({ success: true, message: `Franchisee varify successfully`, }); } else { return res.status(400).json({ success: false, message: `Franchisee varification failled! only admin can varify, please try with admin account `, }); } } else { return res.status(400).json({ success: false, message: `Franchisee Allready Varified`, }); } } catch (err) { // console.log(err) return res.status(500).json({ message: err.message ? err.message : "Something went wrong." }); } }; //filter franchisee wise product export const FranchiseePriceLevelProduct = async (req, res) => { try { const getFranchisee = await Franchisee.findById(req.franchi._id); // console.log(getFranchisee.price_Lable) if (getFranchisee?.price_Lable) { const getFranchiseeProduct = await Product.find().select(` name ${getFranchisee.price_Lable} ${getFranchisee.price_Lable}_With_Tax taxId description image createdAt updatedAt`); return res.status(200).json({ success: true, getFranchiseeProduct, message: `Franchisee product fetched`, }); } } catch (err) { return res.status(500).json({ message: err.message ? err.message : "Something went wrong." }); } }; //franchisee order export const createOrder = async (req, res) => { try { if (!req?.franchi) return res.status(400).json({ message: "please login !" }); // console.log(req?.user) let isUnique = false; let order_id = generate({ length: 9, numbers: true, lowercase: false, uppercase: false, }); while (!isUnique) { const unqOrder = await Order.findOne({ order_id }); if (!unqOrder) { isUnique = true; } else { order_id = generate({ length: 9, numbers: true, lowercase: false, uppercase: false, }); } } req.body.user = req?.franchi?._id req.body.order_id = order_id const order = await Order.create(req.body); res.status(201).json({ success: true, order, message: 'order Created', }); } catch (error) { res.status(500).json({ success: false, message: error.message ? error.message : 'Something went Wrong', }); } } export const getAllOrder = async (req, res) => { try { if (!req?.franchi) return res.status(400).json({ message: "please login first !" }); // console.log(req?.user) const order = await Order.find({ user: req?.franchi?._id }).populate({ path: "user", select: "name -_id", }).sort({ createdAt: -1 }); if (order) { res.status(201).json({ success: true, order, message: 'All Order Fetched', }); } } catch (error) { res.status(500).json({ success: false, message: error.message ? error.message : 'Something went Wrong', }); } } export const getSingleOrder = async (req, res) => { try { if (!req?.franchi) return res.status(400).json({ message: "please login first !" }); // console.log(req?.user) if (!req.params.id) return res.status(400).json({ message: "please Provide Order Id" }); const order = await Order.findById(req.params.id).populate({ path: "user", select: "name -_id", }).populate({ path: "shippingInfo", populate: { path: "Franchisee", select: "banner price_Lable ", }, }).sort({ createdAt: -1 }); if (order) { res.status(201).json({ success: true, order, message: ' Order Fetched', }); } } catch (error) { res.status(500).json({ success: false, message: error.message ? error.message : 'Something went Wrong', }); } } export const EditOrderBeforePayment = async (req, res) => { try { if (!req?.franchi) return res.status(400).json({ message: "please login first !" }); // console.log(req?.user) if (!req.params.id) return res.status(400).json({ message: "please Provide Order Id" }); const order = await Order.findById(req.params.id) if (order) { if (order.isPaid === false) { if (order.user.toString() === req?.franchi._id.toString()) { req.body.user = req?.franchi._id const ModifyOrder = await Order.findByIdAndUpdate(req.params.id, req.body, { new: true, runValidators: true, useFindAndModify: false, } ); res.status(200).json({ success: true, order: ModifyOrder, message: ' Order Updated', }); } else { return res.status(400).json({ message: 'You not created This So You Can not Edit this Order !! ' }) } } else { return res.status(400).json({ message: 'order can not Edited Because Payment Done !! ' }) } } } catch (error) { res.status(500).json({ success: false, message: error.message ? error.message : 'Something went Wrong', }); } } export { addFranchisee, getAllFranchisees, getAllFranchiseesPopulated, getFranchiseeById, getFranchiseeByIdPopulated, updateFranchisee, deleteFranchiseeById, getFranchiseeByIdWithoutPopulate, // getAllFranchiseesPopulatedWithOption, findFranchiseeByURL, // getFranchiseeProductsForChild, addProductToFranchisee, // addGradeToFranchisee, // getFranchiseeGradesAndHousesByParent, };