diff --git a/docs/tasks/ASSETS_PROXY_MANUAL_TEST_PLAN.md b/docs/tasks/ASSETS_PROXY_MANUAL_TEST_PLAN.md new file mode 100644 index 00000000..229e78c6 --- /dev/null +++ b/docs/tasks/ASSETS_PROXY_MANUAL_TEST_PLAN.md @@ -0,0 +1,250 @@ +# Manual Test Plan — Assets Proxy Debugging + +## Контекст + +Після виправлення HEAD методу в city-service, логотипи та банери все ще не відображаються на фронті. Потрібно перевірити: + +1. Які URL генерує фронт +2. Що реально повертає Next.js route +3. Чи web-сервіс оновлений до останнього коду + +## Крок 1: Перевірка реальних запитів в браузері + +### 1.1 Відкрити DevTools + +1. Відкрити `https://daarion.space/microdao` у браузері +2. Відкрити DevTools (F12 або Cmd+Option+I) +3. Перейти на вкладку **Network** +4. Фільтр: **Img** (або All + фільтр за назвою банера/логотипа) + +### 1.2 Знайти "биті" зображення + +1. Знайти запити до зображень, які не завантажились (червоний статус або placeholder) +2. Клікнути по одному з них +3. Перевірити: + - **Request URL** (повний шлях) + - **Status** (200/404/500/...) + - **Response headers** → `Content-Type`, `Content-Length` + +### 1.3 Аналіз URL + +#### Якщо URL виглядає як `/_next/image?url=...` + +→ Використовується Next `` з оптимізацією + +**Рішення:** +- Або виставити `unoptimized` на компоненті +- Або налаштувати `next.config.ts` (domains) та переконатися, що `url` вказує на `/api/city/assets/proxy/...` + +#### Якщо URL виглядає як `/api/city/assets/proxy/...` + +→ Це правильний шлях через proxy + +**Далі:** +1. Відкрити цей URL у новій вкладці браузера +2. Перевірити: + - Якщо картинка **відкривається** → проблема в Next `` / верстці + - Якщо не відкривається (404/500 або HTML-сторінка) → проблема в шляху або в проміжному Next route + +## Крок 2: Перевірка оновлення web-сервісу + +### 2.1 Перебудувати web-сервіс + +На сервері (там де docker-compose): + +```bash +cd /opt/microdao-daarion +git pull +docker compose -f docker-compose.web.yml build web +docker compose -f docker-compose.web.yml up -d --no-deps web +``` + +### 2.2 Hard refresh в браузері + +Після перебудови: + +1. Відкрити `https://daarion.space/microdao` +2. Зробити hard refresh: + - **Windows/Linux:** `Ctrl+Shift+R` + - **Mac:** `Cmd+Shift+R` + +## Крок 3: Перевірка шляху в proxy + +### 3.1 Скопіювати точний path + +З Network tab в DevTools: + +1. Знайти запит до `/api/city/assets/proxy/...` +2. Скопіювати точний path після `/api/city/assets/proxy/` + +Наприклад: `microdao/banner/xyz.png` + +### 3.2 Перевірка через city-service + +На сервері (там де `city-service`): + +```bash +# Перевірка через city-service (внутрішній Docker network) +docker exec daarion-city-service curl -i "http://localhost:7001/city/assets/proxy/microdao/banner/xyz.png" +``` + +### 3.3 Перевірка напряму у MinIO + +```bash +# Перевірка напряму у MinIO (якщо є NGINX/MinIO url) +curl -I "https://assets.daarion.space/daarion-assets/microdao/banner/xyz.png" +``` + +### 3.4 Аналіз результатів + +- Якщо другий запит (на MinIO) **200**, а перший ні → проблема в: + - `normalizeAssetUrl` неправильно обрізає/додає `daarion-assets/` + - Next route/NGINX "з'їдає" частину шляху + +**Примітка:** Банери часто лежать в іншому префіксі, ніж логотипи, тому: +- Для логотипів `normalizeAssetUrl` може працювати (структура шляху співпала) +- Для банерів — ні (інший префікс, додатковий каталог, інший формат збереження в БД) + +## Крок 4: Перевірка логів + +### 4.1 Логи city-service + +```bash +docker logs daarion-city-service | grep "assets/proxy" +``` + +Перевірити: +- Чи є запити на `/city/assets/proxy/...` +- Який статус (200/404/500) +- Чи є помилки + +### 4.2 Логи web-сервісу + +```bash +docker logs daarion-web | grep -E "assets|proxy|image" +``` + +Перевірити: +- Чи є запити на `/api/city/assets/proxy/...` +- Чи є помилки в Next.js route + +## Крок 5: Перевірка normalizeAssetUrl + +### 5.1 Перевірка вхідних даних з БД + +```bash +# Отримати URL з БД для конкретного MicroDAO +curl -s "https://daarion.space/api/city/microdao/daarion" | jq '{logo_url, banner_url}' +``` + +### 5.2 Перевірка нормалізації + +В браузері (Console в DevTools): + +```javascript +// Тест normalizeAssetUrl +const testUrl = "https://assets.daarion.space/daarion-assets/microdao/logo/2025/12/02/abc123.png"; +// Очікуваний результат: "/api/city/assets/proxy/microdao/logo/2025/12/02/abc123.png" +``` + +## Очікувані результати + +### ✅ Успішний сценарій + +1. **Network tab:** + - URL: `/api/city/assets/proxy/microdao/logo/2025/12/02/abc123.png` + - Status: `200 OK` + - Content-Type: `image/png` + - Зображення відображається + +2. **Логи city-service:** + ``` + INFO: "GET /city/assets/proxy/microdao/logo/2025/12/02/abc123.png HTTP/1.1" 200 OK + ``` + +3. **Прямий доступ до URL:** + - Відкривається зображення в новій вкладці + +### ❌ Проблемні сценарії + +#### Сценарій 1: 404 Not Found + +**Симптоми:** +- Status: `404` +- Response: `Asset not found` + +**Можливі причини:** +- Файл не існує в MinIO +- Неправильний path (зайвий/відсутній префікс `daarion-assets/`) +- Неправильна нормалізація URL + +**Рішення:** +- Перевірити чи файл існує в MinIO +- Перевірити `normalizeAssetUrl` контракт +- Перевірити шлях в БД + +#### Сценарій 2: 405 Method Not Allowed + +**Симптоми:** +- Status: `405` +- Response: `Method Not Allowed` + +**Можливі причини:** +- HEAD метод не підтримується (має бути виправлено) +- Next.js route не має HEAD handler + +**Рішення:** +- Перевірити чи city-service має оновлений код +- Перевірити чи Next.js route має HEAD handler + +#### Сценарій 3: 500 Internal Server Error + +**Симптоми:** +- Status: `500` +- Response: `Internal Server Error` + +**Можливі причини:** +- Помилка в city-service при доступі до MinIO +- Неправильні ENV змінні (MINIO_ENDPOINT, MINIO_ACCESS_KEY, тощо) + +**Рішення:** +- Перевірити логи city-service +- Перевірити ENV змінні в docker-compose + +#### Сценарій 4: Зображення не відображається, але статус 200 + +**Симптоми:** +- Status: `200 OK` +- Content-Type правильний +- Але зображення не відображається + +**Можливі причини:** +- Next `` з оптимізацією блокує +- CSS/верстка приховує зображення +- CORS проблема + +**Рішення:** +- Перевірити чи використовується `` або `` +- Перевірити CSS стилі +- Перевірити CORS headers + +## Чек-лист для швидкої перевірки + +- [ ] Web-сервіс перебудовано з останнім кодом +- [ ] Hard refresh в браузері виконано +- [ ] Network tab показує запити на `/api/city/assets/proxy/...` +- [ ] Статус запитів: `200 OK` +- [ ] Content-Type: `image/png` або `image/jpeg` +- [ ] Прямий доступ до URL відкриває зображення +- [ ] Логи city-service показують успішні запити +- [ ] `normalizeAssetUrl` правильно конвертує URL з БД + +## Наступні кроки після тестування + +1. Зафіксувати результати тестування +2. Якщо є проблеми — зібрати: + - Точні URL з Network tab + - Логи city-service та web-сервісу + - Приклади URL з БД +3. Передати інформацію для подальшого виправлення +