Live Stream broadcasted summary
Yayıncı özet endpoint kontratı
Live Stream Broadcasted Summary Endpoint Spec
Endpoint
GET /api/v1/live-stream/my-broadcasted-stream-summariesKullanıcının host veya guest olarak gerçekten katıldığı bitmiş yayınları, yayın başına yayıncı özetiyle listeler.
Auth
Zorunlu:
Authorization: Bearer <JWT>Backend decorator:
@ApiAuth(Role.USER)Query Parameters
| Param | Type | Default | Min | Max | Description |
|---|---|---|---|---|---|
page | number | 1 | 1 | - | Sayfa numarası |
limit | number | 10 | 1 | 100 | Sayfa başına item sayısı |
Örnek:
GET /api/v1/live-stream/my-broadcasted-stream-summaries?page=1&limit=10Access Rule
Bu endpoint sadece current user için çalışır. Bir yayın response'a yalnızca istek atan kullanıcının o yayında Participant.role = host veya Participant.role = guest kaydı varsa girer.
Public kullanıcı profili endpointi değildir; başka bir kullanıcının yayıncı özetleri bu endpointten alınamaz.
Response Shape
Backend standart BaseResponseDto<T> wrapper döner. Asıl payload data içindedir.
BaseResponseDto<PaginatedResponseDto<MyBroadcastedLiveStreamSummaryResponseDto>>;data.list içindeki her item:
type MyBroadcastedLiveStreamSummaryResponseDto = {
liveStream: LiveStreamResponseDto;
summary: MyBroadcastedLiveStreamSummaryMetricsDto;
};liveStream alanı mevcut LiveStreamResponseDto formatındadır ve whats-live-now response item formatıyla uyumludur. Bu endpoint bağlamında liveStream.role matched participant rolüne göre host veya guest olur.
Summary Metrics
| Field | Type | Description |
|---|---|---|
uniqueAudienceViewerCount | number | Yayını izleyen toplam tekil audience kullanıcı sayısı |
watchRevenueCreditsEarned | number | İstek atan kullanıcının yayının izlenmesinden kazandığı kredi |
giftRevenueCreditsEarned | number | İstek atan kullanıcının yayın boyunca gelen hediyelerden kazandığı kredi |
replayRentalRevenueCreditsEarned | number | İstek atan kullanıcının replay kiralamalarından kazandığı kredi |
totalCreditsEarned | number | watchRevenueCreditsEarned + giftRevenueCreditsEarned + replayRentalRevenueCreditsEarned |
chatMessagesCount | number | Yayında gönderilen toplam live stream chat mesajı sayısı |
streamDurationSeconds | number | Yayının toplam sürdüğü süre, saniye |
totalCreditsSpent | number | İstek atan kullanıcının bu yayında toplam harcadığı kredi. watchBillingCreditsSpent + giftCreditsSpent |
watchBillingCreditsSpent | number | İstek atan kullanıcının bu yayını izlemek için dakika bazlı ücretlendirmeden harcadığı kredi |
giftsSentCount | number | İstek atan kullanıcının bu yayında gönderdiği gift sayısı |
giftCreditsSpent | number | İstek atan kullanıcının bu yayında gift göndermek için harcadığı kredi |
replayRentalCount | number | Yayının başarılı replay kiralama sayısı |
Example Response
{
"isSuccess": true,
"statusCode": 200,
"data": {
"list": [
{
"liveStream": {
"id": "65f000000000000000000001",
"title": "Yayin basligi",
"liveStreamType": "duoself",
"channelName": "channel-name",
"broadcasters": [],
"guests": [],
"creator": {
"_id": "65f000000000000000000010",
"username": "creator",
"name": "Creator",
"surname": "User",
"profilePhoto": null
},
"thumbnailUrl": null,
"recording": true,
"recordingUrl": "https://cdn.example.com/replay.mp4",
"status": "ended",
"accessType": "paid",
"price": 10,
"interest": "music",
"durationGoal": null,
"motivation": null,
"isActiveReplayOnCreatorProfile": true,
"replayCreditPrice": 50,
"startedAt": "2026-05-11T10:00:00.000Z",
"plannedStartDate": null,
"endedAt": "2026-05-11T11:30:00.000Z",
"plannedEndDate": null,
"createdAt": "2026-05-11T09:55:00.000Z",
"updatedAt": "2026-05-11T11:30:00.000Z",
"fundingGoal": null,
"collectedFunding": null,
"fundingPercentage": null,
"role": "guest",
"miniCrowdFundings": []
},
"summary": {
"uniqueAudienceViewerCount": 25,
"watchRevenueCreditsEarned": 120,
"giftRevenueCreditsEarned": 64,
"replayRentalRevenueCreditsEarned": 40,
"totalCreditsEarned": 224,
"chatMessagesCount": 128,
"streamDurationSeconds": 5400,
"totalCreditsSpent": 25,
"watchBillingCreditsSpent": 10,
"giftsSentCount": 3,
"giftCreditsSpent": 15,
"replayRentalCount": 5
}
}
],
"pagination": {
"currentPage": 1,
"itemsPerPage": 10,
"totalItems": 1,
"totalPages": 1,
"hasNextPage": false,
"hasPrevPage": false
}
},
"errors": [],
"timestamp": "2026-05-14T12:00:00.000Z"
}Data Rules
- Sadece current user için çalışır.
- Sadece
Participant.role in ['host', 'guest']kayıtları dikkate alınır. - Sadece
LiveStream.status = endedyayınlar döner. - Soft-deleted live stream kayıtları dönmez.
- Aynı yayına birden fazla host/guest katılımı varsa liste itemı
liveStreamIdbazında tekilleştirilir. recordingUrl,recordingveyaisActiveReplayOnCreatorProfilefiltresi uygulanmaz.- Kullanıcı o yayında
audienceise bu endpointte yayın dönmez.
Metric Calculation
uniqueAudienceViewerCount
- Kaynak:
participants - Filtre:
role = audienceliveStreamId in pageStreamIds
- Hesap: yayın bazında distinct
userIdcount.
watchRevenueCreditsEarned
- Kaynak:
streambillingtransactions - Filtre:
userId = currentUserIdliveStreamId in pageStreamIdstransactionType = distributionstatus = completednotes in ['Gelir dağıtımı (guest ile)', 'Gelir dağıtımı (guest olarak)', 'Gelir dağıtımı (guest yok)']
- Hesap:
sum(amount)
giftRevenueCreditsEarned
- Kaynak:
streambillingtransactions - Filtre:
userId = currentUserIdliveStreamId in pageStreamIdstransactionType = distributionstatus = completednotes in ['Hediye geliri dağıtımı (guest ile)', 'Hediye geliri dağıtımı (guest olarak)', 'Hediye geliri dağıtımı (guest yok)']
- Hesap:
sum(amount)
replayRentalRevenueCreditsEarned
- Kaynak:
streambillingtransactions - Filtre:
userId = currentUserIdliveStreamId in pageStreamIdstransactionType = replay_rental_revenuestatus = completed
- Hesap:
sum(amount)
chatMessagesCount
- Kaynak:
streamchatmessages - Filtre:
streamId in pageStreamIds - Hesap:
count(*)
streamDurationSeconds
- Kaynak:
livestreams - Hesap:
endedAt - startedAttotalCreditsSpent
- Kaynaklar:
streambillingtransactions: current user için completedchargetransaction toplamıgifts: current user'ın gönderdiği gift credit toplamı
- Hesap:
watchBillingCreditsSpent + giftCreditsSpentgiftsSentCount ve giftCreditsSpent
- Kaynak:
gifts - Filtre:
metadata.senderUserId = currentUserIdmetadata.liveStreamId in pageStreamIds
- Hesap:
giftsSentCount = count(*)giftCreditsSpent = sum(metadata.creditAmount)
replayRentalCount
- Kaynak:
streambillingtransactions - Filtre:
liveStreamId in pageStreamIdstransactionType = replay_rental_chargestatus = completed
- Hesap:
count(*)
Backend Implementation Map
- Controller:
src/live-stream/live-stream.controller.ts - DTO:
src/live-stream/dto/my-broadcasted-live-stream-summary-response.dto.ts - Use-case:
src/live-stream/use-cases/get-my-broadcasted-live-stream-summaries.usecase.ts - Swagger decorator:
src/live-stream/decorators/api-get-my-live-stream-history.decorator.ts - Tests:
src/live-stream/use-cases/get-my-broadcasted-live-stream-summaries.usecase.spec.tssrc/live-stream/live-stream.controller.auth.spec.tssrc/live-stream/live-stream.controller.versioning.spec.ts
Indexes
Endpoint metrikleri için kullanılan indexler:
StreamBillingTransactionSchema.index({
userId: 1,
liveStreamId: 1,
transactionType: 1,
status: 1,
});
StreamBillingTransactionSchema.index({
liveStreamId: 1,
transactionType: 1,
status: 1,
});
GiftSchema.index({
'metadata.senderUserId': 1,
'metadata.liveStreamId': 1,
timestamp: -1,
});
StreamChatMessageSchema.index({ senderId: 1, streamId: 1, createdAt: -1 });