# Implementation Plan: Project Management, Save As, and File Management inside Profile

We will add robust cloud/local project management, a custom "Save Project" name modal, a "Save As..." dialog offering server/local options, and a comprehensive file and project manager inside the User Profile Modal.

## User Review Required

> [!IMPORTANT]
> The profile modal will now contain three tabs: Account, Cloud Projects, and My Uploaded Files. Unused files (those not in the current session tracks or any saved projects) can be deleted by the user to free up quota storage.
>
> **Save As...** will trigger a modal allowing the user to type a new name and save it to either the server or export locally as a `.sfs` file.

---

## Proposed Changes

### Backend APIs

#### [MODIFY] [projects.py](file:///home/locpham/SonicForgeStudio/app/api/v1/projects.py)
- **`GET /cloud/{project_id}`**: Retrieves a specific user cloud project.
- **`DELETE /cloud/{project_id}`**: Deletes a specific user cloud project.
- **`PUT /cloud/{project_id}`**: Updates/overwrites an existing user cloud project.

#### [MODIFY] [audio.py](file:///home/locpham/SonicForgeStudio/app/api/v1/audio.py)
- **`POST /upload`**, **`run_python_dsp_tool`** (for synth), and **`ai_cut_audio`**: Prefix file IDs with `user_{user_id}_` to establish file ownership and quota tracking securely.
- **`POST /my-files`**: Lists all files starting with `user_{user_id}_` on the server disk. Identifies if they are referenced in the active project session or any database project records to compute their `is_in_use` status.
- **`DELETE /my-files/{file_id}`**: Deletes a user's uploaded/generated file from the server uploads and processed directories after verifying ownership.

---

### Frontend Services & UI

#### [MODIFY] [api.js](file:///home/locpham/SonicForgeStudio/app/static/js/services/api.js)
- Expose APIs for fetching, deleting, and updating cloud projects.
- Expose APIs for listing and deleting user audio files.

#### [MODIFY] [app.jsx](file:///home/locpham/SonicForgeStudio/app/static/js/app.jsx)
- **State Additions**:
  - `currentProjectId`: Tracks the ID of the loaded cloud project (synced with localStorage).
  - `saveProjectModalOpen`, `saveAsModalOpen`: Controls the new custom modals.
- **Save Project Modal**:
  - Modal with an input for project name, used when saving a project that doesn't have a name yet.
- **Save As Modal**:
  - Allows choosing to save under a new name either locally (.sfs file) or on the server.
- **Profile Modal Extensions**:
  - Add Tabs: **Account Settings**, **Cloud Projects**, **My Uploaded Files**.
  - **Cloud Projects Tab**: Displays saved projects with load (open DAW project) and delete options.
  - **My Uploaded Files Tab**: Displays files with sizes, creation dates, usage badges, individual delete buttons, and a global "Clean Up Unused Files" button.

---

## Verification Plan

### Automated Tests
- Run backend lint and sanity checks.
```bash
python -m flake8 app/api/v1/projects.py app/api/v1/audio.py
```

### Manual Verification
1. Create a new project, press Save, verify the custom input modal appears.
2. Upload some files, check the Profile -> My Uploaded Files tab. Verify the files are listed as "In Use".
3. Remove a track containing a file, verify the file changes to "Not In Use". Press delete to free up quota.
4. Click File -> Save As... and select either Cloud or Local .sfs and verify name updates and downloads.
