Media & Lady Profile API (партнерський)
партнерський REST goldenbride.net · MediaApiService — усі ендпоінти реалізовані й покриті e2e (npm run test:media)
Суть
Друга частина партнерського API goldenbride.net — заливка/видалення медіа (медіа чату, вкладення листів, фото/відео TU) і керування профілем TU на модерації (агенцією). Продовження сесійної моделі official-api: авторизація тільки кукою JSESSIONID, яку видає команда login того ж AgencyHelperV2. Тобто окремого логіну тут нема — сесія спільна з основним API.
- Content-Type:
multipart/form-dataдля заливок (1–4),application/jsonдляladyprofilemanager(5). - Доступ: ендпоінти чат-медіа й вкладень листів — тільки TU (з whitelist-агенцій). Заливка/видалення фото-відео TU і
ladyprofilemanager— тільки агенція, яка володіє цим TU (ladyIdналежить агенції). - Стан у golden: усі ендпоінти реалізовані у
MediaApiService(src/golden/official-api/media-api.service.ts) поверх спільногоOfficialApiClient. Покриті e2e проти живого партнера —media-api.e2e-spec.ts, запускnpm run test:media. DTO/типи —media-api.dto.ts+media-api.interface.ts(включно з attach-типами, що переїхали з official-api).
Ендпоінти
| Метод + шлях | Доступ | Що робить | У golden |
|---|---|---|---|
POST /goldenbride/services/upload/media | TU | залити фото/відео в медіабібліотеку чату (multipart) | ✅ uploadChatMedia() |
GET /goldenbride/services/upload/media | TU | список медіабібліотеки (approved + pending) | ✅ getChatMedia() |
DELETE /goldenbride/services/upload/media | TU | видалити медіа чату (батч mediaIds) | ✅ deleteChatMedia() |
POST /goldenbride/services/upload/attach | TU | залити вкладення листа (multipart, jpg/jpeg/png) | ✅ uploadAttach() (на боці партнера зараз 404) |
GET /goldenbride/services/upload/attach | TU | список вкладень листів | ✅ getAttach() |
DELETE /goldenbride/services/upload/attach | TU | видалити вкладення (батч attachIds) | ✅ deleteAttach() |
POST /goldenbride/services/upload/lady/photo | агенція | залити фото TU (PHOTO_LADY | PRIVATE_PHOTO) | ✅ uploadLadyPhoto() (на боці партнера зараз 404) |
DELETE /goldenbride/services/upload/lady/photo | агенція | видалити фото TU (батч photoIds) | ✅ deleteLadyPhoto() |
POST /goldenbride/services/upload/lady/video | агенція | залити відео TU (ORDINAL | INTRO_VIDEO) | ✅ uploadLadyVideo() |
DELETE /goldenbride/services/upload/lady/video | агенція | видалити відео TU (батч videoIds) | ✅ deleteLadyVideo() |
POST /goldenbride/services/ladyprofilemanager | агенція | керування профілем TU на модерації (див. команди) | ✅ getProfile()/getProfiles()/setAvatar()/setGiftsAvailable()/cancelEdit() |
Команди ladyprofilemanager (у тілі command + ladyId):
| Команда | Що робить |
|---|---|
getProfile | повний профіль TU з фото/відео і їх pending/moderation-статусами |
getProfiles | усі TU агенції, що зараз у стані редагування |
setAvatar | призначити головне фото (PHOTO_LADY/NEW_PHOTO_LADY) — pending, чекає директора |
setGiftsAvailable | увімк/вимк доставку подарунків — pending, чекає директора |
cancelEdit | відкинути всі pending-правки TU і прибрати її зі списку «в редагуванні» |
Числа / Ліміти
- Медіа чату: фото ≤
CHAT_PHOTO_MAX_SIZEMB; відео ≤CHAT_VIDEO_MAX_SIZEMB, тривалість 15–60 с (конвертація асинхронна — URL зʼявляються за секунди-хвилини). - Вкладення листа: ≤
ATTACH_PHOTO_MAX_SIZEMB, тільки.jpg/.jpeg/.png, макс роздільнаUtils.MAX_ATTACHMENTS_WIDTH × HEIGHT. - Фото TU: макс 50. Відео TU: макс 35 звичайних + 1 intro (intro треба спершу видалити щоб залити нове).
- Батч-видалення (усі DELETE): приймає одне число / JSON-масив / CSV. Кожен id обробляється незалежно — відповідь
{ results[], deleted, failed, success },successозначає лише валідність запиту.
Нюанси
- Спільна сесія. Ніякого окремого логіну — переюзаємо
JSESSIONIDз official-api: той самий кеш сесій у спільномуOfficialApiClient(див. «Чому так»). - Модерація.
isModerate: falseодразу після заливки →trueпісля модерації. Виняток: agency-upload вкладення одразуisModerate: true. - Soft-delete. Медіа чату, вже куплене RU — soft-delete (
isRemoved=true), не фізичне. Вкладення, вже використане в листах — позначається unavailable, а не видаляється. - Статуси фото/відео TU. Заливка дає
NEW_*(на аппруві), видалення —DELETE_*; приcancelEditDELETE_*відновлюються,NEW_*фізично видаляються. - setAvatar / setGiftsAvailable — НЕ миттєві. Пишуться в
LadyProfileEdit, застосовуються лише після аппруву директора.getProfile/getProfilesпоказують поточне (avatarPhotoId/giftsAvailable) і чекаюче (pendingAvatarPhotoId/pendingGiftsAvailable). attachIdsу новому DELETE — цеAttachedFile.id(==imageIdзі списку GET), неattachConfirmId; сервер сам знаходитьAttachFileConfirm.- Media у chatHistory (основне API) уже віддає
poster(відео) /blur(фото);small/largedeprecated — деталі в official-api. deletePhoto/deleteVideoприбрані зladyprofilemanager— тільки через RESTDELETE /upload/lady/photo|video.
Зв’язки
- Спільна сесія й транспорт (той самий
JSESSIONID): official-api - Помилки →
golden_error_reporterror-report
Чому так
Ендпоінти сидять на тому самому сервері й тій самій сесії, що AgencyHelperV2. Тому імплементація — не окремий незалежний клієнт, а спільний шар OfficialApiClient (транспорт + сесія + JSESSIONID), над яким стоять два тонкі сервіси: OfficialApiService (команди AgencyHelperV2) і MediaApiService (ці ендпоінти + multipart). Так сесія не дублюється, а логін лишається один.