# Rating & Comments API

> **Prefix:** `/api/v1/rate`, `/api/v1/comment`, `/api/v1/like`

---

## POST `/api/v1/rate`

Submit a rating for a doctor.

**Permission:** `AUTH` — any authenticated user (typically after a completed appointment)

### Request Body (`application/json`)
```json
{
  "doctor_uuid": "550e8400-...",
  "score": 5
}
```

| Field | Type | Required | Validation |
|-------|------|----------|------------|
| `doctor_uuid` | string (UUID) | ✅ | Must exist |
| `score` | integer | ✅ | 1–5 |

### Response `201`
```json
{
  "success": true,
  "data": {
    "uuid": "rate-uuid-...",
    "doctor_uuid": "...",
    "score": 5,
    "created_at": 1717000000
  }
}
```

### Errors
| Code | HTTP | Description |
|------|------|-------------|
| `ERR_AUTH_001` | 401 | Missing token |
| `ERR_NOT_FOUND_001` | 404 | Doctor not found |
| `ERR_VALIDATION_001` | 422 | Score out of range |

---

## GET `/api/v1/rate/{doctorUuid}`

Get average rating for a doctor.

**Permission:** `PUBLIC`

### Path Parameters
| Param | Type | Description |
|-------|------|-------------|
| `doctorUuid` | string (UUID) | Doctor UUID |

### Response `200`
```json
{
  "success": true,
  "data": {
    "average": 4.3,
    "total": 47
  }
}
```

### Errors
| Code | HTTP | Description |
|------|------|-------------|
| `ERR_NOT_FOUND_001` | 404 | Doctor not found |

---

## POST `/api/v1/comment`

Submit a comment/review for a doctor.

**Permission:** `AUTH`

> Comments require admin approval before appearing publicly.

### Request Body (`application/json`)
```json
{
  "doctor_uuid": "550e8400-...",
  "body": "پزشک بسیار مؤدب و متخصص بودند"
}
```

| Field | Type | Required | Validation |
|-------|------|----------|------------|
| `doctor_uuid` | string (UUID) | ✅ | Must exist |
| `body` | string | ✅ | Min 10 chars |

### Response `201`
```json
{
  "success": true,
  "data": {
    "uuid": "comment-uuid-...",
    "body": "پزشک بسیار مؤدب و متخصص بودند",
    "status": "pending",
    "created_at": 1717000000
  }
}
```

**Comment Status Values:**
| Value | Description |
|-------|-------------|
| `pending` | Awaiting admin review |
| `approved` | Visible to public |
| `rejected` | Not visible |

### Errors
| Code | HTTP | Description |
|------|------|-------------|
| `ERR_AUTH_001` | 401 | Missing token |
| `ERR_NOT_FOUND_001` | 404 | Doctor not found |
| `ERR_VALIDATION_001` | 422 | Body too short |

---

## GET `/api/v1/comments/{doctorUuid}`

Get approved comments for a doctor.

**Permission:** `PUBLIC`

### Path Parameters
| Param | Type | Description |
|-------|------|-------------|
| `doctorUuid` | string (UUID) | Doctor UUID |

### Response `200`
```json
{
  "success": true,
  "data": [
    {
      "uuid": "...",
      "body": "پزشک بسیار مؤدب...",
      "user": { "uuid": "...", "real_name": "علی" },
      "likes": 3,
      "status": "approved",
      "created_at": 1717000000
    }
  ]
}
```

### Errors
| Code | HTTP | Description |
|------|------|-------------|
| `ERR_NOT_FOUND_001` | 404 | Doctor not found |

---

## DELETE `/api/v1/comment/{uuid}`

Delete a comment.

**Permission:** `AUTH` — must be the comment author or `ROLE_ADMIN`

### Response `200`
```json
{ "success": true, "data": { "message": "نظر حذف شد" } }
```

### Errors
| Code | HTTP | Description |
|------|------|-------------|
| `ERR_AUTH_001` | 401 | Missing token |
| `ERR_FORBIDDEN_001` | 403 | Not the author |
| `ERR_NOT_FOUND_001` | 404 | Comment not found |

---

## GET `/api/v1/admin/comments/pending`

Get all pending comments waiting for review.

**Permission:** `ROLE_ADMIN`

### Response `200`
```json
{
  "success": true,
  "data": [
    {
      "uuid": "...",
      "body": "...",
      "doctor": { "uuid": "...", "title": "دکتر علی احمدی" },
      "user": { "uuid": "...", "real_name": "..." },
      "status": "pending",
      "created_at": 1717000000
    }
  ]
}
```

### Errors
| Code | HTTP | Description |
|------|------|-------------|
| `ERR_AUTH_001` | 401 | Missing token |
| `ERR_AUTH_006` | 403 | Not admin |

---

## POST `/api/v1/admin/comment/{uuid}/approve`

Approve a pending comment (makes it public).

**Permission:** `ROLE_ADMIN`

### Response `200`
Updated comment object with `status: "approved"`.

### Errors
| Code | HTTP | Description |
|------|------|-------------|
| `ERR_AUTH_001` | 401 | Missing token |
| `ERR_AUTH_006` | 403 | Not admin |
| `ERR_NOT_FOUND_001` | 404 | Comment not found |

---

## POST `/api/v1/admin/comment/{uuid}/reject`

Reject a pending comment.

**Permission:** `ROLE_ADMIN`

### Response `200`
Updated comment object with `status: "rejected"`.

### Errors
| Code | HTTP | Description |
|------|------|-------------|
| `ERR_AUTH_001` | 401 | Missing token |
| `ERR_AUTH_006` | 403 | Not admin |
| `ERR_NOT_FOUND_001` | 404 | Comment not found |

---

## POST `/api/v1/like/{commentUuid}`

Toggle like on a comment (like if not liked, unlike if already liked).

**Permission:** `AUTH`

### Path Parameters
| Param | Type | Description |
|-------|------|-------------|
| `commentUuid` | string (UUID) | Comment UUID |

### Response `200` (unlike) or `201` (new like)
```json
{
  "success": true,
  "data": {
    "liked": true,
    "likes": 4
  }
}
```

### Errors
| Code | HTTP | Description |
|------|------|-------------|
| `ERR_AUTH_001` | 401 | Missing token |
| `ERR_NOT_FOUND_001` | 404 | Comment not found |
