Beispiel #1
0
        private void AddInternal(TItem item)
        {
            if (item == null)
            {
                return;
            }

            if (ModelRegistry.IsManagedModel(item) && !ModelRegistry.IsManagedBy(Session, item))
            {
                var id = ModelRegistry.GetId(item);
                throw new UnmanagedModelException(item.GetType(), id);
            }

            var itemId = ModelRegistry.GetOrCreateId(item);

            Session.Cache.Update(itemId, item);

            if (Ids.Contains(itemId))
            {
                return;
            }

            Ids.Add(itemId);
            IsModified = true;
        }
Beispiel #2
0
 private void ThrowIfUnmanaged(object model)
 {
     if (ModelRegistry.IsUnmanagedModel(model) || !ModelRegistry.IsManagedBy(this, model))
     {
         throw new UnmanagedModelException(model.GetType(), ModelRegistry.GetId(model));
     }
 }
Beispiel #3
0
        public Task Delete <TModel>(TModel model)
        {
            ThrowIfDisposed();

            var id = ModelRegistry.GetId(model);

            return(Delete <TModel>(id));
        }
Beispiel #4
0
        public bool Contains(TItem item)
        {
            if (item == null)
            {
                return(false);
            }

            Initialize();

            return(Ids.Contains(ModelRegistry.GetId(item)));
        }
Beispiel #5
0
        public TRltn GetReference <TModel, TRltn>(TModel model, string rltnName)
        {
            ThrowIfDisposed();

            // Assumption here is that GetReference is only used by HasOne to initialize itself
            var resource = ModelRegistry.GetResource(model);

            if (resource == null)
            {
                throw new UnmanagedModelException(model.GetType(), ModelRegistry.GetId(model));
            }
            var relationships = resource.Relationships;

            if (relationships == null || !relationships.TryGetValue(rltnName, out var rltn))
            {
                var related = GetSingleRelated(model, rltnName);
                rltn = new Relationship
                {
                    Data = related != null
                        ? JToken.FromObject(ModelRegistry.GetResource(related).ToResourceIdentifier())
                        : JValue.CreateNull()
                };
            }

            // if we make it to here, 'rltn' has been set
            if (rltn == null)
            {
                throw new ModelMapException("Cannot find HasOne relationship", model.GetType(), ModelRegistry.GetId(model));
            }
            var rltnData = rltn.Data;
            ResourceIdentifier rltnIdentifier;

            if (rltnData == null || rltnData.Type == JTokenType.Null)
            {
                return(default(TRltn));
            }
            if (rltnData.Type == JTokenType.Object)
            {
                // TODO: I don't like that we're performing this conversion for every get
                rltnIdentifier = rltnData.ToObject <ResourceIdentifier>();
            }
            else
            {
                throw new ModelMapException(
                          $"Relationship {rltnName} mapped as [HasOne] but json relationship data was not an object",
                          typeof(TModel),
                          ModelRegistry.GetId(model));
            }
            // calling Get<TRltn>(...) here will check the cache first, then go remote if necessary
            return(Get <TRltn>(rltnIdentifier.Id).GetAwaiter().GetResult());
        }
Beispiel #6
0
        public void GetModelId__Given__WovenModel__When_IdSet__Then_GetId
            (Guid id)
        {
            var config = new ModelConfiguration(typeof(ModelWithPublicIdSetter));

            var subject = new ModelRegistry(new[] { config }, new JsonSerializerSettings());

            var model = new ModelWithPublicIdSetter
            {
                Id = id
            };

            var result = subject.GetId(model);

            Assert.Equal(id, result);
        }
Beispiel #7
0
        public Resource BuildModelResource(object model)
        {
            var resourceType = ModelRegistry.GetResourceType(model.GetType());

            // attributes
            var modelAttributes = ModelRegistry.GetAttributeValues(model);

            foreach (var attr in modelAttributes.Properties().ToArray())
            {
                if (attr.Value.Type == JTokenType.Null)
                {
                    attr.Remove();
                }
            }

            // relationships
            // Note: this process sets unset model Ids in order to create relationships
            var relationships = ModelRegistry.GetRelationshipValues(model);

            foreach (var rtln in relationships.ToList())
            {
                if (rtln.Value.Data.Type == JTokenType.Null)
                {
                    relationships.Remove(rtln);
                }
            }

            var modelMeta = ModelRegistry.GetMetaValues(model);

            foreach (var meta in modelMeta.Properties().ToArray())
            {
                if (meta.Value.Type == JTokenType.Null)
                {
                    meta.Remove();
                }
            }

            return(new Resource
            {
                Id = ModelRegistry.GetId(model),
                Type = resourceType,
                Attributes = modelAttributes.HasValues ? modelAttributes : null,
                Relationships = relationships.Any() ? relationships : null,
                Meta = modelMeta.HasValues ? modelMeta : null
            });
        }
Beispiel #8
0
        public bool Remove(TItem item)
        {
            if (item == null)
            {
                return(true);
            }

            Initialize();

            var itemId = ModelRegistry.GetId(item);

            var removed = Ids.Remove(itemId);

            if (removed)
            {
                IsModified = true;
            }
            return(removed);
        }