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}"; }