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)); }
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); } }
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)); }