From 2346b81c5176db9f2bb3db0d3515939f89b75ff8 Mon Sep 17 00:00:00 2001 From: Alejandra <90076947+alejsdev@users.noreply.github.com> Date: Tue, 27 Feb 2024 15:47:42 -0500 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Support=20delete=20own=20account=20?= =?UTF-8?q?and=20other=20tweaks=20(#614)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Esteban Maya Cadavid --- src/backend/app/api/api_v1/endpoints/users.py | 19 ++++++++++-------- .../src/components/Common/Sidebar.tsx | 3 --- .../src/components/Common/UserMenu.tsx | 4 +--- .../UserSettings/DeleteConfirmation.tsx | 20 +++++++++++-------- src/new-frontend/src/hooks/useAuth.tsx | 4 ++++ src/new-frontend/src/store/items-store.tsx | 2 +- src/new-frontend/src/store/users-store.tsx | 2 +- 7 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/backend/app/api/api_v1/endpoints/users.py b/src/backend/app/api/api_v1/endpoints/users.py index 0b9a511..05b61d3 100644 --- a/src/backend/app/api/api_v1/endpoints/users.py +++ b/src/backend/app/api/api_v1/endpoints/users.py @@ -1,7 +1,7 @@ from typing import Any from fastapi import APIRouter, Depends, HTTPException -from sqlmodel import func, select +from sqlmodel import func, select, delete from app import crud from app.api.deps import ( @@ -21,6 +21,7 @@ from app.models import ( UsersOut, UserUpdate, UserUpdateMe, + Item ) from app.utils import send_new_account_email @@ -194,12 +195,14 @@ def delete_user( user = session.get(User, user_id) if not user: raise HTTPException(status_code=404, detail="User not found") - if not current_user.is_superuser: - raise HTTPException(status_code=400, detail="Not enough permissions") - if user == current_user: + + if (user == current_user and not current_user.is_superuser) or (user != current_user and current_user.is_superuser): + statement = delete(Item).where(Item.owner_id == user_id) + session.exec(statement) + session.delete(user) + session.commit() + return Message(message="User deleted successfully") + elif user == current_user and current_user.is_superuser: raise HTTPException( - status_code=400, detail="Users are not allowed to delete themselves" + status_code=400, detail="Super users are not allowed to delete themselves" ) - session.delete(user) - session.commit() - return Message(message="User deleted successfully") diff --git a/src/new-frontend/src/components/Common/Sidebar.tsx b/src/new-frontend/src/components/Common/Sidebar.tsx index c89158d..e0c0e22 100644 --- a/src/new-frontend/src/components/Common/Sidebar.tsx +++ b/src/new-frontend/src/components/Common/Sidebar.tsx @@ -2,7 +2,6 @@ import React from 'react'; import { Box, Drawer, DrawerBody, DrawerCloseButton, DrawerContent, DrawerOverlay, Flex, IconButton, Image, Text, useColorModeValue, useDisclosure } from '@chakra-ui/react'; import { FiLogOut, FiMenu } from 'react-icons/fi'; -import { useNavigate } from 'react-router-dom'; import Logo from '../../assets/images/fastapi-logo.svg'; import useAuth from '../../hooks/useAuth'; @@ -16,11 +15,9 @@ const Sidebar: React.FC = () => { const { isOpen, onOpen, onClose } = useDisclosure(); const { user } = useUserStore(); const { logout } = useAuth(); - const navigate = useNavigate(); const handleLogout = async () => { logout() - navigate('/login'); }; diff --git a/src/new-frontend/src/components/Common/UserMenu.tsx b/src/new-frontend/src/components/Common/UserMenu.tsx index 137968a..31b6928 100644 --- a/src/new-frontend/src/components/Common/UserMenu.tsx +++ b/src/new-frontend/src/components/Common/UserMenu.tsx @@ -3,17 +3,15 @@ import React from 'react'; import { Box, IconButton, Menu, MenuButton, MenuItem, MenuList } from '@chakra-ui/react'; import { FaUserAstronaut } from 'react-icons/fa'; import { FiLogOut, FiUser } from 'react-icons/fi'; -import { Link, useNavigate } from 'react-router-dom'; +import { Link } from 'react-router-dom'; import useAuth from '../../hooks/useAuth'; const UserMenu: React.FC = () => { - const navigate = useNavigate(); const { logout } = useAuth(); const handleLogout = async () => { logout() - navigate('/login'); }; return ( diff --git a/src/new-frontend/src/components/UserSettings/DeleteConfirmation.tsx b/src/new-frontend/src/components/UserSettings/DeleteConfirmation.tsx index 521b144..e0edb53 100644 --- a/src/new-frontend/src/components/UserSettings/DeleteConfirmation.tsx +++ b/src/new-frontend/src/components/UserSettings/DeleteConfirmation.tsx @@ -2,7 +2,10 @@ import React, { useState } from 'react'; import { AlertDialog, AlertDialogBody, AlertDialogContent, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, Button } from '@chakra-ui/react'; import { useForm } from 'react-hook-form'; +import { ApiError } from '../../client'; +import useAuth from '../../hooks/useAuth'; import useCustomToast from '../../hooks/useCustomToast'; +import { useUserStore } from '../../store/user-store'; interface DeleteProps { isOpen: boolean; @@ -12,18 +15,19 @@ interface DeleteProps { const DeleteConfirmation: React.FC = ({ isOpen, onClose }) => { const showToast = useCustomToast(); const cancelRef = React.useRef(null); - const [isLoading, setIsLoading] = useState(false); - const { handleSubmit } = useForm(); + const { handleSubmit, formState: { isSubmitting } } = useForm(); + const { user, deleteUser } = useUserStore(); + const { logout } = useAuth(); const onSubmit = async () => { - setIsLoading(true); try { - // TODO: Delete user account when API is ready + await deleteUser(user!.id); + logout(); onClose(); + showToast('Success', 'Your account has been successfully deleted.', 'success'); } catch (err) { - showToast('An error occurred', 'An error occurred while deleting your account.', 'error'); - } finally { - setIsLoading(false); + const errDetail = (err as ApiError).body.detail; + showToast('Something went wrong.', `${errDetail}`, 'error'); } } @@ -47,7 +51,7 @@ const DeleteConfirmation: React.FC = ({ isOpen, onClose }) => { -