53 lines
2.3 KiB
Markdown
53 lines
2.3 KiB
Markdown
|
|
# API Endpoints for Frontend Compatibility
|
|||
|
|
|
|||
|
|
This document defines the minimal backend surface expected by the Vue frontend. Default base path is `/api`; responses are JSON with `Content-Type: application/json`.
|
|||
|
|
|
|||
|
|
## POST /api/randomize
|
|||
|
|
- **Purpose:** Produce a randomized Dota 2 build and optionally return the full data sets used for rendering.
|
|||
|
|
- **Request body:**
|
|||
|
|
- `includeSkills` (boolean) — include a skill build suggestion.
|
|||
|
|
- `includeAspect` (boolean) — include an aspect suggestion.
|
|||
|
|
- `itemsCount` (number) — how many items to return (UI offers 3–6).
|
|||
|
|
- **Response 200 body:**
|
|||
|
|
- `hero` — object `{ id: string; name: string; primary: string; }`.
|
|||
|
|
- `items` — array of `{ id: string; name: string; }` with length `itemsCount` (also used to hydrate cached items if you return the full pool).
|
|||
|
|
- `skillBuild` (optional) — `{ id: string; name: string; description?: string; }` when `includeSkills` is true.
|
|||
|
|
- `aspect` (optional) — string when `includeAspect` is true.
|
|||
|
|
- `heroes` (optional) — full hero list to cache client-side; same shape as `hero`.
|
|||
|
|
- `skillBuilds` (optional) — full skill build list; same shape as `skillBuild`.
|
|||
|
|
- `aspects` (optional) — array of strings.
|
|||
|
|
- **Example request:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"includeSkills": true,
|
|||
|
|
"includeAspect": false,
|
|||
|
|
"itemsCount": 6
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
- **Example response:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"hero": { "id": "pudge", "name": "Pudge", "primary": "strength" },
|
|||
|
|
"items": [
|
|||
|
|
{ "id": "blink", "name": "Blink Dagger" },
|
|||
|
|
{ "id": "bkb", "name": "Black King Bar" }
|
|||
|
|
],
|
|||
|
|
"skillBuild": { "id": "hookdom", "name": "Hook/Rot Max", "description": "Max hook, then rot; early Flesh Heap." },
|
|||
|
|
"heroes": [{ "id": "axe", "name": "Axe", "primary": "strength" }],
|
|||
|
|
"skillBuilds": [{ "id": "support", "name": "Support" }],
|
|||
|
|
"aspects": ["Heroic Might"]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Error Handling
|
|||
|
|
- Use standard HTTP status codes (400 invalid input, 500 server error).
|
|||
|
|
- Error payload shape:
|
|||
|
|
```json
|
|||
|
|
{ "message": "Failed to load random build" }
|
|||
|
|
```
|
|||
|
|
- The UI surfaces `message` directly; keep it user-friendly.
|
|||
|
|
|
|||
|
|
## Implementation Notes
|
|||
|
|
- Ensure deterministic constraints: unique `id` per entity and avoid empty arrays when `includeSkills`/`includeAspect` are true.
|
|||
|
|
- If backing data is static, you may return `heroes/items/skillBuilds/aspects` once per request; the frontend caches them after the first successful call.
|