- Add task to verify upload flow for banners - Document fallback options for banner_url == null - Add troubleshooting guide - Document branding assets guide requirements
8.2 KiB
8.2 KiB
TASK_PHASE_BRANDING_BANNERS_MVP — Завершення підтримки логотипів та банерів
Контекст
Після виправлення proxy endpoint та нормалізації URL:
- ✅ Логотипи працюють: завантажуються через
/api/city/assets/proxy/... - ✅ Proxy endpoint працює: HEAD/GET методи підтримуються
- ⚠️ Банери:
banner_url: nullв БД (просто ще не завантажували)
Поточна ситуація:
- Технічна інфраструктура працює
- Потрібно перевірити повний upload flow для банерів
- Можливо додати fallback для відображення банера
Завдання
1. Перевірити upload-флоу для банера
Кроки:
-
Залогінитись на
daarion.space- Відкрити сторінку MicroDAO (наприклад,
/microdao/daarion) - Перейти до секції "Branding"
- Відкрити сторінку MicroDAO (наприклад,
-
Завантажити банер:
- Натиснути "Upload Banner"
- Вибрати зображення (PNG/JPG, рекомендовано 1920x400 або подібне)
- Дочекатись завершення завантаження (без помилок)
-
Перевірити в DevTools → Network:
- Знайти запит на
/api/assets/upload(або/api/city/assets/upload) - Статус:
200 OK - Відповідь містить
processed_urlабоoriginal_urlз MinIO URL - Знайти запит на
/api/microdao/{slug}/branding(PATCH) - Статус:
200 OK - Відповідь містить
banner_url(неnull)
- Знайти запит на
-
Перевірити оновлення в БД:
curl -s "https://daarion.space/api/city/microdao/daarion" | jq '{logo_url, banner_url}'banner_urlмає бути заповнений (неnull)- URL має бути формату:
https://assets.daarion.space/daarion-assets/microdao/banner/...
-
Перевірити відображення:
- Оновити сторінку MicroDAO
- Банер має відображатись (не placeholder)
- В DevTools → Network знайти запит на
/api/city/assets/proxy/microdao/banner/... - Статус:
200 OK,Content-Type: image/pngабоimage/jpeg
2. Гарантувати запис banner_url у БД
Перевірити:
-
Backend endpoint
/api/microdao/{slug}/branding(PATCH):- Файл:
apps/web/src/app/api/microdao/[slug]/branding/route.ts(або подібний) - Переконатись, що
banner_urlзберігається в БД - Перевірити валідацію URL
- Файл:
-
Backend endpoint
/api/city/microdao/{slug}/branding(якщо є):- Файл:
services/city-service/routes_city.py - Переконатись, що endpoint оновлює
banner_urlв таблиціmicrodaos
- Файл:
-
Database schema:
- Переконатись, що
microdaos.banner_urlмає типtext(після міграції043_asset_urls_to_text.sql) - Перевірити, що поле може бути
NULL(для старих записів)
- Переконатись, що
3. Додати fallback при banner_url == null
Варіанти реалізації:
Варіант A: Використати логотип як банер
// apps/web/src/components/microdao/MicrodaoHeaderCard.tsx
const bannerUrl = normalizeAssetUrl(microdao.banner_url) || normalizeAssetUrl(microdao.logo_url);
Варіант B: Використати дефолтний банер
// apps/web/src/lib/utils/assetUrl.ts
export function normalizeAssetUrl(url: string | null | undefined, fallback?: string): string | null {
if (!url) return fallback || null;
// ... existing logic
}
// Usage:
const bannerUrl = normalizeAssetUrl(microdao.banner_url, '/assets/default-banner.png');
Варіант C: CSS gradient fallback
// Якщо banner_url == null, використати CSS gradient замість зображення
style={microdao.banner_url ? {
backgroundImage: `url(${normalizeAssetUrl(microdao.banner_url)})`,
} : {
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
}}
Рекомендація: Варіант A (використати логотип) — найпростіший і найлогічніший.
4. Задокументувати "як правильно додавати логотип/банер до MicroDAO"
Створити документацію:
-
Файл:
docs/BRANDING_ASSETS_GUIDE.md -
Зміст:
- Як завантажити логотип/банер через UI
- Рекомендовані розміри:
- Logo: 512x512px (квадратне)
- Banner: 1920x400px (широке)
- Підтримувані формати: PNG, JPG, WebP
- Як працює proxy endpoint
- Як працює
normalizeAssetUrl - Troubleshooting (якщо зображення не відображається)
Acceptance Criteria
- Upload банера працює без помилок
banner_urlзберігається в БД після завантаження- Банер відображається на сторінці MicroDAO після завантаження
- Proxy endpoint працює для банерів (
/api/city/assets/proxy/microdao/banner/...) - Додано fallback для
banner_url == null(опціонально) - Створено документацію по роботі з branding assets
Технічні деталі
Endpoints для перевірки
-
Upload asset:
POST /api/assets/upload(Next.js route)- Або
POST /api/city/assets/upload(city-service) - Body:
FormDataзfileтаtype(наприклад,microdao_banner)
-
Update branding:
PATCH /api/microdao/{slug}/branding- Body:
{ banner_url: "https://assets.daarion.space/..." }
-
Get MicroDAO:
GET /api/city/microdao/{slug}- Response:
{ logo_url: "...", banner_url: "..." }
Файли для перевірки/зміни
-
Frontend:
apps/web/src/components/microdao/MicrodaoBrandingCard.tsx— компонент завантаженняapps/web/src/components/microdao/MicrodaoHeaderCard.tsx— відображення банераapps/web/src/app/microdao/[slug]/page.tsx— сторінка MicroDAO
-
Backend:
services/city-service/routes_city.py— endpoint/assets/uploadта/microdao/{slug}/brandingapps/web/src/app/api/microdao/[slug]/branding/route.ts— Next.js API route (якщо є)
-
Database:
- Таблиця
microdaosз полямиlogo_urlтаbanner_url(типtext)
- Таблиця
Troubleshooting
Проблема: Банер не зберігається в БД
Перевірити:
- Чи працює endpoint
/api/microdao/{slug}/branding(PATCH) - Чи правильно передається
banner_urlв запиті - Чи є помилки в логах city-service
Проблема: Банер зберігається, але не відображається
Перевірити:
- Чи використовується
normalizeAssetUrlдля банера - Чи працює proxy endpoint для шляху банера
- Чи файл існує в MinIO за вказаним шляхом
Проблема: Upload не працює
Перевірити:
- Чи працює endpoint
/api/assets/upload - Чи правильно налаштовані ENV змінні для MinIO
- Чи є помилки в логах city-service
Наступні кроки
- Виконати перевірку upload-флоу для банера
- Виправити виявлені проблеми (якщо є)
- Додати fallback для
banner_url == null(опціонально) - Створити документацію
- Закомітити зміни