#!/usr/bin/env python3 """ Script to clean up all test data from the Grocery Tracker application. This will delete all shopping events, groceries, and shops. """ import requests import json from typing import List, Dict, Any BASE_URL = "http://localhost:8000" def delete_all_shopping_events() -> int: """Delete all shopping events and return the count of deleted events.""" print("๐Ÿ›’ Deleting all shopping events...") try: # Get all shopping events response = requests.get(f"{BASE_URL}/shopping-events/") if response.status_code != 200: print(f" โŒ Failed to fetch shopping events: {response.status_code}") return 0 events = response.json() deleted_count = 0 for event in events: try: delete_response = requests.delete(f"{BASE_URL}/shopping-events/{event['id']}") if delete_response.status_code == 200: deleted_count += 1 print(f" โœ… Deleted event #{event['id']} from {event['shop']['name']}") else: print(f" โŒ Failed to delete event #{event['id']}: {delete_response.status_code}") except Exception as e: print(f" โŒ Error deleting event #{event['id']}: {e}") print(f" ๐Ÿ“Š Deleted {deleted_count} shopping events total\n") return deleted_count except Exception as e: print(f" โŒ Error fetching shopping events: {e}") return 0 def delete_all_groceries() -> int: """Delete all groceries and return the count of deleted groceries.""" print("๐Ÿฅฌ Deleting all groceries...") try: # Get all groceries response = requests.get(f"{BASE_URL}/groceries/") if response.status_code != 200: print(f" โŒ Failed to fetch groceries: {response.status_code}") return 0 groceries = response.json() deleted_count = 0 for grocery in groceries: try: delete_response = requests.delete(f"{BASE_URL}/groceries/{grocery['id']}") if delete_response.status_code == 200: deleted_count += 1 organic_label = "๐ŸŒฑ" if grocery['organic'] else "๐ŸŒพ" print(f" โœ… Deleted grocery: {organic_label} {grocery['name']}") else: print(f" โŒ Failed to delete grocery {grocery['name']}: {delete_response.status_code}") except Exception as e: print(f" โŒ Error deleting grocery {grocery['name']}: {e}") print(f" ๐Ÿ“Š Deleted {deleted_count} groceries total\n") return deleted_count except Exception as e: print(f" โŒ Error fetching groceries: {e}") return 0 def delete_all_shops() -> int: """Delete all shops and return the count of deleted shops.""" print("๐Ÿช Deleting all shops...") try: # Get all shops response = requests.get(f"{BASE_URL}/shops/") if response.status_code != 200: print(f" โŒ Failed to fetch shops: {response.status_code}") return 0 shops = response.json() deleted_count = 0 for shop in shops: try: delete_response = requests.delete(f"{BASE_URL}/shops/{shop['id']}") if delete_response.status_code == 200: deleted_count += 1 print(f" โœ… Deleted shop: {shop['name']} ({shop['city']})") else: print(f" โŒ Failed to delete shop {shop['name']}: {delete_response.status_code}") except Exception as e: print(f" โŒ Error deleting shop {shop['name']}: {e}") print(f" ๐Ÿ“Š Deleted {deleted_count} shops total\n") return deleted_count except Exception as e: print(f" โŒ Error fetching shops: {e}") return 0 def get_current_data_summary(): """Get a summary of current data in the database.""" print("๐Ÿ“Š CURRENT DATA SUMMARY") print("=" * 30) try: # Get counts shops_response = requests.get(f"{BASE_URL}/shops/") groceries_response = requests.get(f"{BASE_URL}/groceries/") events_response = requests.get(f"{BASE_URL}/shopping-events/") shops_count = len(shops_response.json()) if shops_response.status_code == 200 else 0 groceries_count = len(groceries_response.json()) if groceries_response.status_code == 200 else 0 events_count = len(events_response.json()) if events_response.status_code == 200 else 0 print(f"๐Ÿช Shops: {shops_count}") print(f"๐Ÿฅฌ Groceries: {groceries_count}") print(f"๐Ÿ›’ Shopping Events: {events_count}") if events_count > 0 and events_response.status_code == 200: events = events_response.json() total_spent = sum(event.get('total_amount', 0) for event in events) print(f"๐Ÿ’ฐ Total spent: ${total_spent:.2f}") print() return shops_count, groceries_count, events_count except Exception as e: print(f"โŒ Error getting data summary: {e}") return 0, 0, 0 def main(): """Main function to clean up all test data.""" print("๐Ÿงน GROCERY TRACKER DATA CLEANUP") print("=" * 40) print("This script will delete ALL data from the Grocery Tracker app.") print("Make sure the backend server is running on http://localhost:8000\n") try: # Test connection response = requests.get(f"{BASE_URL}/") if response.status_code != 200: print("โŒ Cannot connect to the API server. Make sure it's running!") return print("โœ… Connected to API server\n") # Show current data shops_count, groceries_count, events_count = get_current_data_summary() if shops_count == 0 and groceries_count == 0 and events_count == 0: print("โœ… Database is already empty. Nothing to clean up!") return # Confirm deletion print("โš ๏ธ WARNING: This will permanently delete all data!") confirmation = input("Type 'DELETE' to confirm: ") if confirmation != 'DELETE': print("โŒ Cleanup cancelled.") return print("\n๐Ÿงน Starting cleanup process...\n") # Delete in order: events -> groceries -> shops # (due to foreign key constraints) deleted_events = delete_all_shopping_events() deleted_groceries = delete_all_groceries() deleted_shops = delete_all_shops() # Final summary print("๐Ÿ“‹ CLEANUP SUMMARY") print("=" * 30) print(f"๐Ÿ›’ Shopping Events deleted: {deleted_events}") print(f"๐Ÿฅฌ Groceries deleted: {deleted_groceries}") print(f"๐Ÿช Shops deleted: {deleted_shops}") print(f"๐Ÿ“Š Total items deleted: {deleted_events + deleted_groceries + deleted_shops}") print("\n๐ŸŽ‰ Cleanup completed successfully!") print("The database is now empty and ready for fresh data.") except requests.exceptions.ConnectionError: print("โŒ Could not connect to the API server.") print(" Make sure the backend server is running on http://localhost:8000") except KeyboardInterrupt: print("\nโŒ Cleanup cancelled by user.") except Exception as e: print(f"โŒ Unexpected error: {e}") if __name__ == "__main__": main()