Skip to content

Карта бэкенда

Последняя сверка с кодом: 2026-06-06
Стек: Express, Prisma, Postgres, Better Auth, TUS, sharp/ffmpeg
OpenAPI: http://localhost:3002/api/docs
Связанные доки: 02-frontend-map · 01-glossary


1. Разделы API

PrefixRouterAuthНазначение
/api/auth/*Better Auth handlervariesLogin, register, session, reset password
/api/healthapp.tsHealthcheck
/api/plansroutes/plans.tsпубличноОписание тарифов FREE/BASE/PRO
/api/eventsroutes/events.tsmixedCRUD событий, settings, members, media list, ZIP, SSE
/api/mediaroutes/media.tsmixedФайлы, like, delete, moderation
/api/usersroutes/users.tssessionGET /me — профиль и роль
/api/adminroutes/admin.tsSUPER_ADMINПользователи, события, планы платформы
/api/tusroutes/tus.tsoptionalResumable upload

Порядок в app.ts: TUS и Auth до express.json() — иначе ломается body stream.


2. Events API (/api/events)

MethodPathMiddlewareService / логикаFrontend
GET/myrequireAuthlistMyEvents/account, /my-events
POST/requireAuth + plan limitcreateEventCreateEventForm
GET/:idoptionalAuth + qrAccessgetEvent/:id, share
GET/:id/accessoptionalAuthgetEventAccessmiddleware, useEventAccess
GET/:id/mediaoptionalAuth + visibilitylistEventMediaalbum, admin, moderate
GET/:id/streamoptionalAuthSSE addSubscriberuseEventStream
GET/:id/zipoptionalAuth + zipAccessstreamEventZipadmin, album download
POST/:id/zipbody: selected idspartial ZIPadmin multi-select
GET/:id/settingsrequireAuth + OWNERgetEventSettingssettings page
PATCH/:id/settingsrequireAuth + OWNERupdateEventSettingssettings page
POST/:id/branding/:kindrequireAuth + OWNER + planuploadEventBrandingsettings
DELETE/:id/branding/:kindrequireAuth + OWNERdeleteEventBrandingsettings
GET/:id/membersrequireAuth + admin rolelistEventMembersmembers
POST/:id/membersrequireAuth + OWNERaddEventMembermembers
DELETE/:id/members/:userIdrequireAuth + OWNERremoveEventMembermembers
GET/:id/members/invite-linkrequireAuth + OWNERgetMemberInviteLinkmembers
POST/:id/members/invite-linkrequireAuth + OWNERregenerate invitemembers
POST/:id/joinrequireAuth + tokenjoinEventWithInvitejoin page

3. Media API (/api/media)

MethodPathMiddlewareНазначениеFrontend
GET/:idОригинал файлаlightbox, download
GET/:id/thumbПревьюMediaGrid
GET/file?key=По storage key (internal)branding URLs
POST/:id/likerequireMediaLiketoggle likeMediaCard
DELETE/:idrequireMediaDeleteудалениеadmin / member own
PATCH/:id/moderationrequireMediaManageapprove/rejectmoderate

4. Admin & Users & Plans

MethodPathКтоНазначение
GET/api/users/melogged inglobalRole, plan
GET/api/admin/statsSUPER_ADMINсчётчики
GET/api/admin/usersSUPER_ADMINвсе пользователи
GET/api/admin/eventsSUPER_ADMINвсе события
GET/api/admin/plansSUPER_ADMINтарифы + лимиты (admin view)
GET/api/plansвсепубличные тарифы для pricing

5. TUS Upload (/api/tus)

ЭтапЧто происходит
1Клиент (Uppy) создаёт upload с metadata: eventId, guest name, …
2eventUploadPolicy проверяет qrAccess, limits, allowedMedia
3Файл пишется в Storage (local / R2)
4onUploadFinish → запись Media, очередь processing
5sharp/ffmpeg → thumb, blurhash; SSE уведомляет альбом

Детали: 05-upload.md, 06-media-processing.md.


6. Services (слой домена)

ServiceОтветственность
eventServiceEvent CRUD, list media, access, my events
eventSettingsServiceEventSettings GET/PATCH
eventBrandingServicelogo/background upload
eventMemberServiceMODERATOR assign/remove
eventMemberInviteServiceMEMBER invite link + join
eventGuestAccessServiceqrAccess, album visibility, zip
eventRoleServiceроли на событие
mediaServicestream files, delete
likeServiceMediaLike toggle
moderationServicePENDING → APPROVED/REJECTED
planLimitsServiceлимиты по User.plan
adminServiceplatform admin lists
zipServicearchiver stream
emailServiceZoho SMTP (reset password, verify, owner notify)
storage/*LocalDisk / R2
processing/*image/video pipeline + queue

7. Middleware (цепочки)

MiddlewareКогда
corsMiddlewareВсе запросы, credentials для auth cookie
optionalAuthГость или user — session если есть
requireAuth401 без session
requireSuperAdminglobalRole === SUPER_ADMIN
requireEventRole(OWNER/MODERATOR)роль на событие
requireMediaManageOWNER/MODERATOR + moderation
requireMediaDeleteadmin или MEMBER своё
requireMediaLikelogged in + canLike
requirePlanEventCreateлимит событий по тарифу
assertQrAccess / guest accessв handlers events/media

Типичный защищённый запрос:

CORS → optionalAuth/requireAuth → requireEventRole → handler → service → Prisma

8. Auth (Better Auth)

КомпонентПуть
Configconfig/auth.ts
Mountapp.all('/api/auth/*', toNodeHandler(auth))
SessionhttpOnly cookie, Prisma Session
Password resetsendResetPasswordemailService

Frontend: /api/auth/get-session, sign-in/email, и т.д. — см. 21-auth-frontend.md.


9. Данные и storage

ГдеЧто
PostgresUser, Event, Media metadata, Settings, Roles, Likes
Storage (disk/R2)original, thumb, branding files
In-memorySSE subscribers (single instance; Redis — backlog)

Схема Prisma: backend/prisma/schema.prisma. Продуктовое описание — 09-data-model-summary.md (фаза D).


10. Обработка ошибок

CodeКонстантаUX на фронте
401UNAUTHORIZEDAuth modal / loginPath
403FORBIDDENUiPageError inline
404EVENT_NOT_FOUNDUiPageError not-found
409DUPLICATE_MEDIAtoast

Источник кодов: constants/apiErrorCode.ts → OpenAPI → ApiClientError на фронте.


11. Live updates (SSE)

GET /api/events/:id/stream
→ text/event-stream
→ события: new media, moderation, delete

Клиент: useEventStream.ts. Сервер: utils/sse.ts. Подробнее: 11-live-updates.md.


12. Где править код

ЗадачаКуда
Новый REST endpointroutes/*.ts + JSDoc swagger + generate-api.sh
Бизнес-правилоservices/*.ts
Право доступаmiddleware + getEventAccess
Лимит тарифаplanLimitsService + middleware/planLimits.ts
Envconfig/env.ts, backend/.env.example

13. Локальная отладка

bash
npm run dev:backend   # :3002
open http://localhost:3002/api/docs

Seed user: dev@local.test / dev123456, event demo-event.