

| # | Database Collection | Description |
| 1 | friend_friend_requests | • id: uuid • recipient_profile_id: ObjectId • requester_profile_id: ObjectId • status: String "PENDING"|"ACCEPTED"|"DECLINED" • message: String • feedback: String • created_at: Date • created_by: ObjectId • modified_at: Date • modified_by: ObjectId |
| 2 | friend_friends | • id: uuid • profile_id: ObjectId • friend_profile_id: ObjectId • created_at: Date • created_by: ObjectId • modified_at: Date • modified_by: ObjectId • deleted_at: Date • deleted_by: ObjectId |

| # | Path | Description | Method | Headers | Request | Response |
| 1 | profile/internal/v1/{userId}/friend-requests | View pending friend requests | GET | • x-server-key | N/A | { items: [ { id: String, recipientProfileId: ObjectId, requesterProfileId: ObjectId, status: String "PENDING"|"ACCEPTED"|"DECLINED", message: String, feedback: String, createdAt: Date, createdBy: ObjectId, modifiedAt: Date, modifiedBy: ObjectId } ] paging: { cursors: { before: String, after: String } }} |
| 2 | profile/internal/v1/{userId}/friend-requests | Send personalized friend request | POST | • x-server-key | { recipientProfileId: String, message?: String, } | { id: String, recipientProfileId: ObjectId, requesterProfileId: ObjectId, status: "PENDING", message: String, feedback: String, createdAt: Date, createdBy: ObjectId, modifiedAt: Date, modifiedBy: ObjectId} |
| 3 | profile/internal/v1/{userId}/friend-requests/{requestId}/accept | Accept friend request | PUT | • x-server-key | N/A | SuccessResponseDTO |
| 4 | profile/internal/v1/{userId}/friend-requests/{requestId}/decline | Decline friend request | PUT | • x-server-key | { feedback?: String } | SuccessResponseDTO |
| 5 | profile/internal/v1/{userId}/friends | View all friends | GET | • x-server-key | N/A | { items: [ { id: String, profileId: ObjectId friendProfileId: ObjectId createdAt: Date, createdBy: ObjectId, modifiedAt: Date, modifiedBy: ObjectId, deletedAt: Date, deletedBy: ObjectId } ] paging: { cursors: { before: String, after: String } }} |
| 6 | profile/internal/v1/{userId}/friends/{friendProfileId} | Remove a friend | DELETE | • x-server-key | N/A | SuccessResponseDTO |
| 7 | profile/cms/v1/{userId}/friend-requests | View all friend requests | GET | • x-access-token | N/A | { items: [ { id: String, recipientProfileId: ObjectId, requesterProfileId: ObjectId, status: String "PENDING"|"ACCEPTED"|"DECLINED", message: String, feedback: String, createdAt: Date, createdBy: ObjectId, modifiedAt: Date, modifiedBy: ObjectId } ] paging: { cursors: { before: String, after: String } }} |
| 8 | profile/cms/v1/{userId}/friends | View all friends | GET | • x-access-token | N/A | { items: [ { id: String, profileId: ObjectId friendProfileId: ObjectId createdAt: Date, createdBy: ObjectId, modifiedAt: Date, modifiedBy: ObjectId, deletedAt: Date, deletedBy: ObjectId } ] paging: { cursors: { before: String, after: String } }} |



Because after a long period of time, we may not be able to remember what and why we decide for that design.
Beiryu
Contributor

Xin chào các bạn, hôm nay mình sẽ chia sẻ với các bạn về kinh nghiệm xây dựng hệ thống streaming video và cách tích hợp với các dịch vụ của bên thứ ba như Dropbox và Bunny. Qua bài viết này, mình hy vọng sẽ cung cấp cho các bạn một cái nhìn tổng quan về kiến trúc streaming video và những lựa chọn phổ biến khi làm việc với các dịch vụ bên ngoài.
Beiryu
Contributor