/// <summary> /// 检查用户是否接收动态 /// </summary> /// <param name="activityService"></param> /// <param name="isPublic">群组是否为公开群组</param> /// <param name="userId">UserId</param> /// <param name="activity">动态</param> /// <returns>接收动态返回true,否则返回false</returns> private bool IsReceiveActivity(ActivityService activityService, bool isPublic, long userId, Activity activity) { if (isPublic) { //检查用户是否已在信息发布者的粉丝圈里面 FollowService followService = new FollowService(); if (followService.IsFollowed(userId, activity.UserId)) return false; } //检查用户是否已屏蔽群组 if (new UserBlockService().IsBlockedGroup(userId, activity.OwnerId)) return false; //检查用户是否接收该动态项目 Dictionary<string, bool> userSettings = activityService.GetActivityItemUserSettings(userId); if (userSettings.ContainsKey(activity.ActivityItemKey)) return userSettings[activity.ActivityItemKey]; else { //如果用户没有设置从默认设置获取 ActivityItem activityItem = activityService.GetActivityItem(activity.ActivityItemKey); if (activityItem != null) return activityItem.IsUserReceived; else return true; } }
/// <summary> /// 获取接收人UserId集合 /// </summary> /// <param name="activityService">动态业务逻辑类</param> /// <param name="ownerId">动态拥有者Id</param> /// <param name="userId">动态发布者Id</param> /// <param name="activityItemKey">动态项目标识</param> /// <returns></returns> IEnumerable<long> IActivityReceiverGetter.GetReceiverUserIds(ActivityService activityService, Activity activity) { SubscribeService subscribeService = new SubscribeService(TenantTypeIds.Instance().BlogThread()); IEnumerable<long> followerUserIds = subscribeService.GetUserIdsOfObject(activity.OwnerId); if (followerUserIds == null) return new List<long>(); return followerUserIds.Where(n => IsReceiveActivity(activityService, n, activity)); }
//done:zhengw,by mazq 缺少注释 //zhengw回复:已修改 /// <summary> /// 获取接收人UserId集合 /// </summary> /// <param name="activityService">动态业务逻辑类</param> /// <param name="activity">动态</param> /// <returns></returns> IEnumerable<long> IActivityReceiverGetter.GetReceiverUserIds(ActivityService activityService, Activity activity) { //1、获取用户的所有粉丝,然后通过IsReceiveActivity()检查,是否给该粉丝推送动态; FollowService followService = new FollowService(); IEnumerable<long> followerUserIds = followService.GetTopFollowerUserIds(activity.OwnerId, Follow_SortBy.DateCreated_Desc, ValueUtility.GetSqlMaxInt()); if (followerUserIds == null) return new List<long>(); return followerUserIds.Where(n => IsReceiveActivity(activityService, n, activity)); }
/// <summary> /// 是否具有删除群组动态的权限 /// </summary> /// <param name="authorizer"></param> /// <param name="activity"></param> /// <returns></returns> public static bool Group_DeleteGroupActivity(this Authorizer authorizer, Activity activity) { IUser currentUser = UserContext.CurrentUser; if (currentUser == null) return false; if (authorizer.Group_Manage(activity.OwnerId)) return true; if (currentUser.UserId == activity.UserId) return true; return false; }
/// <summary> /// 获取接收人UserId集合 /// </summary> /// <param name="activityService">动态业务逻辑类</param> /// <param name="activity">动态</param> /// <returns></returns> IEnumerable<long> IActivityReceiverGetter.GetReceiverUserIds(ActivityService activityService, Activity activity) { GroupService groupService = new GroupService(); IEnumerable<long> userIds = groupService.GetUserIdsOfGroup(activity.OwnerId); bool isPublic = false; var group = groupService.Get(activity.OwnerId); if (group != null) isPublic = group.IsPublic; if (userIds == null) return new List<long>(); return userIds.Where(n => IsReceiveActivity(activityService, isPublic, n, activity)); }
/// <summary> /// 检查用户是否接收动态 /// </summary> /// <param name="userId">UserId</param> /// <param name="activityItemKey">动态项目标识</param> /// <param name="fromOwnerId">动态拥有者</param> /// <returns>接收动态返回true,否则返回false</returns> private bool IsReceiveActivity(ActivityService activityService, long userId, Activity activity) { //首先检查是否屏蔽用户 UserBlockService userBlockService = new UserBlockService(); if (userBlockService.IsBlockedUser(userId, activity.OwnerId)) return false; //被验证用户为黑名单用户 PrivacyService privacyService = new PrivacyService(); if (privacyService.IsStopedUser(activity.OwnerId, userId)) return false; //判断指定对象可见 Dictionary<int, IEnumerable<ContentPrivacySpecifyObject>> dictionary = new ContentPrivacyService().GetPrivacySpecifyObjects(activity.TenantTypeId, activity.SourceId); if (dictionary != null && dictionary.Count() > 0) { foreach (var pair in dictionary) { IPrivacySpecifyObjectValidator privacySpecifyUserGetter = DIContainer.ResolveNamed<IPrivacySpecifyObjectValidator>(pair.Key.ToString()); foreach (var specifyObject in pair.Value) { if (privacySpecifyUserGetter.Validate(activity.OwnerId, userId, specifyObject.SpecifyObjectId)) return true; } } return false; } //检查用户是否接收该动态项目 Dictionary<string, bool> userSettings = activityService.GetActivityItemUserSettings(userId); if (userSettings.ContainsKey(activity.ActivityItemKey)) return userSettings[activity.ActivityItemKey]; else { //如果用户没有设置从默认设置获取 ActivityItem activityItem = activityService.GetActivityItem(activity.ActivityItemKey); if (activityItem != null) return activityItem.IsUserReceived; else return true; } }
/// <summary> /// 生成动态 /// </summary> /// <param name="activity">待生成的动态</param> /// <param name="toMyInbox">是否加入我的动态收件箱</param> /// <param name="isPublic">是否是公开的</param> public void Generate(Activity activity, bool toMyInbox, bool isPublic = true) { 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; } //生成拥有者动态 //change:by wuqh( 如果是群组中的动态,不生成拥有者动态) if (activity.OwnerType == ActivityOwnerTypes.Instance().Group() && activity.ReferenceId > 0) 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 (isPublic) { //推送给站点动态 if (activityItem.IsSiteReceived && activity.OwnerType == ActivityOwnerTypes.Instance().User()) activityRepository.InsertSiteInbox(activity.ActivityId); } }
/// <summary> /// 新建实体时使用 /// </summary> public static Activity New() { Activity activity = new Activity() { OwnerName = string.Empty, DateCreated = DateTime.UtcNow, LastModified = DateTime.UtcNow, TenantTypeId = string.Empty, ReferenceTenantTypeId = string.Empty }; return activity; }