1
0
mirror of https://github.com/bitwarden/server.git synced 2024-11-22 12:15:36 +01:00

cleanup push sharp implementation for new model

This commit is contained in:
Kyle Spearrin 2017-05-30 00:02:20 -04:00
parent c4dee589cc
commit 72ac5c9f80
3 changed files with 84 additions and 74 deletions

View File

@ -0,0 +1,63 @@
using Bit.Core.Enums;
using Newtonsoft.Json;
using System;
namespace Bit.Core.Models
{
public class PayloadPushNotification
{
[JsonProperty(PropertyName = "data")]
public DataObj Data { get; set; }
public class DataObj
{
public DataObj(PushType type, string payload)
{
Type = type;
Payload = payload;
}
[JsonProperty(PropertyName = "type")]
public PushType Type { get; set; }
[JsonProperty(PropertyName = "payload")]
public string Payload { get; set; }
}
}
public class ApplePayloadPushNotification : PayloadPushNotification
{
[JsonProperty(PropertyName = "aps")]
public AppleData Aps { get; set; } = new AppleData { ContentAvailable = 1 };
public class AppleData
{
[JsonProperty(PropertyName = "badge")]
public dynamic Badge { get; set; } = null;
[JsonProperty(PropertyName = "alert")]
public string Alert { get; set; }
[JsonProperty(PropertyName = "content-available")]
public int ContentAvailable { get; set; }
}
}
public class SyncCipherPushNotification
{
public Guid Id { get; set; }
public Guid? UserId { get; set; }
public Guid? OrganizationId { get; set; }
public DateTime RevisionDate { get; set; }
}
public class SyncFolderPushNotification
{
public Guid Id { get; set; }
public Guid UserId { get; set; }
public DateTime RevisionDate { get; set; }
}
public class SyncUserPushNotification
{
public Guid UserId { get; set; }
public DateTime Date { get; set; }
}
}

View File

@ -6,6 +6,7 @@ using Bit.Core.Enums;
using Newtonsoft.Json;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Bit.Core.Models;
namespace Bit.Core.Services
{
@ -158,26 +159,5 @@ namespace Bit.Core.Services
{ "payload", JsonConvert.SerializeObject(payload) }
}, tag);
}
private class SyncCipherPushNotification
{
public Guid Id { get; set; }
public Guid? UserId { get; set; }
public Guid? OrganizationId { get; set; }
public DateTime RevisionDate { get; set; }
}
private class SyncFolderPushNotification
{
public Guid Id { get; set; }
public Guid UserId { get; set; }
public DateTime RevisionDate { get; set; }
}
private class SyncUserPushNotification
{
public Guid UserId { get; set; }
public DateTime Date { get; set; }
}
}
}

View File

@ -15,6 +15,7 @@ using Microsoft.Extensions.Logging;
using System.Diagnostics;
using Bit.Core.Utilities;
using Microsoft.AspNetCore.Http;
using Bit.Core.Models;
namespace Bit.Core.Services
{
@ -89,12 +90,10 @@ namespace Bit.Core.Services
var message = new SyncCipherPushNotification
{
Type = type,
Id = cipher.Id,
UserId = cipher.UserId,
OrganizationId = cipher.OrganizationId,
RevisionDate = cipher.RevisionDate,
Aps = new PushNotification.AppleData { ContentAvailable = 1 }
RevisionDate = cipher.RevisionDate
};
var excludedTokens = new List<string>();
@ -105,18 +104,16 @@ namespace Bit.Core.Services
excludedTokens.Add(currentContext.DeviceIdentifier);
}
await PushToAllUserDevicesAsync(cipher.UserId.Value, JObject.FromObject(message), excludedTokens);
await PushToAllUserDevicesAsync(cipher.UserId.Value, type, message, excludedTokens);
}
private async Task PushFolderAsync(Folder folder, PushType type)
{
var message = new SyncFolderPushNotification
{
Type = type,
Id = folder.Id,
UserId = folder.UserId,
RevisionDate = folder.RevisionDate,
Aps = new PushNotification.AppleData { ContentAvailable = 1 }
RevisionDate = folder.RevisionDate
};
var excludedTokens = new List<string>();
@ -127,7 +124,7 @@ namespace Bit.Core.Services
excludedTokens.Add(currentContext.DeviceIdentifier);
}
await PushToAllUserDevicesAsync(folder.UserId, JObject.FromObject(message), excludedTokens);
await PushToAllUserDevicesAsync(folder.UserId, type, message, excludedTokens);
}
public async Task PushSyncCiphersAsync(Guid userId)
@ -154,13 +151,11 @@ namespace Bit.Core.Services
{
var message = new SyncUserPushNotification
{
Type = type,
UserId = userId,
Date = DateTime.UtcNow,
Aps = new PushNotification.AppleData { ContentAvailable = 1 }
Date = DateTime.UtcNow
};
await PushToAllUserDevicesAsync(userId, JObject.FromObject(message), null);
await PushToAllUserDevicesAsync(userId, type, message, null);
}
private void InitGcmBroker(GlobalSettings globalSettings)
@ -310,7 +305,7 @@ namespace Bit.Core.Services
// timestamp is the time the token was reported as expired
}
private async Task PushToAllUserDevicesAsync(Guid userId, JObject message, IEnumerable<string> tokensToSkip)
private async Task PushToAllUserDevicesAsync(Guid userId, PushType type, object message, IEnumerable<string> tokensToSkip)
{
var devices = (await _deviceRepository.GetManyByUserIdAsync(userId))
.Where(d => !string.IsNullOrWhiteSpace(d.PushToken) && (!tokensToSkip?.Contains(d.PushToken) ?? true));
@ -321,13 +316,20 @@ namespace Bit.Core.Services
if(_apnsBroker != null)
{
var appleNotification = new ApplePayloadPushNotification
{
Data = new PayloadPushNotification.DataObj(type, JsonConvert.SerializeObject(message))
};
var obj = JObject.FromObject(appleNotification);
// Send to each iOS device
foreach(var device in devices.Where(d => d.Type == DeviceType.iOS))
{
_apnsBroker.QueueNotification(new ApnsNotification
{
DeviceToken = device.PushToken,
Payload = message
Payload = obj
});
}
}
@ -336,50 +338,15 @@ namespace Bit.Core.Services
var androidDevices = devices.Where(d => d.Type == DeviceType.Android);
if(_gcmBroker != null && androidDevices.Count() > 0)
{
var gcmData = new PayloadPushNotification.DataObj(type, JsonConvert.SerializeObject(message));
var obj = JObject.FromObject(gcmData);
_gcmBroker.QueueNotification(new GcmNotification
{
RegistrationIds = androidDevices.Select(d => d.PushToken).ToList(),
Data = message
Data = obj
});
}
}
private class PushNotification
{
public PushType Type { get; set; }
[JsonProperty(PropertyName = "aps")]
public AppleData Aps { get; set; }
public class AppleData
{
[JsonProperty(PropertyName = "badge")]
public dynamic Badge { get; set; } = null;
[JsonProperty(PropertyName = "alert")]
public string Alert { get; set; }
[JsonProperty(PropertyName = "content-available")]
public int ContentAvailable { get; set; }
}
}
private class SyncCipherPushNotification : PushNotification
{
public Guid Id { get; set; }
public Guid? UserId { get; set; }
public Guid? OrganizationId { get; set; }
public DateTime RevisionDate { get; set; }
}
private class SyncFolderPushNotification : PushNotification
{
public Guid Id { get; set; }
public Guid UserId { get; set; }
public DateTime RevisionDate { get; set; }
}
private class SyncUserPushNotification : PushNotification
{
public Guid UserId { get; set; }
public DateTime Date { get; set; }
}
}
}