Навчальні матеріали
Метадані
Section titled “Метадані”| Поле | Значення |
|---|---|
| Статус | 🟢 prod |
| Поверхні | web |
| Доступність | каталог + PDF-preview — безкоштовно, без акаунта; повний PDF — разова покупка (потрібен акаунт) |
| Власник | TODO: |
| Останнє підтвердження | 2026-06-13 · browse (abitly.org/uk/materials, cms.abitly.org/api/materials, uk-materials.xml) + код:main (abitly-frontend-v2, abitly-api-v2, abitly-strapi) |
Призначення
Section titled “Призначення”Магазин PDF-матеріалів для підготовки до НМТ: теорія, тести, шпаргалки, розбори типових помилок із чотирьох предметів (математика, українська, історія, англійська). Кожен матеріал має безкоштовний teaser-preview у вбудованому переглядачі; повний PDF продається поштучно або бандлами.
User flow
Section titled “User flow”Точка входу: https://abitly.org/uk/materials (роут /materials, у PATHNAMES без локалізованого перейменування). Лінк «Матеріали» — у головній навігації.
- Каталог — секції за предметами, бандли, «Мої матеріали» (для залогінених).
- Сторінка матеріалу
/materials/{slug}або бандла/materials/bundles/{slug}. - Preview —
teaserPdfу модальному переглядачі (@react-pdf-viewer+pdfjs-dist); PDF віддається через Next-роут/api/pdf-proxyз whitelist-ом media-хостів. - «Купити»: гість → модалка з Google-логіном, незавершена покупка відновлюється після входу (
pendingPurchase); залогінений →POST /premium/create-payment→ redirect на Monobank. - Повернення на
/materials/success— пулінг/premium/order-status(paid / processing / failed / timeout); куплений матеріал відкривається повністю та завантажується (/premium/downloadз токеном).
Платіжний флоу вже намальований — див. data-flows: оплата Monobank; шлях контенту — data-flows: контент Strapi.
Дані та API
Section titled “Дані та API”| Джерело | Ендпоінт / entity | Призначення |
|---|---|---|
| api-v2 | GET /materials, /materials/{slug}, /bundles, /bundles/{slug} | каталог: читає Strapi через StrapiService, мерджить із власними refs (materialRef, bundleRef) |
| api-v2 | GET /me/materials, /me/bundles | куплене користувачем (entity userMaterial) |
| api-v2 | POST /premium/create-payment · GET /premium/order-status · GET /premium/download + Monobank webhook | оплата і видача файлів (entity premiumOrder) |
| Strapi | content-type material | slug, subject (math/ukrainian/history/english), type (theory/tests/cheatsheet/breakdown), pages, format (enum — тільки pdf), priceCopecks, coverImage, teaserPdf, fullPdf, available, m2m bundles |
| Strapi | content-type bundle | slug, priceCopecks, coverImage, available, m2m materials |
На відміну від блогу, фронтенд не ходить у Strapi напряму — всі дані через api-v2. GA4-воронка ecommerce (view_item_list → purchase, item_category=materials + кастомні materials_*) задокументована в домен-доці фронтенду.
Зв’язки з іншими фічами
Section titled “Зв’язки з іншими фічами”- Статті / блог — той самий Strapi-канал контенту.
- Автентифікація — покупка вимагає акаунт; pending-purchase resume після Google-логіну.
- Checkout Monobank — спільні
/premium-ендпоінти; картки ще немає (див. індекс).
| Репо | Шлях | Примітка |
|---|---|---|
abitly-frontend-v2 | src/app/[locale]/(main)/materials/** | роути: каталог, [slug], bundles/[slug], success (+ sitemaps {uk,en}-materials.xml) |
abitly-frontend-v2 | src/components/pages/materials/** | UI; shared/viewer/ — PDF-переглядач, shared/hooks/useBuyFlow.ts — покупка |
abitly-frontend-v2 | src/api/materials/ · src/app/api/pdf-proxy/route.ts | API-клієнт; proxy з whitelist STATIC_ALLOWED_HOSTS |
abitly-frontend-v2 | docs/reference/materials/overview.md | домен-док — першоджерело механіки та analytics-подій |
abitly-api-v2 | src/api/materials/ · src/api/premium/ | контролери каталогу/покупок; entities materialRef, bundleRef, userMaterial, premiumOrder |
abitly-strapi | src/api/{material,bundle}/ | content-types (draft&publish, i18n) |
Обмеження та блокери
Section titled “Обмеження та блокери”- Розділ позначений BETA у UI (
BetaNotice: «Якщо щось не працює — повідомте нам у Telegram-спільноті»). - Формат — тільки PDF (enum
format); предмети — лише 4 НМТ-предмети. pdf-proxyвіддає PDF лише з whitelist-хостів (S3abitly-prod-strapi-media, legacy DO Spaces, host зіNEXT_PUBLIC_STRAPI_API_URL); новий media-bucket → оновитиSTATIC_ALLOWED_HOSTS.- Монетизація — разові покупки (premium one-off), тарифи Free/Pro/Max не задіяні (billing в api-v2 нічого не gate-ить).
- Контент завантажує тулінг
strapi-materials-parser(PDF uploader → Strapimaterial) — див. глосарій.
Історія змін
Section titled “Історія змін”| Дата | Подія | Джерело |
|---|---|---|
TODO: | реліз фічі — домен-док посилається на коміт f60a9517, який не резолвиться на main (ймовірно squash) | abitly-frontend-v2 |
| 2026-06-01 | актуалізовано домен-док (механіка + GA4-події) | docs/reference/materials/overview.md |
| 2026-06-13 | створено картку; факти звірено browse + код main | PR Wave 1 |