Browse Source

Added POST, PUT, GET and DELETE routes for /employees

Fela Maslen 7 years ago
parent
commit
ffe486ff02

+ 10 - 0
src/server/modules/client-error.js

@@ -0,0 +1,10 @@
+function clientError(err) {
+    err.statusCode = 400;
+
+    return err;
+}
+
+module.exports = {
+    clientError
+};
+

+ 29 - 6
src/server/modules/users.js

@@ -1,7 +1,18 @@
 const joi = require('joi');
+const { ObjectID } = require('mongodb');
+
+const { clientError } = require('server/modules/client-error');
 
 const COLLECTION_USERS = 'users';
 
+function getObjectId(id) {
+    if (process.env.NODE_ENV === 'test') {
+        return id;
+    }
+
+    return new ObjectID(id);
+}
+
 async function insertUser(db, info) {
     const { error, value } = joi.validate(info, {
         name: joi.string().required(),
@@ -11,14 +22,24 @@ async function insertUser(db, info) {
     });
 
     if (error) {
-        throw error;
+        throw clientError(error);
     }
 
     const users = await db.collection(COLLECTION_USERS);
 
-    const newUser = await users.insert(value);
+    const result = await users.insert(value);
 
-    return newUser;
+    try {
+        const { _id, ...userResult } = result.ops[0];
+
+        return {
+            id: String(_id),
+            ...userResult
+        };
+
+    } catch (err) {
+        return value;
+    }
 }
 
 async function modifyUser(db, id, info) {
@@ -29,12 +50,14 @@ async function modifyUser(db, id, info) {
     });
 
     if (error) {
-        throw error;
+        throw clientError(error);
     }
 
     const users = await db.collection(COLLECTION_USERS);
 
-    await users.update({ _id: id }, { $set: value }, {
+    const _id = getObjectId(id);
+
+    await users.updateOne({ _id }, { $set: value }, {
         upsert: false,
         multi: false
     });
@@ -43,7 +66,7 @@ async function modifyUser(db, id, info) {
 async function deleteUser(db, id) {
     const users = await db.collection(COLLECTION_USERS);
 
-    await users.deleteOne({ _id: id });
+    await users.deleteOne({ _id: getObjectId(id) });
 }
 
 async function getUsers(db) {

+ 47 - 0
src/server/routes/employees.js

@@ -0,0 +1,47 @@
+const { Router } = require('express');
+
+const {
+    insertUser,
+    modifyUser,
+    deleteUser,
+    getUsers
+} = require('server/modules/users');
+
+function employees(config, db) {
+    const router = new Router();
+
+    router.get('/', async (req, res) => {
+
+        const users = await getUsers(db);
+
+        res.json({ employees: users });
+    });
+
+    router.post('/', async (req, res) => {
+
+        const result = await insertUser(db, req.body);
+
+        res.json(result);
+    });
+
+    router.put('/:id', async (req, res) => {
+
+        await modifyUser(db, req.params.id, req.body);
+
+        res.json({ ok: true });
+    });
+
+    router.delete('/:id', async (req, res) => {
+
+        await deleteUser(db, req.params.id);
+
+        res.json({ ok: true });
+    });
+
+    return router;
+}
+
+module.exports = {
+    employees
+};
+

+ 4 - 0
src/server/routes/index.js

@@ -1,5 +1,7 @@
 const { Router } = require('express');
 
+const { employees } = require('server/routes/employees');
+
 function apiRoutes(config, db) {
     const router = new Router();
 
@@ -7,6 +9,8 @@ function apiRoutes(config, db) {
         res.send('OK');
     });
 
+    router.use('/employees', employees(config, db));
+
     // eslint-disable-next-line no-unused-vars
     router.use((err, req, res, next) => {
         let statusCode = 500;

+ 4 - 0
test/server/modules/users.spec.js

@@ -83,6 +83,8 @@ describe('API - Users module', () => {
                 try {
                     await insertUser(db, user);
                 } catch (err) {
+                    expect(err).to.have.property('statusCode', 400);
+
                     errorThrown = true;
                 }
 
@@ -130,6 +132,8 @@ describe('API - Users module', () => {
                     await modifyUser(db, id, user);
                 } catch (err) {
                     errorThrown = true;
+
+                    expect(err).to.have.property('statusCode', 400);
                 }
 
                 if (!errorThrown) {