public object GetFeed( string product, ApiDateTime from, ApiDateTime to, Guid?author, bool?onlyNew, ApiDateTime timeReaded) { var filter = new FeedApiFilter { Product = product, From = from != null ? from.UtcTime : DateTime.MinValue, To = to != null ? to.UtcTime : DateTime.MaxValue, Offset = (int)context.StartIndex, Max = (int)context.Count - 1, Author = author ?? Guid.Empty, SearchKeys = context.FilterValues, OnlyNew = onlyNew.HasValue && onlyNew.Value }; var feedReadedProvider = new FeedReadedDataProvider(); var lastTimeReaded = feedReadedProvider.GetTimeReaded(); var readedDate = timeReaded != null ? (ApiDateTime)timeReaded.UtcTime : (ApiDateTime)lastTimeReaded; var commentReadedDate = (ApiDateTime)feedReadedProvider.GetTimeReaded("comments"); if (filter.OnlyNew) { filter.From = (ApiDateTime)lastTimeReaded; filter.Max = 100; } else if (timeReaded == null) { feedReadedProvider.SetTimeReaded(); feedReadedProvider.SetTimeReaded("comments"); } var feeds = FeedAggregateDataProvider .GetFeeds(filter) .GroupBy(n => n.GroupId, n => new FeedWrapper(n), (n, group) => { var firstFeed = group.First(); firstFeed.GroupedFeeds = group.Skip(1); return(firstFeed); }) .ToList(); context.SetDataPaginated(); return(new { feeds, readedDate, commentReadedDate }); }
public object GetFeed( string product, ApiDateTime from, ApiDateTime to, Guid?author, bool?onlyNew, ApiDateTime timeReaded) { var filter = new FeedApiFilter { Product = product, Offset = (int)context.StartIndex, Max = (int)context.Count - 1, Author = author ?? Guid.Empty, SearchKeys = context.FilterValues, OnlyNew = onlyNew.HasValue && onlyNew.Value }; if (from != null && to != null) { var f = TenantUtil.DateTimeFromUtc(from.UtcTime); filter.From = new DateTime(f.Year, f.Month, f.Day, 0, 0, 0); var t = TenantUtil.DateTimeFromUtc(to.UtcTime); filter.To = new DateTime(t.Year, t.Month, t.Day, 23, 59, 59); } else { filter.From = from != null ? from.UtcTime : DateTime.MinValue; filter.To = to != null ? to.UtcTime : DateTime.MaxValue; } var feedReadedProvider = new FeedReadedDataProvider(); var lastTimeReaded = feedReadedProvider.GetTimeReaded(); var readedDate = timeReaded != null ? (ApiDateTime)timeReaded.UtcTime : (ApiDateTime)lastTimeReaded; if (filter.OnlyNew) { filter.From = (ApiDateTime)lastTimeReaded; filter.Max = 100; } else if (timeReaded == null) { feedReadedProvider.SetTimeReaded(); newFeedsCountCache.Remove(GetNewFeedsCountKey()); } var feeds = FeedAggregateDataProvider .GetFeeds(filter) .GroupBy(n => n.GroupId, n => new FeedWrapper(n), (n, group) => { var firstFeed = group.First(); firstFeed.GroupedFeeds = group.Skip(1); return(firstFeed); }) .ToList(); context.SetDataPaginated(); return(new { feeds, readedDate }); }
public void ProcessRequest(HttpContext context) { if (!ProcessAuthorization(context)) { AccessDenied(context); return; } var productId = ParseGuid(context.Request[ProductParam]); var product = WebItemManager.Instance[productId.GetValueOrDefault()]; var products = WebItemManager.Instance.GetItemsAll <IProduct>().ToDictionary(p => p.GetSysName()); var lastModified = GetLastModified(context); var feeds = FeedAggregateDataProvider.GetFeeds(new FeedApiFilter { Product = product != null ? product.GetSysName() : null, From = lastModified ?? DateTime.UtcNow.AddDays(-14), To = DateTime.UtcNow, OnlyNew = true }) .OrderByDescending(f => f.CreatedDate) .Take(100) .Select(f => f.ToFeedMin()) .ToList(); if (lastModified != null && feeds.Count == 0) { context.Response.StatusCode = (int)HttpStatusCode.NotModified; context.Response.StatusDescription = "Not Modified"; } var feedItems = feeds.Select(f => { var item = new SyndicationItem( HttpUtility.HtmlDecode((products.ContainsKey(f.Product) ? products[f.Product].Name + ": " : string.Empty) + f.Title), string.Empty, new Uri(CommonLinkUtility.GetFullAbsolutePath(f.ItemUrl)), f.Id, new DateTimeOffset(TenantUtil.DateTimeToUtc(f.CreatedDate))) { PublishDate = f.CreatedDate, }; if (f.Author != null && f.Author.UserInfo != null) { var u = f.Author.UserInfo; item.Authors.Add(new SyndicationPerson(u.Email, u.DisplayUserName(false), CommonLinkUtility.GetUserProfile(u.ID))); } return(item); }); var lastUpdate = DateTime.UtcNow; if (feeds.Count > 0) { lastUpdate = feeds.Max(x => x.ModifiedDate); } var feed = new SyndicationFeed( CoreContext.TenantManager.GetCurrentTenant().Name, string.Empty, new Uri(context.Request.GetUrlRewriter(), VirtualPathUtility.ToAbsolute("~/Feed.aspx")), TenantProvider.CurrentTenantID.ToString(), new DateTimeOffset(lastUpdate), feedItems); var rssFormatter = new Atom10FeedFormatter(feed); var settings = new XmlWriterSettings { CheckCharacters = false, ConformanceLevel = ConformanceLevel.Document, Encoding = Encoding.UTF8, Indent = true, }; using (var writer = XmlWriter.Create(context.Response.Output, settings)) { rssFormatter.WriteTo(writer); } context.Response.Charset = Encoding.UTF8.WebName; context.Response.ContentType = "application/atom+xml"; context.Response.AddHeader("ETag", DateTime.UtcNow.ToString("yyyyMMddHHmmss")); context.Response.AddHeader("Last-Modified", DateTime.UtcNow.ToString("R")); }
public static void SendMsgWhatsNew(DateTime scheduleDate, INotifyClient client) { var log = LogManager.GetLogger("ASC.Notify.WhatsNew"); if (WebItemManager.Instance.GetItemsAll <IProduct>().Count == 0) { log.Info("No products. Return from function"); return; } log.Info("Start send whats new."); var products = WebItemManager.Instance.GetItemsAll().ToDictionary(p => p.GetSysName()); foreach (var tenantid in GetChangedTenants(scheduleDate)) { try { var tenant = CoreContext.TenantManager.GetTenant(tenantid); if (tenant == null || tenant.Status != TenantStatus.Active || !TimeToSendWhatsNew(TenantUtil.DateTimeFromUtc(tenant.TimeZone, scheduleDate)) || TariffState.NotPaid <= CoreContext.PaymentManager.GetTariff(tenantid).State) { continue; } CoreContext.TenantManager.SetCurrentTenant(tenant); log.InfoFormat("Start send whats new in {0} ({1}).", tenant.TenantDomain, tenantid); foreach (var user in CoreContext.UserManager.GetUsers()) { if (!StudioNotifyHelper.IsSubscribedToNotify(user, Actions.SendWhatsNew)) { continue; } SecurityContext.AuthenticateMe(CoreContext.Authentication.GetAccountByID(user.ID)); var culture = string.IsNullOrEmpty(user.CultureName) ? tenant.GetCulture() : user.GetCulture(); Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; var feeds = FeedAggregateDataProvider.GetFeeds(new FeedApiFilter { From = scheduleDate.Date.AddDays(-1), To = scheduleDate.Date.AddSeconds(-1), Max = 100, }); var feedMinWrappers = feeds.ConvertAll(f => f.ToFeedMin()); var feedMinGroupedWrappers = feedMinWrappers .Where(f => (f.CreatedDate == DateTime.MaxValue || f.CreatedDate >= scheduleDate.Date.AddDays(-1)) && //'cause here may be old posts with new comments products.ContainsKey(f.Product) && !f.Id.StartsWith("participant") ) .GroupBy(f => products[f.Product]); var ProjectsProductName = products["projects"].Name; //from ASC.Feed.Aggregator.Modules.ModulesHelper.ProjectsProductName var activities = feedMinGroupedWrappers .Where(f => f.Key.Name != ProjectsProductName) //not for project product .ToDictionary( g => g.Key.Name, g => g.Select(f => new WhatsNewUserActivity { Date = f.CreatedDate, UserName = f.Author != null && f.Author.UserInfo != null ? f.Author.UserInfo.DisplayUserName() : string.Empty, UserAbsoluteURL = f.Author != null && f.Author.UserInfo != null ? CommonLinkUtility.GetFullAbsolutePath(f.Author.UserInfo.GetUserProfilePageURL()) : string.Empty, Title = HtmlUtil.GetText(f.Title, 512), URL = CommonLinkUtility.GetFullAbsolutePath(f.ItemUrl), BreadCrumbs = new string[0], Action = getWhatsNewActionText(f) }).ToList()); var projectActivities = feedMinGroupedWrappers .Where(f => f.Key.Name == ProjectsProductName) // for project product .SelectMany(f => f); var projectActivitiesWithoutBreadCrumbs = projectActivities.Where(p => String.IsNullOrEmpty(p.ExtraLocation)); var whatsNewUserActivityGroupByPrjs = new List <WhatsNewUserActivity>(); foreach (var prawbc in projectActivitiesWithoutBreadCrumbs) { whatsNewUserActivityGroupByPrjs.Add( new WhatsNewUserActivity { Date = prawbc.CreatedDate, UserName = prawbc.Author != null && prawbc.Author.UserInfo != null ? prawbc.Author.UserInfo.DisplayUserName() : string.Empty, UserAbsoluteURL = prawbc.Author != null && prawbc.Author.UserInfo != null ? CommonLinkUtility.GetFullAbsolutePath(prawbc.Author.UserInfo.GetUserProfilePageURL()) : string.Empty, Title = HtmlUtil.GetText(prawbc.Title, 512), URL = CommonLinkUtility.GetFullAbsolutePath(prawbc.ItemUrl), BreadCrumbs = new string[0], Action = getWhatsNewActionText(prawbc) }); } var groupByPrjs = projectActivities.Where(p => !String.IsNullOrEmpty(p.ExtraLocation)).GroupBy(f => f.ExtraLocation); foreach (var gr in groupByPrjs) { var grlist = gr.ToList(); for (var i = 0; i < grlist.Count(); i++) { var ls = grlist[i]; whatsNewUserActivityGroupByPrjs.Add( new WhatsNewUserActivity { Date = ls.CreatedDate, UserName = ls.Author != null && ls.Author.UserInfo != null ? ls.Author.UserInfo.DisplayUserName() : string.Empty, UserAbsoluteURL = ls.Author != null && ls.Author.UserInfo != null ? CommonLinkUtility.GetFullAbsolutePath(ls.Author.UserInfo.GetUserProfilePageURL()) : string.Empty, Title = HtmlUtil.GetText(ls.Title, 512), URL = CommonLinkUtility.GetFullAbsolutePath(ls.ItemUrl), BreadCrumbs = i == 0 ? new string[1] { gr.Key } : new string[0], Action = getWhatsNewActionText(ls) }); } } if (whatsNewUserActivityGroupByPrjs.Count > 0) { activities.Add(ProjectsProductName, whatsNewUserActivityGroupByPrjs); } if (0 < activities.Count) { log.InfoFormat("Send whats new to {0}", user.Email); client.SendNoticeAsync( Actions.SendWhatsNew, null, user, null, new TagValue(Tags.Activities, activities), new TagValue(Tags.Date, DateToString(scheduleDate.AddDays(-1), culture)), new TagValue(CommonTags.Priority, 1) ); } } } catch (Exception error) { log.Error(error); } } }
public void SendMsgWhatsNew(DateTime scheduleDate) { if (WebItemManager.Instance.GetItemsAll <IProduct>().Count == 0) { return; } var log = LogManager.GetLogger("ASC.Notify.WhatsNew"); log.Info("Start send whats new."); var products = WebItemManager.Instance.GetItemsAll().ToDictionary(p => p.GetSysName()); foreach (var tenantid in GetChangedTenants(scheduleDate)) { try { var tenant = CoreContext.TenantManager.GetTenant(tenantid); if (tenant == null || tenant.Status != TenantStatus.Active || !TimeToSendWhatsNew(TenantUtil.DateTimeFromUtc(tenant, scheduleDate)) || TariffState.NotPaid <= CoreContext.PaymentManager.GetTariff(tenantid).State) { continue; } CoreContext.TenantManager.SetCurrentTenant(tenant); log.InfoFormat("Start send whats new in {0} ({1}).", tenant.TenantDomain, tenantid); foreach (var user in CoreContext.UserManager.GetUsers()) { if (!IsSubscribeToWhatsNew(user)) { continue; } SecurityContext.AuthenticateMe(CoreContext.Authentication.GetAccountByID(user.ID)); Thread.CurrentThread.CurrentCulture = user.GetCulture(); Thread.CurrentThread.CurrentUICulture = user.GetCulture(); var feeds = FeedAggregateDataProvider.GetFeeds(new FeedApiFilter { From = scheduleDate.Date.AddDays(-1), To = scheduleDate.Date.AddSeconds(-1), Max = 100, }); var activities = feeds .Select(f => f.ToFeedMin()) .SelectMany(f => { if (f.Comments == null || !f.Comments.Any()) { return(new[] { f }); } var comment = f.Comments.Last().ToFeedMin(); comment.Id = f.Id; comment.Product = f.Product; comment.ItemUrl = f.ItemUrl; if (f.Date < scheduleDate.Date.AddDays(-1)) { return(new[] { comment }); } return(new[] { f, comment }); }) .Where(f => products.ContainsKey(f.Product) && !f.Id.StartsWith("participant")) .GroupBy(f => products[f.Product]) .ToDictionary(g => g.Key.Name, g => g.Select(f => new WhatsNewUserActivity { Date = TenantUtil.DateTimeFromUtc(tenant, f.Date), UserName = f.Author != null && f.Author.UserInfo != null ? f.Author.UserInfo.DisplayUserName() : string.Empty, UserAbsoluteURL = f.Author != null && f.Author.UserInfo != null ? CommonLinkUtility.GetFullAbsolutePath(f.Author.UserInfo.GetUserProfilePageURL()) : string.Empty, Title = HtmlUtil.GetText(f.Title, 512), URL = CommonLinkUtility.GetFullAbsolutePath(f.ItemUrl), BreadCrumbs = GetBreadCrumbs(products, f), }).ToList()); if (0 < activities.Count) { log.InfoFormat("Send whats new to {0}", user.Email); client.SendNoticeAsync( Constants.ActionSendWhatsNew, null, user, null, new TagValue(Constants.TagActivities, activities), new TagValue(Constants.TagDate, DateToString(scheduleDate.AddDays(-1), user.GetCulture())), new TagValue(CommonTags.Priority, 1) ); } } } catch (Exception error) { log.Error(error); } } }