コード例 #1
0
        public async Task <ActionResult> ClearHeros([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req, CancellationToken cancellationToken)
        {
            var database  = cosmosClient.GetDatabase("Heros");
            var container = database.GetContainer("Heros");
            var iterator  = container.GetItemLinqQueryable <Hero>(requestOptions: new QueryRequestOptions()
            {
                MaxItemCount = Max_Page_Size
            }).ToFeedIterator();
            var hub = await StaticServiceHubContextStore.Get().GetAsync(nameof(HerosHub));

            while (iterator.HasMoreResults)
            {
                var resultSet = await iterator.ReadNextAsync(cancellationToken);

                var deletions = new List <Hero>();
                foreach (var item in resultSet)
                {
                    deletions.Add(item);
                    await container.DeleteItemAsync <Hero>(item.Id, new Microsoft.Azure.Cosmos.PartitionKey(item.Race), cancellationToken : cancellationToken);

                    await Task.Delay(150);
                }

                await hub.Clients.All.SendAsync("herosStream", new ChangeSet <Hero, string>(deletions.Select(z => new Change <Hero, string>(ChangeReason.Remove, z.Id, z))), cancellationToken);
            }


            return(new OkResult());
        }
コード例 #2
0
        public async Task <ActionResult <IEnumerable <Hero> > > ImportHeros([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req, CancellationToken cancellationToken)
        {
            var container = cosmosClient.GetDatabase("Heros").GetContainer("Heros");
            var ids       = req.Query["id"].SelectMany(z => z.Split(','));

            var heros = await GetHeros(cancellationToken);

            var client  = httpClientFactory.CreateClient("SuperHeroApi");
            var records = new List <Hero>();

            foreach (var id in ids)
            {
                Hero parent = null;
                if (heros.Count > 0)
                {
                    parent = faker.PickRandom(heros).OrNull(faker, 0.1f);
                }
                records.Add(await GenerateHero(container, client, id, parent?.Id, cancellationToken));
            }

            var hub = await StaticServiceHubContextStore.Get().GetAsync(nameof(HerosHub));

            await hub.Clients.All.SendAsync(
                "herosStream",
                new ChangeSet <Hero, string>(
                    records.Select(hero => new Change <Hero, string>(ChangeReason.Add, hero.Id, hero))
                    ),
                cancellationToken
                );

            return(new OkObjectResult(records));
        }
コード例 #3
0
        public async Task <ActionResult <IEnumerable <Hero> > > RandomHeros([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req, CancellationToken cancellationToken)
        {
            var container = cosmosClient.GetDatabase("Heros").GetContainer("Heros");
            var count     = req.Query["count"];
            var client    = httpClientFactory.CreateClient("SuperHeroApi");
            var records   = new List <Hero>();
            var heros     = await GetHeros(cancellationToken);

            foreach (var id in Enumerable.Range(0, int.Parse(count)).Select(_ => faker.Random.Number(1, 731)))
            {
                Hero parent = null;
                if (heros.Count > 0)
                {
                    parent = faker.PickRandom(heros).OrNull(faker, 0.1f);
                }
                records.Add(await GenerateHero(container, client, id.ToString(), parent?.Id, cancellationToken));
            }

            var hub = await StaticServiceHubContextStore.Get().GetAsync(nameof(HerosHub));

            foreach (var items in records.Buffer(Max_Page_Size))
            {
                await hub.Clients.All.SendAsync(
                    "herosStream",
                    new ChangeSet <Hero, string>(items.Select(hero => new Change <Hero, string>(ChangeReason.Add, hero.Id, hero))),
                    cancellationToken
                    );

                await Task.Delay(400); // simulate a delay for effect!
            }

            return(new OkObjectResult(records));
        }
コード例 #4
0
        public async Task <IActionResult> UpdateHero([HttpTrigger(AuthorizationLevel.Anonymous, "post")] Hero hero, CancellationToken cancellationToken)
        {
            var container = cosmosClient.GetDatabase("Heros").GetContainer("Heros");

            hero.Updated = DateTimeOffset.Now.ToString("u");


            var originalHero = (await container.GetItemLinqQueryable <Hero>(requestOptions: new QueryRequestOptions()
            {
                MaxItemCount = Max_Page_Size
            })
                                .Where(z => z.Id == hero.Id)
                                .ToFeedIterator()
                                .ReadNextAsync(cancellationToken))?.SingleOrDefault();

            var result = await container.UpsertItemAsync(hero, cancellationToken : cancellationToken);

            var hub = await StaticServiceHubContextStore.Get().GetAsync(nameof(HerosHub));

            await hub.Clients.All.SendAsync(
                "herosStream",
                new ChangeSet <Hero, string>() { new Change <Hero, string>(ChangeReason.Update, result.Resource.Id, result.Resource, originalHero) },
                cancellationToken
                );

            return(new OkObjectResult(result.Resource));
        }
コード例 #5
0
        public static async Task Broadcast(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req,
            [SignalR(HubName = "simplechat")] IAsyncCollector <SignalRMessage> signalRMessages)
        {
            var message           = new JsonSerializer().Deserialize <ChatMessage>(new JsonTextReader(new StreamReader(req.Body)));
            var serviceHubContext = await StaticServiceHubContextStore.GetOrAddAsync("simplechat");

            await serviceHubContext.Clients.All.SendAsync("newMessage", message);
        }
コード例 #6
0
        public async Task <IActionResult> DeleteHero(
            [HttpTrigger(AuthorizationLevel.Anonymous, "delete")] HttpRequest req,
            CancellationToken cancellationToken)
        {
            var container = cosmosClient.GetDatabase("Heros").GetContainer("Heros");
            var id        = req.Query["id"].ToString();
            var partition = req.Query["partition"].ToString();
            await container.DeleteItemAsync <Hero>(id, new Microsoft.Azure.Cosmos.PartitionKey(null), cancellationToken : cancellationToken);

            var hub = await StaticServiceHubContextStore.Get().GetAsync(nameof(HerosHub));

            await hub.Clients.All.SendAsync("herosStream", new ChangeSet <Hero, string>() { new Change <Hero, string>(ChangeReason.Remove, id, null) }, cancellationToken);

            return(new OkResult());
        }
コード例 #7
0
        public async Task <IActionResult> CreateHero([HttpTrigger(AuthorizationLevel.Anonymous, "post")] Hero hero, CancellationToken cancellationToken)
        {
            var container = cosmosClient.GetDatabase("Heros").GetContainer("Heros");

            hero.Id      = Guid.NewGuid().ToString();
            hero.Created = DateTimeOffset.Now.ToString("u");
            var result = await container.CreateItemAsync(hero, cancellationToken : cancellationToken);

            var hub = await StaticServiceHubContextStore.Get().GetAsync(nameof(HerosHub));

            await hub.Clients.All.SendAsync(
                "herosStream",
                new ChangeSet <Hero, string>() { new Change <Hero, string>(ChangeReason.Add, result.Resource.Id, result.Resource) },
                cancellationToken
                );

            return(new OkObjectResult(result.Resource));
        }