public void SendUnreadUsers(Dictionary <int, HashSet <Guid> > unreadUsers)
        {
            try
            {
                foreach (var tenantsUsers in unreadUsers)
                {
                    CoreContext.TenantManager.SetCurrentTenant(tenantsUsers.Key);
                    foreach (var userId in tenantsUsers.Value)
                    {
                        var    userInfo        = CoreContext.UserManager.GetUsers(userId);
                        string currentUserName = userInfo.UserName.ToLowerInvariant();
                        if (userInfo.ID != Constants.LostUser.ID &&
                            CountersHub.Connections.GetConnectionsCount(userInfo.Tenant, currentUserName) > 0)
                        {
                            SecurityContext.AuthenticateMe(userInfo.ID);

                            var lastTimeReaded = feedReadedProvider.GetTimeReaded();
                            int count          = FeedAggregateDataProvider.GetNewFeedsCount(lastTimeReaded);
                            // sendFeedsCount
                            countersContext.Clients.Group(tenantsUsers.Key + currentUserName).sfc(count);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Chat.TraceMessage(Chat.TraceError, string.Format("Unknown Error. {0}, {1}, {2}", e.ToString(),
                                                                 e.StackTrace, e.InnerException != null ? e.InnerException.Message : string.Empty));
            }
        }
Example #2
0
        public object GetFreshNewsCount()
        {
            var feedReadedProvider = new FeedReadedDataProvider();
            var lastTimeReaded     = feedReadedProvider.GetTimeReaded();

            return(FeedAggregateDataProvider.GetNewFeedsCount(lastTimeReaded));
        }
Example #3
0
        public override IEnumerable <int> GetTenantsWithFeeds(DateTime fromTime)
        {
            var lastTimeAggregate = FeedAggregateDataProvider.GetLastTimeAggregate(GetType().Name);
            var now = DateTime.UtcNow;

            if (lastTimeAggregate.Date == now.Date)
            {
                return(new List <int>());
            }

            var q = new SqlQuery("tenants_tenants t")
                    .Select("t.id")
                    .Distinct()
                    .InnerJoin("core_user u", Exp.EqColumns("u.tenant", "t.id"))
                    .Where(Exp.Eq("t.status", TenantStatus.Active))
                    .Where(Exp.Eq("u.status", EmployeeStatus.Active))
                    .Where(!Exp.Eq("u.bithdate", null))
                    .Where(Exp.Eq("month(u.bithdate)", now.Month))
                    .Where(Exp.Eq("day(u.bithdate)", now.Day));

            using (var db = DbManager.FromHttpContext(DbId))
            {
                return(db.ExecuteList(q)
                       .ConvertAll(r => Convert.ToInt32(r[0])));
            }
        }
Example #4
0
 public void Deconstruct(out TenantManager tenantManager,
                         out PaymentManager paymentManager,
                         out TenantUtil tenantUtil,
                         out StudioNotifyHelper studioNotifyHelper,
                         out UserManager userManager,
                         out SecurityContext securityContext,
                         out AuthContext authContext,
                         out AuthManager authManager,
                         out CommonLinkUtility commonLinkUtility,
                         out DisplayUserSettingsHelper displayUserSettingsHelper,
                         out FeedAggregateDataProvider feedAggregateDataProvider,
                         out CoreSettings coreSettings)
 {
     tenantManager             = TenantManager;
     paymentManager            = PaymentManager;
     tenantUtil                = TenantUtil;
     studioNotifyHelper        = StudioNotifyHelper;
     userManager               = UserManager;
     securityContext           = SecurityContext;
     authContext               = AuthContext;
     authManager               = AuthManager;
     commonLinkUtility         = CommonLinkUtility;
     displayUserSettingsHelper = DisplayUserSettingsHelper;
     feedAggregateDataProvider = FeedAggregateDataProvider;
     coreSettings              = CoreSettings;
 }
Example #5
0
 public StudioWhatsNewNotifyScope(TenantManager tenantManager,
                                  PaymentManager paymentManager,
                                  TenantUtil tenantUtil,
                                  StudioNotifyHelper studioNotifyHelper,
                                  UserManager userManager,
                                  SecurityContext securityContext,
                                  AuthContext authContext,
                                  AuthManager authManager,
                                  CommonLinkUtility commonLinkUtility,
                                  DisplayUserSettingsHelper displayUserSettingsHelper,
                                  FeedAggregateDataProvider feedAggregateDataProvider,
                                  CoreSettings coreSettings)
 {
     TenantManager             = tenantManager;
     PaymentManager            = paymentManager;
     TenantUtil                = tenantUtil;
     StudioNotifyHelper        = studioNotifyHelper;
     UserManager               = userManager;
     SecurityContext           = securityContext;
     AuthContext               = authContext;
     AuthManager               = authManager;
     CommonLinkUtility         = commonLinkUtility;
     DisplayUserSettingsHelper = displayUserSettingsHelper;
     FeedAggregateDataProvider = feedAggregateDataProvider;
     CoreSettings              = coreSettings;
 }
Example #6
0
        public override string Check(int tenantId)
        {
            try
            {
                log.Debug("CheckFeedState");
                var userGuid = new Guid(fakeUserId);
                CoreContext.TenantManager.SetCurrentTenant(tenantId);
                SecurityContext.AuthenticateMe(userGuid);

                var person = new Person
                {
                    FirstName = "Homer",
                    LastName  = "Simpson",
                    JobTitle  = "Software engineer",
                    About     = "Cool dude"
                };

                int personId;

                using (var scope = DIHelper.Resolve(tenantId))
                {
                    var dao = scope.Resolve <DaoFactory>().ContactDao;
                    personId = dao.SaveContact(person);

                    CRMSecurity.SetAccessTo(person, new List <Guid> {
                        userGuid
                    });

                    // waiting while service is collecting news
                    var feedCfg = FeedConfigurationSection.GetFeedSection();

                    Thread.Sleep(feedCfg.AggregatePeriod + TimeSpan.FromSeconds(30));

                    var feedItemId = string.Format("person_{0}", personId);

                    var feedItem = FeedAggregateDataProvider.GetFeedItem(feedItemId);
                    if (feedItem == null)
                    {
                        log.ErrorFormat("Error! Feed Item is null, feedItemId = {0}", feedItemId);
                        dao.DeleteContact(personId);
                        FeedAggregateDataProvider.RemoveFeedItem(feedItemId);
                        return(HealthCheckResource.FeedService_NewsGenerationError);
                    }

                    dao.DeleteContact(personId);
                    FeedAggregateDataProvider.RemoveFeedItem(feedItemId);
                    log.Debug("Feed is OK!");
                    return(string.Empty);
                }
            }
            catch (Exception ex)
            {
                log.ErrorFormat("Feed is failed! {0}, innerException = {1}", ex,
                                ex.InnerException != null ? ex.InnerException.Message : string.Empty);
                return(HealthCheckResource.ServiceCheckFailed);
            }
        }
Example #7
0
        public object GetFreshNewsCount()
        {
            var cacheKey = GetNewFeedsCountKey();
            var result   = newFeedsCountCache.Get(cacheKey);

            if (result == null)
            {
                var lastTimeReaded = new FeedReadedDataProvider().GetTimeReaded();
                newFeedsCountCache.Insert(cacheKey, result = FeedAggregateDataProvider.GetNewFeedsCount(lastTimeReaded), DateTime.UtcNow.AddMinutes(3));
            }
            return(result);
        }
Example #8
0
        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 });
        }
Example #9
0
        public object GetFreshNewsCount()
        {
            var cacheKey        = GetNewFeedsCountKey();
            var resultfromCache = newFeedsCountCache.Get <String>(cacheKey);
            int result;

            if (!int.TryParse(resultfromCache, out result))
            {
                var lastTimeReaded = new FeedReadedDataProvider().GetTimeReaded();
                result = FeedAggregateDataProvider.GetNewFeedsCount(lastTimeReaded);
                newFeedsCountCache.Insert(cacheKey, result.ToString(), DateTime.UtcNow.AddMinutes(3));
            }
            return(result);
        }
Example #10
0
 public void Deconstruct(out BaseCommonLinkUtility baseCommonLinkUtility,
                         out TenantManager tenantManager,
                         out FeedAggregateDataProvider feedAggregateDataProvider,
                         out UserManager userManager,
                         out SecurityContext securityContext,
                         out AuthManager authManager)
 {
     baseCommonLinkUtility     = BaseCommonLinkUtility;
     tenantManager             = TenantManager;
     feedAggregateDataProvider = FeedAggregateDataProvider;
     userManager     = UserManager;
     securityContext = SecurityContext;
     authManager     = AuthManager;
 }
Example #11
0
 public FeedAggregatorServiceScope(BaseCommonLinkUtility baseCommonLinkUtility,
                                   TenantManager tenantManager,
                                   FeedAggregateDataProvider feedAggregateDataProvider,
                                   UserManager userManager,
                                   SecurityContext securityContext,
                                   AuthManager authManager)
 {
     BaseCommonLinkUtility     = baseCommonLinkUtility;
     TenantManager             = tenantManager;
     FeedAggregateDataProvider = feedAggregateDataProvider;
     UserManager     = userManager;
     SecurityContext = securityContext;
     AuthManager     = authManager;
 }
Example #12
0
        private int GetUserFeedsCount()
        {
            int count = 0;

            try
            {
                var lastTimeReaded = feedReadedProvider.GetTimeReaded();
                count = FeedAggregateDataProvider.GetNewFeedsCount(lastTimeReaded);
            }
            catch (Exception ex)
            {
                log.ErrorFormat("GetNewFeedsCount error: {0}, {1}", ex.StackTrace, ex.ToString());
            }

            return(count);
        }
        private void RemoveFeeds(object interval)
        {
            if (!Monitor.TryEnter(removeLock))
            {
                return;
            }

            try
            {
                log.DebugFormat("Start of removing old news");
                FeedAggregateDataProvider.RemoveFeedAggregate(DateTime.UtcNow.Subtract((TimeSpan)interval));
            }
            catch (Exception ex)
            {
                log.Error(ex);
            }
            finally
            {
                Monitor.Exit(removeLock);
            }
        }
Example #14
0
        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 });
        }
        private void AggregateFeeds(object interval)
        {
            if (!Monitor.TryEnter(aggregateLock))
            {
                return;
            }

            try
            {
                var start = DateTime.UtcNow;
                log.DebugFormat("Start of collecting feeds...");

                foreach (var module in Modules)
                {
                    var result   = new List <FeedRow>();
                    var fromTime = FeedAggregateDataProvider.GetLastTimeAggregate(module.GetType().Name);
                    if (fromTime == default(DateTime))
                    {
                        fromTime = DateTime.UtcNow.Subtract((TimeSpan)interval);
                    }
                    var toTime = DateTime.UtcNow;

                    var tenants = Attempt(10, () => module.GetTenantsWithFeeds(fromTime)).ToList();
                    log.DebugFormat("Find {1} tenants for module {0}.", module.GetType().Name, tenants.Count());

                    foreach (var tenant in tenants)
                    {
                        // Warning! There is hack here!
                        // clearing the cache to get the correct acl
                        var cache = AscCache.Default;
                        cache.Remove("acl" + tenant);
                        cache.Remove("/webitemsecurity/" + tenant);
                        cache.Remove(string.Format("sub/{0}/{1}/{2}", tenant, "6045b68c-2c2e-42db-9e53-c272e814c4ad", NotifyConstants.Event_NewCommentForMessage.ID));

                        HttpContext.Current = null;
                        try
                        {
                            if (CoreContext.TenantManager.GetTenant(tenant) == null)
                            {
                                continue;
                            }

                            CoreContext.TenantManager.SetCurrentTenant(tenant);

                            // fake httpcontext break configuration manager for mono
                            if (!WorkContext.IsMono)
                            {
                                HttpContext.Current = new HttpContext(
                                    new HttpRequest("hack", CommonLinkUtility.GetFullAbsolutePath("/"), string.Empty),
                                    new HttpResponse(new StringWriter()));
                            }

                            var feeds = Attempt(10, () => module.GetFeeds(new FeedFilter(fromTime, toTime)
                            {
                                Tenant = tenant
                            }));
                            log.DebugFormat("{0} feeds in {1} tenant.", feeds.Count(), tenant);
                            foreach (var tuple in feeds)
                            {
                                if (tuple.Item1 == null)
                                {
                                    continue;
                                }

                                var r = new FeedRow
                                {
                                    Id = tuple.Item1.Id,
                                    ClearRightsBeforeInsert = tuple.Item1.Variate,
                                    Tenant      = tenant,
                                    ProductId   = module.Product,
                                    ModuleId    = tuple.Item1.Module,
                                    AuthorId    = tuple.Item1.LastModifiedBy,
                                    CreatedDate = tuple.Item1.Date,
                                    GroupId     = tuple.Item1.GroupId,
                                    Json        = JsonConvert.SerializeObject(tuple.Item1, new JsonSerializerSettings
                                    {
                                        DateTimeZoneHandling = DateTimeZoneHandling.Utc
                                    }),
                                    Keywords = tuple.Item1.Keywords
                                };

                                foreach (var u in CoreContext.UserManager.GetUsers())
                                {
                                    if (isStopped)
                                    {
                                        return;
                                    }
                                    if (TryAuthenticate(u.ID) && module.VisibleFor(tuple.Item1, tuple.Item2, u.ID))
                                    {
                                        r.Users.Add(u.ID);
                                    }
                                }

                                result.Add(r);
                            }
                        }
                        catch (Exception ex)
                        {
                            log.ErrorFormat("Tenant: {0}, {1}", tenant, ex);
                        }
                        finally
                        {
                            // fake httpcontext break configuration manager for mono
                            if (!WorkContext.IsMono)
                            {
                                if (HttpContext.Current != null)
                                {
                                    new DisposableHttpContext(HttpContext.Current).Dispose();
                                    HttpContext.Current = null;
                                }
                            }
                        }
                    }

                    FeedAggregateDataProvider.SaveFeeds(result, module.GetType().Name, toTime);
                }

                log.DebugFormat("Time of collecting news: {0}", DateTime.UtcNow - start);
            }
            catch (Exception ex)
            {
                log.Error(ex);
            }
            finally
            {
                Monitor.Exit(aggregateLock);
            }
        }
Example #16
0
 private static IEnumerable <int> GetChangedTenants(FeedAggregateDataProvider feedAggregateDataProvider, DateTime date)
 {
     return(feedAggregateDataProvider.GetTenants(new TimeInterval(date.Date.AddDays(-1), date.Date.AddSeconds(-1))));
 }
        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);
                }
            }
        }
Example #19
0
        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"));
        }
        private void AggregateFeeds(object interval)
        {
            if (!Monitor.TryEnter(aggregateLock))
            {
                return;
            }

            try
            {
                var start = DateTime.UtcNow;
                log.DebugFormat("Start of collecting feeds...");

                var unreadUsers = new Dictionary <int, Dictionary <Guid, int> >();

                foreach (var module in Modules)
                {
                    var result   = new List <FeedRow>();
                    var fromTime = FeedAggregateDataProvider.GetLastTimeAggregate(module.GetType().Name);
                    if (fromTime == default(DateTime))
                    {
                        fromTime = DateTime.UtcNow.Subtract((TimeSpan)interval);
                    }
                    var toTime = DateTime.UtcNow;

                    var tenants = Attempt(10, () => module.GetTenantsWithFeeds(fromTime)).ToList();
                    log.DebugFormat("Find {1} tenants for module {0}.", module.GetType().Name, tenants.Count());

                    foreach (var tenant in tenants)
                    {
                        // Warning! There is hack here!
                        // clearing the cache to get the correct acl
                        var cache = AscCache.Memory;
                        cache.Remove("acl" + tenant);
                        cache.Remove("/webitemsecurity/" + tenant);
                        cache.Remove(string.Format("sub/{0}/{1}/{2}", tenant, "6045b68c-2c2e-42db-9e53-c272e814c4ad", NotifyConstants.Event_NewCommentForMessage.ID));

                        HttpContext.Current = null;
                        try
                        {
                            if (CoreContext.TenantManager.GetTenant(tenant) == null)
                            {
                                continue;
                            }

                            CoreContext.TenantManager.SetCurrentTenant(tenant);
                            var users = CoreContext.UserManager.GetUsers();
                            // fake httpcontext break configuration manager for mono
                            if (!WorkContext.IsMono)
                            {
                                HttpContext.Current = new HttpContext(
                                    new HttpRequest("hack", CommonLinkUtility.GetFullAbsolutePath("/"), string.Empty),
                                    new HttpResponse(new StringWriter()));
                            }

                            var feeds = Attempt(10, () => module.GetFeeds(new FeedFilter(fromTime, toTime)
                            {
                                Tenant = tenant
                            }).Where(r => r.Item1 != null).ToList());
                            log.DebugFormat("{0} feeds in {1} tenant.", feeds.Count, tenant);

                            var tenant1  = tenant;
                            var module1  = module;
                            var feedsRow = feeds
                                           .Select(tuple => new Tuple <FeedRow, object>(new FeedRow(tuple.Item1)
                            {
                                Tenant    = tenant1,
                                ProductId = module1.Product
                            }, tuple.Item2))
                                           .ToList();

                            foreach (var u in users)
                            {
                                if (isStopped)
                                {
                                    return;
                                }
                                if (!TryAuthenticate(u.ID))
                                {
                                    continue;
                                }

                                module.VisibleFor(feedsRow, u.ID);
                            }

                            result.AddRange(feedsRow.Select(r => r.Item1));
                        }
                        catch (Exception ex)
                        {
                            log.ErrorFormat("Tenant: {0}, {1}", tenant, ex);
                        }
                        finally
                        {
                            // fake httpcontext break configuration manager for mono
                            if (!WorkContext.IsMono)
                            {
                                if (HttpContext.Current != null)
                                {
                                    new DisposableHttpContext(HttpContext.Current).Dispose();
                                    HttpContext.Current = null;
                                }
                            }
                        }
                    }

                    FeedAggregateDataProvider.SaveFeeds(result, module.GetType().Name, toTime);

                    foreach (var res in result)
                    {
                        foreach (var userGuid in res.Users.Where(userGuid => !userGuid.Equals(res.ModifiedById)))
                        {
                            Dictionary <Guid, int> dictionary;
                            if (!unreadUsers.TryGetValue(res.Tenant, out dictionary))
                            {
                                dictionary = new Dictionary <Guid, int>();
                            }
                            if (dictionary.ContainsKey(userGuid))
                            {
                                ++dictionary[userGuid];
                            }
                            else
                            {
                                dictionary.Add(userGuid, 1);
                            }

                            unreadUsers[res.Tenant] = dictionary;
                        }
                    }
                }

                signalrServiceClient.SendUnreadUsers(unreadUsers);

                log.DebugFormat("Time of collecting news: {0}", DateTime.UtcNow - start);
            }
            catch (Exception ex)
            {
                log.Error(ex);
            }
            finally
            {
                Monitor.Exit(aggregateLock);
            }
        }