media-api

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/mediaTUзалити фото/відео в медіабібліотеку чату (multipart)uploadChatMedia()
GET /goldenbride/services/upload/mediaTUсписок медіабібліотеки (approved + pending)getChatMedia()
DELETE /goldenbride/services/upload/mediaTUвидалити медіа чату (батч mediaIds)deleteChatMedia()
POST /goldenbride/services/upload/attachTUзалити вкладення листа (multipart, jpg/jpeg/png)uploadAttach() (на боці партнера зараз 404)
GET /goldenbride/services/upload/attachTUсписок вкладень листівgetAttach()
DELETE /goldenbride/services/upload/attachTUвидалити вкладення (батч 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_SIZE MB; відео ≤ CHAT_VIDEO_MAX_SIZE MB, тривалість 15–60 с (конвертація асинхронна — URL зʼявляються за секунди-хвилини).
  • Вкладення листа:ATTACH_PHOTO_MAX_SIZE MB, тільки .jpg/.jpeg/.png, макс роздільна Utils.MAX_ATTACHMENTS_WIDTH × HEIGHT.
  • Фото TU: макс 50. Відео TU: макс 35 звичайних + 1 intro (intro треба спершу видалити щоб залити нове).
  • Батч-видалення (усі DELETE): приймає одне число / JSON-масив / CSV. Кожен id обробляється незалежно — відповідь { results[], deleted, failed, success }, success означає лише валідність запиту.

Нюанси

  1. Спільна сесія. Ніякого окремого логіну — переюзаємо JSESSIONID з official-api: той самий кеш сесій у спільному OfficialApiClient (див. «Чому так»).
  2. Модерація. isModerate: false одразу після заливки → true після модерації. Виняток: agency-upload вкладення одразу isModerate: true.
  3. Soft-delete. Медіа чату, вже куплене RU — soft-delete (isRemoved=true), не фізичне. Вкладення, вже використане в листах — позначається unavailable, а не видаляється.
  4. Статуси фото/відео TU. Заливка дає NEW_* (на аппруві), видалення — DELETE_*; при cancelEdit DELETE_* відновлюються, NEW_* фізично видаляються.
  5. setAvatar / setGiftsAvailable — НЕ миттєві. Пишуться в LadyProfileEdit, застосовуються лише після аппруву директора. getProfile/getProfiles показують поточне (avatarPhotoId/giftsAvailable) і чекаюче (pendingAvatarPhotoId/pendingGiftsAvailable).
  6. attachIds у новому DELETE — це AttachedFile.id (== imageId зі списку GET), не attachConfirmId; сервер сам знаходить AttachFileConfirm.
  7. Media у chatHistory (основне API) уже віддає poster (відео) / blur (фото); small/large deprecated — деталі в official-api.
  8. deletePhoto/deleteVideo прибрані з ladyprofilemanager — тільки через REST DELETE /upload/lady/photo|video.

Зв’язки

  • Спільна сесія й транспорт (той самий JSESSIONID): official-api
  • Помилки → golden_error_report error-report

Чому так

Ендпоінти сидять на тому самому сервері й тій самій сесії, що AgencyHelperV2. Тому імплементація — не окремий незалежний клієнт, а спільний шар OfficialApiClient (транспорт + сесія + JSESSIONID), над яким стоять два тонкі сервіси: OfficialApiService (команди AgencyHelperV2) і MediaApiService (ці ендпоінти + multipart). Так сесія не дублюється, а логін лишається один.