Skip to content
Open
Show file tree
Hide file tree
Changes from 4 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
28 changes: 28 additions & 0 deletions Backend/Server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const mongoose= require('mongoose');
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove duplicate mongoose import.

The mongoose module is imported twice.

 const mongoose= require('mongoose');
 const express= require('express');
 const bodyParser= require('body-parser');
-const mongoose= require('mongoose');

Also applies to: 4-4

const express= require('express');
const bodyParser= require('body-parser');
const mongoose= require('mongoose');

const authRoutes= require('./routes/auth');
const scanRoutes= require('./routes/scan');

const app=express();
app.use(corse());
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix CORS middleware typo and import.

The CORS middleware has a typo and is not imported.

+const cors = require('cors');
 const app=express();
-app.use(corse());
+app.use(cors());

app.use(bodyParser.json());

app.use('/api/auth', authRoutes);
app.use('/api/scan', scanRoutes);

mongoose.connect('mongodb://localhost:27017/digital-mess-card', { //Mongodb connection
useNewUrlParser: true,
useUnifiedTopology: true,
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Move database configuration to environment variables.

Don't hardcode the MongoDB connection URL in the code. Also, add error handling for the connection.

-mongoose.connect('mongodb://localhost:27017/digital-mess-card', {  //Mongodb connection
-    useNewUrlParser: true,
-    useUnifiedTopology: true,
-});
+mongoose.connect(process.env.MONGODB_URI, {
+    useNewUrlParser: true,
+    useUnifiedTopology: true,
+})
+.then(() => console.log('Connected to MongoDB'))
+.catch(err => {
+    console.error('MongoDB connection error:', err);
+    process.exit(1);
+});


app.get('/',(req,res)=>{
res.send('Digital MESS Card'); //Route
});

const PORT= 5000;
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
})
16 changes: 16 additions & 0 deletions Backend/middleware/auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
const jwt= require('jsonwebtoken');

const authenticate= (req,res,next) => { //Authenticate access
const token=req.header('Authorization');
if (!token) return res.status(401).send('Access Denied');
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Implement proper token format validation.

The token validation should:

  1. Check for the 'Bearer' prefix
  2. Extract the token correctly
-    const token=req.header('Authorization');
-    if (!token) return res.status(401).send('Access Denied');
+    const authHeader = req.header('Authorization');
+    if (!authHeader?.startsWith('Bearer ')) {
+        return res.status(401).json({ error: 'Missing or invalid authorization header' });
+    }
+    const token = authHeader.split(' ')[1];
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const token=req.header('Authorization');
if (!token) return res.status(401).send('Access Denied');
const authHeader = req.header('Authorization');
if (!authHeader?.startsWith('Bearer ')) {
return res.status(401).json({ error: 'Missing or invalid authorization header' });
}
const token = authHeader.split(' ')[1];


try{
const decoded= jwt.verify(token, 'secret_key');
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Move secret key to environment variables.

Don't hardcode the JWT secret key in the code. Use environment variables instead.

-        const decoded= jwt.verify(token, 'secret_key');
+        const decoded = jwt.verify(token, process.env.JWT_SECRET);

req.userId= decoded.userId;
next();
} catch (err) {
res.status(400).send('Invalid token');
}
};

module.exports= { authenticate };
7 changes: 7 additions & 0 deletions Backend/models/Scan.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const mongoose= require('mongoose');
const scanSchema =new mongoose.Schema({ //Scan date update in db
userId: { type: String, enum: ['lunch', 'snck'], required: true },
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Rename userId field to better reflect its purpose.

The field name userId is misleading as it stores the scan type ('lunch' or 'snck'). Consider renaming it to scanType for better clarity. Also, 'snck' appears to be a typo of 'snack'.

-    userId: {   type: String, enum: ['lunch', 'snck'], required: true },
+    scanType: {   type: String, enum: ['lunch', 'snack'], required: true },

date :{ type: Date, default: Date.now},
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add missing fields and optimize schema for queries.

The schema is missing:

  1. Reference to the actual user performing the scan
  2. Index on the date field for efficient queries
 const mongoose= require('mongoose');
 const scanSchema =new mongoose.Schema({
-    userId: {   type: String, enum: ['lunch', 'snck'], required: true },
-    date :{  type: Date, default: Date.now},
+    scanType: { type: String, enum: ['lunch', 'snack'], required: true },
+    userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
+    date: { type: Date, default: Date.now, index: true }
 });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const mongoose= require('mongoose');
const scanSchema =new mongoose.Schema({ //Scan date update in db
userId: { type: String, enum: ['lunch', 'snck'], required: true },
date :{ type: Date, default: Date.now},
});
const mongoose= require('mongoose');
const scanSchema = new mongoose.Schema({
scanType: { type: String, enum: ['lunch', 'snack'], required: true },
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
date: { type: Date, default: Date.now, index: true }
});


module.exports= mongoose.model('Scan', scanSchema);
8 changes: 8 additions & 0 deletions Backend/models/User.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const mongoose= require('mongoose');

const userSchema= new mongoose.schema({ //login details connected to db
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix schema name casing.

The schema name is incorrectly cased. Mongoose's method is named Schema, not schema.

-const userSchema= new mongoose.schema({
+const userSchema= new mongoose.Schema({
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const userSchema= new mongoose.schema({ //login details connected to db
const userSchema= new mongoose.Schema({ //login details connected to db

username:{ type: String, required: true, unique: true },
password:{ type: String, required: true, match:/^[a-zA-Z0-9]+$/,
}
Comment on lines +5 to +6
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Strengthen password security.

The current password validation is insufficient:

  1. Allows weak passwords (only alphanumeric)
  2. No minimum length requirement
  3. No password hashing
-    password:{ type: String, required: true, match:/^[a-zA-Z0-9]+$/,
-    }
+    password: {
+        type: String,
+        required: true,
+        minlength: 8,
+        match: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/
+    }

Also, add a pre-save hook to hash the password:

const bcrypt = require('bcrypt');

userSchema.pre('save', async function(next) {
    if (this.isModified('password')) {
        this.password = await bcrypt.hash(this.password, 10);
    }
    next();
});

});
module.exports= mongoose.model('User', userSchema);
26 changes: 26 additions & 0 deletions Backend/routes/auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
const express= require('express');
const bcrypt= require('bcryptjs');
const jwt= require('jsonwebtoken');
const User= require('../models/User');

const router= express.Router(); //to register new user
router.post('/register', async(req, res) => {
const { username, password}=req.body;
const hashedPassword=await bcrypt.hash(password, 10);
const User= new User({username, password: hashedPassword });
await username.save();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix critical variable declaration and usage errors.

There are two critical issues in the user registration logic:

  1. Line 10: You're redeclaring the User model that was already imported
  2. Line 11: Using username.save() instead of User.save()

Apply this fix:

-    const User= new User({username, password: hashedPassword });
-    await username.save();
+    const user = new User({username, password: hashedPassword });
+    await user.save();
🧰 Tools
🪛 Biome (1.9.4)

[error] 10-10: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)

res.status(201).send('User registered');
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add input validation and error handling to registration endpoint.

The registration endpoint lacks input validation and proper error handling.

Here's a suggested implementation:

 router.post('/register', async(req, res) => {
+    try {
     const { username, password}=req.body;
+    if (!username || !password) {
+        return res.status(400).json({ error: 'Username and password are required' });
+    }
+    if (password.length < 8) {
+        return res.status(400).json({ error: 'Password must be at least 8 characters long' });
+    }
+    const existingUser = await User.findOne({ username });
+    if (existingUser) {
+        return res.status(400).json({ error: 'Username already exists' });
+    }
     const hashedPassword=await bcrypt.hash(password, 10);
-    const User= new User({username, password: hashedPassword });
-    await username.save();
-    res.status(201).send('User registered');
+    const user = new User({username, password: hashedPassword });
+    await user.save();
+    res.status(201).json({ message: 'User registered successfully' });
+    } catch (error) {
+        console.error('Registration error:', error);
+        res.status(500).json({ error: 'Internal server error' });
+    }
 });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
router.post('/register', async(req, res) => {
const { username, password}=req.body;
const hashedPassword=await bcrypt.hash(password, 10);
const User= new User({username, password: hashedPassword });
await username.save();
res.status(201).send('User registered');
});
router.post('/register', async (req, res) => {
try {
const { username, password } = req.body;
if (!username || !password) {
return res.status(400).json({ error: 'Username and password are required' });
}
if (password.length < 8) {
return res.status(400).json({ error: 'Password must be at least 8 characters long' });
}
const existingUser = await User.findOne({ username });
if (existingUser) {
return res.status(400).json({ error: 'Username already exists' });
}
const hashedPassword = await bcrypt.hash(password, 10);
const user = new User({ username, password: hashedPassword });
await user.save();
res.status(201).json({ message: 'User registered successfully' });
} catch (error) {
console.error('Registration error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
🧰 Tools
🪛 Biome (1.9.4)

[error] 10-10: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


router.post('/login', async (req, res) => { //to check whether the login details are valid
const { username, password } = req.body;
const user= await User.findOne({ username });
if (user && await bcrypt.compare(password, user.password)) {
const token= jwt.sign({ userId: user._id }, 'secret_key');
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Replace hardcoded JWT secret with environment variable.

Using a hardcoded secret key for JWT signing is a security risk. Move it to environment variables.

  1. Create a .env file in your project root:
JWT_SECRET=your_secure_random_string_here
  1. Install and configure dotenv:
+require('dotenv').config();
  1. Replace the hardcoded secret:
-const token= jwt.sign({ userId: user._id }, 'secret_key');
+const token= jwt.sign({ userId: user._id }, process.env.JWT_SECRET);

res.json({ token });
} else {
res.status(400).send('Invalid credentials');
}
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add error handling and improve security in login endpoint.

The login endpoint needs error handling and security improvements.

Here's a suggested implementation:

 router.post('/login', async (req, res) => {
+    try {
     const { username, password } = req.body;
+    if (!username || !password) {
+        return res.status(400).json({ error: 'Username and password are required' });
+    }
     const user= await User.findOne({ username });
     if (user && await bcrypt.compare(password, user.password)) {
-        const token= jwt.sign({ userId: user._id }, 'secret_key');
+        const token= jwt.sign(
+            { userId: user._id },
+            process.env.JWT_SECRET,
+            { expiresIn: '24h' }
+        );
         res.json({ token });
     } else {
-        res.status(400).send('Invalid credentials');
+        res.status(401).json({ error: 'Invalid credentials' });
     }
+    } catch (error) {
+        console.error('Login error:', error);
+        res.status(500).json({ error: 'Internal server error' });
+    }
 });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
router.post('/login', async (req, res) => { //to check whether the login details are valid
const { username, password } = req.body;
const user= await User.findOne({ username });
if (user && await bcrypt.compare(password, user.password)) {
const token= jwt.sign({ userId: user._id }, 'secret_key');
res.json({ token });
} else {
res.status(400).send('Invalid credentials');
}
});
router.post('/login', async (req, res) => { //to check whether the login details are valid
try {
const { username, password } = req.body;
if (!username || !password) {
return res.status(400).json({ error: 'Username and password are required' });
}
const user = await User.findOne({ username });
if (user && await bcrypt.compare(password, user.password)) {
const token = jwt.sign(
{ userId: user._id },
process.env.JWT_SECRET,
{ expiresIn: '24h' }
);
res.json({ token });
} else {
res.status(401).json({ error: 'Invalid credentials' });
}
} catch (error) {
console.error('Login error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});


module.exports= router;
29 changes: 29 additions & 0 deletions Backend/routes/scan.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const express= require('express');
const Scan= require('../models/Scan');
const {authenticate}=require('../middleware/auth');

const router=express.Router();
router.post('/scan',authenticate, async(req,res)=> { //to get info about user and the current time
const {type}= req.body;
const userId=req.userId;
const now= new Date();
const hours= now.getHours();
const minutes=now.getMinutes();

if(type==='lunch' && !(hours>=11 && minutes>=30 && hours<14)){ //to check whether scanning of lunch time is valid
return res.status(400).send('Lunch sacnning is only allwed between 11:30 AM and 2:00 PM');
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix time window logic edge cases.

The current time window checks have edge cases that could cause incorrect validations:

  1. For lunch (11:30 AM - 2:00 PM), the current logic fails at exactly 2 PM
  2. For snack (3:30 PM - 5:00 PM), the current logic fails at exactly 5 PM

Apply this fix:

-    if(type==='lunch' && !(hours>=11 && minutes>=30 && hours<14)){
+    const currentTime = hours * 60 + minutes;
+    if(type==='lunch' && !(currentTime >= 690 && currentTime <= 840)){  // 690 = 11:30, 840 = 14:00
         return res.status(400).send('Lunch sacnning is only allwed between 11:30 AM and 2:00 PM');
     }

-    if(type=== 'snack' && !(hours>=15 && minutes>=30 && hours<17)){
+    if(type=== 'snack' && !(currentTime >= 930 && currentTime <= 1020)){  // 930 = 15:30, 1020 = 17:00
         return res.status(400).send('Snack scanning is only allowed between 3:30 PM and 5:00 PM');
     }

Also applies to: 17-19


if(type=== 'snack' && !(hours>=15 && minutes>=30 && hours<17)){ //to check whether scanning of snack time is valid
return res.status(400).send('Snack scanning is only allowed between 3:30 PM and 5:00 PM');
}
const existingScan=await Scan.findone({ userId, type, date: { $gte: new Date().setHours(0,0,0,0)}});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix typo in findOne method.

There's a typo in the method name which will cause a runtime error.

-    const existingScan=await Scan.findone({ userId, type, date: { $gte: new Date().setHours(0,0,0,0)}});
+    const existingScan=await Scan.findOne({ userId, type, date: { $gte: new Date().setHours(0,0,0,0)}});
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const existingScan=await Scan.findone({ userId, type, date: { $gte: new Date().setHours(0,0,0,0)}});
const existingScan=await Scan.findOne({ userId, type, date: { $gte: new Date().setHours(0,0,0,0)}});

if (existingScan){ //to check whether a scanning already occured in the given time
return res.status(400).send('Already scanned today');
}
const scan= new scan({userId, type});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix variable case mismatch.

The variable case doesn't match the imported Scan model.

-    const scan= new scan({userId, type});
+    const scan= new Scan({userId, type});
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const scan= new scan({userId, type});
const scan= new Scan({userId, type});
🧰 Tools
🪛 Biome (1.9.4)

[error] 24-24: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)

await scan.save(); //to save current scan
res.send('Scan successful');
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add error handling and input validation.

The scan endpoint lacks error handling and input validation.

Here's a suggested implementation:

 router.post('/scan',authenticate, async(req,res)=> {
+    try {
     const {type}= req.body;
+    if (!type) {
+        return res.status(400).json({ error: 'Scan type is required' });
+    }
+    if (!['lunch', 'snack'].includes(type)) {
+        return res.status(400).json({ error: 'Invalid scan type' });
+    }
     const userId=req.userId;
     const now= new Date();
     const hours= now.getHours();
     const minutes=now.getMinutes();
     const currentTime = hours * 60 + minutes;

-    if(type==='lunch' && !(currentTime >= 690 && currentTime <= 840)){
-        return res.status(400).send('Lunch sacnning is only allwed between 11:30 AM and 2:00 PM');
+    if(type==='lunch' && !(currentTime >= 690 && currentTime <= 840)){
+        return res.status(400).json({ error: 'Lunch scanning is only allowed between 11:30 AM and 2:00 PM' });
     }

-    if(type=== 'snack' && !(currentTime >= 930 && currentTime <= 1020)){
-        return res.status(400).send('Snack scanning is only allowed between 3:30 PM and 5:00 PM');
+    if(type=== 'snack' && !(currentTime >= 930 && currentTime <= 1020)){
+        return res.status(400).json({ error: 'Snack scanning is only allowed between 3:30 PM and 5:00 PM' });
     }

     const existingScan=await Scan.findOne({ userId, type, date: { $gte: new Date().setHours(0,0,0,0)}});
     if (existingScan){
-        return res.status(400).send('Already scanned today');
+        return res.status(400).json({ error: 'Already scanned today' });
     }

     const scan= new Scan({userId, type});
     await scan.save();
-    res.send('Scan successful');
+    res.status(201).json({ message: 'Scan successful' });
+    } catch (error) {
+        console.error('Scan error:', error);
+        res.status(500).json({ error: 'Internal server error' });
+    }
 });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
router.post('/scan',authenticate, async(req,res)=> { //to get info about user and the current time
const {type}= req.body;
const userId=req.userId;
const now= new Date();
const hours= now.getHours();
const minutes=now.getMinutes();
if(type==='lunch' && !(hours>=11 && minutes>=30 && hours<14)){ //to check whether scanning of lunch time is valid
return res.status(400).send('Lunch sacnning is only allwed between 11:30 AM and 2:00 PM');
}
if(type=== 'snack' && !(hours>=15 && minutes>=30 && hours<17)){ //to check whether scanning of snack time is valid
return res.status(400).send('Snack scanning is only allowed between 3:30 PM and 5:00 PM');
}
const existingScan=await Scan.findone({ userId, type, date: { $gte: new Date().setHours(0,0,0,0)}});
if (existingScan){ //to check whether a scanning already occured in the given time
return res.status(400).send('Already scanned today');
}
const scan= new scan({userId, type});
await scan.save(); //to save current scan
res.send('Scan successful');
});
router.post('/scan', authenticate, async (req, res) => {
try {
const { type } = req.body;
if (!type) {
return res.status(400).json({ error: 'Scan type is required' });
}
if (!['lunch', 'snack'].includes(type)) {
return res.status(400).json({ error: 'Invalid scan type' });
}
const userId = req.userId;
const now = new Date();
const hours = now.getHours();
const minutes = now.getMinutes();
const currentTime = hours * 60 + minutes;
if (type === 'lunch' && !(currentTime >= 690 && currentTime <= 840)) {
return res.status(400).json({ error: 'Lunch scanning is only allowed between 11:30 AM and 2:00 PM' });
}
if (type === 'snack' && !(currentTime >= 930 && currentTime <= 1020)) {
return res.status(400).json({ error: 'Snack scanning is only allowed between 3:30 PM and 5:00 PM' });
}
const existingScan = await Scan.findOne({
userId,
type,
date: { $gte: new Date().setHours(0, 0, 0, 0) }
});
if (existingScan) {
return res.status(400).json({ error: 'Already scanned today' });
}
const scan = new Scan({ userId, type });
await scan.save();
res.status(201).json({ message: 'Scan successful' });
} catch (error) {
console.error('Scan error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
🧰 Tools
🪛 Biome (1.9.4)

[error] 24-24: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


module.exports= router;
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@


## Basic Details
### Team Name: [Name]
### Team Name: NOX


### Team Members
- Member 1: [Name] - [College]
- Member 2: [Name] - [College]
- Member 3: [Name] - [College]
- Member 1: Anagha TR - SCMS School of engineering and technology
- Member 2: Anaya Wilson - SCMS School of engineering and technology
- Member 3: Aneeja J - SCMS School of engineering and technology

### Hosted Project Link
[mention your project hosted project link here]
Expand Down