//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); }
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)); }
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)); }
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)); }
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; }
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()); } } }
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); }
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); }
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 });
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}")); } }
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) });