# Storage API

> *⚠️ Note: This API is not yet implemented and is planned for a future release.*

botserver provides a RESTful API for managing file storage and object management through its S3-compatible storage backend.

## Overview

The Storage API allows you to:
- Upload and download files
- Manage buckets and objects
- Generate presigned URLs
- Handle binary data and documents
- Organize bot assets

## Base URL

```
http://localhost:8080/api/v1/storage
```

## Authentication

All storage API requests require authentication:

```http
Authorization: Bearer <token>
```

## Endpoints

### List Buckets

**GET** `/buckets`

List all available storage buckets.

**Response:**
```json
{
  "buckets": [
    {
      "name": "mybot.gbai",
      "created": "2024-01-15T10:00:00Z",
      "size": 1048576
    }
  ]
}
```

### Create Bucket

**POST** `/buckets`

Create a new storage bucket.

**Request Body:**
```json
{
  "name": "newbot.gbai",
  "region": "us-east-1",
  "versioning": false
}
```

**Response:**
```json
{
  "bucket": "newbot.gbai",
  "created": true,
  "location": "/newbot.gbai"
}
```

### List Objects

**GET** `/buckets/{bucket}/objects`

List objects in a bucket.

**Query Parameters:**
- `prefix` - Filter objects by prefix
- `delimiter` - Delimiter for grouping
- `max_keys` - Maximum number of results (default: 1000)
- `continuation_token` - Pagination token

**Response:**
```json
{
  "objects": [
    {
      "key": "documents/manual.pdf",
      "size": 2048576,
      "last_modified": "2024-01-15T10:30:00Z",
      "etag": "d41d8cd98f00b204e9800998ecf8427e"
    }
  ],
  "is_truncated": false,
  "continuation_token": null
}
```

### Upload Object

**PUT** `/buckets/{bucket}/objects/{key}`

Upload a file to storage.

**Headers:**
- `Content-Type` - MIME type of the file
- `Content-Length` - Size of the file
- `x-amz-meta-*` - Custom metadata

**Request Body:** Binary file data

**Response:**
```json
{
  "bucket": "mybot.gbai",
  "key": "documents/report.pdf",
  "etag": "d41d8cd98f00b204e9800998ecf8427e",
  "version_id": null
}
```

### Download Object

**GET** `/buckets/{bucket}/objects/{key}`

Download a file from storage.

**Headers:**
- `Range` - Partial content request (optional)
- `If-None-Match` - ETag for caching (optional)

**Response:** Binary file data with appropriate headers

### Delete Object

**DELETE** `/buckets/{bucket}/objects/{key}`

Delete an object from storage.

**Response:**
```json
{
  "deleted": true,
  "key": "documents/old-file.pdf"
}
```

### Copy Object

**POST** `/buckets/{bucket}/objects/{key}/copy`

Copy an object to a new location.

**Request Body:**
```json
{
  "source_bucket": "source.gbai",
  "source_key": "file.pdf",
  "destination_bucket": "dest.gbai",
  "destination_key": "copied-file.pdf"
}
```

**Response:**
```json
{
  "copied": true,
  "source": "source.gbai/file.pdf",
  "destination": "dest.gbai/copied-file.pdf"
}
```

### Generate Presigned URL

**POST** `/buckets/{bucket}/objects/{key}/presign`

Generate a presigned URL for temporary access.

**Request Body:**
```json
{
  "operation": "GET",
  "expires_in": 3600,
  "content_type": "application/pdf"
}
```

**Response:**
```json
{
  "url": "http://localhost:9000/mybot.gbai/file.pdf?X-Amz-Algorithm=...",
  "expires_at": "2024-01-15T11:30:00Z"
}
```

### Object Metadata

**HEAD** `/buckets/{bucket}/objects/{key}`

Get object metadata without downloading.

**Response Headers:**
- `Content-Type` - MIME type
- `Content-Length` - File size
- `Last-Modified` - Modification time
- `ETag` - Entity tag
- `x-amz-meta-*` - Custom metadata

### Multipart Upload

**POST** `/buckets/{bucket}/objects/{key}/multipart`

Initiate multipart upload for large files.

**Response:**
```json
{
  "upload_id": "abc123...",
  "bucket": "mybot.gbai",
  "key": "large-file.zip"
}
```

**Upload Part:**
**PUT** `/buckets/{bucket}/objects/{key}/multipart/{uploadId}/{partNumber}`

**Complete Upload:**
**POST** `/buckets/{bucket}/objects/{key}/multipart/{uploadId}/complete`

## Error Responses

### 404 Not Found
```json
{
  "error": "not_found",
  "message": "Object not found",
  "resource": "mybot.gbai/missing.pdf"
}
```

### 409 Conflict
```json
{
  "error": "conflict",
  "message": "Bucket already exists",
  "bucket": "existing.gbai"
}
```

### 507 Insufficient Storage
```json
{
  "error": "insufficient_storage",
  "message": "Storage quota exceeded",
  "quota": 10737418240,
  "used": 10737418240
}
```

## Usage Examples

### Upload File with cURL

```bash
curl -X PUT \
  -H "Authorization: Bearer token123" \
  -H "Content-Type: application/pdf" \
  --data-binary @document.pdf \
  http://localhost:8080/api/v1/storage/buckets/mybot.gbai/objects/docs/manual.pdf
```

### Download File

```bash
curl -X GET \
  -H "Authorization: Bearer token123" \
  http://localhost:8080/api/v1/storage/buckets/mybot.gbai/objects/docs/manual.pdf \
  -o downloaded.pdf
```

### List Objects with Prefix

```bash
curl -X GET \
  -H "Authorization: Bearer token123" \
  "http://localhost:8080/api/v1/storage/buckets/mybot.gbai/objects?prefix=docs/"
```

## Storage Organization

### Recommended Structure

```
bucket/
├── .gbkb/           # Knowledge base files
│   ├── docs/
│   └── data/
├── .gbdialog/       # Dialog scripts
│   ├── scripts/
│   └── tools/
├── .gbtheme/        # Theme assets
│   ├── css/
│   └── images/
└── .gbdrive/        # User uploads
    ├── attachments/
    └── temp/
```

## Quotas and Limits

| Limit | Default Value |
|-------|--------------|
| Max file size | 100 MB |
| Max bucket size | 10 GB |
| Max objects per bucket | 10,000 |
| Presigned URL validity | 7 days |
| Multipart chunk size | 5 MB |

## Performance Tips

1. **Use Multipart Upload** for files > 5MB
2. **Enable Caching** with ETags
3. **Compress Large Files** before upload
4. **Use Presigned URLs** for direct client uploads
5. **Implement Retry Logic** for network failures

## Security Considerations

- All uploads are scanned for malware
- File types are validated
- Presigned URLs expire automatically
- Access control per bucket
- Encryption at rest
- SSL/TLS for transfers

## Related APIs

- [Document Processing API](./document-processing.md)
- [Reports API](./reports-api.md)
- [ML API](./ml-api.md)