From e9017498a0bd87e2a5ae457c00f9ddee35809c29 Mon Sep 17 00:00:00 2001 From: crupest Date: Sat, 15 May 2021 16:01:21 +0800 Subject: feat: Timeline post change notification with signalr. --- BackEnd/Timeline/SignalRHub/TimelineHub.cs | 58 ++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 BackEnd/Timeline/SignalRHub/TimelineHub.cs (limited to 'BackEnd/Timeline/SignalRHub/TimelineHub.cs') diff --git a/BackEnd/Timeline/SignalRHub/TimelineHub.cs b/BackEnd/Timeline/SignalRHub/TimelineHub.cs new file mode 100644 index 00000000..2ad7bd66 --- /dev/null +++ b/BackEnd/Timeline/SignalRHub/TimelineHub.cs @@ -0,0 +1,58 @@ +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using System; +using System.Threading.Tasks; +using Timeline.Auth; +using Timeline.Services; +using Timeline.Services.Timeline; +using Timeline.Services.User; + +namespace Timeline.SignalRHub +{ + public class TimelineHub : Hub + { + private readonly ILogger _logger; + private readonly ITimelineService _timelineService; + + public TimelineHub(ILogger logger, ITimelineService timelineService) + { + _logger = logger; + _timelineService = timelineService; + } + + public static string GenerateTimelinePostChangeListeningGroupName(string timelineName) + { + return $"timeline-post-change-{timelineName}"; + } + + public async Task SubscribeTimelinePostChange(string timelineName) + { + try + { + var timelineId = await _timelineService.GetTimelineIdByNameAsync(timelineName); + var user = Context.User; + if (!user.HasPermission(UserPermission.AllTimelineManagement) && !await _timelineService.HasReadPermissionAsync(timelineId, user.GetOptionalUserId())) + throw new HubException("Forbidden."); + + var group = GenerateTimelinePostChangeListeningGroupName(timelineName); + await Groups.AddToGroupAsync(Context.ConnectionId, group); + _logger.LogInformation("Add connection {0} to group {1}", Context.ConnectionId, group); + } + catch (ArgumentException) + { + throw new HubException("Timeline name is illegal."); + } + catch (EntityNotExistException) + { + throw new HubException("Timeline not exist."); + } + } + + public async Task UnsubscribeTimelinePostChange(string timelineName) + { + var group = GenerateTimelinePostChangeListeningGroupName(timelineName); + await Groups.RemoveFromGroupAsync(Context.ConnectionId, group); + _logger.LogInformation("Remove connection {0} from group {1}", Context.ConnectionId, group); + } + } +} -- cgit v1.2.3