103 lines
1.6 KiB
Markdown
103 lines
1.6 KiB
Markdown
|
|
# Черновик Data Model
|
|||
|
|
|
|||
|
|
Это черновик для будущих миграций PostgreSQL. Реальные таблицы добавим вместе с API.
|
|||
|
|
|
|||
|
|
## allowed_image_hosts
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
id
|
|||
|
|
hostname
|
|||
|
|
enabled
|
|||
|
|
description nullable
|
|||
|
|
created_at
|
|||
|
|
updated_at
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Правила normalization:
|
|||
|
|
|
|||
|
|
- lowercase;
|
|||
|
|
- без protocol;
|
|||
|
|
- без path;
|
|||
|
|
- без trailing slash;
|
|||
|
|
- без wildcard на первом этапе;
|
|||
|
|
- source URL должен быть `http` или `https`;
|
|||
|
|
- запрещены localhost, private IP, loopback, link-local.
|
|||
|
|
|
|||
|
|
## image_assets
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
id
|
|||
|
|
source_url
|
|||
|
|
source_host
|
|||
|
|
source_hash
|
|||
|
|
original_s3_key nullable
|
|||
|
|
status
|
|||
|
|
width nullable
|
|||
|
|
height nullable
|
|||
|
|
content_type nullable
|
|||
|
|
size_bytes nullable
|
|||
|
|
created_at
|
|||
|
|
updated_at
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## image_variants
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
id
|
|||
|
|
asset_id
|
|||
|
|
preset
|
|||
|
|
variant_hash
|
|||
|
|
format
|
|||
|
|
width
|
|||
|
|
height nullable
|
|||
|
|
quality
|
|||
|
|
s3_key
|
|||
|
|
status: pending | processing | ready | failed
|
|||
|
|
size_bytes nullable
|
|||
|
|
error nullable
|
|||
|
|
created_at
|
|||
|
|
updated_at
|
|||
|
|
last_accessed_at nullable
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Unique constraints
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
allowed_image_hosts(hostname)
|
|||
|
|
image_assets(source_hash)
|
|||
|
|
image_variants(asset_id, variant_hash, format)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## S3 layout
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
originals/{assetId}/source
|
|||
|
|
variants/{assetId}/{variantHash}.{format}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Presets
|
|||
|
|
|
|||
|
|
Клиент не должен передавать произвольные трансформации. Сначала нужны ограниченные presets.
|
|||
|
|
|
|||
|
|
Пример:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
avatar:
|
|||
|
|
widths: 128, 256, 512
|
|||
|
|
formats: avif, webp, jpg
|
|||
|
|
quality: 80
|
|||
|
|
resize: fill
|
|||
|
|
|
|||
|
|
card:
|
|||
|
|
widths: 320, 640, 960
|
|||
|
|
formats: avif, webp, jpg
|
|||
|
|
quality: 80
|
|||
|
|
resize: fit
|
|||
|
|
|
|||
|
|
hero:
|
|||
|
|
widths: 1280, 1920
|
|||
|
|
formats: avif, webp, jpg
|
|||
|
|
quality: 80
|
|||
|
|
resize: fit
|
|||
|
|
```
|