- добавлен базовый pnpm workspace для будущих приложений - добавлена dev-инфраструктура PostgreSQL и MinIO - добавлены env-пример и базовые правила репозитория - зафиксированы архитектура, data model и API-контракт - описан контракт с внешним imgproxy
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
|
||
```
|