Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

80 create endpoints for activity type #107

Open
wants to merge 8 commits into
base: develop
Choose a base branch
from
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
server/.env
server/node_modules
mobile/node_modules
./node_modules
./node_modules
.DS_Store
11 changes: 2 additions & 9 deletions server/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,21 @@ const dotenv = require("dotenv");


///////////////////////////////////////////// Configurations ////////////////////////////////////////
const User = require('./models/user.model'); // register schema for model User
const ActivityType = require('./models/ActivityType.model'); // register schema for model Activity Type

const app = express();

dotenv.config(); // allow access to .env file

const port = process.env.PORT || 5000;

const username = process.env.MONGO_USER;
const password = process.env.MONGO_PASSWORD;
const mongoURI = "mongodb+srv://" + username + ":" + password + "@cluster0.dxhaxm8.mongodb.net/?retryWrites=true&w=majority";
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Sooraj-beep marked this conversation as resolved.
Show resolved Hide resolved
//////////////////////////// Database connection /////////////////////////
// Database connection
mongoose.connect(mongoURI)
.then(
() => {console.log('Connected successfully to mongodb.');},
(err) => {console.log(`Failed to connect to mongodb. Error: ${err}`);}
);
/////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////// Import routes ////////////////////
Expand Down
88 changes: 53 additions & 35 deletions server/controllers/ActivityType.controller.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
///////////////////////////// Import dependencies ///////////////////////////////
const ActivityType = require('../models/ActivityType.model');
const JWTVerifier = require('../services/JWTVerifier');
/////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////// CRUD Callbacks for Activity Types ///////////////////////////////////////////
exports.getAllActivityTypes = (req, res) => {
exports.getAll = (req, res) => {
ActivityType.find({}, (err, types) => {
if (err) {return res.status(400).json({ message: `Failed to find activity types. ${err}` });}
else {
Expand All @@ -16,46 +17,63 @@ exports.getAllActivityTypes = (req, res) => {
});
}

exports.createNewActivityType = (req, res) => {
const activityTypeName = req.body.activityTypeName;
const newActivityType = new ActivityType({ name: activityTypeName });
newActivityType.save(
(err) => {
if (err) {
return res.status(400).send({message: `Failed to save new activity type. ${err}`});
exports.create = (req, res) => {
if (JWTVerifier.verifyStaffToken(req.body.token, process.env.STAFF_SECRET_KEY)) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

This function can be called as middleware where the route is defined. More about middleware functions: https://reflectoring.io/express-middleware/
icard example: https://github.com/UofA-Blueprint/ICard/blob/develop/backend/src/routes/Students.js#L63 (notice how verifyApiKey is called before the actual getStudent controller is called in the route definition).

Copy link
Collaborator

Choose a reason for hiding this comment

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

If you decide to make this change, please also change all other endpoints accordingly.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done

const activityTypeName = req.body.name;
const newActivityType = new ActivityType({ name: activityTypeName });
newActivityType.save(
(err) => {
if (err) {
return res.status(400).send({message: `Failed to save new activity type. ${err}`});
}
else {
return res.status(200).json({success: true, name: activityTypeName});
}
}
);
}
else {
res.status(401).json({success: false, message: 'Invalid staff token.'});
}
}

exports.update = (req, res) => {
if (JWTVerifier.verifyStaffToken(req.body.token, process.env.STAFF_SECRET_KEY)) {
const activityTypeName = req.body.current_name;
const newActivityTypeName = req.body.new_name;
ActivityType.findOneAndUpdate(
{ name: activityTypeName },
{ $set: {name: newActivityTypeName} },
(err, updatedActivityType) => {
if (err) {return res.status(400).json({ message: `Failed to update activity type. ${err}` });}
else if (!updatedActivityType) {return res.status(400).json({ message: `Activity type ${activityTypeName} does not exist.` });}
else {
return res.json({success: true, name: activityTypeName});
return res.status(200).json({ success: true, old_name: activityTypeName, updated_name: updatedActivityType.name });
}
}
);
);
}
else {
res.status(401).json({success: false, message: 'Invalid staff token.'});
}
}

exports.updateActivityType = (req, res) => {
const activityTypeName = req.body.activityTypeName;
const newActivityTypeName = req.body.newActivityTypeName;
ActivityType.findOneAndUpdate(
{ name: activityTypeName },
{ $set: {name: newActivityTypeName} },
(err, updatedActivityType) => {
if (err) {return res.status(400).json({ message: `Failed to update activity type. ${err}` });}
else {
return res.status(200).json({ success: true, name: updatedActivityType.name });
}
}
);
}

exports.deleteActivityType = (req, res) => {
const activityTypeToDelete = req.body.activityTypeName;
ActivityType.findOneAndDelete(
{ name: activityTypeToDelete },
(err) => {
if (err) {return res.status(400).json({ message: `Failed to delete activity type. ${err}` });}
else {
return res.status(200).json({ success: true, deleted_activity: activityTypeToDelete});
exports.delete = (req, res) => {
if (JWTVerifier.verifyStaffToken(req.body.token, process.env.STAFF_SECRET_KEY)) {
const activityTypeToDelete = req.body.name;
ActivityType.findOneAndDelete(
{ name: activityTypeToDelete },
(err, activity) => {
if (err) {return res.status(400).json({ message: `Failed to delete activity type. ${err}` });}
else if (!activity) {return res.status(400).json({message: `Activity type ${activityTypeToDelete} does not exist.`});}
else {
return res.status(200).json({ success: true, deleted_activity: activityTypeToDelete});
}
}
}
);
);
}
else {
res.status(401).json({success: false, message: 'Invalid staff token.'});
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
16 changes: 10 additions & 6 deletions server/controllers/user.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
const jwt = require('jsonwebtoken');
const User = require('../models/user.model');
const Authenticator = require('../services/Authenticator');
const OnRegisterTokenVerifier = require('../services/OnRegisterTokenVerifier');
const JWTVerifier = require('../services/JWTVerifier');
const NewUserCreator = require('../services/NewUserCreator');
/////////////////////////////////////////////////////////////////////////////////

Expand All @@ -14,13 +14,12 @@ exports.register = (req, res) => {
const token = req.body.token;

if (Authenticator.checkUsername(username) && Authenticator.checkRole(role)) {
OnRegisterTokenVerifier.verify(username, role, token, process.env.STAFF_SECRET_KEY, res); // make sure only a staff can register accounts for the caregivers and the clients
JWTVerifier.verifyAndRegister(username, role, token, process.env.STAFF_SECRET_KEY, res); // make sure only a staff can register accounts for the caregivers and the clients
} else {
return res.status(400).json({message: 'Invalid username or role'});
}
}

/* ------------------------- This is a dummy log in route for testing ------------------------- */
exports.login = (req, res) => {
User.findOne(
{username: req.body.username},
Expand All @@ -44,7 +43,6 @@ exports.login = (req, res) => {
}
);
}
/* ------------------------- End of a dummy log in route for testing ------------------------- */

/* ------------- This is a dummy sign up route for staff members used for testing ------------- */
exports.sign_up = (req, res) => {
Expand All @@ -59,9 +57,15 @@ exports.sign_up = (req, res) => {
/* ------------- End of a dummy sign up route for staff members used for testing ------------- */

exports.loginRequired = (req, res, next) => {
if (req.body.token) {next();}
const token = req.body.token;

if (!token) {return res.status(401).json({message: 'Unauthorized. Null token.'});}

const isValidStaff = JWTVerifier.verifyStaffToken(token, process.env.STAFF_SECRET_KEY);
const isValidCaregiver = JWTVerifier.verifyStaffToken(token, process.env.CAREGIVER_SECRET_KEY);
if (isValidStaff || isValidCaregiver) {next();}
else {
return res.status(401).json({message: 'Unauthorized.'});
return res.status(401).json({message: 'Unauthorized. Invalid token.'});
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2 changes: 1 addition & 1 deletion server/models/ActivityType.model.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@ const ActivityTypeSchema = new Schema({


/////////////////////////////// Exports /////////////////////////////
module.exports = mongoose.model('ActivityType', ActivityTypeSchema);
module.exports = mongoose.model('Activity_Type', ActivityTypeSchema);
////////////////////////////////////////////////////////////////////
9 changes: 5 additions & 4 deletions server/routes/ActivityType.route.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
/////////////////////// Import dependencies /////////////////////
const express = require('express');
const activityTypeController = require('../controllers/ActivityType.controller');
const userController = require('../controllers/user.controller');
const router = express.Router();
/////////////////////////////////////////////////////////////////


/////////////////////////// Routes ///////////////////////////
router.route('/all')
.get(activityTypeController.getAllActivityTypes);
.get(userController.loginRequired, activityTypeController.getAll);

router.route('/create')
.post(activityTypeController.createNewActivityType);
.post(userController.loginRequired, activityTypeController.create);

router.route('/update')
.put(activityTypeController.updateActivityType);
.put(userController.loginRequired, activityTypeController.update);

router.route('/delete')
.delete(activityTypeController.deleteActivityType);
.delete(userController.loginRequired, activityTypeController.delete);
//////////////////////////////////////////////////////////////


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ const jwt = require('jsonwebtoken');
////////////////////////////////////////////////////////////////////////


////////////////////////////////////// Functionality ////////////////////////////////////////
exports.verify = (username, role, token, secretKey, res) => {
////////////////////////////////////// Functionalities ////////////////////////////////////////
exports.verifyAndRegister = (username, role, token, secretKey, res) => {
if (!token) {res.status(401).json({message: 'Undefined token during registration.'});}
else {
jwt.verify(token, secretKey, (err, user) => {
Expand All @@ -15,4 +15,22 @@ exports.verify = (username, role, token, secretKey, res) => {
}
});}
}

exports.verifyStaffToken = (token, secretKey) => {
let isValid;
jwt.verify(token, secretKey, (err, staff) => {
if (err) {isValid = false;}
else {isValid = true;}
});
return isValid;
}

exports.verifyCaregiverToken = (token, secretKey) => {
let isValid;
jwt.verify(token, secretKey, (err, caregiver) => {
if (err) {isValid = false;}
else {isValid = true;}
});
return isValid;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Loading