public async Task <PushSubscription> SubscribeAsync(string clientId, PushSubscription subscription) { Subscription stored = null; var client = await _db.ClientSet.FindAsync(clientId); if (client == null) { return(null); } // retrieve existing, if any stored = await _db.SubscriptionSet .Include(s => s.Client) .Where(i => i.ClientId == clientId && ((!string.IsNullOrEmpty(subscription.UserId) && i.UserId == subscription.UserId) || (string.IsNullOrEmpty(subscription.UserId) && i.P256Dh == subscription.P256Dh())) ) .FirstOrDefaultAsync(); // expired or disabled client? if (stored != null && ( !client.IsEnabled || (stored.Expires.HasValue == true && DateTimeOffset.FromUnixTimeMilliseconds(stored.Expires.Value) < DateTimeOffset.UtcNow) ) ) { // tidy up _db.Remove(stored); stored = null; } // client isn't enabled? if (!client.IsEnabled) { // tidy up already done, exit return(null); } // (re)new if (stored == null) { stored = _mapper.Map <Subscription>(subscription); stored.ClientId = clientId; await _db.AddAsync(stored); await _db.SaveChangesAsync(true); } // update (userId, basically) _mapper.Map(stored, subscription); return(subscription); }