Exemplo n.º 1
0
 /// <summary>
 /// 查询自lastActivityId以后进入用户时间线的动态
 /// </summary>
 /// <param name="ownerId">拥有者Id</param>
 /// <param name="lastActivityId">上次最后呈现的ActivityId</param>
 /// <param name="applicationId">应用Id</param>
 /// <param name="ownerType">动态拥有者类型</param>
 /// <returns>lastActivityId</returns>
 public IEnumerable <Activity> GetNewerActivities(long ownerId, long lastActivityId, int?applicationId, int?ownerType = null)
 {
     //根据lastActivityId获取到LastModified,获取晚于lastActivity.LastModified的动态并按LastModified倒排序
     if (ownerType == null)
     {
         ownerType = ActivityOwnerTypes.Instance().User();
     }
     return(activityRepository.GetNewerActivities(ownerId, lastActivityId, applicationId, ownerType));
 }
Exemplo n.º 2
0
        /// <summary>
        /// 更新动态的私有状态
        /// </summary>
        public void UpdatePrivateStatus(long activityId, bool isPrivate, bool isPublic = true)
        {
            //仅isPrivate发生变化才执行以下操作:
            //1、从false->true:参考Generate()中创建用户收件箱、站点收件箱 (注意不要让同一用户及站点收件箱的ActivityId重复)
            //2、从true->false:移除该ActivityId对应的用户收件箱(动态拥有者的收件箱除外)、站点收件箱;

            Activity activity = activityRepository.Get(activityId);

            if (activity == null)
            {
                return;
            }

            //若没有发生变化,则返回
            if (isPrivate == activity.IsPrivate)
            {
                return;
            }

            activityRepository.UpdatePrivateStatus(activityId, isPrivate);

            if (isPrivate)
            {
                //保留动态操作者的收件箱
                activityRepository.DeleteActivityFromUserInboxAndSiteInbox(activityId, activity.UserId);
            }
            else
            {
                //创建用户收件箱、站点收件箱
                ActivityItem activityItem = GetActivityItem(activity.ActivityItemKey);
                if (activityItem == null)
                {
                    return;
                }

                if (!activityItem.IsUserReceived)
                {
                    return;
                }

                IActivityReceiverGetter receiverGetter  = DIContainer.ResolveNamed <IActivityReceiverGetter>(activity.OwnerType.ToString());
                IEnumerable <long>      receiverUserIds = receiverGetter.GetReceiverUserIds(this, activity);

                activityRepository.InsertUserInboxs(activity.ActivityId, receiverUserIds);
                if (isPublic)
                {
                    //推送给站点动态
                    if (activityItem.IsSiteReceived && activity.OwnerType == ActivityOwnerTypes.Instance().User())
                    {
                        activityRepository.InsertSiteInbox(activity.ActivityId);
                    }
                }
            }
        }
Exemplo n.º 3
0
 public static ActivityOwnerTypes Instance()
 {
     if (_instance == null)
     {
         lock (lockObject)
         {
             if (_instance == null)
             {
                 _instance = new ActivityOwnerTypes();
             }
         }
     }
     return _instance;
 }
Exemplo n.º 4
0
 public static ActivityOwnerTypes Instance()
 {
     if (_instance == null)
     {
         lock (lockObject)
         {
             if (_instance == null)
             {
                 _instance = new ActivityOwnerTypes();
             }
         }
     }
     return(_instance);
 }
Exemplo n.º 5
0
        /// <summary>
        /// 查询自lastActivityId以后又有多少动态进入用户的时间线
        /// </summary>
        /// <param name="ownerId">拥有者Id</param>
        /// <param name="lastActivityId">上次最后呈现的ActivityId</param>
        /// <param name="applicationId">应用Id</param>
        /// <param name="operatorName">返回首个动态操作者名称</param>
        /// <param name="ownerType">动态拥有者类型</param>
        /// <returns>自lastActivityId以后进入用户时间线的动态个数</returns>
        public int GetNewerCount(long ownerId, long lastActivityId, int?applicationId, out string operatorName, int?ownerType = null)
        {
            //done:mazq,by zhengw:这里根据GetNewerActivity方法获取就行了吧?
            //mazq回复:性能有差异
            if (ownerType == null)
            {
                ownerType = ActivityOwnerTypes.Instance().User();
            }
            long userId     = 0;
            int  newerCount = activityRepository.GetNewerCount(ownerId, lastActivityId, applicationId, out userId, ownerType);

            operatorName = string.Empty;
            if (userId > 0)
            {
                var user = DIContainer.Resolve <IUserService>().GetUser(userId);
                if (user != null)
                {
                    operatorName = user.DisplayName;
                }
            }
            return(newerCount);
        }
Exemplo n.º 6
0
        /// <summary>
        /// 生成动态
        /// </summary>
        /// <param name="activity">待生成的动态</param>
        /// <param name="toMyInbox">是否加入我的动态收件箱</param>
        public void Generate(Activity activity, bool toMyInbox)
        {
            ActivityItem activityItem = GetActivityItem(activity.ActivityItemKey);

            if (activityItem == null)
            {
                return;
            }
            //1、首先检查IsOnlyOnce是否为true,如果为true并且已经生成过则仅更新动态的最后更新时间
            if (activityItem.IsOnlyOnce)
            {
                //检测是否已经存在,并更新动态的最后更新时间
                if (activityRepository.CheckExistAndUpdateLastModified(activity.OwnerId, activity.OwnerType, activity.ActivityItemKey))
                {
                    return;
                }
            }

            //2、如果存在ReferenceId,更新OwnerType+TenantTypeId+ReferenceId对应动态的LastModified;
            if (activity.ReferenceId > 0)
            {
                //对应主体内容动态的最后更新时间设置为当前时间(可能有多个Owner)
                activityRepository.UpdateLastModified(activity.ReferenceTenantTypeId, activity.ReferenceId);
                //3、判断用户是否对同一主体内容产生过从属内容动态,如果产生过则替换成本次操作;  处理类似连续回复的情况
                if (activityRepository.CheckExistAndUpdateSource(activity))
                {
                    return;
                }
            }

            //生成拥有者动态
            activityRepository.Insert(activity);

            //该类操作是否需要给用户推送动态
            if (!activityItem.IsUserReceived)
            {
                return;
            }

            //4、toMyInbox = true,也会加入自己的时间线(动态收件箱)
            if (toMyInbox)
            {
                //加入自己的时间线(动态收件箱)
                activityRepository.InsertUserInboxs(activity.ActivityId, new List <long> {
                    activity.UserId
                });
            }

            //私有内容不推送给其他用户
            if (activity.IsPrivate)
            {
                return;
            }

            //5、通过IsReceiveActivity()检查,是否给该粉丝推送动态,推送时确保 ActivityId+UserId 已存在不再添加;
            IActivityReceiverGetter receiverGetter  = DIContainer.ResolveNamed <IActivityReceiverGetter>(activity.OwnerType.ToString());
            IEnumerable <long>      receiverUserIds = receiverGetter.GetReceiverUserIds(this, activity);

            activityRepository.InsertUserInboxs(activity.ActivityId, receiverUserIds);

            //推送给站点动态
            if (activityItem.IsSiteReceived && activity.OwnerType == ActivityOwnerTypes.Instance().User())
            {
                activityRepository.InsertSiteInbox(activity.ActivityId);
            }
        }