public async Task <List <TModel> > GetAll <TModel>(string tableName, TableQuery query, EntityResolver <TModel> resolver) where TModel : class, IBaseFieldsForAzureTableRecord
        {
            var results = new List <TModel>();

            var table = GetTable(tableName);

            var token = new TableContinuationToken();

            TableQuerySegment <TModel> entities = null;

            do
            {
                entities = await table.ExecuteQuerySegmentedAsync(query, resolver, token);

                if (entities != null && entities.Any())
                {
                    results.AddRange(entities);

                    token = entities.ContinuationToken;
                }
            } while (!string.IsNullOrWhiteSpace(token?.NextPartitionKey) &&
                     !string.IsNullOrWhiteSpace(token?.NextRowKey));

            return(results);
        }
        public static async Task <IActionResult> AddressManagement(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
            [Table("AddressManagementv2")] CloudTable inTable,
            ILogger log)
        {
            var parser          = new JsonParser(JsonParser.Settings.Default.WithIgnoreUnknownFields(true)); // パーサーを作る
            var webhookRequest  = parser.Parse <WebhookRequest>(await req.ReadAsStringAsync());              // パースする
            var webhookResponse = new WebhookResponse();

            log.LogInformation(webhookRequest.QueryResult.Intent.DisplayName);

            var items = webhookRequest.QueryResult.Parameters.Fields["items"].StringValue;

            log.LogInformation(items);

            //データの読み取り
            TableQuery <Person> rangeQuery = new TableQuery <Person>();

            log.LogInformation(TableQuery.GenerateFilterCondition("items", QueryComparisons.Equal, items));

            TableContinuationToken     token   = null;
            TableQuerySegment <Person> segment = await inTable.ExecuteQuerySegmentedAsync(rangeQuery, token);

            //応答部分
            switch (webhookRequest.QueryResult.Intent.DisplayName)
            {
            default:
            {
                if (segment.Any())
                {
                    var fulfillmentText = "お調べします。\n";
                    {
                        foreach (Person entity in segment)
                        {
                            log.LogInformation(entity.PartitionKey);
                            log.LogInformation(entity.items);
                            log.LogInformation(items);

                            if (entity.items == items)        //フィルター
                            {
                                fulfillmentText += $"{entity.items}は、{entity.location}にあります。";
                                log.LogInformation(entity.PartitionKey);
                                log.LogInformation(entity.items);
                            }
                        }
                    }
                    webhookResponse.FulfillmentText = fulfillmentText;
                }
                else
                {
                    webhookResponse.FulfillmentText = "登録されていません";
                }
            }
            break;
            }

            return(new ProtcolBufJsonResult(webhookResponse, JsonFormatter.Default));
        }
Exemple #3
0
        public static async Task <string> AddNewClass(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestMessage request,
            [Table("ClassesTable")] CloudTable classesTable, ILogger log)
        {
            List <string>   teacherClassesIds;
            OperationResult result = new OperationResult();

            SchoolClass newClassInfo = await Utilities.ExtractContent <SchoolClass>(request);

            var usersTable    = CloudTableUtilities.OpenTable(ProjectConsts.UsersTableName);
            var teacherEntity = CloudTableUtilities.getTableEntityAsync <UsersTable>(usersTable, newClassInfo.teacherId).Result.First();
            TableQuerySegment <ClassesTable> teacherClasses = await CloudTableUtilities.getTableEntityAsync <ClassesTable>(classesTable, teacherEntity.RowKey, newClassInfo.classId);

            if (!teacherClasses.Any())
            {
                string subjectsTableName = $"{teacherEntity.RowKey}{newClassInfo.classId}";
                SubjectsTableUtilities.CreateClassTable(subjectsTableName);
                var newClassEntity = new ClassesTable {
                    subjectsTableName = newClassInfo.ToString()
                };
                newClassEntity.LastTeacherUpdate = defaultDateTime;
                TableOperation insertOperation = TableOperation.InsertOrReplace(newClassEntity);
                newClassEntity.PartitionKey      = teacherEntity.RowKey;
                newClassEntity.RowKey            = newClassInfo.classId;
                newClassEntity.subjectsTableName = subjectsTableName;
                await classesTable.ExecuteAsync(insertOperation);

                result.UpdateData(newClassEntity.subjectsTableName);

                if (teacherEntity.ClassId != null)
                {
                    teacherClassesIds = teacherEntity.ClassId.Split(ProjectConsts.delimiter).ToList();
                }
                else
                {
                    teacherClassesIds = new List <string>();
                }

                teacherClassesIds.Add(newClassInfo.classId);
                teacherEntity.ClassId = string.Join(ProjectConsts.delimiter, teacherClassesIds);
                await CloudTableUtilities.AddTableEntity <UsersTable>(usersTable, teacherEntity);
            }
            else
            {
                result.UpdateFailure(ErrorMessages.classAlreadyExist);
            }

            return(JsonConvert.SerializeObject(result));
        }
        protected override async Task <object[]> ReadRecord(CancellationToken cancellationToken)
        {
            try
            {
                if (!_tableResult.Any())
                {
                    return(null);
                }

                if (_currentReadRow >= _tableResult.Count())
                {
                    if (_token == null)
                    {
                        return(null);
                    }

                    _tableResult = await _tableReference.ExecuteQuerySegmentedAsync(_tableQuery, _token);

                    if (!_tableResult.Any())
                    {
                        return(null);
                    }

                    _token          = _tableResult.ContinuationToken;
                    _currentReadRow = 0;
                }

                var currentEntity = _tableResult.ElementAt(_currentReadRow);

                var row = GetRow(currentEntity);

                _currentReadRow++;

                return(row);
            }
            catch (Exception ex)
            {
                throw new ConnectionException("The azure storage table reader failed due to the following error: " + ex.Message, ex);
            }
        }
Exemple #5
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));
        }