예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
        }