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