├── uploads ├── 03_preview.png └── b1db1292fe6ad1ee5c8a2ac7caf29050.jpg ├── src ├── routes │ ├── StateRoutes.js │ ├── PaymentRoutes.js │ ├── AreaRoutes.js │ ├── TwitterRoutes.js │ ├── CityRoutes.js │ ├── RoleRoutes.js │ ├── HordingRoutes.js │ └── UserRoutes.js ├── models │ ├── StateModel.js │ ├── RoleModel.js │ ├── CityModel.js │ ├── TwitterModel.js │ ├── AreaModel.js │ ├── UserModel.js │ └── HordingModel.js ├── utils │ ├── CloudanryUtil.js │ ├── MailUtil.js │ └── twittercleandata.js ├── controllers │ ├── StateController.js │ ├── AreaController.js │ ├── CityController.js │ ├── RoleController.js │ ├── RazorPayController.js │ ├── twitter.js │ ├── HordingController.js │ └── UserController.js └── middleware │ └── AuthMiddleware.js ├── package.json ├── backup.txt ├── app.js ├── .gitignore └── th.txt /uploads/03_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samirvithlani/internship-25-nodejs/HEAD/uploads/03_preview.png -------------------------------------------------------------------------------- /uploads/b1db1292fe6ad1ee5c8a2ac7caf29050.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samirvithlani/internship-25-nodejs/HEAD/uploads/b1db1292fe6ad1ee5c8a2ac7caf29050.jpg -------------------------------------------------------------------------------- /src/routes/StateRoutes.js: -------------------------------------------------------------------------------- 1 | const routes = require('express').Router(); 2 | const stateController = require('../controllers/StateController'); 3 | routes.post("/addstate", stateController.addState); 4 | routes.get("/getallstates", stateController.getAllStates); 5 | module.exports = routes; -------------------------------------------------------------------------------- /src/routes/PaymentRoutes.js: -------------------------------------------------------------------------------- 1 | const router = require("express").Router(); 2 | const paymentController = require("../controllers/RazorpayController"); 3 | router.post("/create_order", paymentController.create_order); 4 | router.post("/verify_order", paymentController.verify_order); 5 | 6 | module.exports = router; 7 | 8 | -------------------------------------------------------------------------------- /src/routes/AreaRoutes.js: -------------------------------------------------------------------------------- 1 | const routes = require('express').Router(); 2 | const areaController = require('../controllers/AreaController'); 3 | 4 | routes.post('/add', areaController.addArea); 5 | routes.get('/', areaController.getAreas); 6 | routes.get("/getareabycity/:cityId",areaController.getAreaBycityId) 7 | module.exports = routes; -------------------------------------------------------------------------------- /src/routes/TwitterRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | const twitterController = require('../controllers/twitter'); 4 | 5 | router.post('/scrape', twitterController.scrapeTwitter); 6 | router.get('/analysis/:userId', twitterController.getTwitterAnalysis); 7 | 8 | module.exports = router; 9 | -------------------------------------------------------------------------------- /src/models/StateModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const Schema = mongoose.Schema; 3 | 4 | const stateSchema = new Schema({ 5 | name:{ 6 | type: String, 7 | required: true, 8 | unique: true 9 | } 10 | },{ 11 | timestamps: true 12 | }) 13 | module.exports = mongoose.model('State', stateSchema); -------------------------------------------------------------------------------- /src/routes/CityRoutes.js: -------------------------------------------------------------------------------- 1 | const routes = require('express').Router(); 2 | const cityController = require('../controllers/CityController'); 3 | routes.post("/addcity", cityController.addCity); 4 | routes.get("/getallcities", cityController.getCities); 5 | routes.get("/getcitybystate/:stateId",cityController.getCityByStateId) 6 | module.exports = routes; -------------------------------------------------------------------------------- /src/routes/RoleRoutes.js: -------------------------------------------------------------------------------- 1 | const routes = require("express").Router() 2 | const roleController= require("../controllers/RoleController") 3 | routes.get("/roles",roleController.getAllRoles) 4 | routes.post("/role",roleController.addRole) 5 | routes.delete("/role/:id",roleController.deleteRole) 6 | routes.get("/role/:id",roleController.getRoleById) 7 | 8 | //v-imp 9 | module.exports = routes -------------------------------------------------------------------------------- /src/models/RoleModel.js: -------------------------------------------------------------------------------- 1 | //database 2 | const mongoose = require("mongoose") 3 | const Schema = mongoose.Schema; 4 | 5 | const roleSchema = new Schema({ 6 | //fileds /// get 7 | 8 | name:{ 9 | type:String, 10 | }, 11 | description:{ 12 | type:String 13 | } 14 | 15 | }) 16 | 17 | module.exports = mongoose.model("roles",roleSchema) 18 | 19 | //roles[roleSchema] -------------------------------------------------------------------------------- /src/models/CityModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const Schema = mongoose.Schema; 3 | 4 | const citySchema = new Schema({ 5 | 6 | name:{ 7 | type: String, 8 | required: true, 9 | unique: true 10 | }, 11 | stateId:{ 12 | type:Schema.Types.ObjectId, 13 | ref:"State", 14 | } 15 | },{ 16 | timestamps: true 17 | }) 18 | module.exports = mongoose.model('City', citySchema); -------------------------------------------------------------------------------- /src/utils/CloudanryUtil.js: -------------------------------------------------------------------------------- 1 | const cloundinary = require("cloudinary").v2; 2 | 3 | 4 | const uploadFileToCloudinary = async (file) => { 5 | 6 | //conif 7 | cloundinary.config({ 8 | cloud_name:"", 9 | api_key:"", 10 | api_secret:"" 11 | }) 12 | 13 | const cloundinaryResponse = await cloundinary.uploader.upload(file.path); 14 | return cloundinaryResponse; 15 | 16 | 17 | 18 | }; 19 | module.exports = { 20 | uploadFileToCloudinary 21 | } -------------------------------------------------------------------------------- /src/routes/HordingRoutes.js: -------------------------------------------------------------------------------- 1 | const routes = require('express').Router(); 2 | const hordingController = require('../controllers/HordingController'); 3 | routes.post('/add', hordingController.addHording); 4 | routes.get('/all', hordingController.getAllHordings); 5 | routes.get('/getHordingsbyuserid/:userId', hordingController.getAllHordingsByUserId); 6 | routes.post('/addWithFile', hordingController.addHordingWithFile); 7 | routes.put("/updatehording/:id",hordingController.updateHording); 8 | routes.get("/getHordingById/:id",hordingController.getHordingById); 9 | module.exports = routes; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "25-intern-node", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "bcrypt": "^5.1.1", 13 | "cloudinary": "^2.5.1", 14 | "cors": "^2.8.5", 15 | "express": "^4.21.2", 16 | "jsonwebtoken": "^9.0.2", 17 | "mongoose": "^8.10.1", 18 | "multer": "^1.4.5-lts.1", 19 | "nodemailer": "^6.10.0", 20 | "path": "^0.12.7", 21 | "razorpay": "^2.9.6" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/models/TwitterModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const TwitterSchema = new mongoose.Schema({ 4 | userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }, 5 | category: { type: String, enum: ['trending', 'sports'], required: true }, 6 | topics: [ 7 | { 8 | topic: { type: String, required: true }, 9 | posts: { type: String, default: 'N/A' }, 10 | scrapedAt: { type: Date, default: Date.now } 11 | } 12 | ] 13 | }, { timestamps: true }); 14 | 15 | module.exports = mongoose.model('Twitter', TwitterSchema); 16 | -------------------------------------------------------------------------------- /src/models/AreaModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const Schema = mongoose.Schema; 3 | 4 | const areaSchema = new Schema({ 5 | name:{ 6 | type: String, 7 | required: true, 8 | unique: true 9 | }, 10 | cityId:{ 11 | type:Schema.Types.ObjectId, 12 | ref:"City", 13 | }, 14 | stateId:{ 15 | type:Schema.Types.ObjectId, 16 | ref:"State", 17 | }, 18 | pincode:{ 19 | type: Number, 20 | required: true, 21 | unique: true 22 | } 23 | },{ 24 | timestamps: true 25 | }) 26 | module.exports = mongoose.model('Area', areaSchema); -------------------------------------------------------------------------------- /src/models/UserModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose") 2 | const Schema = mongoose.Schema 3 | 4 | const userSchema = new Schema({ 5 | 6 | firstName:{ 7 | type:String 8 | }, 9 | lastName:{ 10 | type:String 11 | }, 12 | age:{ 13 | type:Number 14 | }, 15 | status:{ 16 | type:Boolean, 17 | default:true 18 | }, 19 | roleId:{ 20 | type:Schema.Types.ObjectId, //batugasoijkadsasiksaj 21 | ref:"roles" 22 | }, 23 | password:{ 24 | type:String, 25 | }, 26 | email:{ 27 | type:String, 28 | unique:true 29 | } 30 | 31 | }) 32 | 33 | module.exports = mongoose.model("users",userSchema) -------------------------------------------------------------------------------- /src/utils/MailUtil.js: -------------------------------------------------------------------------------- 1 | //to,from,subject,text 2 | const mailer = require('nodemailer'); 3 | 4 | ///function 5 | 6 | const sendingMail = async(to,subject,text) => { 7 | 8 | const transporter = mailer.createTransport({ 9 | service: 'gmail', 10 | auth:{ 11 | user:"pythonforsamir@gmail.com", 12 | pass:"dyzp bppo ihwx htks" 13 | } 14 | }) 15 | 16 | const mailOptions = { 17 | from: 'pythonforsamir@gmail.com', 18 | to: to, 19 | subject: subject, 20 | //text: text 21 | html:text 22 | } 23 | 24 | const mailresponse = await transporter.sendMail(mailOptions); 25 | console.log(mailresponse); 26 | return mailresponse; 27 | 28 | } 29 | 30 | module.exports ={ 31 | sendingMail 32 | } 33 | //sendingMail("samir.vithlani83955@gmail.com","Test Mail","this is test mail") 34 | 35 | -------------------------------------------------------------------------------- /src/routes/UserRoutes.js: -------------------------------------------------------------------------------- 1 | //router 2 | const routes = require("express").Router() 3 | //controller --> userController 4 | const userController = require("../controllers/UserController") 5 | const authMiddleware = require("../middleware/AuthMiddleware") 6 | 7 | 8 | //routes.post("/user",userController.addUser) 9 | routes.post("/user",userController.signup) 10 | routes.get("/users",authMiddleware.authMiddleware,userController.getAllUsers) 11 | routes.get("/user/:id",userController.getUserById) 12 | routes.delete("/user/:id",userController.deleteUserById) 13 | //routes.post("/user/login",userController.loginUser) 14 | routes.post("/user/login",userController.loginuserWithToken) 15 | routes.post("/user/forgotpassword",userController.forgotPassword) 16 | routes.post("/user/resetpassword",userController.resetpassword) 17 | //get 18 | //post 19 | //delete 20 | //get 21 | 22 | module.exports = routes -------------------------------------------------------------------------------- /src/controllers/StateController.js: -------------------------------------------------------------------------------- 1 | const stateModel = require("../models/StateModel"); 2 | 3 | //addState 4 | //getAllStates. 5 | 6 | const addState = async (req, res) => { 7 | try { 8 | const savedState = await stateModel.create(req.body); 9 | res.status(201).json({ 10 | message: "State added successfully", 11 | data: savedState, 12 | }); 13 | } catch (err) { 14 | res.status(500).json({ 15 | message: err, 16 | }); 17 | } 18 | }; 19 | 20 | const getAllStates = async (req, res) => { 21 | 22 | try{ 23 | 24 | const states = await stateModel.find(); 25 | res.status(200).json({ 26 | message: "All states fetched successfully", 27 | data: states 28 | }) 29 | 30 | }catch(err){ 31 | 32 | res.status(500).json({ 33 | message: err 34 | }) 35 | 36 | } 37 | 38 | } 39 | module.exports = { 40 | addState, 41 | getAllStates, 42 | } 43 | -------------------------------------------------------------------------------- /backup.txt: -------------------------------------------------------------------------------- 1 | 2 | app.js 3 | console.log("Hello") 4 | var user = require("./user") //user == userName // {userName,userAge,printUserData} 5 | console.log(user) 6 | console.log(user.userName) 7 | console.log(user.userAge) 8 | user.printUserData(100) // function calling.. 9 | 10 | 11 | user.js 12 | console.log("user file loaded....") 13 | var userName = "Ram" 14 | var userAge = 23 15 | 16 | const printUserData = (a)=>{ 17 | 18 | console.log("print userdata function called from user.js file...",a) 19 | } 20 | 21 | //export 22 | // module.exports = userName 23 | // module.exports = userAge 24 | 25 | module.exports = { 26 | userName,userAge,printUserData 27 | } 28 | 29 | 30 | 31 | //https://node5.onrender.com/user/user : domain + endpoints 32 | //http://localhost:3000/test 33 | app.get("/test",(req,res)=>{ 34 | 35 | console.log("test api called...") 36 | 37 | res.send("hello test api called...") 38 | 39 | }) 40 | 41 | //http://localhost:3000/users 42 | app.get("/users",(req,res)=>{ 43 | 44 | res.json({ 45 | message:"user api called...", 46 | data:["ram","shyam","seeta"] 47 | }) 48 | }) 49 | 50 | -------------------------------------------------------------------------------- /src/controllers/AreaController.js: -------------------------------------------------------------------------------- 1 | const areaModel = require("../models/AreaModel"); 2 | 3 | const addArea = async (req, res) => { 4 | try { 5 | const savedArea = await areaModel.create(req.body); 6 | res.status(201).json({ 7 | message: "Area added successfully", 8 | data: savedArea, 9 | }); 10 | } catch (err) { 11 | res.status(500).json({ message: err }); 12 | } 13 | }; 14 | const getAreas = async (req, res) => { 15 | try { 16 | const areas = await areaModel.find().populate("cityId").populate("stateId"); 17 | res.status(200).json({ 18 | message: "All Areas", 19 | data: areas, 20 | }); 21 | } catch (err) { 22 | res.status(500).json({ message: err }); 23 | } 24 | }; 25 | 26 | const getAreaBycityId = async (req, res) => { 27 | try { 28 | const areas = await areaModel.find({ cityId: req.params.cityId }); 29 | res.status(200).json({ 30 | message: "area found", 31 | data: areas, 32 | }); 33 | } catch (err) { 34 | res.status(500).json({ 35 | message: err, 36 | }); 37 | } 38 | }; 39 | module.exports = { addArea, getAreas,getAreaBycityId }; 40 | -------------------------------------------------------------------------------- /src/controllers/CityController.js: -------------------------------------------------------------------------------- 1 | //add city 2 | //display city 3 | const cityModel = require("../models/CityModel"); 4 | 5 | const addCity = async (req, res) => { 6 | try { 7 | const savedCity = await cityModel.create(req.body); 8 | res.status(201).json({ 9 | message: "City added successfully", 10 | data: savedCity, 11 | }); 12 | } catch (err) { 13 | res.status(500).json({ message: err.message }); 14 | } 15 | }; 16 | 17 | const getCities = async (req, res) => { 18 | try { 19 | const cities = await cityModel.find().populate("stateId"); 20 | res.status(200).json({ 21 | message: "All cities", 22 | data: cities, 23 | }); 24 | } catch (err) { 25 | res.status(500).json({ message: err }); 26 | } 27 | }; 28 | 29 | const getCityByStateId = async (req, res) => { 30 | try { 31 | const cities = await cityModel.find({ stateId: req.params.stateId }); 32 | res.status(200).json({ 33 | message: "city found", 34 | data: cities, 35 | }); 36 | } catch (err) { 37 | res.status(500).json({ 38 | message: "city not found", 39 | }); 40 | } 41 | }; 42 | 43 | module.exports = { addCity, getCities, getCityByStateId}; 44 | -------------------------------------------------------------------------------- /src/middleware/AuthMiddleware.js: -------------------------------------------------------------------------------- 1 | //token --> controller --> 2 | const jwt = require("jsonwebtoken") 3 | const secret = "secret" 4 | 5 | const authMiddleware = (req,res,next)=>{ 6 | 7 | var token = req.headers.authorization; 8 | 9 | if(token){ 10 | 11 | if(token.startsWith("Bearer ")){ 12 | 13 | //remove Bearer // string split 14 | //Bearer mkldjoisjalsjijsijsasiao // [Bearer,tokenn] 15 | token = token.split(" ")[1] 16 | //token verify.. 17 | try{ 18 | 19 | const userFromToken = jwt.verify(token,secret) 20 | console.log(userFromToken) 21 | next() 22 | 23 | }catch(err){ 24 | 25 | res.status(500).json({ 26 | message:"token is not valid...." 27 | }) 28 | 29 | } 30 | 31 | } 32 | else{ 33 | res.status(400).json({ 34 | message:"token is not Bearer token" 35 | }) 36 | } 37 | 38 | 39 | 40 | } 41 | else{ 42 | res.status(400).json({ 43 | message:"token is required.." 44 | }) 45 | } 46 | } 47 | 48 | module.exports = { 49 | authMiddleware 50 | } -------------------------------------------------------------------------------- /src/controllers/RoleController.js: -------------------------------------------------------------------------------- 1 | const roleModel = require("../models/RoleModel"); 2 | //roleModel == roles 3 | const getAllRoles = async (req, res) => { 4 | //await.... 5 | //select * from roleModel 6 | 7 | const roles = await roleModel.find(); //[{}] 8 | 9 | res.json({ 10 | message: "role fetched successfully", 11 | data: roles, 12 | }); 13 | }; 14 | 15 | const addRole = async (req, res) => { 16 | //req.body,req.params,req.headers,req.query 17 | //console.log("request body....", req.body); 18 | //insert into roles () values() 19 | //database... 20 | const savedRole = await roleModel.create(req.body) 21 | 22 | res.json({ 23 | message:"role created...", 24 | data:savedRole 25 | }); 26 | }; 27 | 28 | const deleteRole = async(req,res)=>{ 29 | 30 | //delete from roles where id =? 31 | //req.params 32 | // console.log(req.params.id) //prams object... 33 | 34 | const deletedRole = await roleModel.findByIdAndDelete(req.params.id) 35 | 36 | res.json({ 37 | message:"role deleted successfully..", 38 | data:deletedRole 39 | }) 40 | 41 | 42 | 43 | } 44 | 45 | const getRoleById = async (req,res)=>{ 46 | 47 | //req.params.id 48 | 49 | const foundRole = await roleModel.findById(req.params.id) 50 | res.json({ 51 | message:"role fatched..", 52 | data:foundRole 53 | }) 54 | 55 | } 56 | 57 | 58 | module.exports = { 59 | getAllRoles,addRole,deleteRole,getRoleById 60 | }; 61 | -------------------------------------------------------------------------------- /src/models/HordingModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const Schema = mongoose.Schema; 3 | 4 | const hordingSchema = new Schema({ 5 | 6 | hoardingDimension:{ 7 | type: String, 8 | required: true 9 | }, 10 | hoardingType:{ 11 | enum: ['Unipole', 'Billboard', 'Gantry', 'Digital'], 12 | type: String, 13 | required: true 14 | 15 | }, 16 | Availablity_Status:{ 17 | type: Boolean, 18 | required: true, 19 | default: true 20 | }, 21 | hourlyRate:{ 22 | type: Number, 23 | required: true 24 | }, 25 | hordingURL:{ 26 | type: String, 27 | required: true 28 | }, 29 | stateId:{ 30 | type: Schema.Types.ObjectId, 31 | ref: 'State', 32 | required: true 33 | }, 34 | cityId:{ 35 | type: Schema.Types.ObjectId, 36 | ref: 'City', 37 | required: true 38 | }, 39 | areaId:{ 40 | type: Schema.Types.ObjectId, 41 | ref: 'Area', 42 | required: true 43 | }, 44 | userId:{ 45 | type: Schema.Types.ObjectId, 46 | ref: 'users', 47 | required: true 48 | }, 49 | latitude:{ 50 | type: Number, 51 | required: true 52 | }, 53 | longitude:{ 54 | type: Number, 55 | required: true 56 | }, 57 | 58 | 59 | 60 | },{timestamps: true}); 61 | module.exports = mongoose.model('Hording', hordingSchema); -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const express = require("express") //express.... 2 | const mongoose = require("mongoose") 3 | const cors = require("cors") 4 | //express object.. 5 | const app = express() 6 | app.use(cors()) // * 7 | app.use(express.json()) //to accept data as json... 8 | 9 | 10 | //import role routes 11 | const roleRoutes = require("./src/routes/RoleRoutes") 12 | app.use(roleRoutes) 13 | 14 | //userRoutes 15 | const userRoutes = require("./src/routes/UserRoutes") 16 | app.use(userRoutes) 17 | 18 | const stateRoutes = require("./src/routes/StateRoutes") 19 | app.use("/state",stateRoutes) // 20 | //http://localhost:3000/addState 21 | //http://localhost:3000/state/addState 22 | 23 | const cityRoutes = require("./src/routes/CityRoutes") 24 | app.use("/city",cityRoutes) //http://localhost:3000/city/addCity 25 | 26 | const areaRoutes = require("./src/routes/AreaRoutes") 27 | app.use("/area",areaRoutes) //http://localhost:3000/area/add 28 | 29 | const hordingRoutes = require("./src/routes/HordingRoutes") 30 | app.use("/hording",hordingRoutes) //http://localhost:3000/hording/add 31 | 32 | const paymentRoutes = require("./src/routes/PaymentRoutes") 33 | app.use("/payment", paymentRoutes) //http://localhost:3000/payment/create_order 34 | 35 | mongoose.connect("mongodb://127.0.0.1:27017/25_node_internship").then(()=>{ 36 | console.log("database connected....") 37 | }) 38 | 39 | 40 | //server creation... 41 | const PORT = 3000 42 | app.listen(PORT,()=>{ 43 | console.log("server started on port number ",PORT) 44 | }) 45 | -------------------------------------------------------------------------------- /src/controllers/RazorPayController.js: -------------------------------------------------------------------------------- 1 | 2 | const Razorpay = require("razorpay"); 3 | const bodyParser = require("body-parser"); 4 | 5 | 6 | // Razorpay instance 7 | const razorpay = new Razorpay({ 8 | key_id: "rzp_test_d32mzcypTwltG7", 9 | key_secret: "1YJr64YQjSz8F09ADdcsIo2x", 10 | }); 11 | 12 | // API to create an order 13 | const create_order =async (req, res) => { 14 | const { amount, currency, receipt } = req.body; 15 | 16 | const options = { 17 | amount: amount * 100, // Razorpay expects the amount in paise 18 | currency: currency, 19 | receipt: receipt, 20 | }; 21 | 22 | try { 23 | const order = await razorpay.orders.create(options); 24 | res.json(order); // Returns the order details, including order_id 25 | } catch (error) { 26 | console.log(error) 27 | console.error(error); 28 | res.status(500).json({ message: "Something went wrong" }); 29 | } 30 | }; 31 | 32 | // API to verify the payment signature (optional for backend verification) 33 | const verify_order = async (req, res) => { 34 | const crypto = require("crypto"); 35 | 36 | const { razorpay_order_id, razorpay_payment_id, razorpay_signature } = req.body; 37 | 38 | const secret = "1YJr64YQjSz8F09ADdcsIo2x"; 39 | 40 | const hash = crypto.createHmac("sha256", secret) 41 | .update(razorpay_order_id + "|" + razorpay_payment_id) 42 | .digest("hex"); 43 | console.log(hash, razorpay_signature); 44 | if (hash === razorpay_signature) { 45 | res.json({ status: "success" }); 46 | } else { 47 | res.status(400).json({ status: "failure" }); 48 | } 49 | }; 50 | 51 | module.exports = { 52 | create_order, 53 | verify_order, 54 | } 55 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # vitepress build output 108 | **/.vitepress/dist 109 | 110 | # vitepress cache directory 111 | **/.vitepress/cache 112 | 113 | # Docusaurus cache and generated files 114 | .docusaurus 115 | 116 | # Serverless directories 117 | .serverless/ 118 | 119 | # FuseBox cache 120 | .fusebox/ 121 | 122 | # DynamoDB Local files 123 | .dynamodb/ 124 | 125 | # TernJS port file 126 | .tern-port 127 | 128 | # Stores VSCode versions used for testing VSCode extensions 129 | .vscode-test 130 | 131 | # yarn v2 132 | .yarn/cache 133 | .yarn/unplugged 134 | .yarn/build-state.yml 135 | .yarn/install-state.gz 136 | .pnp.* -------------------------------------------------------------------------------- /th.txt: -------------------------------------------------------------------------------- 1 | req,response --> web server | app server 2 | 3 | java: tomcat 4 | python : django 5 | .net :isi server 6 | .node | express : 7 | 8 | npm install express 9 | 10 | npm install nodemon -g 11 | 12 | 13 | folder structure: 14 | 15 | nodemon app.js 16 | 17 | 18 | app.js --> routes --> controller [models] 19 | 20 | routes : app.js <--> controller 21 | controller : api functions --> business logic 22 | models : database schema 23 | 24 | 10 tables: 25 | 26 | mongodb database: 27 | 28 | SQL NOSQL 29 | mysql mongodb 30 | oracle 31 | postgres.. 32 | 33 | 34 | table document --> json 35 | 36 | 37 | mongodb -->ORM package - mongoose 38 | 39 | 40 | npm install mongoose 41 | 42 | 43 | mongoose : 44 | 45 | 25_node_internship : databse.... 46 | 47 | mongodb : table[collectoin] 48 | 49 | app.js -->roleRoutes -->roleCont 50 | 51 | 52 | employee 53 | id name email age 54 | .. 55 | 1000... 56 | 57 | alter: 58 | id name email age gender 59 | null 60 | 61 | { 62 | _id:,name,age 63 | } 64 | 65 | { 66 | _id:,name,age,gender 67 | } 68 | 69 | 70 | 71 | 72 | 73 | src: 74 | controller: api logic: functions 75 | models : schema : collectoin -->controller 76 | routes : end point --> controller function n 77 | utils : utility functions..... 78 | 79 | POST: 80 | 81 | 82 | postman: -->Body -->raw 83 | 84 | role: 85 | user: 86 | 87 | local serveice: admin,serveiceProvide,user 88 | projecamanr : Develioe,manager,tester,... 89 | -------------------------------------------- 90 | 91 | role: pk roleId 92 | 93 | user table: 94 | roleId fk 95 | 96 | joins:select * from users natural join roles; 97 | 98 | 99 | file upload : 100 | 101 | local file sytem : server side.. 102 | 103 | database : binary data 104 | server : file system 105 | cloud : s3 bucket-aws,cloudinary,google cloud storage 106 | 107 | live bucket file 108 | 109 | 110 | 111 | fileupload --> image --> cloudanry: -->respinse ---> url : url -->database... 112 | 113 | cloudanry: signup with google --> 114 | find api key: 115 | npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth 116 | 117 | 118 | api -->forgotpoassword api 119 | frontend: forgotpoassword --> email --> post apo --> req.body --> database user 120 | if user found --> token ---> email --> 121 | if not found -->response --> user not found... 122 | 123 | TOKEN :- jwt : jsonwebtoken 124 | auth2 --> 125 | 126 | AUTHOrizaation: 127 | Authe: 128 | 129 | 130 | update user set password ="knasbkasjs" where email =? 131 | token... 132 | 133 | oauth --> Auth | AUTHOrizaation 134 | 135 | 136 | userFromemail --> object... 137 | 138 | token : id 139 | 140 | id-->object 141 | 142 | 143 | middleware: --> filter --> controller token verify... : 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | -------------------------------------------------------------------------------- /src/utils/twittercleandata.js: -------------------------------------------------------------------------------- 1 | const rawData = [ 2 | 'WWE Speed', 'LIVE', 3 | 'Trending in Sports', 'Real Madrid', 4 | '93.5K posts', 'Trending in Sports', 5 | 'Jonathan David', '2,646 posts', 6 | 'Trending in Sports', 'Hala Madrid', 7 | '6,614 posts', 'Trending in Sports', 8 | 'Flacco', '1,997 posts', 9 | 'Trending in Sports', 'Makar', 10 | '1,738 posts', 'Trending in Sports', 11 | 'Addison', '10.1K posts', 12 | 'Trending in Sports', 'Shaq', 13 | '16.7K posts', 'Trending in Sports', 14 | 'Dortmund', '33.7K posts' 15 | ]; 16 | 17 | // Function to clean and structure data 18 | function cleanSportsData(data) { 19 | const cleanedData = []; 20 | let i = 0; 21 | 22 | while (i < data.length) { 23 | if (data[i] !== 'Trending in Sports') { 24 | let topic = data[i]; 25 | let posts = (i + 1 < data.length && /\d+(\.\d+)?[Kk]?\s+posts/.test(data[i + 1])) ? data[i + 1] : 'N/A'; 26 | 27 | cleanedData.push({ topic, posts }); 28 | i += posts !== 'N/A' ? 2 : 1; 29 | } else { 30 | i++; 31 | } 32 | } 33 | 34 | return cleanedData; 35 | } 36 | 37 | //const cleanedSportsTopics = cleanSportsData(rawData); 38 | 39 | //console.log(JSON.stringify(cleanedSportsTopics, null, 2)); 40 | 41 | 42 | const rawData1 = [ 43 | '1', '·', 'Entertainment industry · Trending', '#परमार्थ_की_अनोखी_मिसाल', '#परमार्थ_की_अनोखी_मिसाल', '230K posts', 44 | '2', '·', 'Entertainment industry · Trending', 'Social Reformer Sant RampalJi', '172K posts', 45 | '3', '·', 'Trending in India', '#NoSmokingDay', '#NoSmokingDay', '38.3K posts', 46 | '4', '·', 'Trending in India', 'Starlink', '75.9K posts', 47 | '5', '·', 'Trending in India', '#TrainHijack', '#TrainHijack', 'Balochistan', '46.4K posts', 48 | '6', '·', 'Trending in India', 'फूलन देवी', '31.1K posts', 49 | '7', '·', 'Entertainment industry · Trending', '#Holi2025', '#Holi2025', '9,199 posts', 50 | '8', '·', 'Trending in India', '#harshilagrotechsurge', '#harshilagrotechsurge', '11.6K posts', 51 | '9', '·', 'Trending in India', 'Airtel', '29K posts', 52 | '10', '·', 'Politics · Trending', 'Balochistan', '127K posts', 53 | '11', '·', 'Business & finance · Trending', 'Thar', '8,640 posts', 54 | '12', '·', 'Politics · Trending', 'Mauritius', '105K posts' 55 | ]; 56 | 57 | // Function to clean and structure data 58 | function cleanTrendingData(data) { 59 | const cleanedData = []; 60 | let i = 0; 61 | 62 | while (i < data.length) { 63 | if (!/^\d+$/.test(data[i]) && data[i] !== '·') { 64 | let topic = data[i]; 65 | let posts = (i + 1 < data.length && /\d+(\.\d+)?[Kk]?\s+posts/.test(data[i + 1])) ? data[i + 1] : 'N/A'; 66 | 67 | cleanedData.push({ topic, posts }); 68 | i += posts !== 'N/A' ? 2 : 1; 69 | } else { 70 | i++; 71 | } 72 | } 73 | 74 | return cleanedData; 75 | } 76 | 77 | // const cleanedTrendingTopics = cleanTrendingData(rawData1); 78 | 79 | // console.log(JSON.stringify(cleanedTrendingTopics, null, 2)); 80 | module.exports = { cleanSportsData, cleanTrendingData }; 81 | -------------------------------------------------------------------------------- /src/controllers/twitter.js: -------------------------------------------------------------------------------- 1 | const Twitter = require('../models/TwitterModel'); 2 | const puppeteer = require('puppeteer-extra'); 3 | const StealthPlugin = require('puppeteer-extra-plugin-stealth'); 4 | const { cleanSportsData, cleanTrendingData } = require('../utils/twittercleandata'); 5 | 6 | puppeteer.use(StealthPlugin()); 7 | 8 | /** 9 | * Start Twitter Scraping and Store in DB 10 | */ 11 | 12 | 13 | exports.scrapeTwitter = async (req, res) => { 14 | const { userId } = req.body; 15 | 16 | if (!userId) { 17 | return res.status(400).json({ message: 'User ID is required' }); 18 | } 19 | 20 | try { 21 | const browser = await puppeteer.launch({ 22 | headless: false, // Set to true for production 23 | args: ['--no-sandbox', '--disable-setuid-sandbox', '--start-maximized'], 24 | defaultViewport: null, 25 | }); 26 | 27 | const page = await browser.newPage(); 28 | await page.goto('https://x.com', { waitUntil: 'networkidle2' }); 29 | 30 | console.log("Waiting for user to log in manually..."); 31 | await new Promise(r => setTimeout(r, 60000)); // 1-minute login wait 32 | 33 | // Navigate to "Explore" 34 | await page.waitForSelector('a[aria-label="Search and explore"]', { timeout: 60000 }); 35 | await page.click('a[aria-label="Search and explore"]'); 36 | await page.waitForFunction(() => window.location.href.includes('/explore'), { timeout: 60000 }); 37 | 38 | // Extract trending topics 39 | await page.waitForSelector('a[href="/explore/tabs/trending"]', { timeout: 60000 }); 40 | await page.click('a[href="/explore/tabs/trending"]'); 41 | await page.waitForSelector('[aria-label="Timeline: Explore"]', { timeout: 60000 }); 42 | 43 | const trendingTopics = await page.evaluate(() => { 44 | const timeline = document.querySelector('[aria-label="Timeline: Explore"]'); 45 | if (!timeline) return []; 46 | return Array.from(timeline.querySelectorAll('span')) 47 | .map(el => el.innerText.trim()) 48 | .filter(text => text.length > 0); 49 | }); 50 | 51 | const cleanedTrendingData = cleanTrendingData(trendingTopics); 52 | await Twitter.create({ userId, category: 'trending', topics: cleanedTrendingData }); 53 | 54 | // Extract sports topics 55 | await page.waitForSelector('a[href="/explore/tabs/sports"]', { timeout: 60000 }); 56 | await page.click('a[href="/explore/tabs/sports"]'); 57 | await page.waitForSelector('[aria-label="Timeline: Explore"]', { timeout: 60000 }); 58 | 59 | const sportsTopics = await page.evaluate(() => { 60 | const timeline = document.querySelector('[aria-label="Timeline: Explore"]'); 61 | if (!timeline) return []; 62 | return Array.from(timeline.querySelectorAll('span')) 63 | .map(el => el.innerText.trim()) 64 | .filter(text => text.length > 0); 65 | }); 66 | 67 | const cleanedSportsData = cleanSportsData(sportsTopics); 68 | 69 | console.log("Trending Topics:", cleanedTrendingData); 70 | console.log("Sports Topics:", cleanedSportsData); 71 | 72 | await Twitter.create({ userId, category: 'sports', topics: cleanedSportsData }); 73 | 74 | await browser.close(); 75 | 76 | res.status(200).json({ message: 'Scraping complete and data saved.', trendingTopics, sportsTopics }); 77 | } catch (error) { 78 | console.error("Error occurred during scraping:", error); 79 | res.status(500).json({ message: 'Scraping failed', error }); 80 | } 81 | }; 82 | 83 | 84 | /** 85 | * Fetch Twitter Data for Analysis 86 | */ 87 | exports.getTwitterAnalysis = async (req, res) => { 88 | const { userId } = req.params; 89 | 90 | if (!userId) { 91 | return res.status(400).json({ message: 'User ID is required' }); 92 | } 93 | 94 | try { 95 | const data = await Twitter.find({ userId }).sort({ createdAt: -1 }); 96 | res.status(200).json(data); 97 | } catch (error) { 98 | res.status(500).json({ message: 'Failed to fetch analysis data', error }); 99 | } 100 | }; 101 | -------------------------------------------------------------------------------- /src/controllers/HordingController.js: -------------------------------------------------------------------------------- 1 | const hordingModel = require("../models/HordingModel"); 2 | const multer = require("multer"); 3 | const path = require("path"); 4 | const cloudinaryUtil = require("../utils/CloudanryUtil"); 5 | //storage engine 6 | 7 | const storage = multer.diskStorage({ 8 | destination: "./uploads", 9 | filename: function (req, file, cb) { 10 | cb(null, file.originalname); 11 | }, 12 | }); 13 | 14 | //multer object.... 15 | 16 | const upload = multer({ 17 | storage: storage, 18 | //fileFilter: 19 | }).single("image"); 20 | 21 | const addHording = async (req, res) => { 22 | try { 23 | const savedHording = await hordingModel.create(req.body); 24 | res.status(201).json({ 25 | message: "Hording added successfully", 26 | data: savedHording, 27 | }); 28 | } catch (err) { 29 | res.status(500).json({ message: err.message }); 30 | } 31 | }; 32 | 33 | const getAllHordings = async (req, res) => { 34 | try { 35 | const hordings = await hordingModel 36 | .find() 37 | .populate("stateId cityId areaId userId"); 38 | if (hordings.length === 0) { 39 | res.status(404).json({ message: "No hordings found" }); 40 | } else { 41 | res.status(200).json({ 42 | message: "Hording found successfully", 43 | data: hordings, 44 | }); 45 | } 46 | } catch (err) { 47 | res.status(500).json({ message: err.message }); 48 | } 49 | }; 50 | const getAllHordingsByUserId = async (req, res) => { 51 | try { 52 | const hordings = await hordingModel 53 | .find({ userId: req.params.userId }) 54 | .populate("stateId cityId areaId userId"); 55 | if (hordings.length === 0) { 56 | res.status(404).json({ message: "No hordings found" }); 57 | } else { 58 | res.status(200).json({ 59 | message: "Hording found successfully", 60 | data: hordings, 61 | }); 62 | } 63 | } catch (err) { 64 | res.status(500).json({ message: err.message }); 65 | } 66 | }; 67 | 68 | // const addHordingWithFile = async (req, res) => { 69 | // upload(req, res, (err) => { 70 | // if (err) { 71 | // res.status(500).json({ 72 | // message: err.message, 73 | // }); 74 | // } else { 75 | // // database data store 76 | // //cloundinary 77 | // console.log(req.body); 78 | // res.status(200).json({ 79 | // message: "File uploaded successfully", 80 | // data: req.file, 81 | // }); 82 | // } 83 | // }); 84 | // }; 85 | 86 | const addHordingWithFile = async (req, res) => { 87 | upload(req, res, async (err) => { 88 | if (err) { 89 | console.log(err); 90 | res.status(500).json({ 91 | message: err.message, 92 | }); 93 | } else { 94 | // database data store 95 | //cloundinary 96 | 97 | const cloundinaryResponse = await cloudinaryUtil.uploadFileToCloudinary( 98 | req.file 99 | ); 100 | console.log(cloundinaryResponse); 101 | console.log(req.body); 102 | 103 | //store data in database 104 | req.body.hordingURL = cloundinaryResponse.secure_url; 105 | const savedHording = await hordingModel.create(req.body); 106 | 107 | res.status(200).json({ 108 | message: "hording saved successfully", 109 | data: savedHording, 110 | }); 111 | } 112 | }); 113 | }; 114 | 115 | const updateHording = async (req, res) => { 116 | //update tablename set ? where id = ? 117 | //update new data -->req.body 118 | //id -->req.params.id 119 | 120 | try { 121 | const updatedHording = await hordingModel.findByIdAndUpdate( 122 | req.params.id, 123 | req.body, 124 | { new: true } 125 | ); 126 | res.status(200).json({ 127 | message: "Hording updated successfully", 128 | data: updatedHording, 129 | }); 130 | } catch (err) { 131 | res.status(500).json({ 132 | message: "error while update hording", 133 | err: err, 134 | }); 135 | } 136 | }; 137 | 138 | const getHordingById= async(req,res)=>{ 139 | try { 140 | const hording = await hordingModel.findById(req.params.id); 141 | if (!hording) { 142 | res.status(404).json({ message: "No hording found" }); 143 | } else { 144 | res.status(200).json({ 145 | message: "Hording found successfully", 146 | data: hording, 147 | }); 148 | } 149 | } catch (err) { 150 | res.status(500).json({ message: err.message }); 151 | } 152 | } 153 | 154 | module.exports = { 155 | addHording, 156 | getAllHordings, 157 | addHordingWithFile, 158 | getAllHordingsByUserId, 159 | updateHording, 160 | getHordingById 161 | }; 162 | -------------------------------------------------------------------------------- /src/controllers/UserController.js: -------------------------------------------------------------------------------- 1 | //users table.. -->userModel 2 | const userModel = require("../models/UserModel"); 3 | const bcrypt = require("bcrypt"); 4 | const mailUtil = require("../utils/MailUtil"); 5 | const jwt = require("jsonwebtoken"); 6 | const secret = "secret"; 7 | 8 | const loginUser = async (req, res) => { 9 | //req.body email and password: password 10 | 11 | //password -->plain -->db -->encrypted 12 | //bcrypt --> plain,enc --> match : true 13 | const email = req.body.email; 14 | const password = req.body.password; 15 | //select * from users where email =? and password = ? 16 | //userModel.find({email:email,password:password}) 17 | //email --> object -->abc --{passwird:hashedPasseord} 18 | //normal passwoed compare --> 19 | 20 | //const foundUserFromEmail = userModel.findOne({email:req.body.email}) 21 | const foundUserFromEmail = await userModel 22 | .findOne({ email: email }) 23 | .populate("roleId"); 24 | console.log(foundUserFromEmail); 25 | //check if email is exist or not// 26 | if (foundUserFromEmail != null) { 27 | //password 28 | //normal -plain req.bodyy --- databse -->match --> true | false 29 | //const isMatch = bcrypt.compareSync(req.body.password,foundUserFromEmail.password) 30 | const isMatch = bcrypt.compareSync(password, foundUserFromEmail.password); 31 | //true | false 32 | if (isMatch == true) { 33 | res.status(200).json({ 34 | message: "login success", 35 | data: foundUserFromEmail, 36 | }); 37 | } else { 38 | res.status(404).json({ 39 | message: "invalid cred..", 40 | }); 41 | } 42 | } else { 43 | res.status(404).json({ 44 | message: "Email not found..", 45 | }); 46 | } 47 | }; 48 | 49 | 50 | const loginuserWithToken = async(req,res)=>{ 51 | 52 | const {email,password} = req.body; 53 | 54 | const foundUserFromEmail = await userModel.findOne({email:email}) 55 | if(foundUserFromEmail){ 56 | const isMatch = bcrypt.compareSync(password,foundUserFromEmail.password) 57 | if(isMatch){ 58 | 59 | //token... 60 | const token = jwt.sign(foundUserFromEmail.toObject(),secret) 61 | //const token = jwt.sign({id:foundUserFromEmail._id},secret) 62 | res.status(200).json({ 63 | message:"user loggedin..", 64 | token:token 65 | }) 66 | 67 | 68 | } 69 | else{ 70 | res.status(420).json({ 71 | message:"invalid cred..." 72 | }) 73 | } 74 | 75 | } 76 | else{ 77 | res.status(404).json({ 78 | message:"user not found.." 79 | }) 80 | } 81 | } 82 | 83 | 84 | 85 | const signup = async (req, res) => { 86 | //try catch if else... 87 | try { 88 | //password encrupt.. 89 | const salt = bcrypt.genSaltSync(10); 90 | const hashedPassword = bcrypt.hashSync(req.body.password, salt); 91 | req.body.password = hashedPassword; 92 | const createdUser = await userModel.create(req.body); 93 | 94 | //send mail to user... 95 | //const mailResponse = await mailUtil.sendingMail(createdUser.email,"welcome to eadvertisement","this is welcome mail") 96 | await mailUtil.sendingMail( 97 | createdUser.email, 98 | "welcome to eadvertisement", 99 | "this is welcome mail" 100 | ); 101 | 102 | res.status(201).json({ 103 | message: "user created..", 104 | data: createdUser, 105 | }); 106 | } catch (err) { 107 | console.log(err); 108 | res.status(500).json({ 109 | message: "error", 110 | data: err, 111 | }); 112 | } 113 | }; 114 | 115 | const addUser = async (req, res) => { 116 | //req.body... 117 | const savedUser = await userModel.create(req.body); 118 | res.json({ 119 | message: "User Saved Successfully", 120 | data: savedUser, 121 | }); 122 | }; 123 | const getAllUsers = async (req, res) => { 124 | const users = await userModel.find().populate("roleId"); 125 | res.json({ 126 | message: "User fetched successfully..", 127 | data: users, 128 | }); 129 | }; 130 | 131 | const getUserById = async (req, res) => { 132 | const foundUser = await userModel.findById(req.params.id); 133 | res.json({ 134 | message: "user fetched successfully..", 135 | data: foundUser, 136 | }); 137 | }; 138 | 139 | const deleteUserById = async (req, res) => { 140 | const deletedUser = await userModel.findByIdAndDelete(req.params.id); 141 | res.json({ 142 | message: "user deleted Successfully..", 143 | data: deletedUser, 144 | }); 145 | }; 146 | 147 | const forgotPassword = async (req, res) => { 148 | const email = req.body.email; 149 | const foundUser = await userModel.findOne({ email: email }); 150 | 151 | if (foundUser) { 152 | const token = jwt.sign(foundUser.toObject(), secret); 153 | console.log(token); 154 | const url = `http://localhost:5173/resetpassword/${token}`; 155 | const mailContent = ` 156 | rest password 157 | `; 158 | //email... 159 | await mailUtil.sendingMail(foundUser.email, "reset password", mailContent); 160 | res.json({ 161 | message: "reset password link sent to mail.", 162 | }); 163 | } else { 164 | res.json({ 165 | message: "user not found register first..", 166 | }); 167 | } 168 | }; 169 | 170 | const resetpassword = async (req, res) => { 171 | const token = req.body.token; //decode --> email | id 172 | const newPassword = req.body.password; 173 | 174 | const userFromToken = jwt.verify(token, secret); 175 | //object -->email,id.. 176 | //password encrypt... 177 | const salt = bcrypt.genSaltSync(10); 178 | const hashedPasseord = bcrypt.hashSync(newPassword,salt); 179 | 180 | const updatedUser = await userModel.findByIdAndUpdate(userFromToken._id, { 181 | password: hashedPasseord, 182 | }); 183 | res.json({ 184 | message: "password updated successfully..", 185 | }); 186 | }; 187 | 188 | module.exports = { 189 | addUser, 190 | getAllUsers, 191 | getUserById, 192 | deleteUserById, 193 | signup, 194 | loginUser, 195 | forgotPassword, 196 | resetpassword, 197 | loginuserWithToken 198 | }; 199 | 200 | //addUser 201 | //getUser 202 | //deleteUser 203 | //getUserById 204 | 205 | //exports 206 | --------------------------------------------------------------------------------