Skip to content
Merged
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -176,4 +176,5 @@ vite_build_clean.log
vite_build_debug.log

.vscode
backend/
backend/
docs/
40 changes: 0 additions & 40 deletions backend/.env.example

This file was deleted.

4 changes: 4 additions & 0 deletions backend/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ const noteRoutes = require('./routes/noteRoutes');
const chatRoutes = require('./routes/chatRoutes');
const taskRoutes = require('./routes/taskRoutes');
const calendarRoutes = require('./routes/calendarRoutes');
const supportRoutes = require('./routes/supportRoutes');



app.use(
Expand Down Expand Up @@ -147,9 +149,11 @@ app.use('/api/linkedin', require('./routes/linkedinRoutes'));
app.use('/api/teams', require('./routes/teamRoutes'));
app.use('/api/google', require('./routes/googleRoutes'));
app.use('/api/calendar', calendarRoutes);
app.use('/api/support', supportRoutes);
app.use('/api/cache/sample', require('./routes/redisCacheSampleRoutes'));



// ── Database connection with automatic retry ──────────────────────────
const MONGO_OPTIONS = {
dbName: 'ZYNC_USER', // Oracle schema name = database name
Expand Down
6 changes: 3 additions & 3 deletions backend/routes/supportRoutes.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const express = require('express');
const router = express.Router();
const { send_ZYNC_email } = require('../services/googleMeet');
const { sendZyncEmail } = require('../services/mailer');
const { getSupportNotificationTemplate } = require('../utils/emailTemplates');


Expand All @@ -14,7 +14,7 @@ router.post('/', async (req, res) => {
}


const recipientsString = process.env.SUPPORT_RECIPIENTS || 'chitukullakshya@gmail.com';
const recipientsString = process.env.SUPPORT_RECIPIENTS || 'consolemaster.app@gmail.com';
const recipients = recipientsString.split(',').map(email => email.trim()).filter(Boolean);

if (recipients.length === 0) {
Expand All @@ -36,7 +36,7 @@ router.post('/', async (req, res) => {


const emailPromises = recipients.map(recipientEmail =>
send_ZYNC_email(recipientEmail, subject, htmlContent)
sendZyncEmail(recipientEmail, subject, htmlContent)
);


Expand Down
33 changes: 33 additions & 0 deletions backend/routes/teamRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -314,4 +314,37 @@ router.get('/:teamId/details', verifyToken, async (req, res) => {
}
});


router.patch('/:teamId/transfer-ownership', verifyToken, async (req, res) => {
const { teamId } = req.params;
const { newOwnerId } = req.body;
const uid = req.user.uid;

if (!newOwnerId) return res.status(400).json({ message: 'New owner ID is required' });

try {
const team = await Team.findById(teamId).lean();
if (!team) return res.status(404).json({ message: 'Team not found' });

if (team.ownerId !== uid) {
return res.status(403).json({ message: 'Only the current owner can transfer ownership' });
}

if (!team.members.includes(newOwnerId)) {
return res.status(400).json({ message: 'Target user is not a member of this team' });
}

if (newOwnerId === uid) {
return res.status(400).json({ message: 'You are already the owner' });
}

await Team.findByIdAndUpdate(teamId, { $set: { ownerId: newOwnerId } });

res.status(200).json({ message: 'Ownership transferred successfully' });
} catch (error) {
console.error('Error transferring ownership:', error);
res.status(500).json({ message: 'Server error' });
}
});

module.exports = router;
2 changes: 1 addition & 1 deletion backend/services/googleMeet.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const oauth2Client = new google.auth.OAuth2(


if (process.env.GOOGLE_REFRESH_TOKEN) {
oauth2Client.setCredentials({ refresh_token: process.env.GOOGLE_REFRESH_TOKEN });
oauth2Client.setCredentials({ refresh_token: process.env.GOOGLE_REFRESH_TOKEN.trim() });
}

const create_meeting = async () => {
Expand Down
Loading