Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
cr105ph1nx committed Sep 28, 2022
0 parents commit 9656bdc
Show file tree
Hide file tree
Showing 1,815 changed files with 420,548 additions and 0 deletions.
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Instructions

1- Position yourself in `backend/` folder

2- Run local server with:

```
$ npm run start
```

3- Open the file `frontend/index.html` in your favorite browser.

4- You're ready to go !

# Maintenance

If the app stops working. Check if the server is still running (It should show the message `Server listening on port 3000` on the console logs). If an error occurs, just re-run the server with the command in step #2
353 changes: 353 additions & 0 deletions backend/controllers/memberControllers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,353 @@
const Member = require("../models/member");
const converter = require("json-2-csv");
const fs = require("fs");
const path = require("path"); // <-- import path module to use absolute path.
const absPath = path.join(__dirname, "members.json");
var data = fs.readFileSync(absPath);
var object = JSON.parse(data);

module.exports = {
// Find member by ID
async getMember(req, res, next) {
let member;
try {
member = await Member.findById(req.params.memberID);
if (member == null) {
return res.status(404).json({ error: "Member could not be found." });
}
} catch (err) {
return res.status(500).json({ error: err.message });
}

res.member = member;
next();
},

// Getting all members
async index(req, res, next) {
try {
Member.find()
.sort({ createdAt: -1 })
.exec((err, docs) => {
if (err) {
return res.status(400).json({ error: err.message });
}
return res.status(200).json({ docs });
});
} catch (err) {
return res.status(500).json({ error: err.message });
}
},

// Getting a member by ID
async getMemberByID(req, res, next) {
res.send(res.member);
next();
},

// Creating a member
async createMember(req, res, next) {
try {
let {
firstname,
lastname,
email,
phonenumber,
studentID,
level,
faculty,
field,
motivation,
experience,
portfolio,
github,
socials,
feedback,
team,
} = req.body;

// check if all mandatory fields are filled
if (
!firstname ||
!lastname ||
!email ||
!phonenumber ||
!studentID ||
!level ||
!field ||
!motivation ||
!experience ||
!socials
) {
return res
.status(400)
.json({ error: "You must fill all mandatory fields..." });
}

// check if phonenumber is valid
if (!phonenumber.match(/^(00213|\+213|0)(5|6|7)[0-9]{8}$/)) {
return res
.status(400)
.json({ error: "The phonenumber you entered is invalid..." });
}

if (team.includes("IT") && !github) {
// check github for team IT
return res
.status(400)
.json({ error: "Github and/or Gitlab are required for team IT..." });
}

// create member
const member = {
date: new Date(),
email,
firstname,
lastname,
phonenumber,
studentID,
level,
field,
motivation,
team,
socials,
experience,
...(faculty && { faculty }),
...(portfolio && { portfolio }),
...(github && { github }),
...(feedback && { feedback }),
};

// save member to json file
object.push(member);
var newData = JSON.stringify(object);
fs.writeFile(absPath, newData, (err) => {
// error checking
if (err) throw err;

console.log("New data added");
});

res.status(200).json({ message: "Member added." });
} catch (err) {
res.status(500).json({ error: err.message });
}
},

// Updating a member
async updateMember(req, res, next) {
if (req.body.email != null) {
res.member.email = req.body.email;
}
if (req.body.firstname != null) {
res.member.firstname = req.body.firstname;
}
if (req.body.lastname != null) {
res.member.lastname = req.body.lastname;
}
if (req.body.phonenumber != null) {
res.member.phonenumber = req.body.phonenumber;
}
if (req.body.studentID != null) {
res.member.studentID = req.body.studentID;
}
if (req.body.level != null) {
res.member.level = req.body.level;
}
if (req.body.faculty != null) {
res.member.faculty = req.body.faculty;
}
if (req.body.field != null) {
res.member.field = req.body.field;
}
if (req.body.motivation != null) {
res.member.motivation = req.body.motivation;
}
if (req.body.team != null) {
res.member.team = req.body.team;
}
if (req.body.experience != null) {
res.member.experience = req.body.experience;
}

if (req.body.portfolio != null) {
res.member.portfolio = req.body.portfolio;
}

if (req.body.github != null) {
res.member.github = req.body.github;
}

if (req.body.socials != null) {
res.member.socials = req.body.socials;
}

if (req.body.feedback != null) {
res.member.feedback = req.body.feedback;
}
if (req.body.isAccepted != null) {
res.member.isAccepted = req.body.isAccepted;
}
try {
const updatedMember = await res.member.save();
res.status(200).json({ member: updatedMember });
} catch (err) {
res.status(500).json({ error: err.message });
}

next();
},

// Deleting a member
async deleteMember(req, res, next) {
try {
// delete member
await res.member.remove();

res.status(200).json({ message: "Member deleted." });
} catch (err) {
res.status(500).json({ error: err.message });
}

next();
},

// Searching for member
async searchMember(req, res, next) {
try {
/* {isAccepted, email,fullname,phonenumber,studentID,level,faculty,team} */
let filters = req.body;
let queryObj = {
...(filters.firstname && {
firstname: { $regex: filters.firstname, $options: "$i" },
}),
...(filters.lastname && {
lastname: { $regex: filters.lastname, $options: "$i" },
}),
...(filters.email && {
email: { $regex: filters.email, $options: "$i" },
}),
...(filters.studentID && {
studentID: { $regex: filters.studentID, $options: "$i" },
}),
...(filters.phonenumber && {
phonenumber: { $regex: filters.phonenumber, $options: "$i" },
}),
...(filters.level && { level: filters.level }),
...(filters.team && { team: filters.team }),
...(filters.isAccepted && { isAccepted: filters.isAccepted }),
};

Member.find(queryObj)
.sort({ createdAt: -1 })
.exec((err, docs) => {
if (err) {
return res.status(500).json({ error: err.message });
}
return res.status(200).json({ docs });
});
} catch (err) {
res.status(500).json({ error: err.message });
}
},

// Accept multiple members
async acceptMembers(req, res, next) {
try {
// req.body.members has id of all members that should be accepted
let { members } = req.body;
let i,
length = members.length,
unhandled = [];
// update status
for (i = 0; i < length; i++) {
await Member.findById({ _id: members[i] })
.then((member) => {
if (member) {
member.isAccepted = true;
member.save();
} else unhandled = members[i];
})
.catch((err) => {
unhandled = members[i];
});
}

res.status(200).json({ message: "Members accepted.", unhandled });
} catch (err) {
res.status(500).json({ error: err.message });
}

next();
},

// Reject multiple members
async rejectMembers(req, res, next) {
try {
// req.body.members has id of all members that should be accepted
let { members } = req.body;
let i,
length = members.length,
unhandled = [];
// update status
for (i = 0; i < length; i++) {
await Member.findById({ _id: members[i] })
.then((member) => {
if (member) {
member.isAccepted = false;
member.save();
} else unhandled = members[i];
})
.catch((err) => {
unhandled = members[i];
});
}

res.status(200).json({ message: "Members rejected.", unhandled });
} catch (err) {
res.status(500).json({ error: err.message });
}

next();
},

// Download all accepted members
async downloadAccepted(req, res, next) {
try {
// get all accepted members
let members = await Member.find({ isAccepted: true });
// convert from json to csv format
const csvString = await converter.json2csvAsync(members, {
emptyFieldValue: "N/A",
excelBOM: true,
excludeKeys: ["_id", "isAccepted"],
keys: [
"createdAt",
"firstname",
"lastname",
"email",
"phonenumber",
"studentID",
"level",
"faculty",
"field",
"team",
"motivation",
"experience",
"github",
"portfolio",
"socials",
"feedback",
],
});
// download file
res.setHeader("Content-disposition", "attachment; filename=members.csv");
res.set("Content-Type", "text/csv");
res.status(200).send(csvString);
} catch (err) {
res.status(500).json({ error: err.message });
}

next();
},
};
1 change: 1 addition & 0 deletions backend/controllers/members.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"date":"2022-09-28T18:56:19.235Z","email":"test","firstname":"test","lastname":"test","phonenumber":"0555055610","studentID":"test","level":"M2","field":"test","motivation":"test","team":["Design"],"socials":"test","experience":"Beginner"}]
23 changes: 23 additions & 0 deletions backend/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// use and initialize express app
const express = require("express");
const app = express();

const cors = require("cors");
app.use(cors());

app.use(express.json());

const bodyParser = require("body-parser");
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));
// parse application/json
app.use(bodyParser.json());

// require routes
require("./routes")(app);

// listen to port
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
Loading

0 comments on commit 9656bdc

Please sign in to comment.