# Reward - Chore & Reward Management System A family-friendly application for managing chores, tasks, and rewards for children. ## ๐Ÿ—๏ธ Architecture - **Backend**: Flask (Python) with TinyDB or MongoDB for data persistence - **Frontend**: Vue 3 (TypeScript) with real-time SSE updates - **Deployment**: Docker with nginx reverse proxy ## ๐Ÿš€ Getting Started ### Backend ```bash cd backend python -m venv .venv .venv\Scripts\activate # Windows source .venv/bin/activate # Linux/Mac pip install -r requirements.txt python -m flask run --host=0.0.0.0 --port=5000 ``` ### Frontend ```bash cd frontend npm install npm run dev ``` ## ๐Ÿ”ง Configuration ### Environment Variables | Variable | Description | Default | | ---------------------------------- | --------------------------------------------- | ------------- | | `ACCOUNT_DELETION_THRESHOLD_HOURS` | Hours to wait before deleting marked accounts | 720 (30 days) | | `DB_ENV` | Database environment (`prod` or `test`) | `prod` | | `DATA_ENV` | Data directory environment (`prod` or `test`) | `prod` | | `USE_MONGODB` | Use MongoDB (`true`/`false`) | `true` | | `MONGO_URI` | MongoDB connection URI (required when `USE_MONGODB=true`) | โ€” | | `MONGO_DB_NAME` | MongoDB database name (optional) | Parsed from `MONGO_URI`, or `chore_db`/`chore_db_test`/`chore_db_e2e` based on `DB_ENV` | ### Database Backend The application supports two persistence backends: - **MongoDB** (default): Set `MONGO_URI` (and optionally `MONGO_DB_NAME`). This is the recommended backend for production and managed hosting (e.g., MongoDB Atlas). - **TinyDB**: JSON-file storage in `backend/data/db/` (or `backend/test_data/db/` for `test`/`e2e`). Opt in by setting `USE_MONGODB=false`. #### Migrating from TinyDB to MongoDB ```bash cd backend # Dry run to preview what will be migrated python -m scripts.migrate_to_mongodb --dry-run # Run the migration (backs up TinyDB files first) python -m scripts.migrate_to_mongodb ``` The migration script reads the existing TinyDB JSON files and inserts each record into the matching MongoDB collection, skipping records that already exist. Original TinyDB files are backed up to `backend/data/db/backups//`. #### Rolling Back to TinyDB Set `USE_MONGODB=false`. The original JSON files remain in place. #### Gunicorn / Docker When running multiple Gunicorn workers, each worker must create its own MongoDB client after forking. This is handled automatically by `backend/gunicorn.conf.py`, which is loaded by `backend/Dockerfile` via `-c gunicorn.conf.py`. ### Account Deletion Scheduler The application includes an automated account deletion scheduler that removes user accounts marked for deletion after a configurable threshold period. **Key Features:** - Runs every hour checking for accounts due for deletion - Configurable threshold between 24 hours (minimum) and 720 hours (maximum) - Automatic retry on failure (max 3 attempts) - Restart-safe: recovers from interruptions during deletion **Deletion Process:** When an account is marked for deletion, the scheduler will automatically: 1. Remove all pending rewards for the user's children 2. Remove all children belonging to the user 3. Remove all user-created tasks 4. Remove all user-created rewards 5. Remove uploaded images from database 6. Delete user's image directory from filesystem 7. Remove the user account **Configuration:** Set the deletion threshold via environment variable: ```bash export ACCOUNT_DELETION_THRESHOLD_HOURS=168 # 7 days ``` **Monitoring:** - Logs are written to `logs/account_deletion.log` with rotation (10MB max, 5 backups) - Check logs for deletion summaries and any errors ## ๐Ÿ”Œ API Endpoints ### Admin Endpoints All admin endpoints require JWT authentication and **admin role**. **Note:** Admin users must be created manually or via the provided script (`backend/scripts/create_admin.py`). The admin role cannot be assigned through the signup API for security reasons. **Creating an Admin User:** ```bash cd backend python scripts/create_admin.py ``` #### Account Deletion Management - `GET /api/admin/deletion-queue` - View users pending deletion - `GET /api/admin/deletion-threshold` - Get current deletion threshold - `PUT /api/admin/deletion-threshold` - Update deletion threshold (24-720 hours) - `POST /api/admin/deletion-queue/trigger` - Manually trigger deletion scheduler ### User Endpoints - `POST /api/user/mark-for-deletion` - Mark current user's account for deletion - `GET /api/me` - Get current user info - `POST /api/login` - User login - `POST /api/logout` - User logout ## ๐Ÿงช Testing ### Backend Tests ```bash cd backend pytest tests/ ``` ### Frontend Tests ```bash cd frontend npm run test ``` ## ๐Ÿ“ Features - โœ… User authentication with JWT tokens - โœ… Child profile management - โœ… Task assignment and tracking - โœ… Reward system - โœ… Real-time updates via SSE - โœ… Image upload and management - โœ… Account deletion with grace period - โœ… Automated cleanup scheduler ## ๐Ÿ”’ Security - JWT tokens stored in HttpOnly, Secure, SameSite=Strict cookies - **Role-Based Access Control (RBAC)**: Admin endpoints protected by admin role validation - Admin users can only be created via direct database manipulation or provided script - Regular users cannot escalate privileges to admin - Account deletion requires email confirmation - Marked accounts blocked from login immediately ## ๐Ÿ“ Project Structure ``` . โ”œโ”€โ”€ backend/ โ”‚ โ”œโ”€โ”€ api/ # REST API endpoints โ”‚ โ”œโ”€โ”€ config/ # Configuration files โ”‚ โ”œโ”€โ”€ db/ # TinyDB / MongoDB persistence layer โ”‚ โ”œโ”€โ”€ events/ # SSE event system โ”‚ โ”œโ”€โ”€ models/ # Data models โ”‚ โ”œโ”€โ”€ tests/ # Backend tests โ”‚ โ””โ”€โ”€ utils/ # Utilities (scheduler, etc) โ”œโ”€โ”€ frontend/ โ”‚ โ””โ”€โ”€ src/ โ”‚ โ”œโ”€โ”€ common/ # Shared utilities โ”‚ โ”œโ”€โ”€ components/ # Vue components โ”‚ โ””โ”€โ”€ layout/ # Layout components โ””โ”€โ”€ .github/ โ””โ”€โ”€ specs/ # Feature specifications ``` ## ๐Ÿ› ๏ธ Development For detailed development patterns and conventions, see [`.github/copilot-instructions.md`](.github/copilot-instructions.md). ## ๐Ÿ“š References - Reset flow (token validation, JWT invalidation, cross-tab logout sync): [`docs/reset-password-reference.md`](docs/reset-password-reference.md) ## ๐Ÿ“„ License Private project - All rights reserved.