Example #1
0
        /// <summary>
        /// 设置/取消 专题管理员
        /// </summary>
        /// <param name="groupId">专题Id</param>
        /// <param name="userId">用户Id</param>
        /// <param name="isManager">是否管理员</param>
        public bool SetManager(long groupId, long userId, bool isManager)
        {
            //设计要点:
            //1、userId必须是groupId成员
            TopicMember member = TopicMemberRepository.GetMember(groupId, userId);

            if (member == null)
            {
                return(false);
            }
            if (member.IsManager == isManager)
            {
                return(false);
            }
            member.IsManager = isManager;
            TopicMemberRepository.Update(member);
            if (isManager)
            {
                EventBus <TopicMember> .Instance().OnAfter(member, new CommonEventArgs(EventOperationType.Instance().SetTopicManager()));
            }
            else
            {
                EventBus <TopicMember> .Instance().OnAfter(member, new CommonEventArgs(EventOperationType.Instance().CancelTopicManager()));
            }
            return(true);
        }
 void SetStatusInvitationnForJoinTopicEventModule_After(Invitation sender, CommonEventArgs eventArgs)
 {
     if (eventArgs.EventOperationType == EventOperationType.Instance().Update())
     {
         InvitationService invitationService = DIContainer.Resolve <InvitationService>();
         Invitation        invitation        = invitationService.Get(sender.Id);
         if (invitation != null && invitation.InvitationTypeKey == InvitationTypeKeys.Instance().InviteJoinTopic() && invitation.Status == InvitationStatus.Accept)
         {
             TopicService groupService = new TopicService();
             TopicMember  member       = TopicMember.New();
             member.TopicId   = sender.RelativeObjectId;
             member.UserId    = sender.UserId;
             member.IsManager = false;
             groupService.CreateTopicMember(member);
         }
         else if (invitation != null && invitation.InvitationTypeKey == InvitationTypeKeys.Instance().ApplyJoinTopic() && invitation.Status == InvitationStatus.Accept)
         {
             TopicService groupService = new TopicService();
             TopicMember  member       = TopicMember.New();
             member.TopicId   = sender.RelativeObjectId;
             member.UserId    = sender.SenderUserId;
             member.IsManager = false;
             groupService.CreateTopicMember(member);
             IEnumerable <long> a = groupService.GetTopicMemberApplies(sender.RelativeObjectId, TopicMemberApplyStatus.Pending, 20, 1).Where(n => n.UserId == sender.SenderUserId).Select(m => m.Id);
             groupService.ApproveTopicMemberApply(a, true);
         }
         else if (invitation != null && invitation.InvitationTypeKey == InvitationTypeKeys.Instance().ApplyJoinTopic() && invitation.Status == InvitationStatus.Refuse)
         {
             TopicService       groupService = new TopicService();
             IEnumerable <long> a            = groupService.GetTopicMemberApplies(sender.RelativeObjectId, TopicMemberApplyStatus.Pending, 20, 1).Where(n => n.UserId == sender.SenderUserId).Select(m => m.Id);
             groupService.ApproveTopicMemberApply(a, false);
         }
     }
 }
Example #3
0
        /// <summary>
        /// 更换群主
        /// </summary>
        /// <param name="groupId">专题Id</param>
        /// <param name="newOwnerUserId">新群主UserId</param>
        public void ChangeTopicOwner(long groupId, long newOwnerUserId)
        {
            //更换群主后,原群主转换成专题成员,如果新群主是专题成员则从成员中移除
            TopicEntity group          = groupRepository.Get(groupId);
            long        oldOwnerUserId = group.UserId;

            group.UserId = newOwnerUserId;
            groupRepository.ChangeTopicOwner(groupId, newOwnerUserId);

            //原群主的专题数-1,加入专题数+1
            OwnerDataService ownerDataService = new OwnerDataService(TenantTypeIds.Instance().User());

            ownerDataService.Change(oldOwnerUserId, OwnerDataKeys.Instance().CreatedTopicCount(), -1);
            ownerDataService.Change(oldOwnerUserId, OwnerDataKeys.Instance().JoinedTopicCount(), 1);

            //原群主转换成专题成员
            TopicMember TopicMember = TopicMember.New();

            TopicMember.TopicId = groupId;
            TopicMember.UserId  = oldOwnerUserId;
            TopicMemberRepository.Insert(TopicMember);

            //新群主的专题数+1,加入专题数-1
            ownerDataService.Change(newOwnerUserId, OwnerDataKeys.Instance().CreatedTopicCount(), 1);

            //如果新群主是专题成员则从成员中移除
            if (IsMember(groupId, newOwnerUserId))
            {
                DeleteTopicMember(groupId, newOwnerUserId);
            }
        }
Example #4
0
        /// <summary>
        /// 增加专题成员
        /// </summary>
        /// <param name="TopicMember"></param>
        public void CreateTopicMember(TopicMember TopicMember)
        {
            //设计要点:
            //1、同一个专题不允许用户重复加入
            //2、群主不允许成为专题成员
            if (IsMember(TopicMember.TopicId, TopicMember.UserId))
            {
                return;
            }
            if (IsOwner(TopicMember.TopicId, TopicMember.UserId))
            {
                return;
            }
            long id = 0;

            long.TryParse(TopicMemberRepository.Insert(TopicMember).ToString(), out id);

            if (id > 0)
            {
                EventBus <TopicMember> .Instance().OnAfter(TopicMember, new CommonEventArgs(EventOperationType.Instance().Create()));

                //用户的参与专题数+1
                OwnerDataService ownerDataService = new OwnerDataService(TenantTypeIds.Instance().User());
                ownerDataService.Change(TopicMember.UserId, OwnerDataKeys.Instance().JoinedTopicCount(), 1);
            }
        }
Example #5
0
        /// <summary>
        /// 接受/拒绝专题加入申请
        /// </summary>
        /// <param name="groupIds">申请Id列表</param>
        /// <param name="isApproved">是否接受</param>
        public void ApproveTopicMemberApply(IEnumerable <long> applyIds, bool isApproved)
        {
            //设计要点:
            //1、仅允许对待处理状态的申请变更状态;
            //2、通过批准的申请,直接创建TopicMember
            IEnumerable <TopicMemberApply> TopicMemberApplies = TopicMemberApplyRepository.PopulateEntitiesByEntityIds(applyIds);
            TopicMemberApplyStatus         applyStatus        = isApproved ? TopicMemberApplyStatus.Approved : TopicMemberApplyStatus.Disapproved;
            string operationType = isApproved ? EventOperationType.Instance().Approved() : EventOperationType.Instance().Disapproved();

            foreach (var apply in TopicMemberApplies)
            {
                if (apply.ApplyStatus != TopicMemberApplyStatus.Pending)
                {
                    continue;
                }



                apply.ApplyStatus = applyStatus;
                TopicMemberApplyRepository.Update(apply);



                EventBus <TopicMemberApply> .Instance().OnAfter(apply, new CommonEventArgs(operationType));

                if (isApproved)
                {
                    TopicMember member = TopicMember.New();
                    member.UserId  = apply.UserId;
                    member.TopicId = apply.TopicId;
                    CreateTopicMember(member);
                }
            }
        }
Example #6
0
 /// <summary>
 /// 专题成员实体
 /// </summary>
 public static TopicMember New()
 {
     TopicMember groupMember = new TopicMember()
     {
         JoinDate = DateTime.UtcNow
     };
     return groupMember;
 }
 /// <summary>
 /// 专题成员实体
 /// </summary>
 public static TopicMember New()
 {
     TopicMember groupMember = new TopicMember()
     {
         JoinDate = DateTime.UtcNow
     };
     return groupMember;
 }
        /// <summary>
        /// 动态处理程序
        /// </summary>
        /// <param name="groupMember"></param>
        /// <param name="eventArgs"></param>
        private void TopicMemberActivityModule_After(TopicMember groupMember, CommonEventArgs eventArgs)
        {
            ActivityService activityService = new ActivityService();
            if (eventArgs.EventOperationType == EventOperationType.Instance().Create())
            {
                //生成动态
                if (groupMember == null)
                    return;
                var group = new TopicService().Get(groupMember.TopicId);
                if (group == null)
                    return;
                //生成Owner为专题的动态
                Activity actvityOfTopic = Activity.New();
                actvityOfTopic.ActivityItemKey = ActivityItemKeys.Instance().CreateTopicMember();
                actvityOfTopic.ApplicationId = TopicConfig.Instance().ApplicationId;
                actvityOfTopic.IsOriginalThread = true;
                actvityOfTopic.IsPrivate = !group.IsPublic;
                actvityOfTopic.UserId = groupMember.UserId;
                actvityOfTopic.ReferenceId = 0;
                actvityOfTopic.ReferenceTenantTypeId = string.Empty;
                actvityOfTopic.SourceId = groupMember.Id;
                actvityOfTopic.TenantTypeId = TenantTypeIds.Instance().User();
                actvityOfTopic.OwnerId = group.TopicId;
                actvityOfTopic.OwnerName = group.TopicName;
                actvityOfTopic.OwnerType = ActivityOwnerTypes.Instance().Topic();

                activityService.Generate(actvityOfTopic, false);

                //生成Owner为用户的动态
                Activity actvityOfUser = Activity.New();
                actvityOfUser.ActivityItemKey = ActivityItemKeys.Instance().JoinTopic();
                actvityOfUser.ApplicationId = actvityOfTopic.ApplicationId;
                actvityOfUser.HasImage = actvityOfTopic.HasImage;
                actvityOfUser.HasMusic = actvityOfTopic.HasMusic;
                actvityOfUser.HasVideo = actvityOfTopic.HasVideo;
                actvityOfUser.IsOriginalThread = actvityOfTopic.IsOriginalThread;
                actvityOfUser.IsPrivate = actvityOfTopic.IsPrivate;
                actvityOfUser.UserId = actvityOfTopic.UserId;
                actvityOfUser.ReferenceId = actvityOfTopic.ReferenceId;
                actvityOfTopic.ReferenceTenantTypeId = actvityOfTopic.ReferenceTenantTypeId;
                actvityOfUser.SourceId = actvityOfTopic.SourceId;

                actvityOfUser.TenantTypeId = actvityOfTopic.TenantTypeId;
                actvityOfUser.OwnerId = groupMember.UserId;
                actvityOfUser.OwnerName = groupMember.User.DisplayName;
                actvityOfUser.OwnerType = ActivityOwnerTypes.Instance().User();
                activityService.Generate(actvityOfUser, false);
            }
            else if (eventArgs.EventOperationType == EventOperationType.Instance().Delete()) //删除动态
            {
                activityService.DeleteSource(TenantTypeIds.Instance().User(), groupMember.UserId);
            }
        }
Example #9
0
        /// <summary>
        /// 移除专题成员
        /// </summary>
        /// <param name="groupId">专题Id</param>
        /// <param name="userId">用户Id</param>
        public void DeleteTopicMember(long groupId, long userId)
        {
            TopicMember TopicMember = TopicMemberRepository.GetMember(groupId, userId);

            if (TopicMember == null)
            {
                return;
            }

            int affectCount = TopicMemberRepository.Delete(TopicMember);

            if (affectCount > 0)
            {
                EventBus <TopicMember> .Instance().OnAfter(TopicMember, new CommonEventArgs(EventOperationType.Instance().Delete()));

                //用户的参与专题数-1
                OwnerDataService ownerDataService = new OwnerDataService(TenantTypeIds.Instance().User());
                ownerDataService.Change(userId, OwnerDataKeys.Instance().JoinedTopicCount(), -1);
            }
        }
Example #10
0
        /// <summary>
        /// 检测用户在专题中属于什么角色
        /// </summary>
        /// <param name="groupId">专题Id</param>
        /// <param name="userId">用户Id</param>
        /// <returns><see cref="TopicMemberRole"/></returns>
        private TopicMemberRole GetTopicMemberRole(long groupId, long userId)
        {
            //设计要点:
            //1、需要缓存,并维护缓存的即时性
            TopicMember member = TopicMemberRepository.GetMember(groupId, userId);

            if (member == null)
            {
                TopicEntity group = groupRepository.Get(groupId);
                if (group != null && group.UserId == userId)
                {
                    return(TopicMemberRole.Owner);
                }
                return(TopicMemberRole.None);
            }
            if (member.IsManager)
            {
                return(TopicMemberRole.Manager);
            }
            else
            {
                return(TopicMemberRole.Member);
            }
        }
        /// <summary>
        /// 增加专题成员
        /// </summary>
        /// <param name="TopicMember"></param>
        public void CreateTopicMember(TopicMember TopicMember)
        {
            //设计要点:
            //1、同一个专题不允许用户重复加入
            //2、群主不允许成为专题成员
            if (IsMember(TopicMember.TopicId, TopicMember.UserId))
                return;
            if (IsOwner(TopicMember.TopicId, TopicMember.UserId))
                return;
            long id = 0;
            long.TryParse(TopicMemberRepository.Insert(TopicMember).ToString(), out id);

            if (id > 0)
            {
                EventBus<TopicMember>.Instance().OnAfter(TopicMember, new CommonEventArgs(EventOperationType.Instance().Create()));
                //用户的参与专题数+1
                OwnerDataService ownerDataService = new OwnerDataService(TenantTypeIds.Instance().User());
                ownerDataService.Change(TopicMember.UserId, OwnerDataKeys.Instance().JoinedTopicCount(), 1);
            }
        }
        /// <summary>
        /// 通知处理程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        private void TopicMemberNoticeModule_After(TopicMember sender, CommonEventArgs eventArgs)
        {
            if (eventArgs.EventOperationType != EventOperationType.Instance().Delete() && eventArgs.EventOperationType != EventOperationType.Instance().Create() && sender != null)
                return;
            TopicService groupService = new TopicService();
            TopicEntity entity = groupService.Get(sender.TopicId);
            if (entity == null)
                return;

            User senderUser = DIContainer.Resolve<IUserService>().GetFullUser(sender.UserId);
            if (senderUser == null)
                return;

            NoticeService noticeService = DIContainer.Resolve<NoticeService>();
            Notice notice;

            List<long> toUserIds = new List<long>();
            toUserIds.Add(entity.UserId);
            toUserIds.AddRange(entity.TopicManagers.Select(n => n.UserId));
            //删除专题成员通知群管理员
            if (eventArgs.EventOperationType == EventOperationType.Instance().Delete())
            {
                foreach (var toUserId in toUserIds)
                {
                    if (toUserId == sender.UserId)
                        continue;
                    notice = Notice.New();
                    notice.UserId = toUserId;
                    notice.ApplicationId = TopicConfig.Instance().ApplicationId;
                    notice.TypeId = NoticeTypeIds.Instance().Hint();
                    notice.LeadingActorUserId = sender.UserId;
                    notice.LeadingActor = senderUser.DisplayName;
                    notice.LeadingActorUrl = SiteUrls.FullUrl(SiteUrls.Instance().SpaceHome(sender.UserId));
                    notice.RelativeObjectId = sender.TopicId;
                    notice.RelativeObjectName = StringUtility.Trim(entity.TopicName, 64);
                    notice.RelativeObjectUrl = SiteUrls.FullUrl(SiteUrls.Instance().TopicHome(entity.TopicKey));
                    notice.TemplateName = NoticeTemplateNames.Instance().MemberQuit();
                    noticeService.Create(notice);
                }
            }
            else if (eventArgs.EventOperationType == EventOperationType.Instance().Create()) //添加群成员时向群管理员发送通知
            {
                foreach (var toUserId in toUserIds)
                {
                    if (toUserId == sender.UserId)
                        continue;
                    notice = Notice.New();
                    notice.UserId = toUserId;
                    notice.ApplicationId = TopicConfig.Instance().ApplicationId;
                    notice.TypeId = NoticeTypeIds.Instance().Hint();
                    notice.LeadingActorUserId = sender.UserId;
                    notice.LeadingActor = senderUser.DisplayName;
                    notice.LeadingActorUrl = SiteUrls.FullUrl(SiteUrls.Instance().SpaceHome(sender.UserId));
                    notice.RelativeObjectId = sender.TopicId;
                    notice.RelativeObjectName = StringUtility.Trim(entity.TopicName, 64);
                    notice.RelativeObjectUrl = SiteUrls.FullUrl(SiteUrls.Instance().TopicHome(entity.TopicKey));
                    notice.TemplateName = NoticeTemplateNames.Instance().MemberJoin();
                    noticeService.Create(notice);
                }
                //向加入者发送通知

                //notice = Notice.New();
                //notice.UserId = sender.UserId;
                //notice.ApplicationId = TopicConfig.Instance().ApplicationId;
                //notice.TypeId = NoticeTypeIds.Instance().Hint();
                //notice.LeadingActorUserId = sender.UserId;
                //notice.LeadingActor = senderUser.DisplayName;
                //notice.LeadingActorUrl = SiteUrls.FullUrl(SiteUrls.Instance().SpaceHome(sender.UserId));
                //notice.RelativeObjectId = sender.TopicId;
                //notice.RelativeObjectName = StringUtility.Trim(entity.TopicName, 64);
                //notice.RelativeObjectUrl = SiteUrls.FullUrl(SiteUrls.Instance().TopicHome(entity.TopicKey));
                //notice.TemplateName = NoticeTemplateNames.Instance().MemberApplyApproved();
                //noticeService.Create(notice);
            }
        }
        /// <summary>
        /// 设置/取消管理员通知处理程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        private void SetManagerNoticeEventModule_After(TopicMember sender, CommonEventArgs eventArgs)
        {
            if (eventArgs.EventOperationType != EventOperationType.Instance().SetTopicManager() && eventArgs.EventOperationType != EventOperationType.Instance().CancelTopicManager())
                return;

            TopicService groupService = new TopicService();
            TopicEntity entity = groupService.Get(sender.TopicId);
            if (entity == null)
                return;

            User senderUser = DIContainer.Resolve<IUserService>().GetFullUser(sender.UserId);
            if (senderUser == null)
                return;

            NoticeService noticeService = DIContainer.Resolve<NoticeService>();

            Notice notice = Notice.New();
            notice.UserId = sender.UserId;
            notice.ApplicationId = TopicConfig.Instance().ApplicationId;
            notice.TypeId = NoticeTypeIds.Instance().Hint();
            notice.LeadingActorUserId = 0;
            notice.LeadingActor = string.Empty;
            notice.LeadingActorUrl = string.Empty;
            notice.RelativeObjectId = sender.TopicId;
            notice.RelativeObjectName = StringUtility.Trim(entity.TopicName, 64);
            notice.RelativeObjectUrl = SiteUrls.FullUrl(SiteUrls.Instance().TopicHome(entity.TopicKey));

            if (eventArgs.EventOperationType == EventOperationType.Instance().SetTopicManager())
            {
                notice.TemplateName = NoticeTemplateNames.Instance().SetTopicManager();
            }
            else
            {
                notice.TemplateName = NoticeTemplateNames.Instance().CannelTopicManager();
            }
            noticeService.Create(notice);
        }