Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }