# Media Service

# Media Service (Port 8011) {#media-service-port-8011}


The **media-service** handles file uploads, storage (S3/MinIO/local), image processing, and media URL generation.


## Database {#database}


**Database:** `media_db`

| Table | Purpose |
|-------|---------|
| `media_assets` | File metadata records |
| `upload_sessions` | Chunked upload session tracking |


## API Endpoints {#api-endpoints}


| Method | Path | Purpose |
|--------|------|---------|
| POST | `/upload` | Upload a file |
| GET | `/assets` | List assets |
| GET | `/assets/{id}` | Get asset metadata |
| DELETE | `/assets/{id}` | Delete asset |
| GET | `/download/{id}` | Download file |


## Storage Backends {#storage-backends}


Supports multiple storage backends selected via configuration:

```python
class StorageBackend(Enum):
    S3 = "s3"           # Amazon S3
    MINIO = "minio"     # MinIO (S3-compatible, local dev)
    LOCAL = "local"     # Local filesystem (development)
```


## Upload Flow {#upload-flow}


```
Client ──► POST /upload (multipart)
  │
  ├──► media-service validates file type/size
  ├──► Stores in configured backend (S3/MinIO/local)
  ├──► Creates media_asset record in media_db
  └──► Returns asset ID and URL

# Response
{
  "id": "asset-uuid",
  "url": "http://files.mquad.local/uploads/abc123.jpg",
  "mime_type": "image/jpeg",
  "size_bytes": 1048576,
  "filename": "photo.jpg"
}
```


## Image Processing {#image-processing}


Images are automatically processed on upload:

- Thumbnail generation (256x256)
- Resize variants (sm: 640, md: 1280, lg: 2048)
- Format conversion (WebP for modern browsers)

```python
async def process_image(file_path: str, asset_id: str):
    variants = {
        "thumbnail": (256, 256),
        "small": (640, 0),     # 0 = maintain aspect ratio
        "medium": (1280, 0),
        "large": (2048, 0),
    }
    for name, (width, height) in variants.items():
        await resize_image(file_path, f"{asset_id}_{name}.webp", width, height)
```


## Environment Configuration {#environment-configuration}


```bash
S3_ENDPOINT_URL=http://minio:9000
S3_ACCESS_KEY=mquadadmin
S3_SECRET_KEY=mquadadmin123
S3_BUCKET_NAME=mquad-media
S3_PUBLIC_URL=http://files.${HOST_MAIN_DOMAIN}
```
