Перейти до вмісту

Збережене / Вступлісти

ПолеЗначення
Статус🟢 prod
Поверхніweb
Доступністьстворення/керування — потрібен акаунт; перегляд публічного вступлиста — без логіну
ВласникTODO:
Останнє підтвердження2026-06-14 · код:main + live (публічний /uk/list/<uuid> → 200, /catalogs/<uuid> без токена → 404, /profile/saved → 307). Авторизований UI — code-derived

Авторизований абітурієнт зберігає конкурсні пропозиції (оффери) з каталогу/пошуку в особисті колекції-каталоги, переглядає їх із персональним конкурсним балом і позицією, кастомізує (емодзі, обкладинка, markdown-опис), ділиться публічним посиланням/QR і клонує чужі публічні каталоги.

  1. Кнопка-закладка «Зберегти» на картці оферу (/offers/result/**) → попап вибору каталогу (гостю — пропозиція реєстрації).
  2. Галерея /profile/saved (CatalogsAll) — усі каталоги з обкладинкою, емодзі, лічильником, бейджем видимості (Globe=публічний / Lock=приватний / Star=стандартний).
  3. Каталог /profile/saved/[catalogId] — hero-обкладинка, markdown «про список», таблиця офферів з персональними concursScore/concursPosition.
  4. Створення/редагування /profile/saved/create, /saved/[catalogId]/edit — назва, видимість, опис, контент, емодзі, обкладинка (color/gradient/image).
  5. Шеринг: діалог QR (react-qr-code) на abitly.org/<locale>/list/<catalogId>, copy-link, download QR.
  6. Публічна сторінка /list/[catalogId] — будь-хто без логіну бачить публічний каталог; гостю — RegisterCTA + кнопка клонувати (SaveCopyButton).

Платіжного/ботового флоу тут немає — фіча суто веб.

ДжерелоЕндпоінт / entityПризначення
api-v2POST/GET/PATCH/DELETE /catalogsCRUD каталогів
api-v2GET /catalogs/:idOptionalJwtAuthGuard: публічний — гостю, приватний → 403
api-v2POST/DELETE /catalogs/:id/offers/:offerIdдодати/прибрати оффер
api-v2POST /catalogs/:id/cloneклонувати лише публічний (клон → private, ім’я +« (копія)»)
api-v2entities catalogs (Catalog) + saved_offers (SavedOffer, PK catalogId+offerId)схема abitly

Зв’язки з іншими фічами

Section titled “Зв’язки з іншими фічами”
  • offer-search — джерело офферів (кнопка-закладка); той самий механізм персонального балу (populateOffersWithUserConcursData).
  • account-auth — гейт власницьких сторінок; реєстрація стартує з попапу збереження.
  • profile/profile/saved як розділ кабінету; лічильник у дашборді.
  • profile-bot-link — приватні/публічні вступлісти як джерело specialty-сигналів (ADR-0011, дизайн).
РепоШляхПримітка
abitly-frontend-v2src/app/[locale]/(profile)/profile/saved/**, (public)/list/[catalogId]роути власницькі + публічний
abitly-frontend-v2src/api/catalogs/catalogs.api.ts + catalogs.queries.tsклієнт (не ретраїть 401/403/404)
abitly-api-v2src/api/catalogs/catalogs.controller.ts · catalog.ts / savedOffer.tsконтролер + entities
  • Власницькі сторінки за логіном — UI не верифіковано браузером (публічний /list/<uuid> підтверджено live).
  • Стандартний (default) каталог (isDefault): не видаляється (400), не кастомізується; будь-який збережений оффер авто-дзеркалиться в нього; видалення оффера з default прибирає його з усіх каталогів.
  • Клонувати можна лише публічний (приватний → 403); клон завжди private.
  • Персональні бал/позиція рахуються лише для APPLICANT/APPLICANT_MEMBER із заповненими grades, інакше null.
  • Жорстких лімітів на к-ть каталогів/офферів у коді немає; обмеження довжин: name≤100, description≤200, content≤5000, emoji≤60, coverValue≤100.
  • Публічний URL — повний /list/<uuid> (не короткий slug); «shortUrl» у QR-діалозі = той самий URL без схеми. SEO: лише public-каталоги індексуються.
ДатаПодіяДжерело
2026-06-14створено картку (злито saved-offers + vstuplysty); факти з коду main + публічний livePR Wave 2