Esempio n. 1
0
        public async Task CreateAsync(CreateCategory command)
        {
            await _createValidator.ValidateCommandAsync(command);

            var categoriesCount = await _dbContext.Categories
                                  .Where(x => x.SiteId == command.SiteId && x.Status != StatusType.Deleted)
                                  .CountAsync();

            var sortOrder = categoriesCount + 1;

            var category = new Category(command.Id,
                                        command.SiteId,
                                        command.Name,
                                        sortOrder,
                                        command.PermissionSetId);

            _dbContext.Categories.Add(category);
            _dbContext.Events.Add(new Event(command.SiteId,
                                            command.UserId,
                                            EventType.Created,
                                            typeof(Category),
                                            category.Id,
                                            new
            {
                category.Name,
                category.PermissionSetId,
                category.SortOrder
            }));

            await _dbContext.SaveChangesAsync();

            _cacheManager.Remove(CacheKeys.Categories(command.SiteId));
            _cacheManager.Remove(CacheKeys.CurrentForums(command.SiteId));
        }
Esempio n. 2
0
        public async Task <string> CreateAsync(CreateTopic command)
        {
            await _createValidator.ValidateCommandAsync(command);

            var title = Regex.Replace(command.Title, @"\s+", " "); // Remove multiple spaces from title

            var slug = string.IsNullOrWhiteSpace(command.Slug)
                ? await GenerateSlugAsync(command.ForumId, title)
                : command.Slug;

            var topic = Post.CreateTopic(command.Id,
                                         command.ForumId,
                                         command.UserId,
                                         title,
                                         slug,
                                         command.Content,
                                         command.Status);

            _dbContext.Posts.Add(topic);
            _dbContext.Events.Add(new Event(command.SiteId,
                                            command.UserId,
                                            EventType.Created,
                                            typeof(Post),
                                            command.Id,
                                            new
            {
                command.ForumId,
                title,
                Slug = slug,
                command.Content,
                command.Status
            }));

            var forum = await _dbContext.Forums.Include(x => x.Category).FirstOrDefaultAsync(x => x.Id == topic.ForumId);

            forum.UpdateLastPost(topic.Id);
            forum.IncreaseTopicsCount();
            forum.Category.IncreaseTopicsCount();

            var user = await _dbContext.Users.FirstOrDefaultAsync(x => x.Id == topic.CreatedBy);

            user.IncreaseTopicsCount();

            await _dbContext.SaveChangesAsync();

            _cacheManager.Remove(CacheKeys.Forum(forum.Id));

            return(slug);
        }
Esempio n. 3
0
        public async Task Should_return_false_when_name_is_not_unique_for_existing_permission_set()
        {
            var options         = Shared.CreateContextOptions();
            var siteId          = Guid.NewGuid();
            var permissionSetId = Guid.NewGuid();

            using (var dbContext = new AtlasDbContext(options))
            {
                var site           = new Site(siteId, "Name", "Title");
                var permissionSet1 = new PermissionSet(siteId, "Permission Set 1", new List <PermissionCommand>());
                var permissionSet2 = new PermissionSet(permissionSetId, siteId, "Permission Set 2", new List <PermissionCommand>());
                dbContext.Sites.Add(site);
                dbContext.PermissionSets.Add(permissionSet1);
                dbContext.PermissionSets.Add(permissionSet2);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var sut    = new PermissionSetRules(dbContext);
                var actual = await sut.IsNameUniqueAsync(siteId, "Permission Set 1", permissionSetId);

                Assert.IsFalse(actual);
            }
        }
Esempio n. 4
0
        public async Task Should_return_false_when_name_is_not_unique_for_existing_forum()
        {
            var options    = Shared.CreateContextOptions();
            var siteId     = Guid.NewGuid();
            var categoryId = Guid.NewGuid();
            var forumId    = Guid.NewGuid();

            using (var dbContext = new AtlasDbContext(options))
            {
                var category = new Category(categoryId, siteId, "Category", 1, Guid.NewGuid());
                var forum1   = new Forum(categoryId, "Forum 1", "My Forum", "my-forum", 1);
                var forum2   = new Forum(forumId, categoryId, "Forum 2", "my-forum-2", "My Forum", 2);
                dbContext.Categories.Add(category);
                dbContext.Forums.Add(forum1);
                dbContext.Forums.Add(forum2);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var sut    = new ForumRules(dbContext);
                var actual = await sut.IsNameUniqueAsync(siteId, categoryId, "Forum 1", forumId);

                Assert.IsFalse(actual);
            }
        }
Esempio n. 5
0
        public async Task CreateAsync(CreateReply command)
        {
            await _createValidator.ValidateCommandAsync(command);

            var reply = Post.CreateReply(command.Id,
                                         command.TopicId,
                                         command.ForumId,
                                         command.UserId,
                                         command.Content,
                                         command.Status);

            _dbContext.Posts.Add(reply);

            _dbContext.Events.Add(new Event(command.SiteId,
                                            command.UserId,
                                            EventType.Created,
                                            typeof(Post),
                                            command.Id,
                                            new
            {
                command.TopicId,
                command.ForumId,
                command.Content,
                command.Status
            }));

            var topic = await _dbContext.Posts
                        .Include(x => x.Forum)
                        .ThenInclude(x => x.Category)
                        .FirstOrDefaultAsync(x => x.Id == reply.TopicId);

            topic.UpdateLastReply(reply.Id);
            topic.IncreaseRepliesCount();
            topic.Forum.UpdateLastPost(reply.Id);
            topic.Forum.IncreaseRepliesCount();
            topic.Forum.Category.IncreaseRepliesCount();

            var user = await _dbContext.Users.FirstOrDefaultAsync(x => x.Id == reply.CreatedBy);

            user.IncreaseRepliesCount();

            await _dbContext.SaveChangesAsync();

            _cacheManager.Remove(CacheKeys.Forum(topic.ForumId));
        }
Esempio n. 6
0
        public async Task Should_update_reply_and_add_event()
        {
            var options = Shared.CreateContextOptions();

            var siteId     = Guid.NewGuid();
            var categoryId = Guid.NewGuid();
            var forumId    = Guid.NewGuid();
            var topicId    = Guid.NewGuid();

            var category = new Category(categoryId, siteId, "Category", 1, Guid.NewGuid());
            var forum    = new Forum(forumId, categoryId, "Forum", "my-forum", "My Forum", 1);
            var topic    = Post.CreateTopic(topicId, forumId, Guid.NewGuid(), "Title", "slug", "Content", StatusType.Published);
            var reply    = Post.CreateReply(Guid.NewGuid(), topicId, forumId, Guid.NewGuid(), "Content", StatusType.Published);

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Categories.Add(category);
                dbContext.Forums.Add(forum);
                dbContext.Posts.Add(topic);
                dbContext.Posts.Add(reply);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = Fixture.Build <UpdateReply>()
                              .With(x => x.Id, reply.Id)
                              .With(x => x.SiteId, siteId)
                              .With(x => x.ForumId, forumId)
                              .With(x => x.TopicId, topicId)
                              .Create();

                var cacheManager = new Mock <ICacheManager>();

                var createValidator = new Mock <IValidator <CreateReply> >();

                var updateValidator = new Mock <IValidator <UpdateReply> >();
                updateValidator
                .Setup(x => x.ValidateAsync(command, new CancellationToken()))
                .ReturnsAsync(new ValidationResult());

                var sut = new ReplyService(dbContext,
                                           cacheManager.Object,
                                           createValidator.Object,
                                           updateValidator.Object);

                await sut.UpdateAsync(command);

                var updatedReply = await dbContext.Posts.FirstOrDefaultAsync(x => x.Id == command.Id);

                var @event = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == command.Id);

                updateValidator.Verify(x => x.ValidateAsync(command, new CancellationToken()));
                Assert.AreEqual(command.Content, updatedReply.Content);
                Assert.NotNull(@event);
            }
        }
Esempio n. 7
0
        public async Task Should_move_forum_down_and_add_events()
        {
            var options = Shared.CreateContextOptions();

            var categoryId = Guid.NewGuid();
            var siteId     = Guid.NewGuid();

            var category = new Category(categoryId, siteId, "Category", 1, Guid.NewGuid());

            var forum1 = new Forum(categoryId, "Forum 1", "my-forum-1", "Forum 1", 1);
            var forum2 = new Forum(categoryId, "Forum 2", "my-forum-2", "Forum 2", 2);

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Categories.Add(category);
                dbContext.Forums.Add(forum1);
                dbContext.Forums.Add(forum2);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = new MoveForum
                {
                    Id        = forum1.Id,
                    Direction = Direction.Down,
                    SiteId    = siteId
                };

                var cacheManager    = new Mock <ICacheManager>();
                var createValidator = new Mock <IValidator <CreateForum> >();
                var updateValidator = new Mock <IValidator <UpdateForum> >();

                var sut = new ForumService(dbContext,
                                           cacheManager.Object,
                                           createValidator.Object,
                                           updateValidator.Object);

                await sut.MoveAsync(command);

                var updatedForum1 = await dbContext.Forums.FirstOrDefaultAsync(x => x.Id == forum1.Id);

                var updatedForum2 = await dbContext.Forums.FirstOrDefaultAsync(x => x.Id == forum2.Id);

                var event1 = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == forum1.Id);

                var event2 = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == forum2.Id);

                Assert.AreEqual(forum2.SortOrder, updatedForum1.SortOrder);
                Assert.AreEqual(forum1.SortOrder, updatedForum2.SortOrder);
                Assert.NotNull(event1);
                Assert.NotNull(event2);
            }
        }
Esempio n. 8
0
        public async Task Should_update_permission_set_and_add_event()
        {
            var options       = Shared.CreateContextOptions();
            var permissionSet = new PermissionSet(Guid.NewGuid(), Guid.NewGuid(), "Default", new List <PermissionCommand>());

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.PermissionSets.Add(permissionSet);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = new UpdatePermissionSet
                {
                    SiteId      = permissionSet.SiteId,
                    Id          = permissionSet.Id,
                    Name        = "Permission Set",
                    Permissions = new List <PermissionCommand>
                    {
                        new PermissionCommand
                        {
                            Type   = PermissionType.Start,
                            RoleId = Guid.NewGuid().ToString()
                        }
                    }
                };

                var cacheManager = new Mock <ICacheManager>();

                var createValidator = new Mock <IValidator <CreatePermissionSet> >();

                var updateValidator = new Mock <IValidator <UpdatePermissionSet> >();
                updateValidator
                .Setup(x => x.ValidateAsync(command, new CancellationToken()))
                .ReturnsAsync(new ValidationResult());

                var sut = new PermissionSetService(dbContext,
                                                   cacheManager.Object,
                                                   createValidator.Object,
                                                   updateValidator.Object);

                await sut.UpdateAsync(command);

                var updatedPermissionSet = await dbContext.PermissionSets.FirstOrDefaultAsync(x => x.Id == command.Id);

                var @event = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == command.Id);

                updateValidator.Verify(x => x.ValidateAsync(command, new CancellationToken()));
                Assert.AreEqual(command.Name, updatedPermissionSet.Name);
                Assert.NotNull(@event);
            }
        }
Esempio n. 9
0
        public async Task CreateAsync(CreateForum command)
        {
            await _createValidator.ValidateCommandAsync(command);

            var forumsCount = await _dbContext.Forums
                              .Where(x => x.CategoryId == command.CategoryId && x.Status != StatusType.Deleted)
                              .CountAsync();

            var sortOrder = forumsCount + 1;

            var forum = new Forum(command.Id,
                                  command.CategoryId,
                                  command.Name,
                                  command.Slug,
                                  command.Description,
                                  sortOrder,
                                  command.PermissionSetId);

            _dbContext.Forums.Add(forum);
            _dbContext.Events.Add(new Event(command.SiteId,
                                            command.UserId,
                                            EventType.Created,
                                            typeof(Forum),
                                            forum.Id,
                                            new
            {
                forum.Name,
                forum.Slug,
                forum.Description,
                forum.CategoryId,
                forum.PermissionSetId,
                forum.SortOrder
            }));

            await _dbContext.SaveChangesAsync();

            _cacheManager.Remove(CacheKeys.Categories(command.SiteId));
            _cacheManager.Remove(CacheKeys.CurrentForums(command.SiteId));
        }
Esempio n. 10
0
        public async Task Should_move_category_up_and_add_events()
        {
            var options = Shared.CreateContextOptions();

            var siteId = Guid.NewGuid();

            var category1 = new Category(siteId, "Category 1", 1, Guid.NewGuid());
            var category2 = new Category(siteId, "Category 2", 2, Guid.NewGuid());

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Categories.Add(category1);
                dbContext.Categories.Add(category2);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = new MoveCategory
                {
                    Id        = category2.Id,
                    Direction = Direction.Up,
                    SiteId    = siteId
                };

                var cacheManager    = new Mock <ICacheManager>();
                var createValidator = new Mock <IValidator <CreateCategory> >();
                var updateValidator = new Mock <IValidator <UpdateCategory> >();

                var sut = new CategoryService(dbContext,
                                              cacheManager.Object,
                                              createValidator.Object,
                                              updateValidator.Object);

                await sut.MoveAsync(command);

                var updatedCategory1 = await dbContext.Categories.FirstOrDefaultAsync(x => x.Id == category1.Id);

                var updatedCategory2 = await dbContext.Categories.FirstOrDefaultAsync(x => x.Id == category2.Id);

                var event1 = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == category1.Id);

                var event2 = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == category2.Id);

                Assert.AreEqual(category2.SortOrder, updatedCategory1.SortOrder);
                Assert.AreEqual(category1.SortOrder, updatedCategory2.SortOrder);
                Assert.NotNull(event1);
                Assert.NotNull(event2);
            }
        }
Esempio n. 11
0
        public async Task Should_update_forum_and_add_event()
        {
            var options = Shared.CreateContextOptions();

            var categoryId = Guid.NewGuid();
            var siteId     = Guid.NewGuid();

            var category = new Category(categoryId, siteId, "Category", 1, Guid.NewGuid());
            var forum    = new Forum(categoryId, "Forum 1", "my-forum", "Forum 1", 1);

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Categories.Add(category);
                dbContext.Forums.Add(forum);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = Fixture.Build <UpdateForum>()
                              .With(x => x.Id, forum.Id)
                              .With(x => x.CategoryId, forum.CategoryId)
                              .With(x => x.SiteId, siteId)
                              .Create();

                var cacheManager = new Mock <ICacheManager>();

                var createValidator = new Mock <IValidator <CreateForum> >();

                var updateValidator = new Mock <IValidator <UpdateForum> >();
                updateValidator
                .Setup(x => x.ValidateAsync(command, new CancellationToken()))
                .ReturnsAsync(new ValidationResult());

                var sut = new ForumService(dbContext,
                                           cacheManager.Object,
                                           createValidator.Object,
                                           updateValidator.Object);

                await sut.UpdateAsync(command);

                var updatedForum = await dbContext.Forums.FirstOrDefaultAsync(x => x.Id == command.Id);

                var @event = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == command.Id);

                updateValidator.Verify(x => x.ValidateAsync(command, new CancellationToken()));
                Assert.AreEqual(command.Name, updatedForum.Name);
                Assert.NotNull(@event);
            }
        }
Esempio n. 12
0
        public async Task Should_lock_topic_and_add_event()
        {
            var options = Shared.CreateContextOptions();

            var siteId     = Guid.NewGuid();
            var categoryId = Guid.NewGuid();
            var forumId    = Guid.NewGuid();

            var category = new Category(categoryId, siteId, "Category", 1, Guid.NewGuid());
            var forum    = new Forum(forumId, category.Id, "Forum", "my-forum", "My Forum", 1);
            var topic    = Post.CreateTopic(forumId, Guid.NewGuid(), "Title", "slug", "Content", StatusType.Published);

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Categories.Add(category);
                dbContext.Forums.Add(forum);
                dbContext.Posts.Add(topic);

                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = Fixture.Build <LockTopic>()
                              .With(x => x.Id, topic.Id)
                              .With(x => x.ForumId, forumId)
                              .With(x => x.SiteId, siteId)
                              .Create();

                var cacheManager    = new Mock <ICacheManager>();
                var createValidator = new Mock <IValidator <CreateTopic> >();
                var updateValidator = new Mock <IValidator <UpdateTopic> >();

                var sut = new TopicService(dbContext,
                                           cacheManager.Object,
                                           createValidator.Object,
                                           updateValidator.Object);

                await sut.LockAsync(command);

                var lockedTopic = await dbContext.Posts.FirstOrDefaultAsync(x => x.Id == command.Id);

                var @event = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == command.Id);

                Assert.AreEqual(command.Locked, lockedTopic.Locked);
                Assert.NotNull(@event);
            }
        }
Esempio n. 13
0
        public async Task Should_update_category_and_add_event()
        {
            var options       = Shared.CreateContextOptions();
            var permissionSet = new PermissionSet(Guid.NewGuid(), Guid.NewGuid(), "Default", new List <PermissionCommand>());
            var category      = new Category(Guid.NewGuid(), permissionSet.SiteId, "Category", 1, permissionSet.Id);

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.PermissionSets.Add(permissionSet);
                dbContext.Categories.Add(category);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = Fixture.Build <UpdateCategory>()
                              .With(x => x.Id, category.Id)
                              .With(x => x.SiteId, category.SiteId)
                              .Create();

                var cacheManager = new Mock <ICacheManager>();

                var createValidator = new Mock <IValidator <CreateCategory> >();

                var updateValidator = new Mock <IValidator <UpdateCategory> >();
                updateValidator
                .Setup(x => x.ValidateAsync(command, new CancellationToken()))
                .ReturnsAsync(new ValidationResult());

                var sut = new CategoryService(dbContext,
                                              cacheManager.Object,
                                              createValidator.Object,
                                              updateValidator.Object);

                await sut.UpdateAsync(command);

                var updatedCategory = await dbContext.Categories.FirstOrDefaultAsync(x => x.Id == command.Id);

                var @event = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == command.Id);

                updateValidator.Verify(x => x.ValidateAsync(command, new CancellationToken()));
                Assert.AreEqual(command.Name, updatedCategory.Name);
                Assert.NotNull(@event);
            }
        }
Esempio n. 14
0
        public async Task Should_return_false_when_display_name_is_not_unique()
        {
            var options     = Shared.CreateContextOptions();
            var displayName = "Display Name";

            using (var dbContext = new AtlasDbContext(options))
            {
                var user = new User(Guid.NewGuid().ToString(), "*****@*****.**", displayName);
                dbContext.Users.Add(user);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var sut    = new UserRules(dbContext);
                var actual = await sut.IsDisplayNameUniqueAsync(displayName);

                Assert.IsFalse(actual);
            }
        }
Esempio n. 15
0
        public async Task UpdateAsync(UpdateSite command)
        {
            await _updateValidator.ValidateCommandAsync(command);

            var site = await _dbContext.Sites
                       .FirstOrDefaultAsync(x =>
                                            x.Id == command.SiteId);

            if (site == null)
            {
                throw new DataException($"Site with Id {command.SiteId} not found.");
            }

            site.UpdateDetails(command.Title,
                               command.Theme,
                               command.Css,
                               command.Language,
                               command.Privacy,
                               command.Terms,
                               command.HeadScript);

            _dbContext.Events.Add(new Event(site.Id,
                                            command.UserId,
                                            EventType.Updated,
                                            typeof(Site),
                                            site.Id,
                                            new
            {
                site.Title,
                site.PublicTheme,
                site.PublicCss,
                site.Language,
                site.Privacy,
                site.Terms,
                site.HeadScript
            }));

            await _dbContext.SaveChangesAsync();

            _cacheManager.Remove(CacheKeys.CurrentSite(site.Name));
        }
Esempio n. 16
0
        public async Task Should_return_false_when_name_is_not_unique()
        {
            var options      = Shared.CreateContextOptions();
            var siteId       = Guid.NewGuid();
            var categoryName = "My Category";

            using (var dbContext = new AtlasDbContext(options))
            {
                var category = new Category(siteId, categoryName, 1, Guid.NewGuid());
                dbContext.Categories.Add(category);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var sut    = new CategoryRules(dbContext);
                var actual = await sut.IsNameUniqueAsync(siteId, categoryName);

                Assert.IsFalse(actual);
            }
        }
Esempio n. 17
0
        public async Task Should_return_true_when_permission_set_is_valid()
        {
            var options       = Shared.CreateContextOptions();
            var site          = new Site(Guid.NewGuid(), "Name", "Title");
            var permissionSet = new PermissionSet(Guid.NewGuid(), site.Id, "Permission Set", new List <PermissionCommand>());

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Sites.Add(site);
                dbContext.PermissionSets.Add(permissionSet);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(Shared.CreateContextOptions()))
            {
                var sut    = new PermissionSetRules(dbContext);
                var actual = await sut.IsValidAsync(site.Id, permissionSet.Id);

                Assert.IsTrue(actual);
            }
        }
Esempio n. 18
0
        public async Task Should_return_true_when_forum_is_valid()
        {
            var options  = Shared.CreateContextOptions();
            var category = new Category(Guid.NewGuid(), Guid.NewGuid(), "Category", 1, Guid.NewGuid());
            var forum    = new Forum(Guid.NewGuid(), category.Id, "Forum", "my-forum", "My Forum", 1);

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Categories.Add(category);
                dbContext.Forums.Add(forum);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var sut    = new ForumRules(dbContext);
                var actual = await sut.IsValidAsync(forum.Category.SiteId, forum.Id);

                Assert.IsTrue(actual);
            }
        }
Esempio n. 19
0
        public async Task Should_delete_permission_set_and_reorder_other_categories_and_add_event()
        {
            var options = Shared.CreateContextOptions();

            var siteId = Guid.NewGuid();

            var permissionSet = new PermissionSet(siteId, "Permission Set", new List <PermissionCommand>());

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.PermissionSets.Add(permissionSet);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = Fixture.Build <DeletePermissionSet>()
                              .With(x => x.Id, permissionSet.Id)
                              .With(x => x.SiteId, siteId)
                              .Create();

                var cacheManager    = new Mock <ICacheManager>();
                var createValidator = new Mock <IValidator <CreatePermissionSet> >();
                var updateValidator = new Mock <IValidator <UpdatePermissionSet> >();

                var sut = new PermissionSetService(dbContext,
                                                   cacheManager.Object,
                                                   createValidator.Object,
                                                   updateValidator.Object);

                await sut.DeleteAsync(command);

                var permissionSetDeleted = await dbContext.PermissionSets.FirstOrDefaultAsync(x => x.Id == command.Id);

                var permissionSetEvent = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == command.Id);

                Assert.AreEqual(StatusType.Deleted, permissionSetDeleted.Status);
                Assert.NotNull(permissionSetEvent);
            }
        }
Esempio n. 20
0
        public async Task Should_return_false_when_display_name_is_not_unique_for_existing_member()
        {
            var options = Shared.CreateContextOptions();
            var userId  = Guid.NewGuid();

            using (var dbContext = new AtlasDbContext(options))
            {
                var user1 = new User(Guid.NewGuid().ToString(), "*****@*****.**", "User 1");
                var user2 = new User(userId, Guid.NewGuid().ToString(), "*****@*****.**", "User 2");
                dbContext.Users.Add(user1);
                dbContext.Users.Add(user2);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var sut    = new UserRules(dbContext);
                var actual = await sut.IsDisplayNameUniqueAsync("User 1", userId);

                Assert.IsFalse(actual);
            }
        }
Esempio n. 21
0
        public async Task Should_update_user_and_add_event()
        {
            var options = Shared.CreateContextOptions();
            var user    = new User(Guid.NewGuid(), Guid.NewGuid().ToString(), "*****@*****.**", "Display Name");

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Users.Add(user);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = Fixture.Build <UpdateUser>()
                              .With(x => x.Id, user.Id)
                              .Create();

                var createValidator = new Mock <IValidator <CreateUser> >();

                var updateValidator = new Mock <IValidator <UpdateUser> >();
                updateValidator
                .Setup(x => x.ValidateAsync(command, new CancellationToken()))
                .ReturnsAsync(new ValidationResult());

                var sut = new UserService(dbContext,
                                          createValidator.Object,
                                          updateValidator.Object);

                await sut.UpdateAsync(command);

                var updatedUser = await dbContext.Users.FirstOrDefaultAsync(x => x.Id == command.Id);

                var @event = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == command.Id);

                updateValidator.Verify(x => x.ValidateAsync(command, new CancellationToken()));
                Assert.AreEqual(command.DisplayName, updatedUser.DisplayName);
                Assert.NotNull(@event);
            }
        }
Esempio n. 22
0
        public async Task Should_update_site_and_add_event()
        {
            var options = Shared.CreateContextOptions();
            var site    = new Site(Guid.NewGuid(), "Name", "Title");

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Sites.Add(site);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = Fixture.Build <UpdateSite>()
                              .With(x => x.SiteId, site.Id)
                              .Create();

                var cacheManager = new Mock <ICacheManager>();

                var updateValidator = new Mock <IValidator <UpdateSite> >();
                updateValidator
                .Setup(x => x.ValidateAsync(command, new CancellationToken()))
                .ReturnsAsync(new ValidationResult());

                var sut = new SiteService(dbContext,
                                          cacheManager.Object,
                                          updateValidator.Object);

                await sut.UpdateAsync(command);

                var updatedSite = await dbContext.Sites.FirstOrDefaultAsync(x => x.Id == command.SiteId);

                var @event = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == command.SiteId);

                updateValidator.Verify(x => x.ValidateAsync(command, new CancellationToken()));
                Assert.AreEqual(command.Title, updatedSite.Title);
                Assert.NotNull(@event);
            }
        }
Esempio n. 23
0
        public async Task Should_return_false_when_name_is_not_unique_for_existing_category()
        {
            var options    = Shared.CreateContextOptions();
            var siteId     = Guid.NewGuid();
            var categoryId = Guid.NewGuid();

            using (var dbContext = new AtlasDbContext(options))
            {
                var category1 = new Category(siteId, "Category 1", 1, Guid.NewGuid());
                var category2 = new Category(categoryId, siteId, "Category 2", 2, Guid.NewGuid());
                dbContext.Categories.Add(category1);
                dbContext.Categories.Add(category2);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var sut    = new CategoryRules(dbContext);
                var actual = await sut.IsNameUniqueAsync(siteId, "Category 1", categoryId);

                Assert.IsFalse(actual);
            }
        }
Esempio n. 24
0
        public async Task Should_return_true_when_topic_is_valid()
        {
            var options  = Shared.CreateContextOptions();
            var category = new Category(Guid.NewGuid(), Guid.NewGuid(), "Category", 1, Guid.NewGuid());
            var forum    = new Forum(Guid.NewGuid(), category.Id, "Forum", "my-forum", "My Forum", 1, Guid.NewGuid());
            var topic    = Post.CreateTopic(Guid.NewGuid(), forum.Id, Guid.NewGuid(), "Title", "slug", "Content", StatusType.Published);

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Categories.Add(category);
                dbContext.Forums.Add(forum);
                dbContext.Posts.Add(topic);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var sut    = new TopicRules(dbContext);
                var actual = await sut.IsValidAsync(category.SiteId, forum.Id, topic.Id);

                Assert.IsTrue(actual);
            }
        }
Esempio n. 25
0
        public async Task Should_suspend_user_and_add_event()
        {
            var options = Shared.CreateContextOptions();

            var userId = Guid.NewGuid();

            var user = new User(userId, Guid.NewGuid().ToString(), "*****@*****.**", "Display Name");

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Users.Add(user);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = Fixture.Build <SuspendUser>()
                              .With(x => x.Id, user.Id)
                              .Create();

                var createValidator = new Mock <IValidator <CreateUser> >();
                var updateValidator = new Mock <IValidator <UpdateUser> >();

                var sut = new UserService(dbContext,
                                          createValidator.Object,
                                          updateValidator.Object);

                await sut.SuspendAsync(command);

                var userSuspended = await dbContext.Users.FirstOrDefaultAsync(x => x.Id == user.Id);

                var userEvent = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == user.Id);

                Assert.AreEqual(StatusType.Suspended, userSuspended.Status);
                Assert.NotNull(userEvent);
            }
        }
Esempio n. 26
0
        public async Task CreateAsync(CreateUser command)
        {
            await _createValidator.ValidateCommandAsync(command);

            var displayName = await GenerateDisplayNameAsync();

            var user = new User(command.Id,
                                command.IdentityUserId,
                                command.Email,
                                displayName);

            if (command.Confirm)
            {
                user.Confirm();
            }

            _dbContext.Users.Add(user);

            var userIdForEvent = command.UserId == Guid.Empty
                ? user.Id
                : command.UserId;

            _dbContext.Events.Add(new Event(command.SiteId,
                                            userIdForEvent,
                                            EventType.Created,
                                            typeof(User),
                                            command.Id,
                                            new
            {
                UserId = command.IdentityUserId,
                command.Email,
                DisplayName = displayName,
                user.Status
            }));

            await _dbContext.SaveChangesAsync();
        }
Esempio n. 27
0
        public async Task Should_set_reply_as_answer_and_add_event()
        {
            var options = Shared.CreateContextOptions();

            var siteId     = Guid.NewGuid();
            var categoryId = Guid.NewGuid();
            var forumId    = Guid.NewGuid();
            var topicId    = Guid.NewGuid();
            var userId     = Guid.NewGuid();

            var category = new Category(categoryId, siteId, "Category", 1, Guid.NewGuid());
            var forum    = new Forum(forumId, categoryId, "Forum", "my-forum", "My Forum", 1);
            var topic    = Post.CreateTopic(topicId, forumId, Guid.NewGuid(), "Title", "slug", "Content", StatusType.Published);
            var reply    = Post.CreateReply(Guid.NewGuid(), topicId, forumId, userId, "Content", StatusType.Published);
            var user     = new User(userId, Guid.NewGuid().ToString(), "Email", "Display Name");

            category.IncreaseRepliesCount();
            forum.IncreaseRepliesCount();
            topic.IncreaseRepliesCount();
            user.IncreaseRepliesCount();

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Categories.Add(category);
                dbContext.Forums.Add(forum);
                dbContext.Posts.Add(topic);
                dbContext.Posts.Add(reply);
                dbContext.Users.Add(user);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = new SetReplyAsAnswer
                {
                    Id       = reply.Id,
                    SiteId   = siteId,
                    ForumId  = forumId,
                    TopicId  = topicId,
                    IsAnswer = true
                };

                var cacheManager    = new Mock <ICacheManager>();
                var createValidator = new Mock <IValidator <CreateReply> >();
                var updateValidator = new Mock <IValidator <UpdateReply> >();

                var sut = new ReplyService(dbContext,
                                           cacheManager.Object,
                                           createValidator.Object,
                                           updateValidator.Object);

                await sut.SetAsAnswerAsync(command);

                var replyUpdated = await dbContext.Posts.Include(x => x.Topic).FirstOrDefaultAsync(x => x.Id == reply.Id);

                var replyEvent = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == reply.Id);

                Assert.AreEqual(true, replyUpdated.IsAnswer);
                Assert.AreEqual(true, replyUpdated.Topic.HasAnswer);
                Assert.NotNull(replyEvent);
            }
        }
Esempio n. 28
0
        public async Task EnsureDefaultSiteInitializedAsync()
        {
            if (await _dbContext.Sites.AnyAsync(x => x.Name == "Default"))
            {
                return;
            }

            var site = new Site("Default", "Atlas");

            _dbContext.Sites.Add(site);
            _dbContext.Events.Add(new Event(site.Id,
                                            null,
                                            EventType.Created,
                                            typeof(Site),
                                            site.Id,
                                            new
            {
                site.Name,
                site.Title,
                site.PublicTheme,
                site.PublicCss,
                site.AdminTheme,
                site.AdminCss
            }));
            var roleManager = _serviceProvider.GetRequiredService <RoleManager <IdentityRole> >();
            var userManager = _serviceProvider.GetRequiredService <UserManager <IdentityUser> >();

            // Roles
            if (await roleManager.RoleExistsAsync(Consts.RoleNameAdmin) == false)
            {
                await roleManager.CreateAsync(new IdentityRole(Consts.RoleNameAdmin));
            }
            var roleAdmin = await roleManager.FindByNameAsync(Consts.RoleNameAdmin);

            if (await roleManager.RoleExistsAsync(Consts.RoleNameModerator) == false)
            {
                await roleManager.CreateAsync(new IdentityRole(Consts.RoleNameModerator));
            }
            var roleModerator = await roleManager.FindByNameAsync(Consts.RoleNameModerator);

            // Identity Users
            var userAdmin = await userManager.FindByEmailAsync(_configuration["DefaultAdminUserEmail"]);

            if (userAdmin == null)
            {
                userAdmin = new IdentityUser
                {
                    Email    = _configuration["DefaultAdminUserEmail"],
                    UserName = _configuration["DefaultAdminUserName"]
                };
                await userManager.CreateAsync(userAdmin, _configuration["DefaultAdminUserPassword"]);

                var code = await userManager.GenerateEmailConfirmationTokenAsync(userAdmin);

                await userManager.ConfirmEmailAsync(userAdmin, code);
            }
            await userManager.AddToRoleAsync(userAdmin, Consts.RoleNameAdmin);

            var userNormalId = string.Empty;

            if (_configuration["CreateDefaultNormalUser"] == "true")
            {
                var userNormal = await userManager.FindByEmailAsync(_configuration["DefaultNormalUserEmail"]);

                if (userNormal == null)
                {
                    userNormal = new IdentityUser
                    {
                        Email    = _configuration["DefaultNormalUserEmail"],
                        UserName = _configuration["DefaultNormalUserName"]
                    };
                    await userManager.CreateAsync(userNormal, _configuration["DefaultNormalUserPassword"]);

                    var code = await userManager.GenerateEmailConfirmationTokenAsync(userNormal);

                    await userManager.ConfirmEmailAsync(userNormal, code);

                    userNormalId = userNormal.Id;
                }
            }

            var userModeratorId = string.Empty;

            if (_configuration["CreateDefaultModeratorUser"] == "true")
            {
                var userModerator = await userManager.FindByEmailAsync(_configuration["DefaultModeratorUserEmail"]);

                if (userModerator == null)
                {
                    userModerator = new IdentityUser
                    {
                        Email    = _configuration["DefaultModeratorUserEmail"],
                        UserName = _configuration["DefaultModeratorUserName"]
                    };
                    await userManager.CreateAsync(userModerator, _configuration["DefaultModeratorUserPassword"]);

                    var code = await userManager.GenerateEmailConfirmationTokenAsync(userModerator);

                    await userManager.ConfirmEmailAsync(userModerator, code);

                    userModeratorId = userModerator.Id;
                }
                await userManager.AddToRoleAsync(userModerator, Consts.RoleNameModerator);
            }

            // Users
            var memberAdmin = await _dbContext.Users.FirstOrDefaultAsync(x => x.IdentityUserId == userAdmin.Id);

            if (memberAdmin == null)
            {
                memberAdmin = new User(userAdmin.Id, _configuration["DefaultAdminUserEmail"], _configuration["DefaultAdminUserDisplayName"]);
                memberAdmin.Confirm();
                _dbContext.Users.Add(memberAdmin);
                _dbContext.Events.Add(new Event(site.Id,
                                                null,
                                                EventType.Created,
                                                typeof(User),
                                                memberAdmin.Id,
                                                new
                {
                    UserId = memberAdmin.IdentityUserId,
                    memberAdmin.Email,
                    memberAdmin.DisplayName
                }));
            }

            if (_configuration["CreateDefaultNormalUser"] == "true")
            {
                var memberNormal = await _dbContext.Users.FirstOrDefaultAsync(x => x.IdentityUserId == userNormalId);

                if (memberNormal == null)
                {
                    memberNormal = new User(userNormalId, _configuration["DefaultNormalUserEmail"], _configuration["DefaultNormalUserDisplayName"]);
                    memberNormal.Confirm();
                    _dbContext.Users.Add(memberNormal);
                    _dbContext.Events.Add(new Event(site.Id,
                                                    null,
                                                    EventType.Created,
                                                    typeof(User),
                                                    memberNormal.Id,
                                                    new
                    {
                        UserId = memberNormal.IdentityUserId,
                        memberNormal.Email,
                        memberNormal.DisplayName
                    }));
                }
            }

            if (_configuration["CreateDefaultModeratorUser"] == "true")
            {
                var memberModerator = await _dbContext.Users.FirstOrDefaultAsync(x => x.IdentityUserId == userModeratorId);

                if (memberModerator == null)
                {
                    memberModerator = new User(userModeratorId, _configuration["DefaultModeratorUserEmail"], _configuration["DefaultModeratorUserDisplayName"]);
                    memberModerator.Confirm();
                    _dbContext.Users.Add(memberModerator);
                    _dbContext.Events.Add(new Event(site.Id,
                                                    null,
                                                    EventType.Created,
                                                    typeof(User),
                                                    memberModerator.Id,
                                                    new
                    {
                        UserId = memberModerator.IdentityUserId,
                        memberModerator.Email,
                        memberModerator.DisplayName
                    }));
                }
            }

            // Permission Sets
            var permissionSetDefault = new PermissionSet(site.Id, "Default", new List <PermissionCommand>
            {
                new PermissionCommand {
                    Type = PermissionType.ViewForum, RoleId = Consts.RoleIdAll
                },
                new PermissionCommand {
                    Type = PermissionType.ViewTopics, RoleId = Consts.RoleIdAll
                },
                new PermissionCommand {
                    Type = PermissionType.Read, RoleId = Consts.RoleIdAll
                },

                new PermissionCommand {
                    Type = PermissionType.Start, RoleId = Consts.RoleIdRegistered
                },
                new PermissionCommand {
                    Type = PermissionType.Reply, RoleId = Consts.RoleIdRegistered
                },
                new PermissionCommand {
                    Type = PermissionType.Edit, RoleId = Consts.RoleIdRegistered
                },
                new PermissionCommand {
                    Type = PermissionType.Delete, RoleId = Consts.RoleIdRegistered
                },

                new PermissionCommand {
                    Type = PermissionType.Moderate, RoleId = roleModerator.Id
                },

                new PermissionCommand {
                    Type = PermissionType.ViewForum, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.ViewTopics, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Read, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Start, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Reply, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Edit, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Delete, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Moderate, RoleId = roleAdmin.Id
                }
            });

            _dbContext.PermissionSets.Add(permissionSetDefault);
            _dbContext.Events.Add(new Event(site.Id,
                                            null,
                                            EventType.Created,
                                            typeof(PermissionSet),
                                            permissionSetDefault.Id,
                                            new
            {
                permissionSetDefault.Name
            }));

            var permissionSetMembersOnly = new PermissionSet(site.Id, "Members Only", new List <PermissionCommand>
            {
                new PermissionCommand {
                    Type = PermissionType.ViewForum, RoleId = Consts.RoleIdRegistered
                },
                new PermissionCommand {
                    Type = PermissionType.ViewTopics, RoleId = Consts.RoleIdRegistered
                },
                new PermissionCommand {
                    Type = PermissionType.Read, RoleId = Consts.RoleIdRegistered
                },
                new PermissionCommand {
                    Type = PermissionType.Start, RoleId = Consts.RoleIdRegistered
                },
                new PermissionCommand {
                    Type = PermissionType.Reply, RoleId = Consts.RoleIdRegistered
                },
                new PermissionCommand {
                    Type = PermissionType.Edit, RoleId = Consts.RoleIdRegistered
                },
                new PermissionCommand {
                    Type = PermissionType.Delete, RoleId = Consts.RoleIdRegistered
                },

                new PermissionCommand {
                    Type = PermissionType.Moderate, RoleId = roleModerator.Id
                },

                new PermissionCommand {
                    Type = PermissionType.ViewForum, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.ViewTopics, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Read, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Start, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Reply, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Edit, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Delete, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Moderate, RoleId = roleAdmin.Id
                }
            });

            _dbContext.PermissionSets.Add(permissionSetMembersOnly);
            _dbContext.Events.Add(new Event(site.Id,
                                            null,
                                            EventType.Created,
                                            typeof(PermissionSet),
                                            permissionSetMembersOnly.Id,
                                            new
            {
                permissionSetMembersOnly.Name
            }));

            var permissionSetAdminOnly = new PermissionSet(site.Id, "Admin Only", new List <PermissionCommand>
            {
                new PermissionCommand {
                    Type = PermissionType.ViewForum, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.ViewTopics, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Read, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Start, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Reply, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Edit, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Delete, RoleId = roleAdmin.Id
                },
                new PermissionCommand {
                    Type = PermissionType.Moderate, RoleId = roleAdmin.Id
                }
            });

            _dbContext.PermissionSets.Add(permissionSetAdminOnly);
            _dbContext.Events.Add(new Event(site.Id,
                                            null,
                                            EventType.Created,
                                            typeof(PermissionSet),
                                            permissionSetAdminOnly.Id,
                                            new
            {
                permissionSetAdminOnly.Name
            }));

            // Categories
            var categoryGeneral = new Category(site.Id, "General", 1, permissionSetDefault.Id);

            _dbContext.Categories.Add(categoryGeneral);
            _dbContext.Events.Add(new Event(site.Id,
                                            null,
                                            EventType.Created,
                                            typeof(Category),
                                            categoryGeneral.Id,
                                            new
            {
                categoryGeneral.Name,
                categoryGeneral.PermissionSetId,
                categoryGeneral.SortOrder
            }));

            // Forums
            var forumWelcome = new Forum(categoryGeneral.Id, "Welcome", "welcome", "Welcome Forum", 1);

            _dbContext.Forums.Add(forumWelcome);
            _dbContext.Events.Add(new Event(site.Id,
                                            null,
                                            EventType.Created,
                                            typeof(Forum),
                                            forumWelcome.Id,
                                            new
            {
                forumWelcome.Name,
                forumWelcome.CategoryId,
                forumWelcome.PermissionSetId,
                forumWelcome.SortOrder
            }));

            var forumMembersOnly = new Forum(categoryGeneral.Id, "Members Only", "members-only", "Members Only Forum", 2, permissionSetMembersOnly.Id);

            _dbContext.Forums.Add(forumMembersOnly);
            _dbContext.Events.Add(new Event(site.Id,
                                            null,
                                            EventType.Created,
                                            typeof(Forum),
                                            forumMembersOnly.Id,
                                            new
            {
                forumMembersOnly.Name,
                forumMembersOnly.CategoryId,
                forumMembersOnly.PermissionSetId,
                forumMembersOnly.SortOrder
            }));

            var forumAdminOnly = new Forum(categoryGeneral.Id, "Admin Only", "admin-only", "Admin Only Forum", 3, permissionSetAdminOnly.Id);

            _dbContext.Forums.Add(forumAdminOnly);
            _dbContext.Events.Add(new Event(site.Id,
                                            null,
                                            EventType.Created,
                                            typeof(Forum),
                                            forumAdminOnly.Id,
                                            new
            {
                forumAdminOnly.Name,
                forumAdminOnly.CategoryId,
                forumAdminOnly.PermissionSetId,
                forumAdminOnly.SortOrder
            }));

            // Topics
            var topicWelcomeTitle = "Welcome to Atlas!";
            var topicWelcome      = Post.CreateTopic(forumWelcome.Id, memberAdmin.Id, topicWelcomeTitle, topicWelcomeTitle.ToSlug(), "Welcome...", StatusType.Published);

            _dbContext.Posts.Add(topicWelcome);
            _dbContext.Events.Add(new Event(site.Id,
                                            topicWelcome.CreatedBy,
                                            EventType.Created,
                                            typeof(Post),
                                            topicWelcome.Id,
                                            new
            {
                topicWelcome.ForumId,
                topicWelcome.Title,
                topicWelcome.Content,
                topicWelcome.Status
            }));
            categoryGeneral.IncreaseTopicsCount();
            forumWelcome.IncreaseTopicsCount();
            memberAdmin.IncreaseTopicsCount();

            // Save all changes
            await _dbContext.SaveChangesAsync();

            // Update last post
            var forumWelcomeToUpdate = await _dbContext.Forums.FirstOrDefaultAsync(x => x.Id == forumWelcome.Id);

            forumWelcomeToUpdate.UpdateLastPost(topicWelcome.Id);
            await _dbContext.SaveChangesAsync();
        }
Esempio n. 29
0
        public async Task Should_create_new_topic_and_add_event()
        {
            var options = Shared.CreateContextOptions();

            var categoryId = Guid.NewGuid();
            var forumId    = Guid.NewGuid();
            var userId     = Guid.NewGuid();

            var category = new Category(categoryId, Guid.NewGuid(), "Category", 1, Guid.NewGuid());
            var forum    = new Forum(forumId, category.Id, "Forum", "my-forum", "My Forum", 1);
            var user     = new User(userId, Guid.NewGuid().ToString(), "Email", "Display Name");

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Categories.Add(category);
                dbContext.Forums.Add(forum);
                dbContext.Users.Add(user);
                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = Fixture.Build <CreateTopic>()
                              .With(x => x.ForumId, forum.Id)
                              .With(x => x.UserId, userId)
                              .Create();

                var cacheManager = new Mock <ICacheManager>();

                var createValidator = new Mock <IValidator <CreateTopic> >();
                createValidator
                .Setup(x => x.ValidateAsync(command, new CancellationToken()))
                .ReturnsAsync(new ValidationResult());

                var updateValidator = new Mock <IValidator <UpdateTopic> >();

                var sut = new TopicService(dbContext,
                                           cacheManager.Object,
                                           createValidator.Object,
                                           updateValidator.Object);

                await sut.CreateAsync(command);

                var topic = await dbContext.Posts.FirstOrDefaultAsync(x => x.Id == command.Id);

                var @event = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == command.Id);

                var updatedCategory = await dbContext.Categories.FirstOrDefaultAsync(x => x.Id == category.Id);

                var updatedForum = await dbContext.Forums.FirstOrDefaultAsync(x => x.Id == forum.Id);

                var updatedUser = await dbContext.Users.FirstOrDefaultAsync(x => x.Id == userId);

                createValidator.Verify(x => x.ValidateAsync(command, new CancellationToken()));
                Assert.NotNull(topic);
                Assert.NotNull(@event);
                Assert.AreEqual(category.TopicsCount + 1, updatedCategory.TopicsCount);
                Assert.AreEqual(topic.Id, updatedForum.LastPostId);
                Assert.AreEqual(forum.TopicsCount + 1, updatedForum.TopicsCount);
                Assert.AreEqual(forum.TopicsCount + 1, updatedForum.TopicsCount);
                Assert.AreEqual(user.TopicsCount + 1, updatedUser.TopicsCount);
            }
        }
Esempio n. 30
0
        public async Task Should_delete_topic_and_add_event()
        {
            var options = Shared.CreateContextOptions();

            var siteId     = Guid.NewGuid();
            var categoryId = Guid.NewGuid();
            var forumId    = Guid.NewGuid();
            var userId     = Guid.NewGuid();

            var category = new Category(categoryId, siteId, "Category", 1, Guid.NewGuid());
            var forum    = new Forum(forumId, category.Id, "Forum", "my-forum", "My Forum", 1);
            var topic    = Post.CreateTopic(forumId, userId, "Title", "slug", "Content", StatusType.Published);
            var user     = new User(userId, Guid.NewGuid().ToString(), "Email", "Display Name");

            category.IncreaseTopicsCount();
            forum.IncreaseTopicsCount();
            user.IncreaseTopicsCount();

            using (var dbContext = new AtlasDbContext(options))
            {
                dbContext.Categories.Add(category);
                dbContext.Forums.Add(forum);
                dbContext.Posts.Add(topic);
                dbContext.Users.Add(user);

                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new AtlasDbContext(options))
            {
                var command = Fixture.Build <DeleteTopic>()
                              .With(x => x.Id, topic.Id)
                              .With(x => x.ForumId, forumId)
                              .With(x => x.SiteId, siteId)
                              .Create();

                var cacheManager    = new Mock <ICacheManager>();
                var createValidator = new Mock <IValidator <CreateTopic> >();
                var updateValidator = new Mock <IValidator <UpdateTopic> >();

                var sut = new TopicService(dbContext,
                                           cacheManager.Object,
                                           createValidator.Object,
                                           updateValidator.Object);

                await sut.DeleteAsync(command);

                var topicDeleted = await dbContext.Posts.FirstOrDefaultAsync(x => x.Id == topic.Id);

                var topicEvent = await dbContext.Events.FirstOrDefaultAsync(x => x.TargetId == topic.Id);

                var updatedCategory = await dbContext.Categories.FirstOrDefaultAsync(x => x.Id == category.Id);

                var updatedForum = await dbContext.Forums.FirstOrDefaultAsync(x => x.Id == forum.Id);

                var updatedUser = await dbContext.Users.FirstOrDefaultAsync(x => x.Id == user.Id);

                Assert.AreEqual(StatusType.Deleted, topicDeleted.Status);
                Assert.NotNull(topicEvent);
                Assert.AreEqual(0, updatedCategory.TopicsCount);
                Assert.AreEqual(0, updatedForum.TopicsCount);
                Assert.AreEqual(0, updatedUser.TopicsCount);
            }
        }