Пример #1
0
 private static void LinksAreValid(Common.Api.Request.MediaHeader requestedHeader, out IList <Common.Api.Response.MediaLink> invalidLinks)
 {
     invalidLinks = new List <Common.Api.Response.MediaLink>();
     if (requestedHeader != null)
     {
         foreach (var part in requestedHeader.Parts)
         {
             if (part != null)
             {
                 foreach (var link in part.Version.Links)
                 {
                     if (link != null)
                     {
                         if (!Uri.TryCreate(link.Link, UriKind.Absolute, out _))
                         {
                             invalidLinks.Add(new Common.Api.Response.MediaLink
                             {
                                 Link        = link.Link,
                                 LinkOrderId = link.LinkOrderId,
                                 MediaLinkId = link.MediaLinkId != null ? (int)link.MediaLinkId : 0
                             });
                         }
                     }
                 }
             }
         }
     }
 }
Пример #2
0
        private async Task <Dal.Model.MediaHeader> AddOrUpdateHeaderAsync(Common.Api.Request.MediaHeader requestedHeader, Dal.Model.User loggedUser)
        {
            Dal.Model.MediaHeader header = requestedHeader.MediaHeaderId == null ? new Dal.Model.MediaHeader() :
                                           await context.MediaHeaders.SingleOrDefaultAsync(h => h.MediaHeaderId == (int)requestedHeader.MediaHeaderId);

            // Change all values except PK (MediaHeaderId)
            header.Name          = requestedHeader.Name;
            header.Year          = requestedHeader.Year;
            header.Description   = requestedHeader.Description;
            header.ReferenceLink = !string.IsNullOrWhiteSpace(requestedHeader.ReferenceLink) ? new Uri(requestedHeader.ReferenceLink) : null;
            header.UserId        = loggedUser.UserId;

            if (requestedHeader.MediaHeaderId == null)
            {
                await context.MediaHeaders.AddAsync(header);
            }
            await context.SaveChangesAsync();                       // Save to get MediaId.

            requestedHeader.MediaHeaderId = header.MediaHeaderId;   // Populate id in request structure, so it can be used later if needed.

            // Header tags
            await AddHeaderTagsAsync(requestedHeader);

            // Parts
            await AddPartsAsync(requestedHeader, header, loggedUser);

            return(header);
        }
Пример #3
0
        public async Task <ActionResult <Common.Api.Response.MediaHeader> > Add(Common.Api.Request.MediaHeader requestedHeader)
        {
            // Always check at beginning!
            var loggedUser = await GetLoggedUserAsync();

            if (loggedUser != null)
            {
                try
                {
                    // Validate links before saving!!!
                    LinksAreValid(requestedHeader, out var invalidLinks);
                    if (invalidLinks == null || invalidLinks.Count == 0)
                    {
                        var addedMediaHeader = await AddOrUpdateHeaderAsync(requestedHeader, loggedUser);

                        return(Ok(await BuildResponseHeaderAsync(addedMediaHeader.MediaHeaderId)));
                    }
                    else
                    {
                        return(BadRequest($"You sent invalid links: \n{invalidLinks.Select(l => l.Link).Aggregate((l1, l2) => l1 + "\n" + l2)}"));
                    }
                }
                catch (Exception ex)
                {
                    return(BadRequest(ex.Message));
                }
            }
            else
            {
                return(GetUnauthorizedLoginResponse());
            }
        }
        public async Task Update_Single_Media()
        {
            // For the sake of sanity I'll use request object and convert it to JSON before calling API.

            // Always set token first.
            Config.Client.SetToken(this.token);

            // Make some changes so we can correct it later with update command.
            var wrongRequest = ExampleRequest_BreakingBad();

            wrongRequest.Name += " ~some wrong text~";
            wrongRequest.Parts.ToArray()[0].Name += " ~some wrong text~";

            // Add wrong data.
            HttpResponseMessage response = await Config.Client.PostAsync(Common.ApiRoutes.Media.Add,
                                                                         new StringContent(
                                                                             JsonSerializer.Serialize(wrongRequest),
                                                                             Encoding.UTF8, Config.HttpMediaTypeJson));

            var responseMessage = await response.Content.ReadAsStringAsync();

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, responseMessage);
            Common.Api.Response.MediaHeader responseHeader = JsonSerializer.Deserialize <Common.Api.Response.MediaHeader>(responseMessage);
            Assert.IsNotNull(responseHeader);

            // Change request data, with correct values.
            Common.Api.Request.MediaHeader correctedRequestHeader = ResponseToRequest(responseHeader);
            correctedRequestHeader.Name = "Breaking Bad (2008)";
            correctedRequestHeader.Parts.ToArray()[0].Name = "Pilot";

            // Update. Structures must have id's.
            response = await Config.Client.PostAsync(Common.ApiRoutes.Media.Update,
                                                     new StringContent(
                                                         JsonSerializer.Serialize(correctedRequestHeader),
                                                         Encoding.UTF8, Config.HttpMediaTypeJson));

            responseMessage = await response.Content.ReadAsStringAsync();

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, responseMessage);
            responseHeader = JsonSerializer.Deserialize <Common.Api.Response.MediaHeader>(responseMessage);
            Assert.IsNotNull(responseHeader);


            // Header
            Assert.AreEqual("Breaking Bad (2008)", responseHeader.Name);
            Assert.IsNotNull(responseHeader.Description);
            Assert.IsTrue(responseHeader.Description.Length > 0);

            // Parts
            Assert.AreEqual(2, responseHeader.Parts.Count);
            Assert.AreEqual("Pilot", responseHeader.Parts.ToArray()[0].Name);
            Assert.AreEqual("Cat's in the Bag...", responseHeader.Parts.ToArray()[1].Name);

            // Part[0] / Versions
            Assert.AreEqual(1, responseHeader.Parts.ToArray()[0].Versions.Count);
            Assert.AreEqual(2, responseHeader.Parts.ToArray()[0].Versions.ToArray()[0].Links.Count);
            // Part[1] / Versions
            Assert.AreEqual(1, responseHeader.Parts.ToArray()[1].Versions.Count);
            Assert.AreEqual(2, responseHeader.Parts.ToArray()[1].Versions.ToArray()[0].Links.Count);
        }
Пример #5
0
        private async Task AddHeaderTagsAsync(Common.Api.Request.MediaHeader requestedHeader)
        {
            if (requestedHeader.Tags != null)
            {
                List <Dal.Model.MediaTag> tagsInRequestHeader = new();
                foreach (var reqHeaderTag in requestedHeader.Tags)
                {
                    var tag = await context.MediaTags.SingleOrDefaultAsync(t => t.Name == reqHeaderTag.Name);

                    if (tag == null)
                    {
                        tag = new Dal.Model.MediaTag {
                            Name = reqHeaderTag.Name
                        };
                        await context.MediaTags.AddAsync(tag);

                        await context.SaveChangesAsync();
                    }
                    tagsInRequestHeader.Add(tag);

                    // Header-Tag link
                    if (!await context.MediaHeaderTags.AnyAsync(ht => ht.MediaHeaderId == (int)requestedHeader.MediaHeaderId && ht.MediaTagId == tag.MediaTagId))
                    {
                        await context.MediaHeaderTags.AddAsync(new Dal.Model.MediaHeaderTag
                        {
                            MediaHeaderId = (int)requestedHeader.MediaHeaderId,
                            MediaTagId    = tag.MediaTagId
                        });

                        await context.SaveChangesAsync();
                    }
                }

                // Remove tags that are not in request.
                var allTagsForHeader = await context.MediaHeaderTags.Where(ht => ht.MediaHeaderId == (int)requestedHeader.MediaHeaderId).ToListAsync();

                context.MediaHeaderTags.RemoveRange(allTagsForHeader.Where(headerTag => !tagsInRequestHeader.Any(requestTag => requestTag.MediaTagId == headerTag.MediaTagId)));
                await context.SaveChangesAsync();
            }
        }
Пример #6
0
        public async Task <ActionResult <Common.Api.Response.MediaHeader> > Update(Common.Api.Request.MediaHeader requestedHeader)
        {
            // Always check at beginning!
            var loggedUser = await GetLoggedUserAsync();

            if (loggedUser != null)
            {
                try
                {
                    var addedMediaHeader = await AddOrUpdateHeaderAsync(requestedHeader, loggedUser);

                    return(Ok(await BuildResponseHeaderAsync(addedMediaHeader.MediaHeaderId)));
                }
                catch (Exception ex)
                {
                    return(BadRequest(ex.Message));
                }
            }
            else
            {
                return(GetUnauthorizedLoginResponse());
            }
        }
        public async Task Remove_One_Part_Tag()
        {
            // For the sake of sanity I'll use request object and convert it to JSON before calling API.

            // Add wrong data.
            HttpResponseMessage response = await Config.Client.PostAsync(Common.ApiRoutes.Media.Add,
                                                                         new StringContent(
                                                                             JsonSerializer.Serialize(ExampleRequest_BreakingBad()),
                                                                             Encoding.UTF8, Config.HttpMediaTypeJson));

            var responseMessage = await response.Content.ReadAsStringAsync();

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, responseMessage);
            Common.Api.Response.MediaHeader responseHeader = JsonSerializer.Deserialize <Common.Api.Response.MediaHeader>(responseMessage);
            Assert.IsNotNull(responseHeader);

            // Delete one tag from first part.
            Common.Api.Request.MediaHeader updatedRequest = ResponseToRequest(responseHeader);
            var part1Tags        = ((List <Common.Api.Request.MediaTag>)((List <Common.Api.Request.MediaPart>)updatedRequest.Parts).First().Tags);
            var oldPart1TagCount = part1Tags.Count;

            part1Tags.Remove(part1Tags.LastOrDefault());

            // Update. Structures must have id's.
            response = await Config.Client.PostAsync(Common.ApiRoutes.Media.Update,
                                                     new StringContent(
                                                         JsonSerializer.Serialize(updatedRequest),
                                                         Encoding.UTF8, Config.HttpMediaTypeJson));

            responseMessage = await response.Content.ReadAsStringAsync();

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, responseMessage);
            responseHeader = JsonSerializer.Deserialize <Common.Api.Response.MediaHeader>(responseMessage);
            Assert.IsNotNull(responseHeader);

            Assert.AreEqual(--oldPart1TagCount, ((IList <Common.Api.Response.MediaTag>)((IList <Common.Api.Response.MediaPart>)responseHeader.Parts).First().Tags).Count);
        }
Пример #8
0
        private async Task AddPartsAsync(Common.Api.Request.MediaHeader requestedHeader,
                                         Dal.Model.MediaHeader addedHeader, Dal.Model.User loggedUser)
        {
            if (requestedHeader.Parts != null)
            {
                foreach (var requestedPart in requestedHeader.Parts)
                {
                    Dal.Model.MediaPart part = requestedPart.MediaPartId == null ? new Dal.Model.MediaPart() :
                                               await context.MediaParts.SingleOrDefaultAsync(p => p.MediaPartId == requestedPart.MediaPartId);

                    part.MediaHeaderId = addedHeader.MediaHeaderId;
                    part.Season        = requestedPart.Season;
                    part.Episode       = requestedPart.Episode;
                    part.Name          = requestedPart.Name;
                    part.Description   = requestedPart.Description;
                    part.ReferenceLink = !string.IsNullOrWhiteSpace(requestedPart.ReferenceLink) ? new Uri(requestedPart.ReferenceLink) : null;
                    part.UserId        = loggedUser.UserId;
                    part.Created       = DateTime.Now;

                    if (requestedPart.MediaPartId == null)
                    {
                        await context.MediaParts.AddAsync(part);
                    }

                    await context.SaveChangesAsync();

                    requestedPart.MediaPartId = part.MediaPartId;

                    // Part tags
                    await AddPartTagsAsync(requestedPart);

                    // Media versions and tags
                    await AddVersionAsync(requestedPart, part, loggedUser);
                }
            }
        }
        private static void CompareRequestAndResponse(Common.Api.Request.MediaHeader requestMedia, Common.Api.Response.MediaHeader responseMedia)
        {
            // Header
            Assert.AreEqual(requestMedia.Name, responseMedia.Name);
            Assert.AreEqual(requestMedia.Year, responseMedia.Year);
            Assert.AreEqual(requestMedia.Description, responseMedia.Description);
            Assert.AreEqual(requestMedia.ReferenceLink, responseMedia.ReferenceLink);
            if (requestMedia.Tags != null)
            {
                Assert.AreEqual(requestMedia.Tags.Count, responseMedia.Tags.Count);
                foreach (var requestTag in requestMedia.Tags)
                {
                    Assert.IsTrue((responseMedia.Tags as IList <Common.Api.Response.MediaTag>).Any(responseTag => responseTag.Name == requestTag.Name));
                }
            }

            // Parts
            if (requestMedia.Parts != null)
            {
                Assert.AreEqual(requestMedia.Parts.Count, responseMedia.Parts.Count);
                foreach (var requestPart in requestMedia.Parts)
                {
                    var responsePart = responseMedia.Parts.SingleOrDefault(p => p.Season == requestPart.Season && p.Episode == requestPart.Episode);
                    Assert.IsNotNull(responsePart, "Can't find response part.");

                    if (requestPart.Name != null)
                    {
                        Assert.AreEqual(requestPart.Name, responsePart.Name);
                    }
                    if (requestPart.Description != null)
                    {
                        Assert.AreEqual(requestPart.Description, responsePart.Description);
                    }
                    if (requestPart.ReferenceLink != null)
                    {
                        Assert.AreEqual(requestPart.ReferenceLink, responsePart.ReferenceLink);
                    }

                    // Part Tags
                    if (requestPart.Tags != null)
                    {
                        Assert.AreEqual(requestPart.Tags.Count, responsePart.Tags.Count);
                        foreach (var requestTag in requestPart.Tags)
                        {
                            Assert.IsTrue((responsePart.Tags as IList <Common.Api.Response.MediaTag>).Any(responseTag => responseTag.Name == requestTag.Name));
                        }
                    }

                    // Version
                    Assert.AreEqual(requestPart.Version.VersionComment, responsePart.Versions.FirstOrDefault().VersionComment);

                    // Version Tags
                    if (requestPart.Version.Tags != null)
                    {
                        Assert.AreEqual(requestPart.Version.Tags.Count, responsePart.Versions.FirstOrDefault().Tags.Count);
                        foreach (var requestTag in requestPart.Version.Tags)
                        {
                            Assert.IsTrue((responsePart.Versions.FirstOrDefault().Tags as IList <Common.Api.Response.MediaTag>).Any(responseTag => responseTag.Name == requestTag.Name));
                        }
                    }

                    // Links
                    Assert.AreEqual(requestPart.Version.Links.Count, responsePart.Versions.FirstOrDefault().Links.Count);
                    foreach (var requestLink in requestPart.Version.Links)
                    {
                        var responseLink = responsePart.Versions.FirstOrDefault().Links.SingleOrDefault(l => l.LinkOrderId == requestLink.LinkOrderId);
                        Assert.IsNotNull(responseLink);
                        Assert.AreEqual(requestLink.Link, responseLink.Link);
                    }
                }
            }
        }