diff --git a/packages/express-backend/backend.js b/packages/express-backend/backend.js index ad796d8..8109f3f 100644 --- a/packages/express-backend/backend.js +++ b/packages/express-backend/backend.js @@ -85,6 +85,23 @@ app.post("/users", (req, res) => { userService.signupUser(req, res); }); +app.post("/users/profile", userService.authenticateUser, (req, res) => { + const { bio, skills } = req.body; // from form + const id = req.userID; + userService.editProfile(id, bio, skills) + .then((result) => { + if (result) { + res.send(result); + } else { + res.status(404).send(`Not found: ${id}`); + } + }) + .catch((error) => { + console.log(error); + res.status(500).send(error); + }); +}); + app.get("/users", userService.authenticateUser, (req, res) => { const id = req.userID; userService @@ -121,6 +138,18 @@ app.post("/login", (req, res) => { userService.loginUser(req, res); }); +app.delete("/users", userService.authenticateUser, (req, res) => { + const id = req.userID; + userService + .removeUser(id) + .then((result) => { + res.status(204).send(result); + }) + .catch((error) => { + res.status(500).send(error.name); + }); +}); + app.delete("/products/:id", userService.authenticateUser, (req, res) => { const id = req.params["id"]; const userID = req.userID; diff --git a/packages/express-backend/services/user-service.js b/packages/express-backend/services/user-service.js index 2b11ea1..3567a94 100644 --- a/packages/express-backend/services/user-service.js +++ b/packages/express-backend/services/user-service.js @@ -140,6 +140,17 @@ function authenticateUser(req, res, next) { } } +function editProfile(id, bio, skills) { + return UserModel.findByIdAndUpdate( + id, + { + bio: bio, + skills: skills + }, + {new: true} + ); +} + function changeUserProfilePicture(id, profilePictureId) { return UserModel.findByIdAndUpdate( id, @@ -222,6 +233,7 @@ export default { findProfilePictureById, uploadProfilePicture, changeUserProfilePicture, + editProfile, addProductToUser, removeProductFromUserID, addOrderToUser, diff --git a/packages/express-backend/uploads/0e6b09186b6b2f21f3a7bcca8b2b6a06 b/packages/express-backend/uploads/0e6b09186b6b2f21f3a7bcca8b2b6a06 new file mode 100644 index 0000000..98db02a Binary files /dev/null and b/packages/express-backend/uploads/0e6b09186b6b2f21f3a7bcca8b2b6a06 differ diff --git a/packages/express-backend/uploads/4703ddaf5881626de685be09d0fef078 b/packages/express-backend/uploads/4703ddaf5881626de685be09d0fef078 new file mode 100644 index 0000000..4add2aa Binary files /dev/null and b/packages/express-backend/uploads/4703ddaf5881626de685be09d0fef078 differ diff --git a/packages/express-backend/uploads/4994a81780587afb1eef581aa69ad92f b/packages/express-backend/uploads/4994a81780587afb1eef581aa69ad92f new file mode 100644 index 0000000..98db02a Binary files /dev/null and b/packages/express-backend/uploads/4994a81780587afb1eef581aa69ad92f differ diff --git a/packages/express-backend/uploads/5ec35440d8d95d7fe39976c47f3358ee b/packages/express-backend/uploads/5ec35440d8d95d7fe39976c47f3358ee new file mode 100644 index 0000000..4add2aa Binary files /dev/null and b/packages/express-backend/uploads/5ec35440d8d95d7fe39976c47f3358ee differ diff --git a/packages/express-backend/uploads/7c86f5a0cb4762a9b1ce5fee5bb64d37 b/packages/express-backend/uploads/7c86f5a0cb4762a9b1ce5fee5bb64d37 new file mode 100644 index 0000000..4825ce9 Binary files /dev/null and b/packages/express-backend/uploads/7c86f5a0cb4762a9b1ce5fee5bb64d37 differ diff --git a/packages/react-frontend/src/Components/Auth.jsx b/packages/react-frontend/src/Components/Auth.jsx index 8b35090..c73ce1a 100644 --- a/packages/react-frontend/src/Components/Auth.jsx +++ b/packages/react-frontend/src/Components/Auth.jsx @@ -30,7 +30,7 @@ function Auth(props) { /> password } /> } /> } /> + } /> } /> } /> diff --git a/packages/react-frontend/src/Components/ProfileEdit.jsx b/packages/react-frontend/src/Components/ProfileEdit.jsx new file mode 100644 index 0000000..70b9830 --- /dev/null +++ b/packages/react-frontend/src/Components/ProfileEdit.jsx @@ -0,0 +1,44 @@ +import React, { useState } from "react"; + +function ProfileEdit(props) { + const [userProfile, setLogin] = useState({ + bio: "", + skills: "" + }); + + function handleChange(event) { + const { name, value } = event.target; + if (name === "skills") { + setLogin({ bio: userProfile["bio"], skills: value }); + } else setLogin({ bio: value, skills: userProfile["skills"] }); + } + + function submitForm() { + props.handleSubmit(userProfile); + setLogin({ bio: "", skills: "" }); + } + + return ( + + bio + + skills + + + + ); +} + +export default ProfileEdit; diff --git a/packages/react-frontend/src/Styles/Profile.css b/packages/react-frontend/src/Styles/Profile.css index 32d4f3d..0508bf0 100644 --- a/packages/react-frontend/src/Styles/Profile.css +++ b/packages/react-frontend/src/Styles/Profile.css @@ -14,6 +14,18 @@ margin-bottom: 20px; } +.button-container { + display: flex; + justify-content: center; + align-items: center; + padding: 10px; +} + +.centered-button { + padding: 10px 20px; + font-size: 16px; +} + .profile-avatar { width: 150px; height: 150px; diff --git a/packages/react-frontend/src/Views/EditProfile.jsx b/packages/react-frontend/src/Views/EditProfile.jsx new file mode 100644 index 0000000..62fe201 --- /dev/null +++ b/packages/react-frontend/src/Views/EditProfile.jsx @@ -0,0 +1,34 @@ +import React, { useState, useEffect } from "react"; +import ProfileEdit from "../Components/ProfileEdit"; +import "../Styles/Profile.css"; +import Cookies from "js-cookie"; +import { addAuthHeader } from "../Components/helpers"; +import { useNavigate } from "react-router-dom"; + +function EditProfile() { + const navigate = useNavigate(); + function changeProfile(profile){ + fetch("http://localhost:8000/users/profile", { + method: "POST", + headers: addAuthHeader({ + "Content-Type": "application/json" + }), + body: JSON.stringify(profile) + }) + .then((response) => { + if (!response.ok) { + // Handle the case where the server returns an error + throw new Error("User Not Found (Invalid Token)"); + } + navigate("/profile"); + }); + } + return ( + + Edit Profile: + + + ); +} + +export default EditProfile; diff --git a/packages/react-frontend/src/Views/Profile.jsx b/packages/react-frontend/src/Views/Profile.jsx index ee48642..91db39b 100644 --- a/packages/react-frontend/src/Views/Profile.jsx +++ b/packages/react-frontend/src/Views/Profile.jsx @@ -2,8 +2,12 @@ import React, { useState, useEffect } from "react"; import axios from "axios"; import "../Styles/Profile.css"; import { addAuthHeader } from "../Components/helpers"; +import { useNavigate } from "react-router-dom"; +import Cookies from 'js-cookie'; + function Profile() { + const navigate = useNavigate(); const [profilePicture, setProfilePicture] = useState(""); const [user, setUser] = useState({ bio: "", skills: ["", ""] }); @@ -63,6 +67,23 @@ function Profile() { } }; + function deleteProfile() { + fetch("http://localhost:8000/users", { + method: "DELETE", + headers: addAuthHeader({ + "Content-Type": "application/json" + }) + }).then((res) => { + if (res.status === 204) + { + Cookies.remove('safeHavenToken'); + } + }); + } + function editProfile() { + navigate("/profile/edit"); + } + return ( @@ -97,6 +118,12 @@ function Profile() { + + Edit Profile + + + Delete Profile + );