Skip to content
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
12 changes: 12 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
NODE_ENV=development
PORT=5000

# MongoDB Connection String
# For local MongoDB (if installed):
# MONGO_URI=mongodb://localhost:27017/intel-iot-club

# For MongoDB Atlas (cloud):
# MONGO_URI=mongodb+srv://username:password@cluster.mongodb.net/intel-iot-club?retryWrites=true&w=majority
# Make sure to:
# 1. Replace 'username' and 'password' with your actual credentials
# 2. Replace 'cluster' with your actual cluster name
# 3. Whitelist your IP in MongoDB Atlas Network Access (or use 0.0.0.0/0 for testing)

MONGO_URI=your-mongodb-uri-here
36 changes: 34 additions & 2 deletions config/db.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,44 @@ import mongoose from 'mongoose';
import { ENV } from './env.js';

export async function connectDB() {
// Check if using local MongoDB or Atlas
const isLocalMongo = ENV.MONGO_URI.includes('localhost') || ENV.MONGO_URI.includes('127.0.0.1');

try {
const conn = await mongoose.connect(ENV.MONGO_URI);
// MongoDB connection options
const options = {
retryWrites: true,
w: 'majority',
serverSelectionTimeoutMS: 10000,
socketTimeoutMS: 45000,
};

// For Atlas connections, try with explicit TLS settings
if (!isLocalMongo) {
// Try to disable strict SSL verification (development only)
options.tls = true;
options.tlsAllowInvalidCertificates = true;
options.tlsAllowInvalidHostnames = true;
}

console.log('🔄 Connecting to MongoDB...');
const conn = await mongoose.connect(ENV.MONGO_URI, options);
console.log(`✅ MongoDB connected: ${conn.connection.host}`);
} catch (err) {
console.error('❌ MongoDB connection failed:', err.message);
// Optional: retry logic/backoff could go here for production
console.error('\n📋 Troubleshooting steps:');
console.error('1. Verify your MONGO_URI in .env file');
console.error('2. Ensure your IP is whitelisted in MongoDB Atlas (Network Access)');
console.error('3. Check if your connection string uses mongodb+srv:// format');
console.error('4. Verify your MongoDB Atlas username/password are correct');
console.error('5. Try using 0.0.0.0/0 in Network Access for testing\n');

if (err.message.includes('SSL') || err.message.includes('TLS')) {
console.error('⚠️ SSL/TLS Error detected. This usually means:');
console.error(' - Your IP address is not whitelisted in MongoDB Atlas');
console.error(' - Or there\'s a network/firewall issue\n');
}

process.exit(1);
}
}
62 changes: 31 additions & 31 deletions controllers/eventController.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,51 +2,51 @@ import Event from '../models/Event.js';

// Get all events
export const getEvent = async (req, res) => {
try {
const events = await Event.find().sort({ date: -1 }); // ← sort by date DESCENDING
if(!events || events.length === 0) {
return res.status(404).json({ message: 'No events found' });}
res.status(200).json(events);
} catch (error) {
res.status(500).json({ message: 'Error fetching events', error: error.message });
}
try {
const events = await Event.find().sort({ date: -1 }); // ← sort by date DESCENDING
// Return empty array if no events, not a 404
res.status(200).json(events);
} catch (error) {
res.status(500).json({ message: 'Error fetching events', error: error.message });
}
};

//Add a new event
export const addEvent = async (req, res) => {
try{
const newEvent = new Event(req.body);
await newEvent.save();
if(!newEvent) {
return res.status(400).json({ message: 'Error adding event' });
}
res.status(201).json({ message: 'Event added successfully' });}
catch (err) {
res.status(500).json({ message: 'Error adding event', error: err });
}
try {
const newEvent = new Event(req.body);
await newEvent.save();
if (!newEvent) {
return res.status(400).json({ message: 'Error adding event' });
}
res.status(201).json({ message: 'Event added successfully' });
}
catch (err) {
res.status(500).json({ message: 'Error adding event', error: err });
}
};


//Edit a specific event
export const editEvent = async(req, res) => {
try {
const updatedEvent = await Event.findByIdAndUpdate(req.params.id, req.body, { new: true });
if (!updatedEvent) return res.status(404).json({ message: 'Event not found' });
res.json({ message: 'Event updated successfully', event: updatedEvent });
export const editEvent = async (req, res) => {
try {
const updatedEvent = await Event.findByIdAndUpdate(req.params.id, req.body, { new: true });
if (!updatedEvent) return res.status(404).json({ message: 'Event not found' });
res.json({ message: 'Event updated successfully', event: updatedEvent });
} catch (err) {
res.status(500).json({ message: 'Error updating event', error: err });
}
};

//Delete a specific event
export const deleteEvent = async (req, res) => {
try {
const deletedEvent = await Event.findByIdAndDelete(req.params.id);
if (!deletedEvent) return res.status(404).json({ message: 'Event not found' });
res.json({ message: 'Event deleted successfully' });
} catch (err) {
res.status(500).json({ message: 'Error deleting event', error: err });
}
try {
const deletedEvent = await Event.findByIdAndDelete(req.params.id);
if (!deletedEvent) return res.status(404).json({ message: 'Event not found' });
res.json({ message: 'Event deleted successfully' });
} catch (err) {
res.status(500).json({ message: 'Error deleting event', error: err });
}
};


Expand All @@ -60,7 +60,7 @@ export const searchEvents = async (req, res) => {

const events = await Event.find({
name: { $regex: title, $options: 'i' } // case-insensitive search
}).sort({date:-1});
}).sort({ date: -1 });

if (events.length === 0) {
return res.status(404).json({ message: 'No events found matching the title' });
Expand Down
34 changes: 16 additions & 18 deletions controllers/membersController.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,29 @@ import Member from "../models/Member.js"
//Get all members
export const getMember = async (req, res) => {
try {
const members = await Member.find();
if(!members || members.length === 0) {
return res.status(404).json({ message: 'No members found' });
}
res.status(200).json(members);
const members = await Member.find();
// Return empty array if no members, not a 404
res.status(200).json(members);
} catch (err) {
res.status(500).json({ message: 'Error fetching members', error: err.message });
res.status(500).json({ message: 'Error fetching members', error: err.message });
}
}

// Add a new member
export const addMember = async (req, res) => {
try {
const newMember = new Member(req.body);
await newMember.save();
res.status(201).json({ message: 'Member added successfully' });
const newMember = new Member(req.body);
await newMember.save();
res.status(201).json({ message: 'Member added successfully' });
} catch (err) {
res.status(500).json({ message: 'Error adding member', error: err.message });
res.status(500).json({ message: 'Error adding member', error: err.message });
}
}


// Edit a member
export const editMember = async (req, res) => {
try {
try {
const updatedMember = await Member.findByIdAndUpdate(req.params.id, req.body, { new: true });
if (!updatedMember) return res.status(404).json({ message: 'Member not found' });
res.json({ message: 'Member updated successfully', member: updatedMember });
Expand All @@ -38,11 +36,11 @@ export const editMember = async (req, res) => {

// Delete a member
export const deleteMember = async (req, res) => {
try {
const deletedMember = await Member.findByIdAndDelete(req.params.id);
if (!deletedMember) return res.status(404).json({ message: 'Member not found' });
res.json({ message: 'Member deleted successfully' });
} catch (err) {
res.status(500).json({ message: 'Error deleting member', error: err });
}
try {
const deletedMember = await Member.findByIdAndDelete(req.params.id);
if (!deletedMember) return res.status(404).json({ message: 'Member not found' });
res.json({ message: 'Member deleted successfully' });
} catch (err) {
res.status(500).json({ message: 'Error deleting member', error: err });
}
}
9 changes: 6 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
"type": "module",
"scripts": {
"start": "node server.js",
"dev": "cross-env NODE_ENV=development nodemon server.js"
"dev": "cross-env NODE_ENV=development nodemon server.js",
"seed": "node scripts/seedDatabase.js"
},
"keywords": [
"express",
Expand All @@ -22,7 +23,9 @@
"cors": "^2.8.5",
"dotenv": "^16.4.7",
"express": "^4.21.2",
"mongoose": "^8.9.0"
"mongodb": "^7.0.0",
"mongoose": "^8.9.0",
"nodemailer": "^7.0.12"
},
"devDependencies": {
"cross-env": "^10.1.0",
Expand All @@ -31,4 +34,4 @@
"engines": {
"node": ">=18.0.0"
}
}
}
Loading