# Routes

## Route Hierarchy

```mermaid
flowchart TD
    Root["/"] --> Records["/records"]
    Root --> Users["/users"]
    Root --> Auth["/auth"]
    Root --> Debts["/debts"]
    Root --> Goals["/goals"]
    Root --> Projects["/projects"]
    Root --> Investments["/investments"]

    Records --> RNew["/records/new"]
    Records --> RType["/records/:type"]
    Records --> REdit["/records/:id/edit"]
    Records --> RDelete["/records/:id"]

    Users --> ULogin["/users/login"]
    Users --> URegister["/users/register"]
    Users --> ULogout["/users/logout"]
    Users --> UProfile["/users/profile"]
    Users --> UEdit["/users/edit"]
    Users --> UBudget["/users/budget"]

    Auth --> AFacebook["/auth/facebook"]
    Auth --> AGoogle["/auth/google"]

    Debts --> DNew["/debts/new"]
    Debts --> DEdit["/debts/:id/edit"]
    Debts --> DDelete["/debts/:id"]

    Goals --> GNew["/goals/new"]
    Goals --> GEdit["/goals/:id/edit"]
    Goals --> GDelete["/goals/:id"]

    Projects --> PNew["/projects/new"]
    Projects --> PEdit["/projects/:id/edit"]
    Projects --> PDelete["/projects/:id"]

    Investments --> INew["/investments/new"]
    Investments --> IEdit["/investments/:id/edit"]
    Investments --> IDelete["/investments/:id"]

    style Root fill:#e3f2fd
    style Auth fill:#fce4ec
    style Users fill:#e8f5e9
```

## Complete Route Map

### Authentication

| Method | Path | Auth | Handler | Description |
|---|---|---|---|---|
| GET | `/users/login` | No | `userController.getLoginPage` | Login form |
| POST | `/users/login` | No | `passport.authenticate('local')` | Local login |
| GET | `/users/register` | No | `userController.getRegisterPage` | Registration form |
| POST | `/users/register` | No | `userController.register` | Create account |
| GET | `/users/logout` | Yes | `userController.logout` | Destroy session |
| GET | `/auth/google` | No | `passport.authenticate('google')` | Google OAuth redirect |
| GET | `/auth/google/callback` | No | `passport.authenticate('google')` | Google callback |
| GET | `/auth/facebook` | No | `passport.authenticate('facebook')` | Facebook OAuth redirect |
| GET | `/auth/facebook/callback` | No | `passport.authenticate('facebook')` | Facebook callback |

### Profile

| Method | Path | Auth | Handler | Description |
|---|---|---|---|---|
| GET | `/users/profile` | Yes | `userController.getUserProfile` | View profile |
| GET | `/users/edit` | Yes | `userController.editUserProfile` | Edit profile form |
| PUT | `/users/profile` | Yes | `userController.putUserProfile` | Update name + avatar |
| PUT | `/users/budget` | Yes | `userController.putBudget` | Update monthly budget |

### Records

| Method | Path | Auth | Handler | Description |
|---|---|---|---|---|
| GET | `/` | Yes | `recordController.getRecords` | Dashboard (home) |
| GET | `/records` | Yes | `recordController.getRecords` | All records |
| GET | `/records/new` | Yes | `recordController.createRecord` | New record form |
| POST | `/records` | Yes | `recordController.postRecord` | Create record |
| GET | `/records/:type` | Yes | `recordController.getRecords` | Filtered by type |
| GET | `/records/:id/edit` | Yes | `recordController.editRecord` | Edit record form |
| PUT | `/records/:id` | Yes | `recordController.putRecord` | Update record |
| DELETE | `/records/:id` | Yes | `recordController.deleteRecord` | Delete record |

### Debts

| Method | Path | Auth | Handler | Description |
|---|---|---|---|---|
| GET | `/debts` | Yes | `debtController.getDebts` | List all debts |
| GET | `/debts/new` | Yes | `debtController.createDebt` | New debt form |
| POST | `/debts` | Yes | `debtController.postDebt` | Create debt |
| GET | `/debts/:id/edit` | Yes | `debtController.editDebt` | Edit debt form |
| PUT | `/debts/:id` | Yes | `debtController.putDebt` | Update debt |
| DELETE | `/debts/:id` | Yes | `debtController.deleteDebt` | Delete debt |

### Goals

| Method | Path | Auth | Handler | Description |
|---|---|---|---|---|
| GET | `/goals` | Yes | `goalController.getGoals` | List all goals |
| GET | `/goals/new` | Yes | `goalController.createGoal` | New goal form |
| POST | `/goals` | Yes | `goalController.postGoal` | Create goal |
| GET | `/goals/:id/edit` | Yes | `goalController.editGoal` | Edit goal form |
| PUT | `/goals/:id` | Yes | `goalController.putGoal` | Update goal |
| DELETE | `/goals/:id` | Yes | `goalController.deleteGoal` | Delete goal |

### Projects

| Method | Path | Auth | Handler | Description |
|---|---|---|---|---|
| GET | `/projects` | Yes | `projectController.getProjects` | List all projects |
| GET | `/projects/new` | Yes | `projectController.createProject` | New project form |
| POST | `/projects` | Yes | `projectController.postProject` | Create project |
| GET | `/projects/:id/edit` | Yes | `projectController.editProject` | Edit project form |
| PUT | `/projects/:id` | Yes | `projectController.putProject` | Update project |
| DELETE | `/projects/:id` | Yes | `projectController.deleteProject` | Delete project |

### Investments

| Method | Path | Auth | Handler | Description |
|---|---|---|---|---|
| GET | `/investments` | Yes | `investmentController.getInvestments` | List all investments |
| GET | `/investments/new` | Yes | `investmentController.createInvestment` | New investment form |
| POST | `/investments` | Yes | `investmentController.postInvestment` | Create investment |
| GET | `/investments/:id/edit` | Yes | `investmentController.editInvestment` | Edit investment form |
| PUT | `/investments/:id` | Yes | `investmentController.putInvestment` | Update investment |
| DELETE | `/investments/:id` | Yes | `investmentController.deleteInvestment` | Delete investment |

## Query Parameters

### Records

| Param | Values | Default | Used in |
|---|---|---|---|
| `ledger` | `Personal`, `Business` | `Personal` | Dashboard, record lists |
| `type` | `expense`, `revenue` | — | Record type filter |
| `date` | `YYYY-M`, `all` | Current month | Month filter |
| `category` | Category name | All | Category filter |
| `page` | Number | `1` | Pagination |

### Examples

```
GET /?ledger=Personal&date=2024-3&category=Food
GET /records/expense?ledger=Business&date=all
GET /records/new?type=expense&ledger=Personal
GET /records?page=2&date=2024-1&category=Transportation
```

## Method Override

All PUT and DELETE operations use POST with `_method` query parameter:

```html
<form method="POST" action="/records/{{id}}?_method=DELETE">
  <button type="submit">Delete</button>
</form>

<form method="POST" action="/records/{{id}}?_method=PUT">
  <button type="submit">Update</button>
</form>
```
