Exemple #1
0
        /// <inheritdoc />
        public async Task <bool> TryDeleteAsync(ulong guildId, string name, ulong deletedByUserId)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentException("The supplied name cannot be null or whitespace.", nameof(name));
            }

            var entity = await ModixContext.Tags.FirstOrDefaultAsync(x
                                                                     => x.GuildId == guildId &&
                                                                     x.Name == name.ToLower() &&
                                                                     x.DeleteActionId == null);

            if (entity is null)
            {
                return(false);
            }

            var deleteAction = new TagActionEntity()
            {
                GuildId     = entity.GuildId,
                Created     = DateTimeOffset.Now,
                Type        = TagActionType.TagDeleted,
                CreatedById = deletedByUserId,
                OldTagId    = entity.Id,
            };

            await ModixContext.TagActions.AddAsync(deleteAction);

            await ModixContext.SaveChangesAsync();

            entity.DeleteActionId = deleteAction.Id;
            await ModixContext.SaveChangesAsync();

            return(true);
        }
Exemple #2
0
        /// <inheritdoc />
        public async Task <bool> TryModifyAsync(ulong guildId, string name, ulong modifiedByUserId, Action <TagMutationData> modifyAction)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentException("The supplied name cannot be null or whitespace.", nameof(name));
            }

            if (modifyAction is null)
            {
                throw new ArgumentNullException(nameof(modifyAction));
            }

            var oldTag = await ModixContext.Tags.FirstOrDefaultAsync(x
                                                                     => x.GuildId == guildId &&
                                                                     x.Name == name.ToLower() &&
                                                                     x.DeleteActionId == null);

            if (oldTag is null)
            {
                return(false);
            }

            var action = new TagActionEntity()
            {
                GuildId     = oldTag.GuildId,
                Type        = TagActionType.TagModified,
                Created     = DateTimeOffset.Now,
                CreatedById = modifiedByUserId,
                OldTagId    = oldTag.Id,
            };

            await ModixContext.TagActions.AddAsync(action);

            await ModixContext.SaveChangesAsync();

            var newTagData = TagMutationData.FromEntity(oldTag);

            modifyAction(newTagData);

            var newTag = newTagData.ToEntity();

            newTag.CreateActionId = action.Id;

            await ModixContext.Tags.AddAsync(newTag);

            await ModixContext.SaveChangesAsync();

            action.NewTagId       = newTag.Id;
            oldTag.DeleteActionId = action.Id;

            await ModixContext.SaveChangesAsync();

            return(true);
        }
Exemple #3
0
 public static TagActionEntity Clone(this TagActionEntity entity)
 => new TagActionEntity()
 {
     Id          = entity.Id,
     GuildId     = entity.GuildId,
     Created     = entity.Created,
     Type        = entity.Type,
     CreatedById = entity.CreatedById,
     CreatedBy   = entity.CreatedBy?.Clone(),
     NewTagId    = entity.NewTagId,
     NewTag      = entity.NewTag?.Clone(),
     OldTagId    = entity.OldTagId,
     OldTag      = entity.OldTag?.Clone(),
 };
        public static void ShouldNotHaveChanged(this TagActionEntity entity)
        {
            entity.ShouldNotBeNull();
            entity.Id.ShouldBeOneOf(TagActions.Entities.Select(x => x.Id).ToArray());

            var originalEntity = TagActions.Entities.First(x => x.Id == entity.Id);

            entity.GuildId.ShouldBe(originalEntity.GuildId);
            entity.Type.ShouldBe(originalEntity.Type);
            entity.Created.ShouldBe(originalEntity.Created);
            entity.CreatedById.ShouldBe(originalEntity.CreatedById);
            entity.NewTagId.ShouldBe(originalEntity.NewTagId);
            entity.OldTagId.ShouldBe(originalEntity.OldTagId);
        }
Exemple #5
0
        public async Task CreateTagAsync(ulong guildId, ulong creatorId, string name, string content)
        {
            _authorizationService.RequireClaims(AuthorizationClaim.CreateTag);

            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentException("The tag name cannot be blank or whitespace.", nameof(name));
            }

            if (string.IsNullOrWhiteSpace(content))
            {
                throw new ArgumentException("The tag content cannot be blank or whitespace.", nameof(content));
            }

            if (!_tagNameRegex.IsMatch(name))
            {
                throw new ArgumentException("The tag name cannot have punctuation at the end.", nameof(name));
            }

            name = name.Trim().ToLower();

            if (await _modixContext.Set <TagEntity>().Where(x => x.GuildId == guildId).Where(x => x.DeleteActionId == null).AnyAsync(x => x.Name == name))
            {
                throw new InvalidOperationException($"A tag with the name '{name}' already exists.");
            }

            var tag = new TagEntity
            {
                GuildId     = guildId,
                OwnerUserId = creatorId,
                Name        = name,
                Content     = content,
            };

            var createAction = new TagActionEntity()
            {
                GuildId     = guildId,
                Created     = DateTimeOffset.Now,
                Type        = TagActionType.TagCreated,
                CreatedById = creatorId,
            };

            tag.CreateAction = createAction;

            _modixContext.Set <TagEntity>().Add(tag);

            await _modixContext.SaveChangesAsync();
        }
Exemple #6
0
 public static TagActionEntity Clone(this TagActionEntity entity)
 => new TagActionEntity()