public async Task UpdateLinksAsync(AddEditDeleteExternalLinkDto updateLinksDto) { var timestamp = DateTime.UtcNow; await DuplicateValuesValidationAsync(updateLinksDto); await UpdateLinksAsync(updateLinksDto, timestamp); await DeleteLinksAsync(updateLinksDto, timestamp); await CreateNewLinksAsync(updateLinksDto, timestamp); }
private async Task DuplicateValuesValidationAsync(AddEditDeleteExternalLinkDto updateLinksDto) { var externalLinks = await _externalLinkDbSet .Where(x => x.OrganizationId == updateLinksDto.OrganizationId) .Select(x => new ExternalLinkDto { Id = x.Id, Name = x.Name, Url = x.Url }) .ToListAsync(); if (updateLinksDto.LinksToCreate.Any(c => externalLinks.Any(l => l.Name == c.Name || l.Url == c.Url)) || updateLinksDto.LinksToUpdate.Any(c => externalLinks.Any(l => (l.Name == c.Name || l.Url == c.Url) && l.Id != c.Id))) { throw new ValidationException(ErrorCodes.DuplicatesIntolerable, "Provided values must be unique"); } }
private async Task UpdateLinksAsync(AddEditDeleteExternalLinkDto updateLinks, DateTime timestamp) { var updatedLinksIds = updateLinks.LinksToUpdate.Select(l => l.Id); var linksToUpdate = await _externalLinkDbSet .Where(l => updatedLinksIds.Contains(l.Id) && l.OrganizationId == updateLinks.OrganizationId) .ToListAsync(); foreach (var updatedLink in updateLinks.LinksToUpdate) { var link = linksToUpdate.First(l => l.Id == updatedLink.Id); link.Name = updatedLink.Name; link.Url = updatedLink.Url; link.Modified = timestamp; link.ModifiedBy = updateLinks.UserId; link.Type = updatedLink.Type; } }
private async Task DeleteLinksAsync(AddEditDeleteExternalLinkDto updateLinks, DateTime timestamp) { var linksToDelete = await _externalLinkDbSet .Where(l => updateLinks.LinksToDelete.Contains(l.Id) && l.OrganizationId == updateLinks.OrganizationId) .ToListAsync(); foreach (var link in linksToDelete) { link.UpdateMetadata(updateLinks.UserId, timestamp); } await _uow.SaveChangesAsync(false); foreach (var link in linksToDelete) { _externalLinkDbSet.Remove(link); } }
private async Task CreateNewLinksAsync(AddEditDeleteExternalLinkDto updateLinks, DateTime timestamp) { foreach (var link in updateLinks.LinksToCreate) { var newLink = new ExternalLink { Name = link.Name, Url = link.Url, OrganizationId = updateLinks.OrganizationId, Created = timestamp, CreatedBy = updateLinks.UserId, Modified = timestamp, Type = link.Type }; _externalLinkDbSet.Add(newLink); } await _uow.SaveChangesAsync(false); }
public void Should_Throw_If_Trying_To_Add_Duplicate_Link() { MockExternalLinks(); var updateDto = new AddEditDeleteExternalLinkDto { LinksToDelete = new[] { 1, 2 }, LinksToCreate = new List <NewExternalLinkDto> { new NewExternalLinkDto { Name = "Test1", Url = "UrlTest1" } }, LinksToUpdate = new List <ExternalLinkDto>(), OrganizationId = 2, UserId = "testUser" }; var ex = Assert.ThrowsAsync <ValidationException>(async() => await _externalLinkService.UpdateLinksAsync(updateDto)); Assert.AreEqual(ErrorCodes.DuplicatesIntolerable, ex.ErrorCode); }
public async Task Should_Add_Update_Delete_Links_Successfully() { MockExternalLinksForCrud(); var updateDto = new AddEditDeleteExternalLinkDto { LinksToDelete = new[] { 1, 2 }, LinksToCreate = new List <NewExternalLinkDto> { new NewExternalLinkDto { Name = "newLink1", Url = "newLink2" } }, LinksToUpdate = new List <ExternalLinkDto> { new ExternalLinkDto { Id = 3, Name = "modifiedLink3", Url = "http://link3modified.com" } }, OrganizationId = 2, UserId = "testUser" }; await _externalLinkService.UpdateLinksAsync(updateDto); _externalLinkDbSet.Received(2).Remove(Arg.Any <ExternalLink>()); _externalLinkDbSet.Received(1).Add(Arg.Any <ExternalLink>()); var externalLink = await _externalLinkDbSet.FirstAsync(x => x.Id == 3); Assert.AreEqual("modifiedLink3", externalLink.Name); Assert.AreEqual("http://link3modified.com", externalLink.Url); }