diff --git a/backend/routes/users.js b/backend/routes/users.js index 73bd5055aeae410f24a2935545dc5f6db226a557..30e2886297aa16ed13bb4ef4d73d5cb20cb0ac25 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 6bfcef5ea68ba4b10f8413cb1fe5f4bc3cce89f3..3db3d692bfd0e3bf79bce07311737f3f1ff9390a 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 0000000000000000000000000000000000000000..a4866209dda0fe2326469182fbee33ba1f659567 --- /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 29861f4b29cab8b254cded1322e2562dbac3d546..e404ffd1102a28e45da5038aa06577f9cad50935 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 () {