Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated the Email Authorization and Authentication #13

Open
wants to merge 3 commits into
base: Server-Rebuild
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 44 additions & 44 deletions controllers/quizControllers.js
Original file line number Diff line number Diff line change
@@ -1,45 +1,45 @@
const {Question, Quiz} = require('../models/Quiz');

exports.addQuestions = async(req,res) => {
try {
const {question, answers, correctAnswer} = req.body

await Question.create({
question,
answers,
correctAnswer
})

const data = await Question.find({})
res.status(200).json(data)
} catch (error) {
console.log(error)
}
}

exports.createQuiz = async(req,res) => {
try {
const questions = await Question.aggregate([{ $sample: { size: 2 } }]);
res.status(200).send(questions)
} catch (error) {
console.log(error)
}
}

exports.submitQuiz = async(req,res) => {
try {
const {questions, score} = req.body

await Quiz.create({
questions,
score
})

const data = await Quiz.find({})

res.status(200).json(data)

} catch (error) {
console.log(error)
}
const {Question, Quiz} = require('../models/Quiz');
exports.addQuestions = async(req,res) => {
try {
const {question, answers, correctAnswer} = req.body
await Question.create({
question,
answers,
correctAnswer
})
const data = await Question.find({})
res.status(200).json(data)
} catch (error) {
console.log(error)
}
}
exports.createQuiz = async(req,res) => {
try {
const questions = await Question.aggregate([{ $sample: { size: 2 } }]);
res.status(200).send(questions)
} catch (error) {
console.log(error)
}
}
exports.submitQuiz = async(req,res) => {
try {
const {questions, score} = req.body
await Quiz.create({
questions,
score
})
const data = await Quiz.find({})
res.status(200).json(data)
} catch (error) {
console.log(error)
}
}
6 changes: 3 additions & 3 deletions controllers/recruiterControllers.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,10 @@ exports.getJobs = async (req, res) => {

exports.getJob = async (req, res) => { // get a job by recruiter
const id = req.params.id;
console.log(id)
// console.log(id)
try {
console.log("hit")
const job = await JSON.findById(id, '-__v');
// console.log("hit")
const job = await Job.findById(id, '-__v');
if(!job) return res.status(404).json({ message: "Job not found" });
return res.status(200).json(job);
} catch(err){
Expand Down
41 changes: 41 additions & 0 deletions controllers/uploadControllers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
const express = require('express')
const cloudinary = require('cloudinary').v2
const User = require('../models/User')

cloudinary.config({
cloud_name:process.env.CLOUD_NAME,
api_key:process.env.API_KEY,
api_secret:process.env.API_SECRET
})

exports.uploadResume = async(req,res) => {
const id = req.body.id

const resume = req.files.resume

const user = User.findById(id)

const response = await cloudinary.uploader.upload(resume.tempFilePath,{
public_id: user.rollNo,
folder: 'resumes'
})

const data = await User.findByIdAndUpdate(id, {
resume:[{
id: response.public_id,
secure_url: response.secure_url
}]
})



// user.resume = [
// {
// id: response.public_id,
// secure_url: response.secure_url,
// url: response.url
// }
// ]

res.status(200).json(data)
}
30 changes: 28 additions & 2 deletions controllers/userControllers.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const validEmailRegex = /^[^@.+_-]+\.[^@.+_-]+@sot\.pdpu\.ac\.in$/;


//Register a user
exports.registerUser = async (req, res) => {
const { name, email, password } = req.body;
Expand Down Expand Up @@ -31,6 +32,10 @@ exports.registerUser = async (req, res) => {
}
return res.sendStatus(200);
});


//Redirecting to the Verification Link for after registering
res.redirect(`../verify-email`, 301);
}

//Login a user; see if first get request can come
Expand Down Expand Up @@ -110,7 +115,7 @@ exports.getJobs = async (req, res) => {
if (!appliedJobs) appliedJobs = [];
const jobs = await Job.find({
_id: { $nin: appliedJobs }
}, "-_id -__v -recruiterId -applicants -approved -selectedApplicants", {
}, " -__v -recruiterId -applicants -approved -selectedApplicants", {
sort: {
acceptingResponses: -1,
jobCreationDate: 1
Expand Down Expand Up @@ -186,4 +191,25 @@ exports.withdrawJobApplication = async (req, res) => {
return res.status(200).json({ msg: "Withdrawn application successfully" });
});
});
}
}

//Run the Flask route to generate the dynamic api for verification
exports.generate_link = async(req, res)=>{
const response = await fetch('../generate_link',{
method: 'POST',
headers:{
"content-type": 'application/json'
},
body: JSON.stringify({ user_id: user_id }),
})
const data = await response.json();

if (response.ok) {
const link = data.link;
return link;
} else {
const error = data.error || "Unknown error";
throw new Error(`Failed to generate link: ${error}`);
}

};
20 changes: 20 additions & 0 deletions helpers/Validations.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import User from '../models/user'
import express from 'express'
import mongoose from 'mongoose'


// When the user will click on the link generated, it will get redirected to the this function to get verified
const ValidateUser = async(req, res)=>{
const{ email, username } = req.body;
try{
const verify = await User.UpdateOne({email, username}, {isVerified: true});
res.status(200).send("User Verified");
//Redirecting to the login after getting verified
res.redirect(`http://localhost:3000/api/v1/users/login`);
}
catch(err){
res.status(404).send("Error Occured while Verifying User");
res.redirect(`http://localhost:3000/404`);
}
}
module.exports = [ValidateUser];
69 changes: 69 additions & 0 deletions helpers/link_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import random
import string
import smtplib
from email.mime.text import MIMEText
from dotenv import load_dotenv
import os
load_dotenv()
import datetime
import urllib.parse
from flask import Flask, request, jsonify,app

# Generate a random verification code for the user
def generate_verification_code():
code = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15))
return code

# Generate a unique verification link for the user
def generate_verification_link(user_id):
code = generate_verification_code()

#Fetching the Expiration Time from Environment Variables
expiration_period = int(os.environ.get('GMAIL_VERIFICATION_EXPIRATION'))

now = datetime.datetime.now()
# expiration_time
expiratiration_time = int(now.timestamp() + expiration_period)
print(expiratiration_time)

params = urllib.parse.urlencode({"id": user_id, "code": code, "expiration_time": expiratiration_time })
base_url = "https://placementportalpdeu.com/verify"
verification_link = f"{base_url}?{params}"

return verification_link

#Defining the App Route for Genrating the Verification Link
@app.route('http://localhost:3000/api/v1/users/${user_id}/verify-email/generate_link', methods = ['POST'])
def generate_link():
data = request.get_json()
user_id = data.get("user_id")

if user_id:
link = generate_verification_link(user_id)
return jsonify({"link": link})
else:
return jsonify({"error": "user_id not provided"}), 400

if __name__ == "__main__":
app.run()


print(generate_verification_link(3453453453))


# # Replace "example.com" with your own domain name
# base_url = "https://www.pdeuplacementportal.com/verify_email"

# # Replace "[email protected]" with the user's email address
# email = "[email protected]"

# # Generate a random token for the verification link
# token =

# # Combine the email and token into a query string
# params = urllib.parse.urlencode({"email": email, "token": token})

# # Combine the base URL and query string to create the verification link
# verification_link = f"{base_url}?{params}"

# print(verification_link)
67 changes: 67 additions & 0 deletions helpers/validsators.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@

const nodemailer = require('nodemailer');
const {google} = require('googleapis');
const { oauth2 } = require('googleapis/build/src/apis/oauth2');
const { OAuth2Client } = require('google-auth-library');
require("dotenv").config()
const code = require('../helpers/link_generator.py');


const CLIENT_ID=process.env.GMAIL_CLIENT_ID;
const CLIENT_SECRET=process.env.GMAIL_CLIENT_SECRET;
const CLIENT_URI=process.env.GMAIL_CLIENT_URI;
const REFRESH_TOKEN=process.env.GMAIL_REFRESH_TOKEN;

const oauth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, CLIENT_URI);
oauth2Client.setCredentials({ refresh_token: REFRESH_TOKEN });

const sendmail = async (email)=>{

try{
const accessToken = await oauth2Client.getAccessToken();
console.log(accessToken);
const transport = nodemailer.createTransport({
service: 'gmail',
auth : {
type: 'OAuth2',
user: process.env.GMAIL_ID,
clientId: CLIENT_ID,
clientSecret: CLIENT_SECRET,
refreshToken: REFRESH_TOKEN,
accessToken: accessToken
}

});
const mailOptions = {
from: 'no reply pdeu placement portal',
to: email,
subject: "Hello From Gmail Using API Phoood Diya Mattkkka",
text: "Please verify with the following link",
html: "Verify your account from placement portal <br> <a></a>"

};
console.log(mailOptions);

const result =
await transport.sendMail(mailOptions);
return (result);


}
catch (err){
return ({err: err.message});
}
}



exports.redirect_User = async(req, res)=>{
const { user_id, password, email } = req.body

sendmail(email)
.then(result=>console.log("Email Delivered ....", result))
.catch(err=> console.log({err: err.message}))

res.status(302).send("You are Currently Being Redirected to Veifuaction Link");
res.redirect(`http://localhost:3000/api/v1/users/${user_id}/verify-email/generate_link`);
}
2 changes: 2 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const quizRoutes = require('./routes/quizRoutes')
const experience = require("./routes/experience")
const superAdmin = require("./routes/superAdminRoutes")
const admin = require("./routes/adminRoutes")
const upload = require("./routes/uploadRoutes")

// regular middlewares
app.use(express.json())
Expand Down Expand Up @@ -64,6 +65,7 @@ app.use("/api/v1/quiz", quizRoutes)
app.use("/api/v1/experience", experience)
app.use("/api/v1/supadmin", superAdmin)
app.use("/api/v1/admin", admin)
app.use("/api/v1/upload", upload)

// after all routes
app.get((req, res) => {
Expand Down
Loading