public async Task <HttpResponseMessage> Get(string id) { var thisOne = await hub.GetRegistrationAsync <RegistrationDescription>(id); if (thisOne == null) { return(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Could not find id")); } return(Request.CreateResponse(HttpStatusCode.OK, thisOne)); }
public async Task InitializeAsync() { NotificationHubClient client = NotificationHubClient.CreateClientFromConnectionString(options.HubConnection, options.HubName); var reg = await client.GetRegistrationAsync <RegistrationDescription>(endpoint.Endpoint); if (reg.Tags == null) { reg.Tags = new HashSet <string>() { config.Id }; } else { reg.Tags.Add(config.Id); } await client.UpdateRegistrationAsync(reg); }
private async Task <bool> VerifyTags(string channelUri, string installationId, NotificationHubClient nhClient) { IPrincipal user = this.User; int expectedTagsCount = 1; if (user.Identity != null && user.Identity.IsAuthenticated) { expectedTagsCount = 2; } string continuationToken = null; do { CollectionQueryResult <RegistrationDescription> regsForChannel = await nhClient.GetRegistrationsByChannelAsync(channelUri, continuationToken, 100); continuationToken = regsForChannel.ContinuationToken; foreach (RegistrationDescription reg in regsForChannel) { RegistrationDescription registration = await nhClient.GetRegistrationAsync <RegistrationDescription>(reg.RegistrationId); if (registration.Tags == null || registration.Tags.Count() < expectedTagsCount) { return(false); } if (!registration.Tags.Contains("$InstallationId:{" + installationId + "}")) { return(false); } ClaimsIdentity identity = user.Identity as ClaimsIdentity; Claim userIdClaim = identity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier); string userId = (userIdClaim != null) ? userIdClaim.Value : string.Empty; if (user.Identity != null && user.Identity.IsAuthenticated && !registration.Tags.Contains("_UserId:" + userId)) { return(false); } } } while (continuationToken != null); return(true); }
public async Task <IResult> DeleteSubscription(DeleteSubscriptionCommand command) { try { var registration = await _hubClient.GetRegistrationAsync <RegistrationDescription>(command.RegistrationId); if (registration == null) { return(new FailedResult()); } await _hubClient.DeleteRegistrationAsync(command.RegistrationId); return(new SuccessfulResult()); } catch (Exception exception) { _logger.LogError($"{nameof(DeleteSubscription)}: {exception}"); return(new FailedResult()); } }
private async Task<bool> VerifyTags(string channelUri, string installationId, NotificationHubClient nhClient) { IPrincipal user = this.User; int expectedTagsCount = 1; if (user.Identity != null && user.Identity.IsAuthenticated) { expectedTagsCount = 2; } string continuationToken = null; do { CollectionQueryResult<RegistrationDescription> regsForChannel = await nhClient.GetRegistrationsByChannelAsync(channelUri, continuationToken, 100); continuationToken = regsForChannel.ContinuationToken; foreach (RegistrationDescription reg in regsForChannel) { RegistrationDescription registration = await nhClient.GetRegistrationAsync<RegistrationDescription>(reg.RegistrationId); if (registration.Tags == null || registration.Tags.Count() != expectedTagsCount) { return false; } if (!registration.Tags.Contains("$InstallationId:{" + installationId + "}")) { return false; } ClaimsIdentity identity = user.Identity as ClaimsIdentity; Claim userIdClaim = identity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier); string userId = (userIdClaim != null) ? userIdClaim.Value : string.Empty; if (expectedTagsCount > 1 && !registration.Tags.Contains("_UserId:" + userId)) { return false; } } } while (continuationToken != null); return true; }
/// <summary> /// CSV 形式でアップロードされたファイルを元に登録情報の追加、更新を行います /// </summary> public async Task <HttpResponseMessage> Post() { // マルチパート以外の場合には拒否 if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } // マルチパートデータを読み込む var provider = await Request.Content.ReadAsMultipartAsync(); var content = provider.Contents.FirstOrDefault(p => p.Headers.ContentDisposition.Name == "\"csv\""); // ファイルが見つからない場合にはエラー if (content == null) { throw new HttpResponseException(HttpStatusCode.BadRequest); } RegistrationModel[] records; try { // CSV としてファイルを解析する var csvData = await content.ReadAsStringAsync(); var reader = new StringReader(csvData); var csvReader = new CsvReader(reader); csvReader.Configuration.RegisterClassMap <RegistrationModelMap>(); records = csvReader.GetRecords <RegistrationModel>().ToArray(); } catch (Exception ex) { return(Failure(ex.Message)); } // 予め登録済みのデータがあるかを非同期で一括取得する var registrations = (await Task.WhenAll(records.Where(p => !string.IsNullOrEmpty(p.RegistrationId)).Select(p => _client.GetRegistrationAsync <RegistrationDescription>(p.RegistrationId)))).Where(p => p != null).ToArray(); long insert = 0, update = 0; var targets = new List <RegistrationDescription>(); // 1 レコードごとに追加なのか、更新なのか RegistrationId の有無で処理を行う foreach (var record in records) { var registration = registrations.FirstOrDefault(p => p.RegistrationId == record.RegistrationId); if (registration == null) { switch (record.Platform) { case Platforms.Windows: registration = new WindowsRegistrationDescription(record.Handle); break; case Platforms.WindowsPhone: registration = new MpnsRegistrationDescription(record.Handle); break; case Platforms.Apple: registration = new AppleRegistrationDescription(record.Handle); break; case Platforms.Android: registration = new GcmRegistrationDescription(record.Handle); break; default: throw new HttpResponseException(HttpStatusCode.BadRequest); } registration.RegistrationId = await _client.CreateRegistrationIdAsync(); insert += 1; } else { switch (record.Platform) { case Platforms.Windows: ((WindowsRegistrationDescription)registration).ChannelUri = new Uri(record.Handle); break; case Platforms.WindowsPhone: ((MpnsRegistrationDescription)registration).ChannelUri = new Uri(record.Handle); break; case Platforms.Apple: ((AppleRegistrationDescription)registration).DeviceToken = record.Handle; break; case Platforms.Android: ((GcmRegistrationDescription)registration).GcmRegistrationId = record.Handle; break; default: throw new HttpResponseException(HttpStatusCode.BadRequest); } update += 1; } registration.Tags = record.Tags; targets.Add(registration); } try { // 処理対象を非同期で一括処理する await Task.WhenAll(targets.Select(p => _client.CreateOrUpdateRegistrationAsync(p))); } catch (Exception ex) { return(Failure(ex.Message)); } // 処理結果を返却 return(Success(string.Format("Imported from CSV : Insert {0}, Update {1}, Total {2}", insert, update, insert + update))); }
/// <summary> /// Get the registration for an app instance /// </summary> /// <param name="hubClient">Notification hub client for this app</param> /// <param name="hubRegistrationId">Hub registration id for this app instance</param> /// <returns>Registration description for the app instance</returns> protected override async Task <RegistrationDescription> GetRegistrationAsync(NotificationHubClient hubClient, string hubRegistrationId) { return(await hubClient.GetRegistrationAsync <AppleRegistrationDescription>(hubRegistrationId)); }
// PUT api/register/5 // This creates or updates a registration (with provided channelURI) at the specified id public async Task <HttpResponseMessage> Put() { string value = await Request.Content.ReadAsStringAsync(); var entidad = System.Web.Helpers.Json.Decode(value); string id = entidad.idhubazure; string[] tag = Convert.ToString(entidad.tag).Split(','); DeviceRegistration deviceUpdate = new DeviceRegistration() { Platform = entidad.platform, Handle = entidad.key, Tags = tag }; RegistrationDescription registration = null; switch (deviceUpdate.Platform) { case "mpns": registration = new MpnsRegistrationDescription(deviceUpdate.Handle); break; case "wns": registration = new WindowsRegistrationDescription(deviceUpdate.Handle); break; case "apns": registration = new AppleRegistrationDescription(deviceUpdate.Handle); break; case "gcm": registration = new GcmRegistrationDescription(deviceUpdate.Handle); break; default: throw new HttpResponseException(HttpStatusCode.BadRequest); } //registration.RegistrationId = id; var username = HttpContext.Current.User.Identity.Name; registration = await hub.GetRegistrationAsync <RegistrationDescription>(entidad.idhubazure); registration.Tags = new HashSet <string>(); registration.Tags.Add("username:"******" ", "").Trim(); registration.Tags.Add(tagString); } try { await hub.CreateOrUpdateRegistrationAsync(registration); } catch (MessagingException e) { ReturnGoneIfHubResponseIsGone(e); } return(Request.CreateResponse(HttpStatusCode.OK)); }
public async Task DeleteRegistrationAsync_DeleteAppleNativeRegistration_RegistrationIsDeleted() { LoadMockData(); await DeleteAllRegistrationsAndInstallations(); var registration = new AppleRegistrationDescription(_configuration["AppleDeviceToken"]); var createdRegistration = await _hubClient.CreateRegistrationAsync(registration); await _hubClient.DeleteRegistrationAsync(createdRegistration); await Assert.ThrowsAsync <MessagingEntityNotFoundException>(async() => await _hubClient.GetRegistrationAsync <AppleRegistrationDescription>(createdRegistration.RegistrationId)); RecordTestResults(); }
// Private async method that performs the actual registration, // since we can't return Task<T> from a service operation. private async Task <string> RegisterForPushNotificationsAsync( Registration clientRegistration) { // If the client gave us a registration ID, use it to try and get the registration. RegistrationDescription currentRegistration = null; if (!string.IsNullOrEmpty(clientRegistration.RegistrationId)) { // Try to get the current registration by ID. currentRegistration = await hubClient.GetRegistrationAsync <RegistrationDescription>( clientRegistration.RegistrationId); } // Update a current registration. if (currentRegistration != null) { // Update the current set of tags. foreach (string tag in clientRegistration.Tags) { if (!currentRegistration.Tags.Contains(tag)) { currentRegistration.Tags.Add(tag); } } // We need to update each platform separately. switch (clientRegistration.Platform) { case "windows": case "win8": // In the Windows Store case we need to delete and recreate the // registration because there's no way to change from a toast template // to a native raw notification. await DeleteRegistrationsAsync(currentRegistration.RegistrationId); clientRegistration.RegistrationId = await createWindowsRegistration(clientRegistration, currentRegistration.Tags); break; case "wp": case "windowsphone": await DeleteRegistrationsAsync(currentRegistration.RegistrationId); clientRegistration.RegistrationId = await createWindowsRegistration(clientRegistration, currentRegistration.Tags); break; case "ios": var iosReg = currentRegistration as AppleRegistrationDescription; // Update tags and device token. iosReg.DeviceToken = clientRegistration.DeviceToken; clientRegistration.RegistrationId = (await hubClient.UpdateRegistrationAsync(iosReg)).RegistrationId; break; } } // Create a new registration. else { // Create an ISet<T> of the supplied tags. HashSet <string> tags = new HashSet <string>(clientRegistration.Tags); // We need to create each platform separately. switch (clientRegistration.Platform) { case "windows": case "win8": // Call the method that creates Windows Store registrations. clientRegistration.RegistrationId = await createWindowsRegistration(clientRegistration, tags); break; case "ios": var template = @"{""aps"":{""alert"":""$(message)""}, ""inAppMessage"":""$(message)""}"; clientRegistration.RegistrationId = (await hubClient.CreateAppleTemplateRegistrationAsync( clientRegistration.DeviceToken, template, tags)).RegistrationId; break; default: throw new DataServiceException("Unsupported client platform."); } } return(clientRegistration.RegistrationId); }
public async Task <RegistrationDescription> Get(string id) { var registrationDescription = await _hub.GetRegistrationAsync <RegistrationDescription>(id); return(registrationDescription); }
public async Task <ActionResult> Update([FromBody] SurveyGroup surveyGroup) { try { var username = string.Empty; if (HttpContext.User.Identity is ClaimsIdentity identity) { username = identity.FindFirst(ClaimTypes.Name).Value; } var existingGroup = await _db.SurveyGroups.Include(group => group.ApplicationUsers).Where(group => group.Id == surveyGroup.Id).FirstOrDefaultAsync(); existingGroup.GroupName = surveyGroup.GroupName; // update associated users var users = _db.Users.Where(user => surveyGroup.ApplicationUserIds.Contains(user.Id)).ToList(); // remove users which have been removed from the group List <ApplicationUser> usersToRemove = new List <ApplicationUser>(); foreach (var user in existingGroup.ApplicationUsers) { if (!surveyGroup.ApplicationUserIds.Contains(user.Id)) { usersToRemove.Add(user); } } usersToRemove.ForEach(user => existingGroup.ApplicationUsers.Remove(user)); foreach (var user in usersToRemove) { if (!string.IsNullOrEmpty(user.RegistrationId)) { var registrationDescription = await _hub.GetRegistrationAsync <RegistrationDescription>(user.RegistrationId); if (registrationDescription.Tags.Contains($"group:{existingGroup.GroupName.Replace(' ', '-')}")) { registrationDescription.Tags.Remove($"group:{existingGroup.GroupName.Replace(' ', '-')}"); await _hub.CreateOrUpdateRegistrationAsync(registrationDescription); } } } // users to add foreach (var user in users) { if (existingGroup.ApplicationUsers.Where(usr => usr.Id == user.Id).Count() == 0) { existingGroup.ApplicationUsers.Add(user); } } foreach (var user in existingGroup.ApplicationUsers) { if (!string.IsNullOrEmpty(user.RegistrationId)) { var registrationDescription = await _hub.GetRegistrationAsync <RegistrationDescription>(user.RegistrationId); if (!registrationDescription.Tags.Contains($"group:{existingGroup.GroupName.Replace(' ','-')}")) { registrationDescription.Tags.Add($"group:{existingGroup.GroupName.Replace(' ', '-')}"); await _hub.CreateOrUpdateRegistrationAsync(registrationDescription); } } } _db.Entry(existingGroup).State = EntityState.Modified; await _db.SaveChangesAsync(); return(Ok(existingGroup)); } catch (Exception) { return(BadRequest()); } }