Exemplo n.º 1
0
        //public static HALResponse AddSelfLinkIfNotExists(this HALResponse response, HttpRequest request) {
        //    if(!response.HasSelfLink()) {
        //        response.AddSelfLink(request);
        //    }

        //    return response;
        //}

        public static HALResponse AddSelfLink(this HALResponse response, HttpRequest request)
        {
            var selfLink = new Link(Link.RelForSelf, request.Path, method: request.Method);

            response.AddLinks(selfLink);
            return(response);
        }
Exemplo n.º 2
0
        public IEnumerable <KeyValuePair <string, IEnumerable <HALResponse> > > GetEmbeddedCollections(object model, IHALModelConfig config)
        {
            var type = model.GetType();
            var embeddedModelProperties = type.GetTypeInfo().GetProperties().Where(x => x.IsDefined(typeof(HalEmbeddedAttribute)));

            foreach (var propertyInfo in embeddedModelProperties)
            {
                var embeddAttribute = propertyInfo.GetCustomAttribute(typeof(HalEmbeddedAttribute)) as HalEmbeddedAttribute;
                if (embeddAttribute == null)
                {
                    continue;
                }

                var modelValue = propertyInfo.GetValue(model);

                var embeddedItems = modelValue as IEnumerable <object> ?? new List <object> {
                    modelValue
                };

                var halResponses = embeddedItems.Select(embeddedModel => {
                    var response = new HALResponse(embeddedModel, config);
                    response.AddLinks(this.GetLinks(embeddedModel));
                    response.AddEmbeddedCollections(this.GetEmbeddedCollections(embeddedModel, config));

                    return(response);
                });

                yield return(new KeyValuePair <string, IEnumerable <HALResponse> >(embeddAttribute.CollectionName, halResponses));
            }
        }
        public async Task <IActionResult> GetRegistrations()
        {
            _logger.LogInformation("Vis registreringer");

            var email = HttpContext.User.Claims.FirstOrDefault(c => c.Type.EndsWith("emailaddress"))?.Value;
            var user  = await _userManager.FindByNameAsync(email);

            var data = _registrationService.GetAllByIdAsync(user.Id).ToList();

            var result = data.Select(s => new RegistrationsModel
            {
                Id        = s.Id,
                Date      = s.Date,
                StartTime = s.StartTime,
                EndTime   = s.EndTime.GetValueOrDefault()
            });


            var responseConfig = new HALModelConfig
            {
                LinkBase = $"{Request.Scheme}://{Request.Host.ToString()}",
                ForceHAL = Request.ContentType == "application/hal+json"
            };

            var response = new HALResponse(responseConfig);

            response.AddEmbeddedCollection("registrations", result);
            response.AddLinks(
                new Link("self", "/api/registration/", null, "GET")
                );

            return(this.HAL(response));
        }
        public async Task <IActionResult> GetRegistration([Required] int id)
        {
            _logger.LogInformation($"Vis detaljer for registrering {id}");

            var data = await _registrationService.GetByIdAsync(id);

            var result = new RegistrationsModel
            {
                Id        = data.Id,
                Date      = data.Date,
                StartTime = data.StartTime,
                EndTime   = data.EndTime.GetValueOrDefault()
            };


            var responseConfig = new HALModelConfig
            {
                LinkBase = $"{Request.Scheme}://{Request.Host.ToString()}",
                ForceHAL = Request.ContentType == "application/hal+json"
            };

            var response = new HALResponse(responseConfig);

            response.AddEmbeddedResource("registration", result);
            response.AddLinks(
                new Link("self", $"/api/registration/{id}", null, "GET")
                );

            return(this.HAL(response));
        }
        public async Task <IActionResult> Exchange([FromBody] ExchangeRequest request)
        {
            _logger.LogInformation(
                $"Omregn beløbet {request.Amount} med fra valuta \"{request.FromCurrencyCode}\" til valuta \"{request.ToCurrencyCode}\"");

            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var result =
                await _exchangeService.Exchange(request.Amount, request.FromCurrencyCode, request.ToCurrencyCode);

            var responseConfig = new HALModelConfig
            {
                LinkBase = $"{Request.Scheme}://{Request.Host.ToString()}",
                ForceHAL = Request.ContentType == "application/hal+json"
            };

            var response = new HALResponse(responseConfig);

            response.AddEmbeddedResource("result", result);
            response.AddLinks(
                new Link("self", "/api/Exchange", null, "POST"),
                new Link("fromCurrency", $"/api/CurrencyRates/{request.FromCurrencyCode}"),
                new Link("toCurrency", $"/api/CurrencyRates/{request.ToCurrencyCode}")
                );

            return(this.HAL(response));
        }
        public async Task <IActionResult> Get()
        {
            var invitations = await _gameInvitationService.All();

            var responseConfig = new HALModelConfig
            {
                LinkBase = $"{Request.Scheme}://{Request.Host.ToString()}",
                ForceHAL = Request.ContentType == "application/hal+json" ? true : false
            };

            var response = new HALResponse(responseConfig);

            response.AddLinks(new Link("self", "/GameInvitation"),
                              new Link("confirm", "/GameInvitation/{id}/Confirm"));

            List <HALResponse> invitationsResponses = new List <HALResponse>();

            foreach (var invitation in invitations)
            {
                var rInv = new HALResponse(invitation, responseConfig);

                rInv.AddLinks(new Link("self", "/GameInvitation/" + invitation.Id));
                rInv.AddLinks(new Link("confirm", $"/GameInvitation/{invitation.Id}/confirm"));

                var invitedPlayer = _userService.GetUserByEmail(invitation.EmailTo);
                rInv.AddEmbeddedResource("invitedPlayer", invitedPlayer, new Link[]
                {
                    new Link("self", $"/User/{invitedPlayer.Id}")
                });

                var invitedBy = _userService.GetUserByEmail(invitation.InvitedBy);
                rInv.AddEmbeddedResource("invitedBy", invitedBy, new Link[]
                {
                    new Link("self", $"/User/{invitedBy.Id}")
                });

                invitationsResponses.Add(rInv);
            }

            response.AddEmbeddedCollection("invitations", invitationsResponses);
            return(this.HAL(response));
        }
Exemplo n.º 7
0
        public static IActionResult HAL(this ControllerBase controller, IEnumerable <Link> links, string relativeLinkBase = "~/", HttpStatusCode statuscode = HttpStatusCode.OK)
        {
            string linkBase = GetLinkBase(controller, relativeLinkBase);

            var hyperMedia = new HALResponse(new HALModelConfig {
                ForceHAL = true, // If we're only returning links, always return them
                LinkBase = linkBase
            });

            hyperMedia.AddLinks(links);

            return(hyperMedia.ToActionResult(controller, statuscode));
        }
Exemplo n.º 8
0
        public static IActionResult HAL <T, E>(this ControllerBase controller, T model, IEnumerable <Link> modelLinks, string embeddedName, IEnumerable <E> embeddedModel, IEnumerable <Link> embeddedLinks, string relativeLinkBase = "~/", HttpStatusCode statuscode = HttpStatusCode.OK)
        {
            string linkBase = GetLinkBase(controller, relativeLinkBase);

            var hyperMedia = new HALResponse(model, new HALModelConfig {
                LinkBase = linkBase
            });

            hyperMedia
            .AddLinks(modelLinks)
            .AddEmbeddedCollection(embeddedName, embeddedModel, embeddedLinks);

            return(hyperMedia.ToActionResult(controller, statuscode));
        }
Exemplo n.º 9
0
        public HALResponse Convert(object model)
        {
            if(!this.CanConvert(model?.GetType())) {
                throw new InvalidOperationException();
            }

            var resolver = new HALAttributeResolver();

            var halConfig = resolver.GetConfig(model);

            var response = new HALResponse(model, halConfig);
            response.AddLinks(resolver.GetLinks(model));
            response.AddEmbeddedCollections(resolver.GetEmbeddedCollections(model, halConfig));

            return response;
        }
Exemplo n.º 10
0
        public void AddEmbeddedResources(HALResponse response, object modelValue, IHALModelConfig config)
        {
            response.AddLinks(this.GetLinks(modelValue));
            var embeddedCollections = this.GetEmbeddedCollections(modelValue, config);

            foreach (var embedded in embeddedCollections)
            {
                if (embedded.IsCollection)
                {
                    response.AddEmbeddedCollection(embedded.ResourceName, embedded.HALResponses);
                }
                else
                {
                    response.AddEmbeddedResource(embedded.ResourceName, embedded.HALResponses.Single());
                }
            }
        }
Exemplo n.º 11
0
        public HALResponse Convert(object model)
        {
            if (!this.CanConvert(model?.GetType()))
            {
                throw new InvalidOperationException();
            }

            var resolver = new HALAttributeResolver();

            var halConfig = resolver.GetConfig(model);

            var response = new HALResponse(model, halConfig);

            response.AddLinks(resolver.GetLinks(model));
            response.AddEmbeddedCollections(resolver.GetEmbeddedCollections(model, halConfig));

            return(response);
        }
        private static HALResponse ConvertInstance(object model, HttpContext context, HalcyonConventionOptions options)
        {
            //If this is called for a collection it will scan all the links for each item, but
            //each one needs to be customized to work anyway.

            //If the options provide a model, use that, otherwise get it from the resolver.
            IHALModelConfig halConfig;

            if (options.BaseUrl != null)
            {
                var pathBaseValue = "";
                var pathBase      = context.Request.PathBase;
                if (pathBase.HasValue)
                {
                    //If we have a value, use that as the pathBaseValue, otherwise stick with the empty string.
                    pathBaseValue = pathBase.Value;
                }

                var currentUri = new Uri(context.Request.GetDisplayUrl());
                var host       = $"{currentUri.Scheme}://{currentUri.Authority}{pathBaseValue}";

                halConfig = new HALModelConfig()
                {
                    LinkBase = options.BaseUrl.Replace(HalcyonConventionOptions.HostVariable, host),
                    ForceHAL = false
                };
            }
            else
            {
                halConfig = CustomHALAttributeResolver.GetConfig(model);
            }

            var response = new HALResponse(model, halConfig);

            response.AddLinks(CustomHALAttributeResolver.GetUserLinks(model, context, options.HalDocEndpointInfo));
            var embeddedCollections = CustomHALAttributeResolver.GetEmbeddedCollectionValues(model)
                                      .Select(i => new KeyValuePair <String, IEnumerable <HALResponse> >(i.Key, GetEmbeddedResponses(i.Value, context, options)));

            response.AddEmbeddedCollections(embeddedCollections);

            return(response);
        }
Exemplo n.º 13
0
    public static IEnumerable <HALResponse> ToHALResponses <T>(this IEnumerable <T> collection, Func <T, IEnumerable <Link> > linkGenerator = null)
    {
        var halCollection = new List <HALResponse>();

        foreach (var item in collection)
        {
            var halItem = new HALResponse(item);
            if (linkGenerator != null)
            {
                var linkList = linkGenerator(item);
                foreach (var x in linkList)
                {
                    System.Console.WriteLine(x.Href);
                }
                halItem.AddLinks(linkList);
            }

            halCollection.Add(halItem);
        }

        return(halCollection);
    }
Exemplo n.º 14
0
        public IEnumerable<KeyValuePair<string, IEnumerable<HALResponse>>> GetEmbeddedCollections(object model, IHALModelConfig config)
        {
            var type = model.GetType();
            var embeddedModelProperties = type.GetTypeInfo().GetProperties().Where(x => x.IsDefined(typeof(HalEmbeddedAttribute)));

            foreach(var propertyInfo in embeddedModelProperties) {
                var embeddAttribute = propertyInfo.GetCustomAttribute(typeof(HalEmbeddedAttribute)) as HalEmbeddedAttribute;
                if(embeddAttribute == null) continue;

                var modelValue = propertyInfo.GetValue(model);

                var embeddedItems = modelValue as IEnumerable<object> ?? new List<object> { modelValue };

                var halResponses = embeddedItems.Select(embeddedModel => {
                    var response = new HALResponse(embeddedModel, config);
                    response.AddLinks(this.GetLinks(embeddedModel));
                    response.AddEmbeddedCollections(this.GetEmbeddedCollections(embeddedModel, config));

                    return response;
                });

                yield return new KeyValuePair<string, IEnumerable<HALResponse>>(embeddAttribute.CollectionName, halResponses);
            }
        }
 public static HALResponse AddLink(this HALResponse hal, Link link) => hal.AddLinks(new Link[] { link });
Exemplo n.º 16
0
        public async Task <ActionResult> GetInstances(
            string org,
            string appId,
            [FromQuery(Name = "process.currentTask")] string currentTaskId,
            [FromQuery(Name = "process.isComplete")] bool?processIsComplete,
            [FromQuery(Name = "process.isInError")] bool?processIsInError,
            [FromQuery(Name = "process.endState")] string processEndState,
            [FromQuery] int?instanceOwnerId,
            [FromQuery] string labels,
            [FromQuery] string lastChangedDateTime,
            [FromQuery] string createdDateTime,
            [FromQuery] string visibleDateTime,
            [FromQuery] string dueDateTime,
            string continuationToken,
            int?size)
        {
            int    pageSize = size ?? 100;
            string selfContinuationToken = null;

            if (!string.IsNullOrEmpty(continuationToken))
            {
                selfContinuationToken = continuationToken;
                continuationToken     = HttpUtility.UrlDecode(continuationToken);
            }

            Dictionary <string, StringValues> queryParams = QueryHelpers.ParseQuery(Request.QueryString.Value);

            string host  = $"{Request.Scheme}://{Request.Host.ToUriComponent()}";
            string url   = Request.Path;
            string query = Request.QueryString.Value;

            logger.LogInformation($"uri = {url}{query}");

            try
            {
                InstanceQueryResponse result = await _instanceRepository.GetInstancesOfApplication(queryParams, continuationToken, pageSize);

                if (result.TotalHits == 0)
                {
                    return(NotFound($"Did not find any instances"));
                }

                if (!string.IsNullOrEmpty(result.Exception))
                {
                    return(BadRequest(result.Exception));
                }

                string nextContinuationToken = HttpUtility.UrlEncode(result.ContinuationToken);
                result.ContinuationToken = null;

                HALResponse response = new HALResponse(result);

                if (continuationToken == null)
                {
                    string selfUrl = $"{host}{url}{query}";

                    result.Self = selfUrl;

                    Link selfLink = new Link("self", selfUrl);
                    response.AddLinks(selfLink);
                }
                else
                {
                    string selfQueryString = BuildQueryStringWithOneReplacedParameter(
                        queryParams,
                        "continuationToken",
                        selfContinuationToken);

                    string selfUrl = $"{host}{url}{selfQueryString}";

                    result.Self = selfUrl;

                    Link selfLink = new Link("self", selfUrl);
                    response.AddLinks(selfLink);
                }

                if (nextContinuationToken != null)
                {
                    string nextQueryString = BuildQueryStringWithOneReplacedParameter(
                        queryParams,
                        "continuationToken",
                        nextContinuationToken);

                    string nextUrl = $"{host}{url}{nextQueryString}";

                    result.Next = nextUrl;

                    Link nextLink = new Link("next", nextUrl);
                    response.AddLinks(nextLink);
                }

                // add self links to platform
                result.Instances.ForEach(i => AddSelfLinks(Request, i));

                StringValues acceptHeader = Request.Headers["Accept"];
                if (acceptHeader.Any() && acceptHeader.Contains("application/hal+json"))
                {
                    /* Response object should be expressed as HAL (Hypertext Application Language) with _embedded and _links.
                     * Thus we reset the response object's inline instances, next and self elements.*/

                    response.AddEmbeddedCollection("instances", result.Instances);
                    result.Instances = null;
                    result.Next      = null;
                    result.Self      = null;
                }

                return(Ok(response));
            }
            catch (Exception e)
            {
                logger.LogError("exception", e);
                return(StatusCode(500, $"Unable to perform query due to: {e.Message}"));
            }
        }
Exemplo n.º 17
0
 public static HALResponse AddLink(this HALResponse self, Link link)
 {
     return(self.AddLinks(link));
 }
 public static HALResponse AddLinkToSelf(this HALResponse hal, string href) => hal.AddLinks(new Link[] { new Link("self", href) });