149 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using DysonNetwork.Ring.Connection;
 | 
						|
using DysonNetwork.Ring.Notification;
 | 
						|
using DysonNetwork.Shared.Models;
 | 
						|
using DysonNetwork.Shared.Proto;
 | 
						|
using Google.Protobuf.WellKnownTypes;
 | 
						|
using Grpc.Core;
 | 
						|
 | 
						|
namespace DysonNetwork.Ring.Services;
 | 
						|
 | 
						|
public class RingServiceGrpc(
 | 
						|
    QueueService queueService,
 | 
						|
    WebSocketService websocket,
 | 
						|
    PushService pushService
 | 
						|
) : RingService.RingServiceBase
 | 
						|
{
 | 
						|
    public override async Task<Empty> SendEmail(SendEmailRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        await queueService.EnqueueEmail(
 | 
						|
            request.Email.ToName,
 | 
						|
            request.Email.ToAddress,
 | 
						|
            request.Email.Subject,
 | 
						|
            request.Email.Body
 | 
						|
        );
 | 
						|
        return new Empty();
 | 
						|
    }
 | 
						|
 | 
						|
    public override Task<Empty> PushWebSocketPacket(PushWebSocketPacketRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        var packet = Shared.Models.WebSocketPacket.FromProtoValue(request.Packet);
 | 
						|
 | 
						|
        WebSocketService.SendPacketToAccount(Guid.Parse(request.UserId), packet);
 | 
						|
        return Task.FromResult(new Empty());
 | 
						|
    }
 | 
						|
 | 
						|
    public override Task<Empty> PushWebSocketPacketToUsers(PushWebSocketPacketToUsersRequest request,
 | 
						|
        ServerCallContext context)
 | 
						|
    {
 | 
						|
        var packet = Shared.Models.WebSocketPacket.FromProtoValue(request.Packet);
 | 
						|
 | 
						|
        foreach (var accountId in request.UserIds)
 | 
						|
            WebSocketService.SendPacketToAccount(Guid.Parse(accountId), packet);
 | 
						|
 | 
						|
        return Task.FromResult(new Empty());
 | 
						|
    }
 | 
						|
 | 
						|
    public override Task<Empty> PushWebSocketPacketToDevice(PushWebSocketPacketToDeviceRequest request,
 | 
						|
            ServerCallContext context)
 | 
						|
    {
 | 
						|
        var packet = Shared.Models.WebSocketPacket.FromProtoValue(request.Packet);
 | 
						|
 | 
						|
        websocket.SendPacketToDevice(request.DeviceId, packet);
 | 
						|
        return Task.FromResult(new Empty());
 | 
						|
    }
 | 
						|
 | 
						|
    public override Task<Empty> PushWebSocketPacketToDevices(PushWebSocketPacketToDevicesRequest request,
 | 
						|
        ServerCallContext context)
 | 
						|
    {
 | 
						|
        var packet = Shared.Models.WebSocketPacket.FromProtoValue(request.Packet);
 | 
						|
 | 
						|
        foreach (var deviceId in request.DeviceIds)
 | 
						|
            websocket.SendPacketToDevice(deviceId, packet);
 | 
						|
 | 
						|
        return Task.FromResult(new Empty());
 | 
						|
    }
 | 
						|
 | 
						|
    public override async Task<Empty> SendPushNotificationToUser(SendPushNotificationToUserRequest request,
 | 
						|
        ServerCallContext context)
 | 
						|
    {
 | 
						|
        var notification = new SnNotification
 | 
						|
        {
 | 
						|
            Topic = request.Notification.Topic,
 | 
						|
            Title = request.Notification.Title,
 | 
						|
            Subtitle = request.Notification.Subtitle,
 | 
						|
            Content = request.Notification.Body,
 | 
						|
            Meta = request.Notification.HasMeta
 | 
						|
                ? GrpcTypeHelper.ConvertByteStringToObject<Dictionary<string, object?>>(request.Notification.Meta) ?? []
 | 
						|
                : [],
 | 
						|
            AccountId = Guid.Parse(request.UserId),
 | 
						|
        };
 | 
						|
 | 
						|
        if (request.Notification.ActionUri is not null)
 | 
						|
            notification.Meta["action_uri"] = request.Notification.ActionUri;
 | 
						|
 | 
						|
        if (request.Notification.IsSavable)
 | 
						|
            await pushService.SaveNotification(notification);
 | 
						|
 | 
						|
        await queueService.EnqueuePushNotification(
 | 
						|
            notification,
 | 
						|
            Guid.Parse(request.UserId),
 | 
						|
            request.Notification.IsSavable
 | 
						|
        );
 | 
						|
 | 
						|
        return new Empty();
 | 
						|
    }
 | 
						|
 | 
						|
    public override async Task<Empty> SendPushNotificationToUsers(SendPushNotificationToUsersRequest request,
 | 
						|
        ServerCallContext context)
 | 
						|
    {
 | 
						|
        var notification = new SnNotification
 | 
						|
        {
 | 
						|
            Topic = request.Notification.Topic,
 | 
						|
            Title = request.Notification.Title,
 | 
						|
            Subtitle = request.Notification.Subtitle,
 | 
						|
            Content = request.Notification.Body,
 | 
						|
            Meta = request.Notification.HasMeta
 | 
						|
                ? GrpcTypeHelper.ConvertByteStringToObject<Dictionary<string, object?>>(request.Notification.Meta) ?? []
 | 
						|
                : [],
 | 
						|
        };
 | 
						|
 | 
						|
        if (request.Notification.ActionUri is not null)
 | 
						|
            notification.Meta["action_uri"] = request.Notification.ActionUri;
 | 
						|
 | 
						|
        var userIds = request.UserIds.Select(Guid.Parse).ToList();
 | 
						|
        if (request.Notification.IsSavable)
 | 
						|
            await pushService.SaveNotification(notification, userIds);
 | 
						|
 | 
						|
        var tasks = userIds
 | 
						|
            .Select(userId => queueService.EnqueuePushNotification(
 | 
						|
                notification,
 | 
						|
                userId,
 | 
						|
                request.Notification.IsSavable
 | 
						|
            ));
 | 
						|
 | 
						|
        await Task.WhenAll(tasks);
 | 
						|
        return new Empty();
 | 
						|
    }
 | 
						|
 | 
						|
    public override async Task<Empty> UnsubscribePushNotifications(UnsubscribePushNotificationsRequest request,
 | 
						|
        ServerCallContext context)
 | 
						|
    {
 | 
						|
        await pushService.UnsubscribeDevice(request.DeviceId);
 | 
						|
        return new Empty();
 | 
						|
    }
 | 
						|
 | 
						|
    public override Task<GetWebsocketConnectionStatusResponse> GetWebsocketConnectionStatus(
 | 
						|
        GetWebsocketConnectionStatusRequest request, ServerCallContext context)
 | 
						|
    {
 | 
						|
        var isConnected = request.IdCase switch
 | 
						|
        {
 | 
						|
            GetWebsocketConnectionStatusRequest.IdOneofCase.DeviceId =>
 | 
						|
                WebSocketService.GetDeviceIsConnected(request.DeviceId),
 | 
						|
            GetWebsocketConnectionStatusRequest.IdOneofCase.UserId => WebSocketService.GetAccountIsConnected(Guid.Parse(request.UserId)),
 | 
						|
            _ => false
 | 
						|
        };
 | 
						|
 | 
						|
        return Task.FromResult(new GetWebsocketConnectionStatusResponse { IsConnected = isConnected });
 | 
						|
    }
 | 
						|
}
 |