/// <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); }
/// <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); }
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); }
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(); }
public static TagActionEntity Clone(this TagActionEntity entity) => new TagActionEntity()