diff --git a/TODO b/TODO new file mode 100644 index 0000000..1a7a79b --- /dev/null +++ b/TODO @@ -0,0 +1,24 @@ + + +User: +✔ Create group @started(22-03-05 16:09) @done(22-03-05 16:24) @lasted(15m4s) +✔ Create organization @started(22-03-05 16:24) @done(22-03-05 16:51) @lasted(27m13s) + +Organization: + +☐ Get organization members +☐ Edit organization members +☐ Get organization details +☐ Add people to organization +☐ Remove people from organization + +Groups: + +☐ Get group details +☐ Edit group details +☐ Get group members +☐ Add people to group +☐ Remove people from group +☐ Delete group + + diff --git a/server/app.js b/server/app.js index 2db3eee..7e50a9a 100644 --- a/server/app.js +++ b/server/app.js @@ -4,8 +4,9 @@ var path = require('path'); var cookieParser = require('cookie-parser'); var logger = require('morgan'); -var orgRouter = require('./routes/orgRouter'); +var authRouter = require('./routes/authRouter'); var userRouter = require('./routes/userRouter'); +var orgRouter = require('./routes/orgRouter'); var app = express(); @@ -19,8 +20,9 @@ app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); -app.use('/api/org', orgRouter); +app.use('/api/auth', authRouter); app.use('/api/user', userRouter); +app.use('/api/org', orgRouter); // catch 404 and forward to error handler app.use(function (req, res, next) { diff --git a/server/models/index.js b/server/models/index.js index 7834c16..976db97 100644 --- a/server/models/index.js +++ b/server/models/index.js @@ -14,7 +14,7 @@ async function initModels(sequelize) { User.hasOne(Token, { foreignKey: 'userID', onDelete: 'CASCADE' }); User.hasOne(ResetRequest, { foreignKey: 'userID', onDelete: 'CASCADE' }); User.hasMany(Group, { - as: 'groupOwner', + as: 'ownedGroup', foreignKey: 'ownerID', onDelete: 'CASCADE', }); @@ -24,7 +24,7 @@ async function initModels(sequelize) { foreignKey: 'userID', }); User.hasOne(Organization, { - as: 'orgOwner', + as: 'ownedOrg', foreignKey: 'ownerID', onDelete: 'CASCADE', }); @@ -61,7 +61,10 @@ async function initModels(sequelize) { ResetRequest.belongsTo(User, { foreignKey: 'userID' }); if (process.env.NODE_ENV == 'development') { - await sequelize.sync({ logging: false, force: true }); + await Organization.drop({ logging: false }); + await Group.drop({ logging: false }); + await ResetRequest.drop({ logging: false }); + await sequelize.sync({ logging: false, alter: true }); } else { await sequelize.sync({ logging: false, alter: true }); } diff --git a/server/routes/user/CreateUser.js b/server/routes/auth/CreateUser.js similarity index 100% rename from server/routes/user/CreateUser.js rename to server/routes/auth/CreateUser.js diff --git a/server/routes/user/Login.js b/server/routes/auth/Login.js similarity index 100% rename from server/routes/user/Login.js rename to server/routes/auth/Login.js diff --git a/server/routes/user/RequestReset.js b/server/routes/auth/RequestReset.js similarity index 85% rename from server/routes/user/RequestReset.js rename to server/routes/auth/RequestReset.js index 21310d5..480c854 100644 --- a/server/routes/user/RequestReset.js +++ b/server/routes/auth/RequestReset.js @@ -36,11 +36,9 @@ async function RequestReset(req, res, next) { console.log(`${resetRequest.reqID}`); - return res - .status(200) - .send( - 'Password reset request sent. If a user exists with this email, an email will be sent with the required information.' - ); + return res.send( + 'Password reset request sent. If a user exists with this email, an email will be sent with the required information.' + ); } catch (e) { console.log(e); return res.status(500).send('Whoops, something went wrong.'); diff --git a/server/routes/user/ResetPassword.js b/server/routes/auth/ResetPassword.js similarity index 92% rename from server/routes/user/ResetPassword.js rename to server/routes/auth/ResetPassword.js index a1a4301..82d790e 100644 --- a/server/routes/user/ResetPassword.js +++ b/server/routes/auth/ResetPassword.js @@ -25,7 +25,7 @@ async function ResetPassword(req, res, next) { const user = await result.getUser(); await user.update({ password: hashedPassword }); - res.status(200).send('Your password has been changed'); + return res.send('Your password has been changed'); } module.exports = ResetPassword; diff --git a/server/routes/authRouter.js b/server/routes/authRouter.js new file mode 100644 index 0000000..ccb077d --- /dev/null +++ b/server/routes/authRouter.js @@ -0,0 +1,16 @@ +var express = require('express'); +var router = express.Router(); + +const basicAuth = require('../middleware/basicAuth'); + +const CreateUser = require('./auth/CreateUser'); +const Login = require('./auth/Login'); +const RequestReset = require('./auth/RequestReset'); +const ResetPassword = require('./auth/ResetPassword'); + +router.post('/register', CreateUser); +router.post('/login', basicAuth, Login); +router.get('/reset-password', RequestReset); +router.patch('/reset-password/:id', ResetPassword); + +module.exports = router; diff --git a/server/routes/orgRouter.js b/server/routes/orgRouter.js index 36b9a4d..81c57c8 100644 --- a/server/routes/orgRouter.js +++ b/server/routes/orgRouter.js @@ -3,21 +3,6 @@ var router = express.Router(); const tokenAuth = require('../middleware/tokenAuth'); -router.get(); - -/* -Organization -- Create organization -- Create organization account -- Add people to organization -- Remove people from organization -- Get organization members - -Groups -- Create group -- Add people to group -- Remove people from group -- Delete group -*/ +router.get('/', tokenAuth); module.exports = router; diff --git a/server/routes/user/CreateGroup.js b/server/routes/user/CreateGroup.js new file mode 100644 index 0000000..d88ff48 --- /dev/null +++ b/server/routes/user/CreateGroup.js @@ -0,0 +1,16 @@ +async function CreateGroup(req, res, next) { + const user = req.user; + const groupName = req.body.groupName; + + if (!groupName) { + return res.status(400).send('Request missing required form fields.'); + } + + const group = await user.createOwnedGroup({ + groupName: groupName, + }); + + return res.send(group); +} + +module.exports = CreateGroup; diff --git a/server/routes/user/CreateOrg.js b/server/routes/user/CreateOrg.js new file mode 100644 index 0000000..93a6fd1 --- /dev/null +++ b/server/routes/user/CreateOrg.js @@ -0,0 +1,25 @@ +async function CreateOrg(req, res, next) { + const user = req.user; + const orgName = req.body.orgName; + + if (!orgName) { + return res.status(400).send('Form missing necessary fields'); + } + + const existing = user.getOwnedOrg(); + if (existing == {}) { + return res + .status(500) + .send( + 'This user already owns an organization, delete it to create another.' + ); + } + + const org = await user.createOwnedOrg({ + orgName: orgName, + }); + + return res.status(200).send(org); +} + +module.exports = CreateOrg; diff --git a/server/routes/user/GetUserDetails.js b/server/routes/user/GetUserDetails.js index dd61290..e993b64 100644 --- a/server/routes/user/GetUserDetails.js +++ b/server/routes/user/GetUserDetails.js @@ -2,7 +2,7 @@ async function GetUserDetails(req, res, next) { const { userID, password, createdAt, updatedAt, ...user } = req.user.dataValues; - res.status(200).send(user); + return res.send(user); } module.exports = GetUserDetails; diff --git a/server/routes/user/UpdateUser.js b/server/routes/user/UpdateUser.js index 9a56347..8f2b574 100644 --- a/server/routes/user/UpdateUser.js +++ b/server/routes/user/UpdateUser.js @@ -22,7 +22,7 @@ async function UpdateUser(req, res, next) { } req.user.update({ ...body }); - return res.status(200).send('Account details changed.'); + return res.send('Account details changed.'); } module.exports = UpdateUser; diff --git a/server/routes/userRouter.js b/server/routes/userRouter.js index 3e4e081..651ce5c 100644 --- a/server/routes/userRouter.js +++ b/server/routes/userRouter.js @@ -1,21 +1,16 @@ var express = require('express'); var router = express.Router(); -const basicAuth = require('../middleware/basicAuth'); const tokenAuth = require('../middleware/tokenAuth'); -const GetUserDetails = require('./auth/GetUserDetails'); -const CreateUser = require('./auth/CreateUser'); -const Login = require('./auth/Login'); -const RequestReset = require('./auth/RequestReset'); -const ResetPassword = require('./auth/ResetPassword'); -const UpdateUser = require('./auth/UpdateUser'); +const GetUserDetails = require('./user/GetUserDetails'); +const UpdateUser = require('./user/UpdateUser'); +const CreateGroup = require('./user/CreateGroup'); +const CreateOrg = require('./user/CreateOrg'); router.get('/', tokenAuth, GetUserDetails); -router.post('/register', CreateUser); -router.post('/login', basicAuth, Login); -router.get('/reset-password', RequestReset); -router.patch('/reset-password/:id', ResetPassword); router.patch('/update', tokenAuth, UpdateUser); +router.post('/group/create', tokenAuth, CreateGroup); +router.post('/org/create', tokenAuth, CreateOrg); module.exports = router;