Exemple #1
0
        public async Task <IActionResult> JoinTopic([FromBody] JoinTopicModel model)
        {
            var topicId = XUtils.ParseId(model.TopicId);

            if (topicId == null)
            {
                return(new ApiError(MyErrorCode.IdNotFound, "Id parse error").Wrap());
            }

            // Check topic exist
            var topic = await Context.Topics.FirstOrDefaultAsync(p => p.Id == topicId);

            if (topic == null)
            {
                return(new ApiError(MyErrorCode.IdNotFound, "Topic id not found").Wrap());
            }

            // Check if already in topic
            var member = await Context.TopicMembers
                         .FirstOrDefaultAsync(p => p.TopicId == topicId.Value && p.UserId == AuthStore.UserId.Value);

            if (member != null)
            {
                return(new ApiError(MyErrorCode.UniqueConstraintConflict, "你已经加入过了").Wrap());
            }

            // join topic
            member = new TopicMember(topicId.Value, AuthStore.UserId.Value, MemberRole.Normal);

            await Context.AddAsync(member);

            await Context.GoAsync();

            return(Ok());
        }
Exemple #2
0
        /// <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);
            }
        }
Exemple #3
0
 public static QTopicMember NormalView(TopicMember p)
 {
     return(p == null ? null : new QTopicMember
     {
         TopicId = p.TopicId,
         UserId = p.UserId,
         Role = p.Role
     });
 }
Exemple #4
0
        public ActionResult _ValidateQuestion(long groupId, string myAnswer)
        {
            StatusMessageData message = null;
            TopicEntity       group   = topicService.Get(groupId);

            if (group == null)
            {
                return(Json(new StatusMessageData(StatusMessageType.Error, "找不到专题!")));
            }


            //已修改
            IUser currentUser = UserContext.CurrentUser;

            if (currentUser == null)
            {
                return(Json(new StatusMessageData(StatusMessageType.Error, "您尚未登录!")));
            }
            if (group.JoinWay != TopicJoinWay.ByQuestion)
            {
                return(Json(new StatusMessageData(StatusMessageType.Error, "当前加入方式不是问题验证")));
            }


            bool isMember = topicService.IsMember(group.TopicId, currentUser.UserId);

            if (!isMember)
            {
                if (group.Answer == myAnswer)
                {
                    TopicMember member = TopicMember.New();
                    member.UserId    = UserContext.CurrentUser.UserId;
                    member.TopicId   = group.TopicId;
                    member.IsManager = false;
                    topicService.CreateTopicMember(member);
                    message = new StatusMessageData(StatusMessageType.Success, "加入专题成功!");
                }
                else
                {
                    message = new StatusMessageData(StatusMessageType.Error, "答案错误!");
                }
            }
            else
            {
                message = new StatusMessageData(StatusMessageType.Hint, "您已加入过该专题!");
            }
            return(Json(message));
        }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
        public ActionResult JoinTopic(long groupId)
        {
            //需判断是否已经加入过专题
            StatusMessageData message = null;
            TopicEntity       group   = topicService.Get(groupId);

            if (group == null)
            {
                return(Json(new StatusMessageData(StatusMessageType.Error, "找不到专题!")));
            }

            IUser currentUser = UserContext.CurrentUser;

            if (currentUser == null)
            {
                return(Json(new StatusMessageData(StatusMessageType.Error, "您尚未登录!")));
            }
            if (group.JoinWay != TopicJoinWay.Direct)
            {
                return(Json(new StatusMessageData(StatusMessageType.Error, "当前加入方式不是直接加入")));
            }

            //已修改

            //判断是否加入过该专题
            bool isMember = topicService.IsMember(groupId, currentUser.UserId);

            //未加入
            if (!isMember)
            {
                TopicMember member = TopicMember.New();
                member.UserId    = currentUser.UserId;
                member.TopicId   = group.TopicId;
                member.IsManager = false;
                topicService.CreateTopicMember(member);
                message = new StatusMessageData(StatusMessageType.Success, "加入专题成功!");
            }
            else
            {
                message = new StatusMessageData(StatusMessageType.Hint, "您已加入过该专题!");
            }
            return(Json(message));
        }
        public async Task Handle(TopicCreatedEvent e, CancellationToken cancellationToken)
        {
            TopicMember member;

            if (e.IsGroup)
            {
                // role: super
                member = new TopicMember(e.TopicId, e.CreatorId, MemberRole.Super, true);
            }
            else
            {
                // role: normal
                member = new TopicMember(e.TopicId, e.CreatorId, MemberRole.Normal, true);
            }

            await Context.TopicMembers.AddAsync(member);

            await Context.GoAsync();
        }
Exemple #8
0
        /// <summary>
        /// 用户加入专题动态内容快
        /// </summary>
        /// <param name="ActivityId">动态id</param>
        /// <returns>用户加入专题动态内容快</returns>
        //[DonutOutputCache(CacheProfile = "Frequently")]
        public ActionResult _JoinTopic(long ActivityId)
        {
            Activity activity = activityService.Get(ActivityId);

            if (activity == null)
            {
                return(Content(string.Empty));
            }
            TopicMember groupMember = topicService.GetTopicMember(activity.SourceId);

            if (groupMember == null)
            {
                return(Content(string.Empty));
            }
            TopicEntity group = topicService.Get(groupMember.TopicId);

            if (group == null)
            {
                return(Content(string.Empty));
            }

            ViewData["activity"] = activity;
            return(View(group));
        }
Exemple #9
0
        /// <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);
            }
        }
Exemple #10
0
        /// <summary>
        /// Get the current forum topic based on the id in the context
        /// </summary>
        /// <param name="context"></param>
        /// <param name="cache"></param>
        /// <param name="memberData"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        /// <remarks>
        /// So that we don't have to look this up multiple times in a single request, this will use the given ICacheProvider to cache it
        /// </remarks>
        public ReadOnlyTopic CurrentTopic(HttpContextBase context, ICacheProvider cache, MemberData memberData, IPublishedContent content)
        {
            var topic = (ReadOnlyTopic)cache.GetCacheItem(typeof(TopicService) + "-CurrentTopic", () =>
            {
                var contextId = context.Items["topicID"] as string;
                if (contextId != null)
                {
                    int topicId;
                    if (int.TryParse(contextId, out topicId))
                    {
                        return(QueryById(topicId));
                    }
                }
                return(null);
            });

            if (topic == null)
            {
                return(null);
            }

            topic.MemberData = memberData;
            if (content != null)
            {
                topic.ForumNewTopicsAllowed = content.NewTopicsAllowed();
                topic.MainNotification      = content.GetPropertyValue <string>("mainNotification");
                if (string.IsNullOrWhiteSpace(topic.MainNotification))
                {
                    topic.MainNotification = "This forum is in read only mode, you can no longer reply";
                }
                topic.ForumName = content.Name;
                topic.ForumUrl  = content.Url;
            }

            if (memberData != null && memberData.Member != null)
            {
                topic.Subscribed = Utils.IsSubscribedToForumTopic(topic.Id, memberData.Member.Id);
            }

            var currentMember = memberData != null && memberData.Member != null
                ? memberData.Member
                : null;

            var topicAuthorIsCurrentMember = currentMember != null && topic.MemberId == currentMember.Id;

            var umbracoHelper = new UmbracoHelper(UmbracoContext.Current);

            topic.TopicAuthor = topicAuthorIsCurrentMember
                ? currentMember
                : umbracoHelper.TypedMember(topic.MemberId);

            if (topic.TopicAuthor == null)
            {
                return(topic);
            }

            topic.TopicMembers = new List <TopicMember>();
            var author = new TopicMember
            {
                Member = topic.TopicAuthor,
                Roles  = topicAuthorIsCurrentMember ? memberData.Roles : topic.TopicAuthor.GetRoles()
            };

            topic.TopicMembers.Add(author);

            foreach (var comment in topic.Comments)
            {
                if (topic.TopicMembers.Any(x => x.Member.Id == comment.MemberId))
                {
                    continue;
                }

                var commentAuthorIsCurrentMember = currentMember != null && comment.MemberId == currentMember.Id;
                if (commentAuthorIsCurrentMember)
                {
                    var commentAuthor = new TopicMember {
                        Member = currentMember, Roles = memberData.Roles
                    };
                    topic.TopicMembers.Add(commentAuthor);
                }
                else
                {
                    var commentMember = umbracoHelper.TypedMember(comment.MemberId);
                    if (commentMember == null)
                    {
                        continue;
                    }

                    var commenterRoles = commentMember.GetRoles();
                    var commentAuthor  = new TopicMember {
                        Member = commentMember, Roles = commenterRoles
                    };
                    topic.TopicMembers.Add(commentAuthor);
                }
            }

            foreach (var comment in topic.Comments)
            {
                comment.TopicMembers = topic.TopicMembers;
                comment.MemberData   = memberData;
                if (topic.Answer == comment.Id)
                {
                    comment.IsAnswer = true;
                }
                var forumContent = umbracoHelper.TypedContent(topic.ParentId);
                comment.ForumNewTopicsAllowed = forumContent.NewTopicsAllowed();
            }

            return(topic);
        }
Exemple #11
0
        static void Main(string[] args)
        {
            var randomText = new RandomText();
            var random     = new Random();

            // copy blob files
            var blobStorePath = Environment.GetEnvironmentVariable("BLOB_STORE");

            foreach (var file in new DirectoryInfo("./blob-seeddata").GetFiles())
            {
                file.CopyTo(Path.Combine(blobStorePath, file.Name), true);
            }

            // Clear all data in database
            using var context = new OneContext(new DbContextOptions <OneContext>());

            context.Database.EnsureDeleted();
            context.Database.Migrate();

            Console.WriteLine("Database migrated");


            // Insert work data
            List <Work> works;

            using (var reader = new StreamReader("./workseed.csv"))
                using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
                {
                    works = csv.GetRecords <WorkSeedRecord>().ToList()
                            .Select(p => new Work((WorkType)p.Type, p.Name, p.Author, p.Description, p.CoverUrl))
                            .ToList();
                }

            context.Works.AddRange(works);

            // Insert user data
            User adminUser = new User("admin", "access-code-001", "admin", "System admin");

            context.Users.Add(adminUser);

            var users = new List <User>();

            for (int i = 0; i < 100; i++)
            {
                users.Add(new User($"user{i}", "access-code-002", $"NormalUser{i}", ""));
            }
            context.Users.AddRange(users);

            // Insert comment data
            foreach (var work in works)
            {
                int commentCount = random.Next(1, 101);

                for (int i = 0; i < commentCount; i++)
                {
                    var comment = new Comment(users[i].Id, work.Id, randomText.Generate(10), randomText.Generate(50, 80), random.Next(1, 6));
                    comment.SetAgreeCount(random.Next(1, 256));
                    comment.SetDisagreeCount(random.Next(0, 32));
                    context.Add(comment);
                }
            }

            // Insert topic data
            List <Topic> topics = new List <Topic>();

            foreach (var work in works)
            {
                int topicCount = random.Next(1, 10);

                for (int i = 0; i < topicCount; i++)
                {
                    var topicName   = work.Name + " " + randomText.Generate(6, 14);
                    var description = randomText.Generate(50, 200);
                    var topic       = new Topic(false, topicName, description, work.Id, adminUser.Id);
                    topic.SetMemberCount(10);
                    topics.Add(topic);
                }

                for (int i = 0; i < topicCount; i++)
                {
                    var topicName   = work.Name + " " + randomText.Generate(3, 10);
                    var description = randomText.Generate(50, 200);
                    var topic       = new Topic(true /*diff*/, topicName, description, work.Id, adminUser.Id);
                    topic.SetMemberCount(10);
                    topics.Add(topic);

                    // super admin
                    var member = new TopicMember(topic.Id, adminUser.Id, MemberRole.Super, true);

                    context.Add(member);
                }
            }

            context.Topics.AddRange(topics);


            // Insert discussion data
            // random count discussion entry for each topic
            foreach (var topic in topics.Where(p => p.IsGroup == false).ToList())
            {
                int discussCount = random.Next(1, 10);
                for (var i = 0; i < discussCount; i++)
                {
                    var discussion = new Discussion(topic.Id, users[i].Id, randomText.Generate(40, 120), null);
                    context.Discussions.Add(discussion);
                }
            }

            // Insert post data
            // random count post for each topic, random count replies for each post
            foreach (var topic in topics.Where(p => p.IsGroup == true).ToList())
            {
                int postCount = random.Next(1, 50);

                for (int i = 0; i < postCount; i++)
                {
                    var post = new Post(adminUser.Id, topic.Id, randomText.Generate(50, 150), randomText.Generate(6, 16));
                    context.Add(post);

                    int replyCount = random.Next(1, 50);
                    for (int j = 0; j < replyCount; j++)
                    {
                        var reply = new Reply(adminUser.Id, post.Id, randomText.Generate(10, 50));
                        context.Add(reply);
                    }
                }
            }


            // Create no content works
            for (int i = 1; i <= 40; i++)
            {
                var work = new Work(WorkType.Book, $"example book {i}", "NULL", "HELLO", "/blob/matrix.webp");
                context.Add(work);

                work = new Work(WorkType.Film, $"example film {i}", "NULL", "HELLO", "/blob/matrix.webp");
                context.Add(work);
            }

            Console.WriteLine("Start saving changes");
            context.SaveChanges();
            Console.WriteLine("Changes saved");
        }