dbd90ee52a
Player-service play-session tracker (floor + 3-bucket classify), SharePopover share tracker with debounce, sendBeacon interop, proxied rate-limited POST api/event/{play,share}, append-only event logs + incremental play_counter with server-side release resolution. Migration authored, not applied. No anonId, no read surface.
24 lines
1.3 KiB
C#
24 lines
1.3 KiB
C#
using DeepDrftModels.Enums;
|
|
using NetBlocks.Models;
|
|
|
|
namespace DeepDrftData;
|
|
|
|
/// <summary>
|
|
/// SQL-side anonymous telemetry service (Phase 16). Records play and share events to the append-only
|
|
/// logs and maintains the incremental play-counter rollup. The release dimension on a play is resolved
|
|
/// server-side from the track key (§2.3 / D4) — callers pass only what the client cheaply knows.
|
|
/// Returns NetBlocks <see cref="Result"/> at the boundary; the controller maps that to 202/4xx/5xx.
|
|
/// </summary>
|
|
public interface IEventService
|
|
{
|
|
/// <summary>
|
|
/// Record one play: append a <c>play_event</c> row (release resolved from the track key) and bump
|
|
/// the track's <c>play_counter</c> in the same transaction. A play of an unknown/removed track key
|
|
/// still logs (with a null release and no counter bump) rather than failing.
|
|
/// </summary>
|
|
Task<Result> RecordPlay(string trackEntryKey, PlayBucket bucket, string? anonId = null, CancellationToken cancellationToken = default);
|
|
|
|
/// <summary>Record one share: append a <c>share_event</c> row. Target and channel come straight from the client.</summary>
|
|
Task<Result> RecordShare(ShareTargetType targetType, string targetKey, ShareChannel channel, string? anonId = null, CancellationToken cancellationToken = default);
|
|
}
|