From 6f1f5ee39e02f30b35f83ab88f18c51c49c8bfb3 Mon Sep 17 00:00:00 2001
From: Louis-Marie Michelin <lmichelin@outlook.fr>
Date: Tue, 8 Jun 2021 16:36:06 +0200
Subject: [PATCH] feat: add & remove users

---
 backend/routes/users.js                | 10 +++
 frontend/src/components/UsersTable.vue | 24 +++++++
 frontend/src/views/AddUser.vue         | 87 ++++++++++++++++++++++++++
 frontend/src/views/Users.vue           |  5 +-
 4 files changed, 125 insertions(+), 1 deletion(-)
 create mode 100644 frontend/src/views/AddUser.vue

diff --git a/backend/routes/users.js b/backend/routes/users.js
index 73bd505..30e2886 100644
--- a/backend/routes/users.js
+++ b/backend/routes/users.js
@@ -31,4 +31,14 @@ router.post("/new", function (req, res) {
     });
 });
 
+router.delete("/:userId", function (req, res) {
+  UserModel.deleteOne({ _id: req.params.userId })
+    .then(function () {
+      res.status(204).json({ message: "User successfully deleted" });
+    })
+    .catch(function () {
+      res.status(500).json({ message: "Error while deleting the user" });
+    });
+});
+
 module.exports = router;
diff --git a/frontend/src/components/UsersTable.vue b/frontend/src/components/UsersTable.vue
index 6bfcef5..3db3d69 100644
--- a/frontend/src/components/UsersTable.vue
+++ b/frontend/src/components/UsersTable.vue
@@ -10,17 +10,37 @@
         <td>{{ user.email }}</td>
         <td>{{ user.firstName }}</td>
         <td>{{ user.lastName }}</td>
+        <td>
+          <button class="delete-button" @click="deleteUser(user._id)">
+            Delete
+          </button>
+        </td>
       </tr>
     </tbody>
   </table>
 </template>
 
 <script>
+import axios from "axios";
+
 export default {
   name: "UsersTable",
   props: {
     users: Array,
   },
+  methods: {
+    deleteUser: function (userId) {
+      axios
+        .delete(`${process.env.VUE_APP_BACKEND_BASE_URL}/users/${userId}`)
+        .then(() => {
+          this.$emit("userDeleted");
+        })
+        .catch((error) => {
+          alert("An error occured while deleting the user.");
+          console.error(error);
+        });
+    },
+  },
 };
 </script>
 
@@ -34,4 +54,8 @@ td {
   border: 1px solid #000000;
   padding: 10px;
 }
+
+.delete-button {
+  cursor: pointer;
+}
 </style>
diff --git a/frontend/src/views/AddUser.vue b/frontend/src/views/AddUser.vue
new file mode 100644
index 0000000..a486620
--- /dev/null
+++ b/frontend/src/views/AddUser.vue
@@ -0,0 +1,87 @@
+<template>
+  <div class="add-user-title">Add new user:</div>
+  <div class="add-user-form-container">
+    <form ref="addUserForm">
+      <input
+        class="add-user-input"
+        v-model="user.email"
+        type="email"
+        placeholder="Email"
+        required
+      />
+      <input
+        class="add-user-input"
+        v-model="user.firstName"
+        placeholder="First name"
+      />
+      <input
+        class="add-user-input"
+        v-model="user.lastName"
+        placeholder="Last name"
+      />
+    </form>
+    <button class="add-user-button" @click="addUser()">Add user</button>
+    <div v-if="userCreationError">{{ userCreationError }}</div>
+  </div>
+</template>
+
+<script>
+import axios from "axios";
+
+export default {
+  name: "AddUser",
+  data: function () {
+    return {
+      user: {
+        email: "",
+        firstName: "",
+        lastName: "",
+      },
+      userCreationError: "",
+    };
+  },
+  methods: {
+    addUser: function () {
+      if (!this.$refs.addUserForm.checkValidity()) {
+        this.$refs.addUserForm.reportValidity();
+        return;
+      }
+
+      axios
+        .post(`${process.env.VUE_APP_BACKEND_BASE_URL}/users/new`, this.user)
+        .then(() => {
+          this.$emit("userAdded");
+          this.user = {
+            email: "",
+            firstName: "",
+            lastName: "",
+          };
+        })
+        .catch((error) => {
+          this.userCreationError = "An error occured while creating new user.";
+          console.error(error);
+        });
+    },
+  },
+};
+</script>
+<style scoped>
+.add-user-title {
+  margin-bottom: 10px;
+}
+
+.add-user-form-container {
+  display: flex;
+  margin-bottom: 20px;
+}
+
+.add-user-input {
+  margin-right: 10px;
+  padding: 5px;
+}
+
+.add-user-button {
+  cursor: pointer;
+  padding: 5px;
+}
+</style>
diff --git a/frontend/src/views/Users.vue b/frontend/src/views/Users.vue
index 29861f4..e404ffd 100644
--- a/frontend/src/views/Users.vue
+++ b/frontend/src/views/Users.vue
@@ -1,6 +1,7 @@
 <template>
   <h1>Users</h1>
-  <UsersTable v-if="users.length" :users="users" />
+  <AddUser @userAdded="fetchUsers()" />
+  <UsersTable v-if="users.length" :users="users" @userDeleted="fetchUsers()" />
   <div v-if="usersLoadingError">{{ usersLoadingError }}</div>
 </template>
 
@@ -8,10 +9,12 @@
 // @ is an alias to /src
 import UsersTable from "@/components/UsersTable.vue";
 import axios from "axios";
+import AddUser from "./AddUser.vue";
 
 export default {
   name: "Users",
   components: {
+    AddUser,
     UsersTable,
   },
   data: function () {
-- 
GitLab