using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
using Volo.Abp.Security.Claims;
namespace Sozsoft.Platform.Notifications;
///
/// Bildirimlerin aninda duyuruldugu baglanti. Istemci yalnizca dinler; okundu/gosterildi
/// isaretleri REST ucundan gider, boylece yetki ve dogrulama tek yoldan gecer.
///
/// Kullanici ve kiraci bilgisi baglantinin claim'lerinden okunur: hub cagrilari HTTP ardisik
/// duzeni disinda calistigi icin AsyncLocal tabanli ICurrentUser her zaman dolu olmaz.
///
///
[Authorize]
public class NotificationHub : Hub
{
/// Istemcinin dinledigi olay adi; yeni bildirim uretildiginde tetiklenir.
public const string NotificationReceived = "NotificationReceived";
public override async Task OnConnectedAsync()
{
var (tenantId, userId) = GetConnectionIdentity();
if (userId.HasValue)
{
await Groups.AddToGroupAsync(Context.ConnectionId, UserGroupName(tenantId, userId.Value));
}
await base.OnConnectedAsync();
}
private (Guid? TenantId, Guid? UserId) GetConnectionIdentity()
{
var user = Context.User;
return (ParseGuid(user?.FindFirst(AbpClaimTypes.TenantId)?.Value),
ParseGuid(user?.FindFirst(AbpClaimTypes.UserId)?.Value));
}
private static Guid? ParseGuid(string? value) =>
Guid.TryParse(value, out var parsed) ? parsed : null;
/// Bildirimler kullanici bazlidir; grup adi kiraci ile birlikte anahtarlanir.
public static string UserGroupName(Guid? tenantId, Guid userId) =>
$"notification:user:{tenantId?.ToString("N") ?? "host"}:{userId:N}";
}