Skip to content

Deactivate Account

Deactivate your own user account (soft delete).

Endpoint

http
DELETE /users/profile

Authentication

Required: Yes (JWT access token)

http
Authorization: Bearer <access_token>

Request

No request body or parameters required. User information is extracted from the JWT token.

Response

Success (200 OK)

json
{
  "message": "Account deactivated successfully"
}

Effect

  • Sets isActive to false
  • User cannot sign in until account is reactivated
  • Account data is preserved (soft delete)
  • Can be reversed using the activate endpoint

Error Responses

401 Unauthorized

Missing or invalid JWT token.

json
{
  "statusCode": 401,
  "message": "Unauthorized",
  "error": "Unauthorized"
}

Examples

cURL

bash
curl -X DELETE http://localhost:3000/users/profile \
  -H "Authorization: Bearer <access_token>"

JavaScript (Fetch)

javascript
const deactivateAccount = async (accessToken) => {
  const response = await fetch('http://localhost:3000/users/profile', {
    method: 'DELETE',
    headers: {
      'Authorization': `Bearer ${accessToken}`
    }
  });

  if (!response.ok) {
    throw new Error('Failed to deactivate account');
  }

  return await response.json();
};

// Usage
const result = await deactivateAccount(accessToken);
console.log(result.message); // "Account deactivated successfully"

React Component

typescript
import { useState } from 'react';

const DeactivateAccount = () => {
  const [loading, setLoading] = useState(false);

  const handleDeactivate = async () => {
    if (!confirm('Are you sure you want to deactivate your account?')) {
      return;
    }

    setLoading(true);
    try {
      const response = await fetch('/users/profile', {
        method: 'DELETE',
        headers: {
          'Authorization': `Bearer ${localStorage.getItem('accessToken')}`
        }
      });

      if (response.ok) {
        alert('Account deactivated successfully');
        // Redirect to login
        window.location.href = '/login';
      } else {
        alert('Failed to deactivate account');
      }
    } catch (error) {
      console.error('Deactivation failed:', error);
    } finally {
      setLoading(false);
    }
  };

  return (
    <button onClick={handleDeactivate} disabled={loading}>
      {loading ? 'Deactivating...' : 'Deactivate Account'}
    </button>
  );
};

Python (Requests)

python
import requests

def deactivate_account(access_token):
    headers = {
        'Authorization': f'Bearer {access_token}'
    }
    
    response = requests.delete(
        'http://localhost:3000/users/profile',
        headers=headers
    )
    
    if response.status_code == 200:
        return response.json()
    else:
        raise Exception(f'Error: {response.json()}')

# Usage
result = deactivate_account(access_token)
print(result['message'])

Use Cases

Account Deletion Request

Allow users to deactivate their account from settings.

Temporary Suspension

User can deactivate and later reactivate their account.

Privacy Control

User wants to stop receiving notifications without deleting data.

Implementation Details

Controller Method

File: server/src/users/users.controller.ts

typescript
@Delete('profile')
@UseGuards(JwtAuthGuard)
@HttpCode(HttpStatus.OK)
async deactivateAccount(
  @CurrentUser() user: UserDocument,
): Promise<{ message: string }> {
  return await this.usersService.deactivateAccount(user);
}

Service Method

File: server/src/users/users.service.ts

typescript
async deactivateAccount(user: UserDocument): Promise<{ message: string }> {
  await this.deactivateUser(user.id);
  return { message: 'Account deactivated successfully' };
}

async deactivateUser(id: string): Promise<UserDocument> {
  const user = await this.userModel.findByIdAndUpdate(
    id,
    { isActive: false },
    { new: true }
  );
  
  if (!user) {
    throw new NotFoundException('User not found');
  }
  
  return user;
}

Security Considerations

Soft Delete

  • Account is not permanently deleted
  • Data is preserved for potential reactivation
  • User cannot sign in while deactivated

JWT Validation

  • Requires valid access token
  • User identity verified from token
  • Cannot deactivate other users' accounts

Reactivation

  • User can reactivate using the activate endpoint
  • Requires valid credentials

Notes

  • This is a soft delete (sets isActive: false)
  • User cannot sign in while deactivated
  • Account can be reactivated
  • All user data is preserved
  • Returns 200 OK (not 204 No Content)
  • Refresh tokens remain in database but are invalid for deactivated users

Built with ❤️ for competitive programmers worldwide.