Пример #1
0
        private void AddWeb(SEActivities activities, SEActivities.Thread thread, DataRow tr)
        {
            bool found = activities.webs.Any(w => w.id == thread.webId);

            if (found)
            {
                return;
            }

            lock (_locker)
            {
                found = activities.webs.Any(w => w.id == thread.webId);
                if (found)
                {
                    return;
                }

                activities.webs.Add(new SEActivities.Web
                {
                    id    = thread.webId,
                    title = (string)tr["WebTitle"],
                    url   = (string)tr["WebUrl"]
                });
            }
        }
Пример #2
0
        private static void SortThreadActivities(SEActivities activities)
        {
            Parallel.ForEach(activities.threads,
                             thread => { thread.activities = thread.activities.OrderByDescending(a => a.time).ToList(); });

            activities.threads = activities.threads.OrderByDescending(t => t.lastActivityOn).ToList();
        }
Пример #3
0
        private void GetData(SEActivities activities, Guid threadId, string kind, DateTime offset)
        {
            SPWeb web    = SPContext.Current.Web;
            int   userId = web.CurrentUser.ID;

            _regionalSettings = SPContext.Current.RegionalSettings;

            using (var connectionManager = new DBConnectionManager(web))
            {
                DBConnectionManager manager = connectionManager;

                List <DataRow> threadRows = GetThreads(manager, userId, web, 0, 0, threadId).AsEnumerable().ToList();

                List <SEActivities.Thread> threads =
                    threadRows.Select(tr => BuildThread(tr, manager, userId, 0, 0, activities, offset, kind))
                    .ToList();

                foreach (SEActivities.Thread thread in threads)
                {
                    activities.threads.Add(thread);
                }
            }

            SortThreadActivities(activities);
        }
Пример #4
0
        public SEActivities GetActivities()
        {
            var activities = new SEActivities();

            try
            {
                int      limit;
                int      page;
                int      activityLimit;
                int      commentLimit;
                DateTime offset;

                ParseMetaData(out page, out limit, out activityLimit, out commentLimit, out offset);

                GetData(page, limit, activityLimit, commentLimit, activities);

                return(activities);
            }
            catch (Exception exception)
            {
                if (exception is AggregateException)
                {
                    exception = ((AggregateException)exception).Flatten();
                }

                activities.error = new Error
                {
                    message    = exception.Message,
                    stackTrace = exception.StackTrace,
                    kind       = typeof(Exception).ToString()
                };
            }

            return(activities);
        }
Пример #5
0
        private void AddUser(SEActivities activities, SEActivities.Thread.Activity activity, DataRow ar)
        {
            bool found = activities.users.Any(u => u.id == activity.userId);

            if (found)
            {
                return;
            }

            lock (_locker)
            {
                found = activities.users.Any(u => u.id == activity.userId);
                if (found)
                {
                    return;
                }

                activities.users.Add(new SEActivities.User
                {
                    id          = activity.userId,
                    name        = (string)ar["UserName"],
                    displayName = (string)ar["UserDisplayName"],
                    picture     = ((ar["UserPicture"] as string) ?? string.Empty).Split(',')[0]
                });
            }
        }
Пример #6
0
        private void BuildComments(IEnumerable <DataRow> commentRows, SEActivities activities, SEActivities.Thread thread)
        {
            Parallel.ForEach(commentRows, r =>
            {
                foreach (string column in _activityDateTimeColumns)
                {
                    SetLocalDateTime(r, column, _utcTimeDict, _regionalSettings);
                }

                SEActivities.Thread.Activity activity = BuildActivity(r, activities);
                thread.comments.Add(activity);
            });
        }
Пример #7
0
        private SEActivities.Thread.Activity BuildActivity(DataRow ar, SEActivities activities)
        {
            var activity = new SEActivities.Thread.Activity
            {
                id              = (Guid)ar["ActivityId"],
                key             = ar["ActivityKey"] as string,
                data            = ar["ActivityData"] as string,
                kind            = ((ActivityKind)ar["ActivityKind"]).ToString(),
                time            = ((DateTime)ar["ActivityDate"]).ToString(DATE_FORMAT),
                isBulkOperation = (bool)ar["ActivityIsMassOperation"],
                userId          = (int)ar["UserId"]
            };

            AddUser(activities, activity, ar);
            return(activity);
        }
Пример #8
0
        public SEActivities GetSUId(string listId, string itemId)
        {
            var activities = new SEActivities();

            try
            {
                var lId = new Guid(listId);
                int iId = int.Parse(itemId);

                const string SQL = @"
                    SELECT    TOP (1) dbo.SS_Activities.ActivityKey 
                    FROM      dbo.SS_Threads INNER JOIN dbo.SS_Activities ON dbo.SS_Threads.Id = dbo.SS_Activities.ThreadId
                    WHERE     (dbo.SS_Threads.Deleted = 0) AND (dbo.SS_Threads.ListId = @ListId) AND 
                              (dbo.SS_Threads.ItemId = @ItemId) AND (dbo.SS_Activities.Kind = 0)";

                using (var connectionManager = new DBConnectionManager(SPContext.Current.Web))
                {
                    using (var sqlCommand = new SqlCommand(SQL, connectionManager.SqlConnection))
                    {
                        sqlCommand.Parameters.AddWithValue("@ListId", lId);
                        sqlCommand.Parameters.AddWithValue("@ItemId", iId);

                        activities.suid = new Guid(sqlCommand.ExecuteScalar().ToString());
                    }
                }
            }
            catch (Exception exception)
            {
                if (exception is AggregateException)
                {
                    exception = ((AggregateException)exception).Flatten();
                }

                activities.error = new Error
                {
                    message    = exception.Message,
                    stackTrace = exception.StackTrace,
                    kind       = typeof(Exception).ToString()
                };
            }

            return(activities);
        }
Пример #9
0
        // Private Methods (17) 

        private void AddList(SEActivities.Thread thread, SEActivities activities, DataRow tr)
        {
            if (!thread.listId.HasValue)
            {
                return;
            }

            bool found = activities.lists.Any(list => list.id == thread.listId.Value);

            if (found)
            {
                return;
            }

            lock (_locker)
            {
                found = activities.lists.Any(list => list.id == thread.listId.Value);
                if (found)
                {
                    return;
                }

                string url = string.Format("{0}/{1}?action=gotolist&webid={2}&listid={3}&nodlg=true",
                                           GetSafeWebUrl(tr["WebUrl"]), PROXY_URL, thread.webId, thread.listId);

                if (((ObjectKind)tr["ThreadKind"]) == ObjectKind.List)
                {
                    tr["ListName"] = tr["ThreadTitle"];
                }

                activities.lists.Add(new SEActivities.ItemList
                {
                    id   = thread.listId.Value,
                    name = tr["ListName"] as string,
                    icon = tr["ListIcon"] as string,
                    url  = url
                });
            }
        }
Пример #10
0
        private void GetData(int page, int limit, int activityLimit, int commentLimit, SEActivities activities)
        {
            SPWeb web    = SPContext.Current.Web;
            int   userId = web.CurrentUser.ID;

            _regionalSettings = SPContext.Current.RegionalSettings;

            using (var connectionManager = new DBConnectionManager(web))
            {
                DBConnectionManager manager = connectionManager;

                List <DataRow> threadRows = GetThreads(manager, userId, web, page, limit, null).AsEnumerable().ToList();

                List <SEActivities.Thread> threads =
                    threadRows.Select(
                        tr => BuildThread(tr, manager, userId, activityLimit, commentLimit, activities, null))
                    .ToList();

                foreach (SEActivities.Thread thread in threads)
                {
                    if (thread.activities.Count != 0 || thread.comments.Count != 0)
                    {
                        activities.threads.Add(thread);
                    }
                }
            }

            activities.threads = activities.threads.Distinct().ToList();
            activities.webs    = activities.webs.Distinct().ToList();
            activities.lists   = activities.lists.Distinct().ToList();
            activities.users   = activities.users.Distinct().ToList();

            SortThreadActivities(activities);
        }
Пример #11
0
        private SEActivities.Thread BuildThread(DataRow tr, DBConnectionManager manager, int userId, int activityLimit,
                                                int commentLimit, SEActivities activities, DateTime?offset, string kind = null)
        {
            foreach (string column in _threadDateTimeColumns)
            {
                SetLocalDateTime(tr, column, _utcTimeDict, _regionalSettings);
            }

            var activityRows = new List <DataRow>();
            var commentRows  = new List <DataRow>();

            var totalComments = (int)tr["TotalComments"];

            var  threadKind   = (ObjectKind)tr["ThreadKind"];
            bool ignoreAccess = threadKind == ObjectKind.StatusUpdate;

            if (!string.IsNullOrEmpty(kind))
            {
                kind = kind.ToLower();

                if (kind.Equals("activities"))
                {
                    activityRows =
                        GetThreadActivities(manager, userId, 0, 3, activityLimit, tr, offset, ignoreAccess)
                        .AsEnumerable()
                        .ToList();
                }
                else if (kind.Equals("comments"))
                {
                    commentRows =
                        GetThreadActivities(manager, userId, 4, 4, commentLimit, tr, offset, ignoreAccess)
                        .AsEnumerable()
                        .ToList();
                }
            }
            else
            {
                activityRows =
                    GetThreadActivities(manager, userId, 0, 3, activityLimit, tr, null, ignoreAccess)
                    .AsEnumerable()
                    .ToList();

                if (totalComments > 0)
                {
                    commentRows =
                        GetThreadActivities(manager, userId, 4, 4, commentLimit, tr, null, ignoreAccess)
                        .AsEnumerable()
                        .ToList();
                }
            }

            int totalActivities = activityRows.Count;

            var webId  = (Guid)tr["WebId"];
            var listId = tr["ListId"] as Guid?;
            var itemId = tr["ItemId"] as int?;

            var url = tr["ThreadUrl"] as string;

            if (listId.HasValue && itemId.HasValue)
            {
                url = string.Format("{0}/{1}?action=view&webid={2}&listid={3}&id={4}",
                                    GetSafeWebUrl(tr["WebUrl"]), PROXY_URL, webId, listId.Value, itemId.Value);
            }

            var thread = new SEActivities.Thread
            {
                id              = (Guid)tr["ThreadId"],
                title           = HttpUtility.HtmlDecode(HttpUtility.HtmlDecode((string)tr["ThreadTitle"])),
                url             = url,
                kind            = ((ObjectKind)tr["ThreadKind"]).ToString(),
                lastActivityOn  = ((DateTime)tr["ThreadLastActivityOn"]).ToString(DATE_FORMAT),
                firstActivityOn = ((DateTime)tr["ThreadFirstActivityOn"]).ToString(DATE_FORMAT),
                webId           = webId,
                listId          = listId,
                itemId          = itemId,
                totalActivities = totalActivities,
                totalComments   = totalComments
            };

            var threadTasks = new[]
            {
                Task.Factory.StartNew(() => BuildActivities(activityRows, activities, thread)),
                Task.Factory.StartNew(() => BuildComments(commentRows, activities, thread)),
                Task.Factory.StartNew(() => AddWeb(activities, thread, tr)),
                Task.Factory.StartNew(() => AddList(thread, activities, tr))
            };

            Task.WaitAll(threadTasks);

            thread.activities = thread.activities.Distinct().ToList();
            thread.comments   = thread.comments.Distinct().ToList();

            return(thread);
        }