private object GetSingleRelated(object model, string rltnName) { var resource = ModelRegistry.GetResource(model); var request = HttpRequestBuilder.GetRelated(resource.Id, resource.Type, rltnName); var response = HttpClient.SendAsync(request).GetAwaiter().GetResult(); HttpResponseListener.GetRelated(response.StatusCode, resource.Id, resource.Type, rltnName); if (response.StatusCode == HttpStatusCode.NotFound) { return(null); } response.CheckStatusCode(); // TODO: perhaps use a 3rd ResourceRoot with JToken Data to determine if array was erroneously returned var root = response.GetContentModel <ResourceRootSingle>(JsonSettings).GetAwaiter().GetResult(); var rltn = root.Data; if (rltn == null) { return(null); } var rltnModel = CreateResourceModel(rltn); Cache.Update(rltn.Id, rltnModel); return(rltnModel); }
public void InitializeCollection(IRemoteCollection collection) { // TODO: abstract this into a collection loader/initializer // TODO: brute force this for now // TODO: don't run this task if the resource collection is empty/null! var resource = ModelRegistry.GetResource(collection.Owner); // determine if the cache is missing any models for this relationship var relationships = ModelRegistry.GetResource(collection.Owner).Relationships; if (relationships != null && relationships.TryGetValue(collection.Name, out var rltn)) { if (rltn?.Data.Type == JTokenType.Array && rltn.Data.ToObject <IEnumerable <ResourceIdentifier> >() .All(x => Cache.Retrieve <object>(x.Id) != null)) { return; } } var request = HttpRequestBuilder.GetRelated(resource.Id, resource.Type, collection.Name); var response = HttpClient.SendAsync(request).GetAwaiter().GetResult(); HttpResponseListener.GetRelated(response.StatusCode, resource.Id, resource.Type, collection.Name); if (response.StatusCode == HttpStatusCode.NotFound) { return; } response.CheckStatusCode(); // TODO: perhaps use a 3rd ResourceRoot with JToken Data to determine if object was erroneously returned var root = response.GetContentModel <ResourceRootCollection>(JsonSettings).GetAwaiter().GetResult(); var related = root.Data?.Select(x => { var rltnModel = CreateResourceModel(x); Cache.Update(x.Id, rltnModel); return(rltnModel); }) .ToArray(); collection.SetItems(related); }
public IEnumerable <TRltn> GetRelated <TParent, TRltn>( Guid id, Expression <Func <TParent, IEnumerable <TRltn> > > relationship) { var modelType = typeof(TParent); if (!(relationship.Body is MemberExpression mExpression)) { throw new NotSupportedException(); } var attr = mExpression.Member.CustomAttributes .SingleOrDefault(a => a.AttributeType == typeof(HasManyAttribute)); if (attr == null) { throw new RelationshipNotRegisteredExecption(mExpression.Member.Name, modelType); } var resourceType = ModelRegistry.GetResourceType(typeof(TParent)); var rltnName = mExpression.Member.GetJsonName(typeof(HasManyAttribute)); var request = HttpRequestBuilder.GetRelated(id, resourceType, rltnName); var response = HttpClient.SendAsync(request).GetAwaiter().GetResult(); HttpResponseListener.GetRelated(response.StatusCode, id, resourceType, rltnName); if (response.StatusCode == HttpStatusCode.NotFound) { return(Enumerable.Empty <TRltn>()); } response.CheckStatusCode(); var root = response.GetContentModel <ResourceRootCollection>(JsonSettings).GetAwaiter().GetResult(); var related = root.Data? .Select(CreateResourceModel) .Cast <TRltn>() .ToArray(); return(related); }