public async Task <EdgeDefinition> RunAsync()
        {
            try
            {
                using (var context = this.dataAccess.GetContext())
                {
                    var results = await context.NoTracking <DAL.Entities.SearchResult>()
                                  .Include(r => r.Query)
                                  .Include(r => r.Query.Category)
                                  .Include(r => r.Query.Category.User)
                                  .Where(r => this.ResultIds.Contains(r.Id))
                                  .ToListAsync();

                    var query = results.First().Query;

                    var iftttSettings = await context.NoTracking <DAL.Entities.Settings>()
                                        .Where(s => s.User.UserId == query.Category.User.UserId && s.EnableIftttNotification)
                                        .Select(s => new
                    {
                        s.IftttMakerKey,
                        s.IftttMakerEventName
                    })
                                        .SingleOrDefaultAsync();

                    if (query.EnableNotifications && !string.IsNullOrWhiteSpace(iftttSettings?.IftttMakerKey) && !string.IsNullOrWhiteSpace(iftttSettings?.IftttMakerEventName))
                    {
                        var url     = $"https://maker.ifttt.com/trigger/{iftttSettings.IftttMakerEventName}/with/key/{iftttSettings.IftttMakerKey}";
                        var content = new
                        {
                            value1 = new
                            {
                                Name = query.Name,
                                Url  = SearchQueryTransformations.EntityToUrl(query)
                            },
                            value2 = results.Select(result => new
                            {
                                Name          = result.Name,
                                Description   = result.Description,
                                BidPrice      = result.BidPrice,
                                PurchasePrice = result.PurchasePrice,
                                Url           = SearchResultTransformations.EntityToUrl(result)
                            })
                                     .ToArray()
                        };

                        var client   = new HttpClient();
                        var response = await client.PostAsJsonAsync(url, content);
                    }

                    return(this.Next);
                }
            }
            catch (Exception e)
            {
                Context.GetCurrentLogger().Error(CLMTIDs.CouldNotTriggerIftttWebhook, e, "Could not trigger IFTTT webhook notification for result ids {ResultIds}!", this.ResultIds);
                return(this.Next);
            }
        }
        public async Task <EdgeDefinition> RunAsync()
        {
            try
            {
                using (var context = this.dataAccess.GetContext())
                {
                    var results = await context.NoTracking <DAL.Entities.SearchResult>()
                                  .Include(r => r.Query)
                                  .Include(r => r.Query.Category)
                                  .Include(r => r.Query.Category.User)
                                  .Where(r => this.ResultIds.Contains(r.Id))
                                  .ToListAsync();

                    var query = results.First().Query;

                    var tos = (await context.NoTracking <DAL.Entities.Settings>()
                               .Where(s => s.User.UserId == query.Category.User.UserId && s.EnableEmailNotification)
                               .ToListAsync())
                              .SelectMany(s => new[] { s.Email, s.AlternativeEmail })
                              .Where(m => !string.IsNullOrWhiteSpace(m))
                              .Select(m => new EmailAddress(m))
                              .ToList();

                    if (query.EnableNotifications && tos.Count > 0)
                    {
                        var from    = new EmailAddress("*****@*****.**");
                        var subject = $"Catch 'Em All Notification: {query.Name}";
                        var body    = BodyFormatter(new
                        {
                            Name = query.Name,
                            Url  = Cirrus.Helpers.WorkflowNameBuilder.ToString(WorkflowIds.SearchQueryByIdWorkflow, new Dictionary <string, object>
                            {
                                { SearchQueryByIdWorkflow.InputQueryId, query.Id },
                                { SearchQueryByIdWorkflow.InputCanGoBack, false }
                            }),
                            Results = results.Select(r => new
                            {
                                r.Name,
                                r.Description,
                                r.BidPrice,
                                r.PurchasePrice,
                                ExternalUrl = SearchResultTransformations.EntityToUrl(r)
                            })
                        });
                        var msg      = MailHelper.CreateSingleEmailToMultipleRecipients(from, tos, subject, body, body);
                        var client   = new SendGridClient("sendgrid-api-token");
                        var response = await client.SendEmailAsync(msg);
                    }

                    return(this.Next);
                }
            }
            catch (Exception e)
            {
                Context.GetCurrentLogger().Error(CLMTIDs.CouldNotSendEmail, e, "Could not send notification email for result ids {ResultIds}!", this.ResultIds);
                return(this.Next);
            }
        }
Exemple #3
0
        protected override async Task <Models.SearchResult> LoadAsync()
        {
            using (var context = this.dataAccess.GetContext())
            {
                var entity = await context.Tracking <DAL.Entities.SearchResult>()
                             .Where(e => e.Id == this.Id)
                             .SingleAsync();

                entity.New = false;

                await context.SaveChangesAsync();

                var dto = new Models.SearchResult
                {
                    Id            = entity.Id,
                    Name          = entity.Name,
                    Description   = entity.Description,
                    FinalPrice    = entity.FinalPrice,
                    BidPrice      = entity.BidPrice,
                    PurchasePrice = entity.PurchasePrice,
                    Ends          = entity.Ends,
                    Sold          = entity.Sold,
                    Closed        = entity.Closed,
                    Favorite      = entity.Favorite,
                    ExternalData  = new Models.ExternalSearchResultData
                    {
                        Id         = entity.Id,
                        ExternalId = entity.ExternalId
                    }
                };

                dto.ExternalData.ExternalUrl = SearchResultTransformations.ModelToUrl(dto);

                return(dto);
            }
        }