mirror of
https://github.com/ryankazokas/turbovault-app.git
synced 2026-04-16 22:12:53 +00:00
412 lines
6.3 KiB
Markdown
412 lines
6.3 KiB
Markdown
# TurboVault API Documentation
|
|
|
|
## Authentication
|
|
|
|
All API requests require authentication using an API token. You can create API tokens from your account settings page.
|
|
|
|
### Headers
|
|
|
|
Include your API token in the `Authorization` header:
|
|
|
|
```
|
|
Authorization: Bearer YOUR_API_TOKEN
|
|
```
|
|
|
|
## Base URL
|
|
|
|
```
|
|
http://localhost:3000/api/v1
|
|
```
|
|
|
|
## Endpoints
|
|
|
|
### Games
|
|
|
|
#### List All Games
|
|
|
|
```
|
|
GET /api/v1/games
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `platform_id` - Filter by platform ID
|
|
- `genre_id` - Filter by genre ID
|
|
- `format` - Filter by format (physical/digital)
|
|
- `completion_status` - Filter by completion status
|
|
- `search` - Search by game title
|
|
- `sort` - Sort by (alphabetical, recent, rated)
|
|
- `page` - Page number (default: 1)
|
|
- `per_page` - Items per page (default: 25)
|
|
|
|
**Response:**
|
|
```json
|
|
[
|
|
{
|
|
"id": 1,
|
|
"title": "The Legend of Zelda: Ocarina of Time",
|
|
"platform": {
|
|
"id": 3,
|
|
"name": "Nintendo 64",
|
|
"abbreviation": "N64"
|
|
},
|
|
"format": "physical",
|
|
"date_added": "2024-01-15",
|
|
"completion_status": "completed",
|
|
"user_rating": 5,
|
|
"condition": "cib",
|
|
"price_paid": "45.00",
|
|
"location": "Shelf A",
|
|
"genres": [
|
|
{ "id": 1, "name": "Action" },
|
|
{ "id": 2, "name": "Adventure" }
|
|
],
|
|
"collections": []
|
|
}
|
|
]
|
|
```
|
|
|
|
#### Get Single Game
|
|
|
|
```
|
|
GET /api/v1/games/:id
|
|
```
|
|
|
|
**Response:** Same as single game object above
|
|
|
|
#### Create Game
|
|
|
|
```
|
|
POST /api/v1/games
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"game": {
|
|
"title": "Elden Ring",
|
|
"platform_id": 17,
|
|
"format": "digital",
|
|
"date_added": "2024-03-01",
|
|
"completion_status": "currently_playing",
|
|
"user_rating": 5,
|
|
"digital_store": "PlayStation Store",
|
|
"price_paid": 59.99,
|
|
"genre_ids": [1, 3],
|
|
"notes": "Amazing open world game"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Response:** Created game object (status 201)
|
|
|
|
#### Update Game
|
|
|
|
```
|
|
PUT /api/v1/games/:id
|
|
PATCH /api/v1/games/:id
|
|
```
|
|
|
|
**Request Body:** Same as create game
|
|
|
|
**Response:** Updated game object
|
|
|
|
#### Delete Game
|
|
|
|
```
|
|
DELETE /api/v1/games/:id
|
|
```
|
|
|
|
**Response:** 204 No Content
|
|
|
|
#### Bulk Create Games
|
|
|
|
```
|
|
POST /api/v1/games/bulk
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"games": [
|
|
{
|
|
"title": "Game 1",
|
|
"platform_id": 3,
|
|
"format": "physical",
|
|
"condition": "cib"
|
|
},
|
|
{
|
|
"title": "Game 2",
|
|
"platform_id": 17,
|
|
"format": "digital",
|
|
"digital_store": "Steam"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"created": 2,
|
|
"failed": 0,
|
|
"details": {
|
|
"created": [ /* array of created game objects */ ],
|
|
"failed": []
|
|
}
|
|
}
|
|
```
|
|
|
|
### Collections
|
|
|
|
#### List All Collections
|
|
|
|
```
|
|
GET /api/v1/collections
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
[
|
|
{
|
|
"id": 1,
|
|
"name": "Nintendo 64 Games",
|
|
"description": "My N64 collection",
|
|
"parent_collection_id": null,
|
|
"games": [ /* array of game objects */ ]
|
|
}
|
|
]
|
|
```
|
|
|
|
#### Get Single Collection
|
|
|
|
```
|
|
GET /api/v1/collections/:id
|
|
```
|
|
|
|
#### Create Collection
|
|
|
|
```
|
|
POST /api/v1/collections
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"collection": {
|
|
"name": "PlayStation Games",
|
|
"description": "All my PlayStation titles",
|
|
"parent_collection_id": null
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Update Collection
|
|
|
|
```
|
|
PUT /api/v1/collections/:id
|
|
PATCH /api/v1/collections/:id
|
|
```
|
|
|
|
#### Delete Collection
|
|
|
|
```
|
|
DELETE /api/v1/collections/:id
|
|
```
|
|
|
|
### Platforms (Read-Only)
|
|
|
|
#### List All Platforms
|
|
|
|
```
|
|
GET /api/v1/platforms
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
[
|
|
{
|
|
"id": 1,
|
|
"name": "Nintendo 64",
|
|
"abbreviation": "N64",
|
|
"manufacturer": "Nintendo"
|
|
}
|
|
]
|
|
```
|
|
|
|
#### Get Single Platform
|
|
|
|
```
|
|
GET /api/v1/platforms/:id
|
|
```
|
|
|
|
### Genres (Read-Only)
|
|
|
|
#### List All Genres
|
|
|
|
```
|
|
GET /api/v1/genres
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
[
|
|
{
|
|
"id": 1,
|
|
"name": "Action"
|
|
}
|
|
]
|
|
```
|
|
|
|
#### Get Single Genre
|
|
|
|
```
|
|
GET /api/v1/genres/:id
|
|
```
|
|
|
|
### API Tokens
|
|
|
|
#### List Your API Tokens
|
|
|
|
```
|
|
GET /api/v1/api_tokens
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
[
|
|
{
|
|
"id": 1,
|
|
"name": "Mobile App",
|
|
"token": "YOUR_TOKEN_HERE",
|
|
"created_at": "2024-01-01T00:00:00Z",
|
|
"last_used_at": "2024-03-28T12:00:00Z",
|
|
"expires_at": null
|
|
}
|
|
]
|
|
```
|
|
|
|
#### Create API Token
|
|
|
|
```
|
|
POST /api/v1/api_tokens
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"api_token": {
|
|
"name": "Mobile App",
|
|
"expires_at": "2025-01-01T00:00:00Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Delete API Token
|
|
|
|
```
|
|
DELETE /api/v1/api_tokens/:id
|
|
```
|
|
|
|
## Error Responses
|
|
|
|
### 401 Unauthorized
|
|
|
|
```json
|
|
{
|
|
"error": "Invalid or missing API token"
|
|
}
|
|
```
|
|
|
|
### 404 Not Found
|
|
|
|
```json
|
|
{
|
|
"error": "Record not found"
|
|
}
|
|
```
|
|
|
|
### 422 Unprocessable Entity
|
|
|
|
```json
|
|
{
|
|
"errors": [
|
|
"Title can't be blank",
|
|
"Platform must exist"
|
|
]
|
|
}
|
|
```
|
|
|
|
## Rate Limiting
|
|
|
|
Currently no rate limiting is implemented. This may be added in future versions.
|
|
|
|
## Data Security
|
|
|
|
- All API tokens are tied to your user account
|
|
- You can only access your own data
|
|
- Row Level Security (RLS) is enabled at the database level for additional protection
|
|
- API tokens can be revoked at any time from your settings page
|
|
|
|
## Examples
|
|
|
|
### cURL Examples
|
|
|
|
**List games:**
|
|
```bash
|
|
curl -H "Authorization: Bearer YOUR_TOKEN" \
|
|
http://localhost:3000/api/v1/games
|
|
```
|
|
|
|
**Create a game:**
|
|
```bash
|
|
curl -X POST \
|
|
-H "Authorization: Bearer YOUR_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"game":{"title":"Halo","platform_id":20,"format":"physical"}}' \
|
|
http://localhost:3000/api/v1/games
|
|
```
|
|
|
|
**Search games:**
|
|
```bash
|
|
curl -H "Authorization: Bearer YOUR_TOKEN" \
|
|
"http://localhost:3000/api/v1/games?search=zelda&platform_id=3"
|
|
```
|
|
|
|
### JavaScript/Fetch Example
|
|
|
|
```javascript
|
|
const API_URL = 'http://localhost:3000/api/v1';
|
|
const API_TOKEN = 'YOUR_TOKEN';
|
|
|
|
// Fetch all games
|
|
async function getGames() {
|
|
const response = await fetch(`${API_URL}/games`, {
|
|
headers: {
|
|
'Authorization': `Bearer ${API_TOKEN}`
|
|
}
|
|
});
|
|
return await response.json();
|
|
}
|
|
|
|
// Create a game
|
|
async function createGame(gameData) {
|
|
const response = await fetch(`${API_URL}/games`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Authorization': `Bearer ${API_TOKEN}`,
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify({ game: gameData })
|
|
});
|
|
return await response.json();
|
|
}
|
|
```
|
|
|
|
## Notes
|
|
|
|
- Dates should be in ISO 8601 format (YYYY-MM-DD)
|
|
- All timestamps are in UTC
|
|
- Boolean values are `true` or `false`
|
|
- Numeric values (prices, ratings) should not include commas
|
|
- Platform and Genre IDs can be obtained from the `/platforms` and `/genres` endpoints
|