using Application.Abstractions.Data;
namespace Application.Abstractions.Chat;
///
/// 방송 세션별 멤버 XP 랭킹 캐시.
/// ChatHub 에서 매 메시지마다 GROUP BY 로 전체 세션 스캔하던 비용을 회피하기 위해 Redis Sorted Set 으로 캐시.
/// TTL 만료 시 DB 에서 재시드 — TTL 동안의 stale 은 라이브 채팅 UX 상 허용.
///
public interface IChatLeaderboard
{
///
/// 세션 내 본인 점수와 본인보다 높은 점수자 수를 반환.
/// 캐시 미스 시 DB MemberExpLog GROUP BY 로 재구축 후 캐시.
/// 세션에 데이터 없거나 본인 항목 없으면 null.
///
Task<(int MyScore, int HigherCount)?> GetRankAsync(int sessionId, int memberId, IAppDbContext db, CancellationToken ct = default);
}