const express = require("express")
const app = express()
const http = require('http');
const server = http.createServer(app);
const socketIO = require('socket.io');
const io = socketIO(server);
const cookieParser = require('cookie-parser')
const connectionWithDb = require('./db')
const session = require('express-session')
const passport = require("passport")
require('./controller/auth/google')
require('./controller/auth/facebook')
const cookieAuth = require('./middleware/authCookie')
const formatDate = require('./helper/formatDate')
const JWT_SECRET = "E4d4U$er";
const jwt = require('jsonwebtoken')
const extractDomain = require('./helper/extractDomainFromUrl')
const calculateYearsDifference = require('./helper/calculateYearsDifference')
const Job = require("./schema/Job")
const User = require('./schema/User')
const Business = require('./schema/Business')
const Connection = require("./schema/Connection")
const Chat = require('./schema/Chat')
app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/views'));
const PORT = process.env.PORT || 8080;
connectionWithDb()
app.use(cookieParser())
// app.use(express.json());
app.use(express.json({ limit: '100mb' }));
app.use(express.urlencoded({ limit: '100mb', extended: true })); // for form data
app.use(session({
secret: 'E4D4-Secret',
resave: false,
saveUninitialized: true,
cookie: { secure: false, maxAge: 5 * 60000 }
}))
app.use(passport.initialize())
app.use(cookieAuth('authtoken'));
app.use((req, res, next) => {
req.session = req.session
next()
})
app.get('/', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
// console.log('user', user)
res.render(`index`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/businessdetails', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
res.render(`businessdetails`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/businessregistration', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (business) {
return res.redirect('/edit/profile')
}
res.render(`businessregistration`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/dashboard-main', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (!user) {
return res.redirect(`/join`)
}
res.render(`dashboard-2`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/dashboard', async (req, res) => {
try {
const { error, message, title, location, industry, position } = req.query
const user = req.user
const business = req.business
if (user) {
let filter = {}
if (title) {
filter.fullName = { $regex: title, $options: 'i' }
}
if (location) {
filter.location = { $regex: location, $options: 'i' }
}
if (industry) {
filter.industry = { $regex: industry, $options: 'i' }
}
if (position) {
let positionsId = []
const jobs = await Job.find({
$or: [
{ title: { $regex: position, $options: 'i' } },
{ skills: { $regex: position, $options: 'i' } },
{ position: { $regex: position, $options: 'i' } }
]
})
jobs.map(item => {
positionsId.push(item.company.toString())
})
filter._id = positionsId
}
const companies = Object.entries(filter).length > 0 ? await Business.find(filter).populate('jobs').exec() : []
const requested = await Connection.find({ user: user._id, approved: false }).populate('business').populate({
path: 'business',
populate: { path: 'jobs' }
})
.select('business');
const connected = await Connection.find({ user: user._id, approved: true }).populate('business').populate({
path: 'business',
populate: { path: 'jobs' }
})
.select('business');
return res.render(`dashboard`, { message, error, user, business, companies, filter, requested, connected })
}
if (business) {
return res.redirect(`/business-dashboard`)
}
return res.redirect(`/join`)
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/connection-request', async (req, res) => {
try {
const { error, message, company } = req.query
const user = req.user
const business = req.business
const companyObj = await Business.findById(company)
if (!companyObj) {
res.redirect(`/dashboard?error=Company Not Found`)
}
if (user) {
// const jobs = await Job.find()
// console.log('companyObj', companyObj)
const companies = await Business.find().populate('jobs').exec()
return res.render(`connection-request`, { message, error, user, business, companies, companyObj, calculateYearsDifference })
}
return res.redirect(`/join`)
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/join', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (user) {
return res.redirect(`/dashboard`)
}
if (business) {
return res.redirect(`/business-dashboard`)
}
return res.render(`join`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/user-loginemail', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (user) {
return res.redirect(`/profile`)
}
if (business) {
return res.redirect(`/business-dashboard`)
}
res.render(`user-loginemail`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/reset-password', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (user) {
return res.redirect(`/profile`)
}
if (business) {
return res.redirect(`/business-dashboard`)
}
res.render(`reset-password`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/business-reset-password', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (user) {
return res.redirect(`/profile`)
}
if (business) {
return res.redirect(`/business-dashboard`)
}
res.render(`business-reset-password`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/business-otp-verification', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
const token = jwt.verify(req.cookies['businesscodepass'], JWT_SECRET)
const otpBusinessId = token.business
const otpObjId = token.otp
if (user) {
return res.redirect(`/profile`)
}
if (business) {
return res.redirect(`/business-dashboard`)
}
if (otpObjId && otpBusinessId) {
return res.render(`business-otp-verification`, { message, error, user, business })
}
return res.redirect(`/business-reset-password?error=Session Expired`)
} catch (error) {
console.log(error)
return res.redirect(`/business-reset-password?error=Session Expired`)
// return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/business-update-password', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
const token = jwt.verify(req.cookies['businesscodepass'], JWT_SECRET)
const otpBusinessId = token.business
const otpObjId = token.otp
// console.log('otpObjId', otpObjId)
// console.log('otpUserId', otpBusinessId)
if (user) {
return res.redirect(`/profile`)
}
if (business) {
return res.redirect(`/business-dashboard`)
}
if (otpObjId && otpBusinessId) {
return res.render(`business-update-password`, { message, error, user, business })
}
return res.redirect(`/business-reset-password?error=Session Expired`)
} catch (error) {
console.log(error)
// return res.redirect(`/profile?error=Something Went Wrong`)
return res.redirect(`/business-reset-password?error=Session Expired`)
}
})
app.get('/otp-verification', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
const token = jwt.verify(req.cookies['codepass'], JWT_SECRET)
const otpUserId = token.user
const otpObjId = token.otp
if (user) {
return res.redirect(`/profile`)
}
if (business) {
return res.redirect(`/business-dashboard`)
}
if (otpObjId && otpUserId) {
return res.render(`otp-verification`, { message, error, user, business })
}
return res.redirect(`/reset-password?error=Session Expired`)
} catch (error) {
console.log(error)
return res.redirect(`/reset-password?error=Session Expired`)
}
})
app.get('/update-password', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
const token = jwt.verify(req.cookies['codepass'], JWT_SECRET)
const otpUserId = token.user
const otpObjId = token.user
// console.log('otpObjId', otpObjId)
// console.log('otpUserId', otpUserId)
if (user) {
return res.redirect(`/profile`)
}
if (business) {
return res.redirect(`/business-dashboard`)
}
if (otpObjId && otpUserId) {
return res.render(`update-password`, { message, error, user, business })
}
return res.redirect(`/reset-password?error=Session Expired`)
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/creelio-business', (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
// console.log('user', user)
res.render(`creelio-business`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
});
app.get('/talent', (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
// console.log('user', user)
res.render(`talent`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
});
app.get('/business-read', (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
// console.log('user', user)
res.render(`business-read`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
});
app.get('/video-interviews', (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
// console.log('user', user)
res.render(`video-interviews`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
});
app.get('/Portfolio-note', (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
// console.log('user', user)
res.render(`Portfolio-note`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
});
app.get('/job-read', (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
// console.log('user', user)
res.render(`job-read`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
});
app.get('/features', (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
// console.log('user', user)
res.render(`features`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
});
app.get('/profile', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (user) {
return res.render(`profile`, { message, error, user, business, extractDomain, calculateYearsDifference })
}
if (business) {
// console.log('business', business.notifications)
const jobs = await Job.find({ company: business._id })
return res.render(`business-profile`, { message, error, user, business, extractDomain, calculateYearsDifference, jobs })
}
res.redirect('/join')
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/share-with-connections/:token', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
const token = req.params.token
const data = jwt.verify(token, JWT_SECRET);
const connected = await Connection.find({ user: user._id, approved: true }).populate('business')
if (user) {
return res.render(`share-with-connections`, { message, connected, error, user, business, extractDomain, calculateYearsDifference, data })
}
res.redirect('/join')
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/business/:id', async (req, res) => {
try {
const { id } = req.params
const { error, message } = req.query
const user = req.user
const business = req.business
const company = await Business.findById(id)
const jobs = await Job.find({ company: company._id })
return res.render(`business-public`, { message, error, user, business, extractDomain, calculateYearsDifference, jobs, company })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/edit/profile', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (user) {
return res.render(`edit-profile`, { message, error, user, business, extractDomain, calculateYearsDifference, formatDate })
}
if (business) {
const jobs = await Job.find({ company: business._id })
return res.render(`edit-business-profile`, { message, error, user, business, jobs, extractDomain, calculateYearsDifference, formatDate })
}
return res.redirect(`/join`)
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/user-login', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (user) {
return res.redirect(`/profile`)
}
res.render(`user-login`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/business-login', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (business) {
return res.redirect('/business-dashboard')
}
res.render(`business-login`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/portfolioreg', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user || req.session?.passport?.user
const business = req.business
res.render(`portfolioreg`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/profilepicture', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (!user) {
return res.redirect(`/join`)
}
res.render(`profilepicture`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/business-subscription', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (!business) {
return res.redirect(`/business-login`)
}
res.render(`business-subscription`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/connection/request/:id', async (req, res) => {
try {
const id = req.params.id;
const { error, message } = req.query
const user = req.user
const business = req.business
const businessObj = await Business.findById(business._id)
businessObj.notifications?.forEach((notification) => {
if (notification.relatedId == id) {
notification.isRead = true
}
})
await businessObj.save()
const connection = await Connection.findById(id).populate('user').populate('business').populate({
path: 'user',
populate: {
path: 'projects' // Populates the 'projects' field inside 'user'
}
});
if (connection) {
// console.log('connection', connection)
// console.log('business._id', business._id)
// console.log('connection.business._id', connection.business._id)
if (connection.business._id.toString() == business._id.toString()) {
if (connection.approved) {
return res.redirect(`/connected-profile/${connection._id}`)
}
return res.render(`requested-profile`, { message, error, user, business, connection, calculateYearsDifference })
}
return res.redirect(`/profile?error=Something Went Wrong`)
}
return res.redirect(`/profile?error=Something Went Wrong`)
} catch (error) {
console.log('error on requested profile Page', error.message)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/connected-profile/:id', async (req, res) => {
try {
const id = req.params.id;
const { error, message } = req.query
const user = req.user
const business = req.business
const businessObj = await Business.findById(business._id)
businessObj.notifications?.forEach((notification) => {
if (notification.relatedId == id) {
notification.isRead = true
}
})
await businessObj.save()
const connection = await Connection.findById(id).populate('user').populate('business').populate({
path: 'user',
populate: {
path: 'projects' // Populates the 'projects' field inside 'user'
}
});
if (connection) {
// console.log('connection', connection)
// console.log('business._id', business._id)
// console.log('connection.business._id', connection.business._id)
if (connection.business._id.toString() == business._id.toString()) {
if (connection.approved) {
return res.render(`requested-profile`, { message, error, user, business, connection, calculateYearsDifference })
}
return res.redirect(`/connection/request/${connection._id}`)
}
return res.redirect(`/profile?error=Something Went Wrong`)
}
return res.redirect(`/profile?error=Something Went Wrong`)
} catch (error) {
console.log('error on requested profile Page', error.message)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/business-dashboard', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
// console.log('business', business)
if (!business) {
return res.redirect(`/business-login`)
}
const requestedConnections = await Connection.find({ business: business._id, approved: false }).populate('user')
const requestedUsersId = requestedConnections.map(item => item.user._id)
console.log('requestedUsersId', requestedUsersId)
const currentPage = req.query.page ? parseInt(req.query.page) : 1;
const itemsPerPage = 9;
const skipItems = (currentPage - 1) * itemsPerPage;
const usersWithConnectionIds = await User.find({ _id: requestedUsersId }).skip(skipItems).limit(itemsPerPage);
const allUsers = usersWithConnectionIds.map(user => {
const connection = requestedConnections.find(item => item.user._id.toString() === user._id.toString());
return {
...user.toObject(), // Spread user properties
connectionId: connection ? connection._id : null,
businessId: connection ? connection.business : null
};
});
const totalUsers = await User.countDocuments({ _id: requestedUsersId });
const totalPages = Math.ceil(totalUsers / itemsPerPage);
// console.log('totalPages', totalPages)
const jobs = await Job.find({ company: business._id }).populate('company')
const connections = await Connection.find({ business: business._id, approved: true }).populate('user')
res.render(`business-dashboard`, { message, error, user, business, allUsers, currentPage, totalPages, totalUsers, jobs, connections })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/searchprofilehistory', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (!user) {
return res.redirect(`/join`)
}
res.render(`searchprofilehistory`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/userregistration', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
res.render(`userregistration`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/jobposting', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
if (!business) {
res.redirect(`/join`)
return
}
res.render(`jobposting`, { message, error, user, business })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/jobdetails/:id', async (req, res) => {
try {
const { error, message } = req.query
const id = req.params.id
const user = req.user
const business = req.business
const job = await Job.findById(id).populate('company')
res.render(`jobdetails`, { message, error, user, business, job, formatDate })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/editjob/:id', async (req, res) => {
try {
const { error, message } = req.query
const id = req.params.id
const user = req.user
const business = req.business
const job = await Job.findById(id).populate('company')
if (job?.company?._id.toString() == business?._id.toString()) {
return res.render(`jobedit`, { message, error, user, business, job, formatDate })
}
return res.redirect(`/profile?error=Something Went Wrong`)
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.get('/chat', async (req, res) => {
try {
const { error, message } = req.query
const user = req.user
const business = req.business
const recipentUser = req.query.user
const recipentBusiness = req.query.business
let availableList = []
let recipent
if (!user && !business) {
return res.redirect(`/join?error=Login to Chat`)
}
if (user) {
const connections = await Connection.find({ user: user._id, approved: true }).populate('business')
for (let item of connections) {
const unreadMessages = await Chat.find({ recipent: item._id, isRead: false })
const lastMessage = await Chat.findOne({
$or: [
{ sender: user._id, recipient: item.business._id },
{ sender: item.business._id, recipient: user._id }
]
}).sort({ createdAt: -1 });
availableList.push({ ...item.business.toObject(), unreadMessages, lastMessage })
}
recipent = await Business.findById(recipentBusiness)
} else if (business) {
const connections = await Connection.find({ business: business._id, approved: true }).populate('user')
for (let item of connections) {
const unreadMessages = await Chat.find({ recipent: item._id, isRead: false })
const lastMessage = await Chat.findOne({
$or: [
{ sender: business._id, recipient: item.user._id },
{ sender: item.user._id, recipient: business._id }
]
}).sort({ createdAt: -1 });
availableList.push({ ...item.user.toObject(), unreadMessages, lastMessage })
}
recipent = await User.findById(recipentUser)
}
const conversation = await Chat.find({
$or: [
{
sender: recipentUser ? recipentUser : user?._id,
senderModel: 'user',
recipient: business?._id ? business?._id : recipentBusiness,
recipientModel: 'business'
},
{
sender: recipentBusiness ? recipentBusiness : business?._id,
senderModel: 'business',
recipient: user?._id ? user?._id : recipentUser,
recipientModel: 'user'
}
]
}).populate('recipient').populate('sender').sort('timestamp'); // Sort by timestamp to get the conversation in order
for (let message of conversation) {
message.isRead = true;
await message.save();
}
res.render(`chat`, { message, error, user, business, conversation, recipent, availableList })
} catch (error) {
console.log(error)
return res.redirect(`/profile?error=Something Went Wrong`)
}
})
app.use('/api', require('./controller/apihandler'))
io.on('connection', socket => {
try {
console.log("Client Connected")
socket.on('joinRoom', (data) => {
const { id, model } = data; // `id` could be userId or businessId
const room = `${model}_${id}`; // E.g., 'user_123', 'business_456'
socket.join(room);
console.log(`${model} with ID: ${id} joined room: ${room}`);
});
socket.on('sendMessage', async (data) => {
try {
const { sender, senderModel, recipient, recipientModel, message } = data;
const newMessage = new Chat({
sender,
senderModel,
recipient,
recipientModel,
message
});
await newMessage.save();
const recipientRoom = `${recipientModel}_${recipient}`; // E.g., 'user_123' or 'business_456'
io.to(recipientRoom).emit('newMessage', newMessage);
// io.emit('newMessage', newMessage);
} catch (error) {
console.log('error sending Message', error.message)
}
});
socket.on('disconnect', async () => {
try {
console.log("client Disconnected")
} catch (error) {
console.log(error.message)
}
});
} catch (error) {
console.log(error.message)
}
});
server.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}/`);
});