Skip to content
Merged
2 changes: 1 addition & 1 deletion backend/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ CLOUDINARY_API_SECRET=
EMAIL_USER=
EMAIL_PASS=

COLLABORATION_PUBLIC_URL=


VITE_SERVER_DOMAIN=https://pjt-blog.onrender.com

Expand Down
54 changes: 48 additions & 6 deletions backend/Controllers/collaboration.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Project from "../Models/project.model.js";
import crypto from "crypto";
import User from "../Models/user.model.js";
import transporter from "../config/nodemailer.js";
import localtunnel from "localtunnel";



export const invitationToCollaborate = async(req, res)=>{
Expand All @@ -14,17 +14,24 @@ export const invitationToCollaborate = async(req, res)=>{
const user = await User.findById(userid);
if(!user) return res.status(404).json({error: "User not found!"});
const projectToCollaborate = await Project.findOne({project_id: project_id}).populate("author", "personal_info.email");
if(user._id.toString() === projectToCollaborate.author._id.toString()){
return res.status(400).json({error: "You cannot invite yourself to collaborate on your own project."});
}


if(!projectToCollaborate) return res.status(404).json({error: "Project not found!"});

const authorEmail = projectToCollaborate.author.personal_info.email;
const token = crypto.randomBytes(16).toString('hex');

// const baseUrl = global.publicUrl || `http://localhost:${process.env.PORT || 8000}`;
const baseUrl = process.env.COLLABORATION_PUBLIC_URL;

const acceptLink = `${baseUrl}/api/collaborate/accept/${token}`;
const rejectLink = `${baseUrl}/api/collaborate/reject/${token}`;
console.log(acceptLink, rejectLink);
const baseUrl = `http://localhost:${process.env.PORT || 8000}`;


const acceptLink = `${baseUrl}/api/collaboration/accept/${token}`;
const rejectLink = `${baseUrl}/api/collaboration/reject/${token}`;


const mailOptions = {
from: process.env.EMAIL_USER,
to: authorEmail,
Expand Down Expand Up @@ -60,5 +67,40 @@ export const invitationToCollaborate = async(req, res)=>{



export const acceptInvitation = async(req, res)=>{
const token = req.params.token;
const id = req.user;
try {
const collaborationRequest = await collaboration.findOne({token: token, author_id: id, status:"pending"})
if(!collaborationRequest) return res.status(404).json({error: "Invalid or expired token!"});
if(collaborationRequest.status !== "pending") return res.status(400).json({error: "This invitation has already been responded to."});
collaborationRequest.status = "accepted";
collaborationRequest.token = " " // Invalidate the token after use
await collaborationRequest.save();
return res.status(200).json({message: `You have accepted the collaboration invitation`});
}
catch (error) {
console.log(error);
return res.status(500).json({error: "Internal Server Error"});
}
}

export const rejectInvitation = async(req,res)=>{
const token = req.params.token;
const id = req.user;
try {

const collaborationRequest = await collaboration.findOne({token: token, author_id: id, status:"pending"})
if(!collaborationRequest) return res.status(404).json({error: "Invalid or expired token!"});
if(collaborationRequest.status !== "pending") return res.status(400).json({error: "This invitation has already been responded to."});
collaborationRequest.status = "rejected";
collaborationRequest.token = " " // Invalidate the token after use
await collaborationRequest.save();
return res.status(200).json({message: `You have rejected the collaboration invitation`});
}
catch (error) {
console.log(error);
return res.status(500).json({error: "Internal Server Error"});
}
}

7 changes: 6 additions & 1 deletion backend/Routes/api/collaboration.routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,15 @@ import express from "express";

import { authenticateUser } from "../../Middlewares/auth.middleware.js";

import {invitationToCollaborate} from "../../Controllers/collaboration.controller.js";

import {invitationToCollaborate, acceptInvitation, rejectInvitation} from "../../Controllers/collaboration.controller.js";
const collaborationRoutes = express.Router();

collaborationRoutes.post("/invite", authenticateUser, invitationToCollaborate);
collaborationRoutes.post('/accept/:token', authenticateUser, acceptInvitation);
collaborationRoutes.post('/reject/:token', authenticateUser, rejectInvitation);




export default collaborationRoutes;
3 changes: 0 additions & 3 deletions backend/Routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,11 @@ import notificationRoutes from './api/notification.routes.js';
import subscriberRoutes from './api/subscriber.routes.js';
import collectionRoutes from './api/collections.routes.js';
import collaborationRoutes from './api/collaboration.routes.js';

import { authMiddleware, generalMiddleware } from '../Middlewares/rateLimit/index.js';

const router = express.Router();


router.use('/auth', authMiddleware, authRoutes);

router.use('/user', generalMiddleware, userRoutes);
router.use('/media', generalMiddleware, mediaRoutes);
router.use('/project', generalMiddleware, projectRoutes);
Expand Down