public async Task ParallelWrite() { var link = RandomStringGenerator.GenerateRandomLatin(30); var firstShopId = Guid.NewGuid(); var secondShopId = Guid.NewGuid(); var firstPublicLink = new PublicLink { ShopId = firstShopId, Link = link, IsActive = true, }; var secondPublicLink = new PublicLink { ShopId = secondShopId, Link = link, IsActive = true, }; var result = await Task.WhenAll(Task.Run(async() => { await Task.Delay(10); return(await publicLinkRepository.WriteOrUpdateAsync(firstPublicLink)); }), Task.Run(async() => { await Task.Delay(10); return(await publicLinkRepository.WriteOrUpdateAsync(secondPublicLink)); })); result.Count(x => x).Should().Be(1); }
public async Task WriteThenUpdateLink() { var firstLink = RandomStringGenerator.GenerateRandomLatin(30); var secondLink = RandomStringGenerator.GenerateRandomLatin(30); var publicLink = new PublicLink { ShopId = Guid.NewGuid(), Link = firstLink, IsActive = true, }; await publicLinkRepository.WriteOrUpdateAsync(publicLink); publicLink.Link = secondLink; var result = await publicLinkRepository.WriteOrUpdateAsync(publicLink); var dbLinkByShopId = await publicLinkRepository.ReadByShopIdAsync(publicLink.ShopId); var dbLinkByFirstLink = await publicLinkRepository.ReadByPublicLinkAsync(firstLink); var dbLinkBySecondLink = await publicLinkRepository.ReadByPublicLinkAsync(secondLink); result.Should().BeTrue(); dbLinkByShopId.Should().BeEquivalentTo(publicLink); dbLinkByFirstLink.Should().BeNull(); dbLinkBySecondLink.Should().BeEquivalentTo(publicLink); }
public async Task WriteThenWriteToAnotherShop() { var link = RandomStringGenerator.GenerateRandomLatin(30); var firstShopId = Guid.NewGuid(); var secondShopId = Guid.NewGuid(); var firstPublicLink = new PublicLink { ShopId = firstShopId, Link = link, IsActive = true, }; var secondPublicLink = new PublicLink { ShopId = secondShopId, Link = link, IsActive = true, }; await publicLinkRepository.WriteOrUpdateAsync(firstPublicLink); var result = await publicLinkRepository.WriteOrUpdateAsync(secondPublicLink); var dbLinkByFirstShopId = await publicLinkRepository.ReadByShopIdAsync(firstShopId); var dbLinkBySecondShopId = await publicLinkRepository.ReadByShopIdAsync(secondShopId); var dbLinkByLink = await publicLinkRepository.ReadByPublicLinkAsync(link); result.Should().BeFalse(); dbLinkByFirstShopId.Should().BeEquivalentTo(firstPublicLink); dbLinkBySecondShopId.Should().BeNull(); dbLinkByLink.Should().BeEquivalentTo(firstPublicLink); }
public async Task <bool> WriteOrUpdateAsync(PublicLink publicLink) { using (await locker.LockAsync(GetLockId(publicLink.Link))) { publicLink.Link = publicLink.Link.ToLowerInvariant(); var previousLinkToShopId = await linkToShopIdStorage.FirstOrDefaultAsync(x => x.Link == publicLink.Link); var previousShopIdToLink = await shopIdToLinkStorage.FirstOrDefaultAsync(x => x.ShopId == publicLink.ShopId); if (previousLinkToShopId != null && previousLinkToShopId.ShopId != publicLink.ShopId) { return(false); } var linkToShopId = mapper.Map <PublicLinkToShopIdStorageElement>(publicLink); var shopIdToLink = mapper.Map <ShopIdToPublicLinkStorageElement>(linkToShopId); await linkToShopIdStorage.WriteAsync(linkToShopId); await shopIdToLinkStorage.WriteAsync(shopIdToLink); if (previousShopIdToLink != null && previousShopIdToLink.Link != publicLink.Link) { await linkToShopIdStorage.DeleteAsync(x => x.Link == previousShopIdToLink.Link); } return(true); } }
public static async Task <PublicLink> GetPublicLink(this Connection conn, string actionName, long id) { string link = null; var req = conn.newRequest(actionName); req.add("fileid", id); req.unixTimestamps(); var response = await conn.send(req); var hosts = (object[])response.dict["hosts"]; var host = hosts[0].ToString(); var path = response.dict["path"]; link = "http://" + host + path; var expires = response.dict["expires"].ToString(); var newLink = new PublicLink() { Hosts = hosts.Select(x => x.ToString()).ToArray(), Link = link }; if (long.TryParse(expires, out var expiresLong)) { newLink.Exipires = expiresLong; newLink.ExpiresDate = DateTimeOffset.FromUnixTimeSeconds(expiresLong).DateTime; } return(newLink); }
public async Task WriteThenReadByPublicLinkLink() { var publicLink = new PublicLink { ShopId = Guid.NewGuid(), Link = RandomStringGenerator.GenerateRandomLatin(30), IsActive = true, }; var result = await publicLinkRepository.WriteOrUpdateAsync(publicLink); var dbPublicLink = await publicLinkRepository.ReadByPublicLinkAsync(publicLink.Link); result.Should().BeTrue(); dbPublicLink.Should().BeEquivalentTo(publicLink); }
public async Task SaveLinkInLowerCase() { var link = RandomStringGenerator.GenerateRandomLatin(30); var publicLink = new PublicLink { ShopId = Guid.NewGuid(), Link = link.ToUpperInvariant(), IsActive = true, }; var result = await publicLinkRepository.WriteOrUpdateAsync(publicLink); var dbPublicLinkUpper = await publicLinkRepository.ReadByPublicLinkAsync(link.ToUpperInvariant()); var dbPublicLinkLower = await publicLinkRepository.ReadByPublicLinkAsync(link); result.Should().BeTrue(); dbPublicLinkUpper.Link.Should().BeEquivalentTo(link); dbPublicLinkLower.Should().BeEquivalentTo(dbPublicLinkUpper); }