Allmine API
Live Stream

Live Stream broadcasted summary

Yayıncı özet endpoint kontratı

Live Stream Broadcasted Summary Endpoint Spec

Endpoint

GET /api/v1/live-stream/my-broadcasted-stream-summaries

Kullanı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

ParamTypeDefaultMinMaxDescription
pagenumber11-Sayfa numarası
limitnumber101100Sayfa başına item sayısı

Örnek:

GET /api/v1/live-stream/my-broadcasted-stream-summaries?page=1&limit=10

Access 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

FieldTypeDescription
uniqueAudienceViewerCountnumberYayını izleyen toplam tekil audience kullanıcı sayısı
watchRevenueCreditsEarnednumberİstek atan kullanıcının yayının izlenmesinden kazandığı kredi
giftRevenueCreditsEarnednumberİstek atan kullanıcının yayın boyunca gelen hediyelerden kazandığı kredi
replayRentalRevenueCreditsEarnednumberİstek atan kullanıcının replay kiralamalarından kazandığı kredi
totalCreditsEarnednumberwatchRevenueCreditsEarned + giftRevenueCreditsEarned + replayRentalRevenueCreditsEarned
chatMessagesCountnumberYayında gönderilen toplam live stream chat mesajı sayısı
streamDurationSecondsnumberYayının toplam sürdüğü süre, saniye
totalCreditsSpentnumberİstek atan kullanıcının bu yayında toplam harcadığı kredi. watchBillingCreditsSpent + giftCreditsSpent
watchBillingCreditsSpentnumberİstek atan kullanıcının bu yayını izlemek için dakika bazlı ücretlendirmeden harcadığı kredi
giftsSentCountnumberİstek atan kullanıcının bu yayında gönderdiği gift sayısı
giftCreditsSpentnumberİstek atan kullanıcının bu yayında gift göndermek için harcadığı kredi
replayRentalCountnumberYayı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 = ended yayınlar döner.
  • Soft-deleted live stream kayıtları dönmez.
  • Aynı yayına birden fazla host/guest katılımı varsa liste itemı liveStreamId bazında tekilleştirilir.
  • recordingUrl, recording veya isActiveReplayOnCreatorProfile filtresi uygulanmaz.
  • Kullanıcı o yayında audience ise bu endpointte yayın dönmez.

Metric Calculation

uniqueAudienceViewerCount

  • Kaynak: participants
  • Filtre:
    • role = audience
    • liveStreamId in pageStreamIds
  • Hesap: yayın bazında distinct userId count.

watchRevenueCreditsEarned

  • Kaynak: streambillingtransactions
  • Filtre:
    • userId = currentUserId
    • liveStreamId in pageStreamIds
    • transactionType = distribution
    • status = completed
    • notes 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 = currentUserId
    • liveStreamId in pageStreamIds
    • transactionType = distribution
    • status = completed
    • notes 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 = currentUserId
    • liveStreamId in pageStreamIds
    • transactionType = replay_rental_revenue
    • status = completed
  • Hesap: sum(amount)

chatMessagesCount

  • Kaynak: streamchatmessages
  • Filtre: streamId in pageStreamIds
  • Hesap: count(*)

streamDurationSeconds

  • Kaynak: livestreams
  • Hesap:
endedAt - startedAt

totalCreditsSpent

  • Kaynaklar:
    • streambillingtransactions: current user için completed charge transaction toplamı
    • gifts: current user'ın gönderdiği gift credit toplamı
  • Hesap:
watchBillingCreditsSpent + giftCreditsSpent

giftsSentCount ve giftCreditsSpent

  • Kaynak: gifts
  • Filtre:
    • metadata.senderUserId = currentUserId
    • metadata.liveStreamId in pageStreamIds
  • Hesap:
    • giftsSentCount = count(*)
    • giftCreditsSpent = sum(metadata.creditAmount)

replayRentalCount

  • Kaynak: streambillingtransactions
  • Filtre:
    • liveStreamId in pageStreamIds
    • transactionType = replay_rental_charge
    • status = 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.ts
    • src/live-stream/live-stream.controller.auth.spec.ts
    • src/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 });

On this page