public async Task <IActionResult> UpdateBaseKit(
            [HttpTrigger(AuthorizationLevel.Anonymous, "put", Route = null)]
            HttpRequest req,
            [CosmosDB(databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
            DocumentClient client,
            ILogger log)
        {
            log.LogInformation($"Updating a base kit");
            var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);

            if (authorizationResult.Failed)
            {
                log.LogWarning(authorizationResult.FailureReason);
                return(new UnauthorizedResult());
            }

            if (!authorizationResult.IsInRole(Roles.Admin))
            {
                log.LogWarning($"User is not in the {Roles.Admin} role");
                return(new UnauthorizedResult());
            }

            var content = await new StreamReader(req.Body).ReadToEndAsync();
            var kit     = JsonConvert.DeserializeObject <BaseKit>(content);

            //verify existing document (not upserting as this is an update only function)
            var     baseKitUri  = UriFactory.CreateDocumentUri("2wr", "basekits", kit.Id);
            BaseKit existingKit = null;

            try
            {
                existingKit = (await client.ReadDocumentAsync <BaseKit>(baseKitUri, new RequestOptions {
                    PartitionKey = new PartitionKey(kit.Id)
                })).Document;
            }
            catch (DocumentClientException ex)
            {
                if (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
                {
                    log.LogWarning($"Base Kit: {kit.Id} not found.");
                    return(new BadRequestObjectResult("Base Kit not found."));
                }
            }

            if (kit.Items.Count > 0)
            {
                kit.Items.ForEach(ki => {
                    if (String.IsNullOrWhiteSpace(ki.Id))
                    {
                        ki.Id = Guid.NewGuid().ToString();
                    }
                });
            }
            Document document = await client.ReplaceDocumentAsync(baseKitUri, kit, new RequestOptions { PartitionKey = new PartitionKey(existingKit.Id) });

            return(new OkObjectResult(kit));
        }
        public async Task <IActionResult> DeleteBaseKit(
            [HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "basekit-delete/{id}")]
            HttpRequest req,
            string id,
            [CosmosDB(databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
            DocumentClient client,
            ILogger log)
        {
            log.LogInformation($"Deleting a base kit");
            var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);

            if (authorizationResult.Failed)
            {
                log.LogWarning(authorizationResult.FailureReason);
                return(new UnauthorizedResult());
            }
            if (!authorizationResult.IsInRole(Roles.Admin))
            {
                log.LogWarning($"User is not in the {Roles.Admin} role");
                return(new UnauthorizedResult());
            }

            if (String.IsNullOrWhiteSpace(id))
            {
                return(new BadRequestObjectResult("Base Kit id was not specified."));
            }

            //verify existing document
            var     baseKitUri  = UriFactory.CreateDocumentUri("2wr", "basekits", id);
            BaseKit existingKit = null;

            try
            {
                existingKit = (await client.ReadDocumentAsync <BaseKit>(baseKitUri, new RequestOptions {
                    PartitionKey = new PartitionKey(id)
                })).Document;
            }
            catch (DocumentClientException ex)
            {
                if (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
                {
                    log.LogWarning($"Base Kit: {id} not found.");
                    return(new BadRequestObjectResult("Base Kit not found."));
                }
            }

            Document document = await client.DeleteDocumentAsync(baseKitUri, new RequestOptions { PartitionKey = new PartitionKey(existingKit.Id) });

            return(new OkObjectResult(true));
        }
        public async Task <IActionResult> CreateFromBaseKit(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)]
            HttpRequest req,
            [CosmosDB(databaseName: "2wr", collectionName: "emergencykits", ConnectionStringSetting = "CosmosDBConnection")]
            DocumentClient client,
            [CosmosDB(databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
            DocumentClient baseKitClient,
            ILogger log)
        {
            log.LogInformation($"Creating a new kit off of a base kit");
            var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);

            if (authorizationResult.Failed)
            {
                log.LogWarning(authorizationResult.FailureReason);
                return(new UnauthorizedResult());
            }

            Uri collectionUri = UriFactory.CreateDocumentCollectionUri("2wr", "emergencykits");

            var content = await new StreamReader(req.Body).ReadToEndAsync();
            var request = JsonConvert.DeserializeObject <CreateKitFromBaseRequest>(content);
            var kit     = new Kit();

            kit.Id     = Guid.NewGuid().ToString();
            kit.UserId = authorizationResult.User.Identity.Name;

            //Pull Base kit information by id, Add items from base kit, multiply quantity by the count
            var     baseKitUri = UriFactory.CreateDocumentUri("2wr", "basekits", request.BaseKitId);
            BaseKit baseKit    = null;

            try
            {
                baseKit = (await baseKitClient.ReadDocumentAsync <BaseKit>(baseKitUri, new RequestOptions {
                    PartitionKey = new PartitionKey(request.BaseKitId)
                })).Document;
            }
            catch (DocumentClientException ex)
            {
                if (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
                {
                    log.LogWarning($"Base Kit: {request.BaseKitId} not found.");
                    return(new BadRequestObjectResult("Base Kit not found."));
                }
            }

            baseKit.Items.ForEach(bki => kit.Items.Add(new KitItem {
                Id               = Guid.NewGuid().ToString(),
                UserId           = authorizationResult.User.Identity.Name,
                Name             = bki.Name,
                Description      = bki.Description,
                Photo            = bki.Photo,
                Quantity         = bki.QuantityPerCount * request.Count,
                QuantityUnit     = bki.QuantityUnit,
                IsAvailableInKit = false
            }));

            Document document = await client.CreateDocumentAsync(collectionUri, kit);

            return(new OkObjectResult(kit));
        }