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()); }
/// <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); } }
public static QTopicMember NormalView(TopicMember p) { return(p == null ? null : new QTopicMember { TopicId = p.TopicId, UserId = p.UserId, Role = p.Role }); }
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)); }
/// <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); }
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(); }
/// <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)); }
/// <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> /// 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); }
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"); }