Esempio n. 1
0
        public async Task <RotaTypeNameDto> GetName(string name, string rotaType)
        {
            try
            {
                var typeFilter = TableQuery.GenerateFilterCondition("RotaType", QueryComparisons.Equal, rotaType);
                var nameFilter = TableQuery.GenerateFilterCondition("Name", QueryComparisons.Equal, name);
                var filter     = TableQuery.CombineFilters(typeFilter, TableOperators.And, nameFilter);
                TableQuery <RotaTypeNameDto> query = new TableQuery <RotaTypeNameDto>().Where(filter);

                TableQuerySegment <RotaTypeNameDto> results = await _table.ExecuteQuerySegmentedAsync(query, null);

                return(results.First());
            }
            catch (Exception e)
            {
                throw new Exception($"Could not get {name} on: {rotaType}.", e);
            }
        }
Esempio n. 2
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = FunctionName.ScrapeProduct + "/{userId}/{productId}")] HttpRequest req,
            [Table(TableName.ProductInfo, "{userId}")] CloudTable productInfoTable,
            [Table(TableName.ScrapeConfig)] CloudTable scrapeConfigTable,
            [Queue(QueueName.AddProductHistory)] IAsyncCollector <ProductInfo> addProductHistoryMessageQueue,
            [Queue(QueueName.EmailsToSend)] IAsyncCollector <SendGridMessage> emailMessageQueue,
            string userId,
            string productId,
            ILogger log)
        {
            log.LogInformation($"Request to scrape product {productId}");

            TableQuery <ProductInfo> productQuery = new TableQuery <ProductInfo>().Where(
                TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, productId));
            TableQuerySegment <ProductInfo> products = await productInfoTable.ExecuteQuerySegmentedAsync(productQuery, null);

            if (products != null && products.Count() == 1)
            {
                //Find matching criteria
                ProductInfo product = products.First();
                TableQuery <ScrapeConfig> configQuery = new TableQuery <ScrapeConfig>().Where(
                    TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, product.URL.ToCoreUrl()));

                TableQuerySegment <ScrapeConfig> configs = await scrapeConfigTable.ExecuteQuerySegmentedAsync(configQuery, null);

                if (!configs.Any())
                {
                    //Notify the admin
                    SendGridMessage message = new SendGridMessage();
                    message.SetFrom(new EmailAddress("*****@*****.**", "Product scraper"));
                    message.AddTo(CommonName.AdminEmail);
                    message.SetSubject("Missing configuration");
                    message.AddContent("text/plain", $"There was request for scraping products from {product.URL.ToCoreUrl()}, consider adding configuration soon. Product Url {product.URL}");
                    await emailMessageQueue.AddAsync(message);
                }
                else if (configs.Count() > 1)
                {
                    //Notify the admin
                    SendGridMessage message = new SendGridMessage();
                    message.SetFrom(new EmailAddress("*****@*****.**", "Product scraper"));
                    message.AddTo(CommonName.AdminEmail);
                    message.SetSubject("Multiple configurations");
                    message.AddContent("text/plain", $"There are more than one configuration for: {product.URL.ToCoreUrl()}, consider deleting one.");
                    await emailMessageQueue.AddAsync(message);
                }
                else if (configs.Count() == 1)
                {
                    Utils utils = new Utils();
                    await utils.Scrape(configs.First(), product, log);

                    //Update product in db
                    TableOperation operation = TableOperation.InsertOrReplace(product);
                    await productInfoTable.ExecuteAsync(operation);

                    //Add to history queue
                    await addProductHistoryMessageQueue.AddAsync(product);
                }
            }
            else
            {
                log.LogInformation($"Multiple products matches the criteria userId={userId} productId={productId}");
            }

            string responseMessage = string.IsNullOrEmpty(productId)
                ? "Please provide productId in the path" : $"Product {productId} has been scraped";

            return(new OkObjectResult(responseMessage));
        }