Esempio n. 1
0
        public static void FromApiResource(this JsonApiCollectionDocument document, IEnumerable data, JsonApiResource apiResource, string baseUrl = null)
        {
            if (data == null)
            {
                return;
            }
            var resourceObjects = new List <JsonApiResourceObject>();

            foreach (var item in data)
            {
                var rObject = new JsonApiResourceObject();
                rObject.FromApiResource(item, apiResource, baseUrl);
                resourceObjects.Add(rObject);
            }
            document.Data = resourceObjects;
            if (!string.IsNullOrWhiteSpace(baseUrl))
            {
                document.Links = new JsonApiLinksObject
                {
                    Self = new JsonApiLink
                    {
                        Href = $"{baseUrl}{apiResource.UrlPath}"
                    }
                };
            }
        }
Esempio n. 2
0
        public static JsonApiCollectionDocument CreateDocumentFromApiResource <T>(IEnumerable data, string baseUrl = null) where T : JsonApiResource
        {
            var apiResource = Activator.CreateInstance <T>();
            var document    = new JsonApiCollectionDocument();

            document.FromApiResource(data, apiResource, baseUrl);
            return(document);
        }
Esempio n. 3
0
        public static IEnumerable <TResult> ToObjectCollection <TResult, TResource>(this JsonApiCollectionDocument document) where TResource : JsonApiResource
        {
            var primaryResourceObjects = document.Data;

            if (primaryResourceObjects == null)
            {
                throw new Exception("Json document contains no data.");
            }
            return(primaryResourceObjects.Select(r => r.ToObject <TResult, TResource>()).ToList());
        }
Esempio n. 4
0
        public void JsonApiCollectionDocument_DataArray()
        {
            var    data            = GetSomeData();
            var    testApiDocument = new JsonApiCollectionDocument <Firma>(data);
            string jsonString      = JsonConvert.SerializeObject(testApiDocument, Formatting.Indented);

            var result = JsonConvert.DeserializeObject <JsonApiCollectionDocument <Firma> >(jsonString);

            Assert.IsNotNull(result);
            var deserialzedModel = result.ToObject();

            Assert.IsNotNull(deserialzedModel);
            Assert.AreEqual(deserialzedModel.Count(), data.Count());
        }
Esempio n. 5
0
        public void TestMethod1()
        {
            var modelIdNull    = new arr();
            var modelIdNotNull = new arr {
                Id = 112314, MyProperty = "muh"
            };
            var docIdNull    = new JsonApiCollectionDocument <arr>(modelIdNull);
            var docIdNotNull = new JsonApiCollectionDocument <arr>(modelIdNotNull);

            var jsonIdNull    = JsonConvert.SerializeObject(docIdNull);
            var jsonIdNotNull = JsonConvert.SerializeObject(docIdNotNull);

            var resultIdNull    = JsonConvert.DeserializeObject <arr>(jsonIdNull);
            var resultIdNotNull = JsonConvert.DeserializeObject <arr>(jsonIdNotNull);
        }
Esempio n. 6
0
        /// <summary>
        /// Extracts apiResource to an <see cref="IEnumerable{T}"/> of type targetType.
        /// </summary>
        /// <param name="document"></param>
        /// <param name="apiResource"></param>
        /// <param name="targetType"></param>
        /// <returns></returns>
        internal static object ToObjectInternal(this JsonApiCollectionDocument document, JsonApiResource apiResource, Type targetType)
        {
            if (targetType.IsNonStringEnumerable())
            {
                throw new Exception("Do not use a collection as target type!");
            }
            var primaryResourceObjects = document.Data;

            if (primaryResourceObjects == null)
            {
                throw new Exception("Json document contains no data.");
            }

            var method = typeof(JsonApiCollectionDocumentExtensions).GetMethod(nameof(Cast), BindingFlags.Static | BindingFlags.NonPublic)?.MakeGenericMethod(targetType);

            return(method.Invoke(null, new object[] { primaryResourceObjects, apiResource }));
        }
Esempio n. 7
0
        public void JsonApiCollectionDocument_TestIncludeToMany()
        {
            //var model = GetSomeData().FirstOrDefault();
            var model = new Firma
            {
                Id         = Guid.NewGuid().ToString(),
                FirmenName = "bitbird",
                FahrZeuge  = new List <Fahrzeug> {
                    new Fahrzeug {
                        Id = Guid.NewGuid().ToString(), Kilometerstand = 4000
                    }, new Fahrzeug {
                        Id = Guid.NewGuid().ToString(), Kilometerstand = 10000
                    }
                },
                Fahrer = new Fahrer {
                    Id = Guid.NewGuid().ToString(), Name = "Christian", Keys = new List <string> {
                        "key0", "key1", "key2"
                    }
                }
            };
            var testApiDocument = new JsonApiCollectionDocument <Firma>(model, new List <PropertyInfo>
            {
                model.GetType().GetProperty(nameof(model.Fahrer)), model.GetType().GetProperty(nameof(model.FahrZeuge))
            });
            JsonSerializerSettings settings = new JsonSerializerSettings()
            {
                Formatting = Formatting.Indented
            };
            string jsonString = JsonConvert.SerializeObject(testApiDocument, settings);

            System.Diagnostics.Debug.WriteLine(jsonString);

            var result = JsonConvert.DeserializeObject <JsonApiCollectionDocument <Firma> >(jsonString, settings);

            var deserialzedModel = result.ToObject()?.FirstOrDefault();

            Assert.IsNotNull(deserialzedModel);

            Assert.AreEqual(deserialzedModel.FahrZeuge.Count(), model.FahrZeuge.Count());

            Assert.AreEqual(deserialzedModel.FahrZeuge.First().Id, model.FahrZeuge.First().Id);
        }
Esempio n. 8
0
        public void JsonApiCollectionDocument_TestNestedIncludes()
        {
            // A has a reference to B
            // B has a reference to C
            // B AND C ARE INCLUDED
            var data = new ClassA
            {
                Id         = Guid.NewGuid().ToString(),
                AName      = "A",
                BReference = new ClassB
                {
                    Id         = Guid.NewGuid().ToString(),
                    BName      = "B",
                    CReference = new ClassC
                    {
                        Id    = Guid.NewGuid().ToString(),
                        CName = "C"
                    }
                }
            };

            var doc = new JsonApiCollectionDocument <ClassA>(data);

            doc.Included = new JsonApiResourceObjectDictionary();
            doc.Included.AddResource(new JsonApiResourceObject().FromObject(data.BReference));
            doc.Included.AddResource(new JsonApiResourceObject().FromObject(data.BReference.CReference));
            string jsonString           = JsonConvert.SerializeObject(doc, Formatting.Indented);
            var    deserializedDocument = JsonConvert.DeserializeObject <JsonApiCollectionDocument <ClassA> >(jsonString);

            var aResource = deserializedDocument.Data.FirstOrDefault();

            Assert.IsNotNull(aResource);

            var aObject = aResource.ToObject <ClassA>();

            Assert.IsNotNull(aObject);
            aObject.BReference = deserializedDocument.Included.GetResource(aObject.BReference.Id, aObject.BReference.GetJsonApiClassName()).ToObject <ClassB>();
            Assert.IsTrue(aObject.BReference.BName == data.BReference.BName);
            aObject.BReference.CReference = deserializedDocument.Included.GetResource(aObject.BReference.CReference.Id, aObject.BReference.CReference.GetJsonApiClassName()).ToObject <ClassC>();
            Assert.IsTrue(aObject.BReference.CReference.CName == data.BReference.CReference.CName);
        }
Esempio n. 9
0
        public void JsonApiCollectionDocument_TestRelationshipIdentifiers()
        {
            var model           = GetSomeData().FirstOrDefault();
            var testApiDocument = new JsonApiCollectionDocument <Firma>(model);
            var settings        = new JsonSerializerSettings
            {
                Formatting = Formatting.Indented
            };
            var jsonString       = JsonConvert.SerializeObject(testApiDocument, settings);
            var result           = JsonConvert.DeserializeObject <JsonApiCollectionDocument <Firma> >(jsonString, settings);
            var deserialzedModel = result.ToObject()?.FirstOrDefault();

            Console.WriteLine($"{nameof(model           )}{Environment.NewLine}{JToken.Parse(JsonConvert.SerializeObject(model           ))}{Environment.NewLine}");
            Console.WriteLine($"{nameof(testApiDocument )}{Environment.NewLine}{JToken.Parse(JsonConvert.SerializeObject(testApiDocument ))}{Environment.NewLine}");
            Console.WriteLine($"{nameof(jsonString      )}{Environment.NewLine}{JToken.Parse(JsonConvert.SerializeObject(jsonString      ))}{Environment.NewLine}");
            Console.WriteLine($"{nameof(result          )}{Environment.NewLine}{JToken.Parse(JsonConvert.SerializeObject(result          ))}{Environment.NewLine}");
            Console.WriteLine($"{nameof(deserialzedModel)}{Environment.NewLine}{JToken.Parse(JsonConvert.SerializeObject(deserialzedModel))}{Environment.NewLine}");

            Assert.IsNotNull(deserialzedModel);
            Assert.AreEqual(deserialzedModel.Fahrer.Id, model?.Fahrer.Id);
            Assert.AreEqual(deserialzedModel.FahrZeuge.Count(), model?.FahrZeuge.Count());
        }
Esempio n. 10
0
        public void JsonApiCollectionDocument_TestPrimitveArray()
        {
            var list = new List <string> {
                "data1", "data2", "data3"
            };
            var data = new Fahrer {
                Id = "123", Name = "hansi", Keys = list
            };
            var    testApiDocument = new JsonApiCollectionDocument <Fahrer>(data);
            string jsonString      = JsonConvert.SerializeObject(testApiDocument);

            var result = JsonConvert.DeserializeObject <JsonApiCollectionDocument <Fahrer> >(jsonString);

            Assert.IsNotNull(result);
            var deserialzedModel = result.ToObject()?.FirstOrDefault();

            Assert.IsNotNull(deserialzedModel);
            Assert.AreEqual(list.Count, deserialzedModel.Keys.Count());
            for (int i = 0; i < list.Count; i++)
            {
                Assert.AreEqual(list[i], deserialzedModel.Keys.ElementAt(i));
            }
        }
Esempio n. 11
0
        public void JsonApiCollectionDocument_TestSelfLinks()
        {
            // create test data
            var model = GetSomeData();

            // setup Query url
            Uri queryUri = (new UriBuilder {
                Host = "localhost", Path = "api/firma"
            }).Uri;

            // create JsonDocument
            var jsonDocument = new JsonApiCollectionDocument <Firma>(model, new List <PropertyInfo> {
                typeof(Firma).GetProperty(nameof(Firma.Fahrer))
            }, queryUri);

            jsonDocument.Links.Related = new JsonApiLink("test", 1);
            var jsonString = JsonConvert.SerializeObject(jsonDocument, Formatting.Indented);
            var result     = JsonConvert.DeserializeObject <JsonApiCollectionDocument <Firma> >(jsonString);

            Assert.IsNotNull(result);
            var deserialzedModel = result.ToObject();

            Assert.IsNotNull(deserialzedModel);
        }
Esempio n. 12
0
        public void JsonApiCollectionDocument_TestInclude()
        {
            var model           = GetSomeData().FirstOrDefault();
            var testApiDocument = new JsonApiCollectionDocument <Firma>(model, new List <PropertyInfo> {
                model.GetType().GetProperty(nameof(model.Fahrer))
            });
            JsonSerializerSettings settings = new JsonSerializerSettings()
            {
                Formatting = Formatting.Indented
            };
            string jsonString = JsonConvert.SerializeObject(testApiDocument, settings);

            System.Diagnostics.Debug.WriteLine(jsonString);

            var result = JsonConvert.DeserializeObject <JsonApiCollectionDocument <Firma> >(jsonString, settings);

            var deserializedModel = result.ToObject()?.FirstOrDefault();

            Assert.IsNotNull(deserializedModel);

            Assert.AreEqual(deserializedModel.Fahrer.Name, model.Fahrer.Name);

            Assert.AreEqual(deserializedModel.Fahrer.Keys.Count(), model.Fahrer.Keys.Count());
        }
Esempio n. 13
0
 public static object GetIncludedResource(this JsonApiCollectionDocument document, object id, Type type, JsonApiResource apiResource)
 {
     return(document.Included?.GetResource(id, apiResource)?.ToObject(apiResource, type));
 }
Esempio n. 14
0
 public static TResult GetIncludedResource <TResult>(this JsonApiCollectionDocument document, object id, JsonApiResource apiResource) where TResult : class
 {
     return((TResult)document.GetIncludedResource(id, typeof(TResult), apiResource));
 }
Esempio n. 15
0
 public static TResult GetIncludedResource <TResult, TResultApiResource>(this JsonApiCollectionDocument document, object id) where TResultApiResource : JsonApiResource where TResult : class
 {
     return((TResult)document.GetIncludedResource(id, typeof(TResult), Activator.CreateInstance <TResultApiResource>()));
 }
Esempio n. 16
0
 internal static object ToObjectInternal(this JsonApiCollectionDocument document, JsonApiResource apiResource, Type targetType, out Func <int, string, bool> foundAttributes)
 {
     foundAttributes = (idx, attrName) => (document.Data.ElementAt(idx)?.Attributes?.ContainsKey(attrName.ToJsonAttributeName()) ?? false) || (document.Data.ElementAt(idx)?.Relationships?.ContainsKey(attrName.ToRelationshipName(apiResource.GetType())) ?? false);
     return(document.ToObjectInternal(apiResource, targetType));
 }
Esempio n. 17
0
        public static IEnumerable <TResult> ToObjectCollection <TResult, TResource>(this JsonApiCollectionDocument document, TResource resource, out Func <int, string, bool> foundAttributes) where TResource : JsonApiResource
        {
            foundAttributes = (idx, attrName) => (document.Data.ElementAt(idx)?.Attributes?.ContainsKey(attrName.ToJsonAttributeName()) ?? false) || (document.Data.ElementAt(idx)?.Relationships?.ContainsKey(attrName.ToRelationshipName <TResource>()) ?? false);

            return(document.ToObjectCollection <TResult, TResource>(resource));
        }
Esempio n. 18
0
        private async Task WriteJsonOutputAsync(
            [NotNull] HttpResponse context,
            [NotNull] Encoding selectedEncoding,
            [CanBeNull] object modelData,
            [NotNull] Type modelDataType,
            [NotNull] JsonApiResource modelResource,
            [CanBeNull] QueryInfo queryInfo)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (selectedEncoding == null)
            {
                throw new ArgumentNullException(nameof(selectedEncoding));
            }
            if (modelDataType == null)
            {
                throw new ArgumentNullException(nameof(modelDataType));
            }
            if (modelResource == null)
            {
                throw new ArgumentNullException(nameof(modelResource));
            }

            var meta = new JsonApiMetaData();

            if (modelData is IQueryResult queryResult)
            {
                meta.PageCount   = queryResult.PageCount;
                meta.RecordCount = queryResult.RecordCount;
                modelData        = queryResult.Data;
            }

            IJsonApiDocument document;

            if (modelData is IEnumerable collectionValue)
            {
                var apiCollectionDocument = new JsonApiCollectionDocument();
                apiCollectionDocument.FromApiResource(collectionValue, modelResource);
                document = apiCollectionDocument;
            }
            else
            {
                var apiDocument = new JsonApiDocument();
                apiDocument.FromApiResource(modelData, modelResource);
                document = apiDocument;
            }

            document.Meta = meta;

            if (queryInfo?.Includes != null)
            {
                foreach (var include in queryInfo.Includes)
                {
                    document.IncludeRelation(modelResource, modelData, include);
                }
            }

            var serializer = JsonSerializer.Create(JsonSerializerSettings);

            using (var streamWriter = new StreamWriter(context.Body, selectedEncoding))
            {
                serializer.Serialize(streamWriter, document, document.GetType());
                await streamWriter.FlushAsync();
            }
        }
        /// <inheritdoc/>
        protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var result = await base.SendAsync(request, cancellationToken);

            if (!(request.Properties.TryGetValue(nameof(JsonApiAttribute.ReturnResourceGetter), out var resourceUntyped) && resourceUntyped is JsonApiResource resource))
            {
                return(result);
            }

            if (!result.IsSuccessStatusCode)
            {
                return(result);
            }

            if (!(result.Content is ObjectContent objectContent))
            {
                return(result);
            }

            var meta = new JsonApiMetaData();

            BenchmarkCollection benchmarks = null;

            if (request.Properties.TryGetValue(nameof(BenchmarkCollection), out var benchmarksObj) &&
                benchmarksObj is BenchmarkCollection foundBenchmarks)
            {
                benchmarks = foundBenchmarks;
            }

            try
            {
                Func <string> serializeDocument;

                using (benchmarks.CreateBenchmark("ConvertToJsonApiDoc"))
                {
                    string overridePrimaryType = null;

                    var value = objectContent.Value;
                    if (value is IJsonApiOverridePrimaryType jsonApiOverridePrimaryType)
                    {
                        value = jsonApiOverridePrimaryType.Data;
                        overridePrimaryType = jsonApiOverridePrimaryType.Type;
                    }
                    if (value is IQueryResult queryResult)
                    {
                        meta.PageCount   = queryResult.PageCount;
                        meta.RecordCount = queryResult.RecordCount;
                        value            = queryResult.Data;
                    }

                    IJsonApiDocument document;
                    if (value is IEnumerable collectionValue)
                    {
                        var apiCollectionDocument = new JsonApiCollectionDocument();
                        apiCollectionDocument.FromApiResource(collectionValue, resource);
                        if (overridePrimaryType != null)
                        {
                            foreach (var primaryDataEntry in apiCollectionDocument.Data)
                            {
                                primaryDataEntry.Type = overridePrimaryType;
                            }
                        }
                        document          = apiCollectionDocument;
                        serializeDocument = () => JsonConvert.SerializeObject(apiCollectionDocument, Config.Formatter.SerializerSettings);
                    }
                    else
                    {
                        var apiDocument = new JsonApiDocument();
                        apiDocument.FromApiResource(value, resource);
                        if (overridePrimaryType != null)
                        {
                            apiDocument.Data.Type = overridePrimaryType;
                        }
                        document          = apiDocument;
                        serializeDocument = () => JsonConvert.SerializeObject(apiDocument, Config.Formatter.SerializerSettings);
                    }

                    if (request.Properties.TryGetValue(nameof(QueryInfo), out var queryInfoUntyped) && queryInfoUntyped is QueryInfo queryInfo && queryInfo.Includes != null)
                    {
                        foreach (var include in queryInfo.Includes)
                        {
                            document.IncludeRelation(resource, value, include);
                        }
                    }

                    document.Meta = meta;
                }

                meta.Benchmarks = benchmarks?.Benchmarks?.Select(b => $"{b.Name}:{b.Duration}");
#if DEBUG
                var benchmarkSerialization = new BenchmarkCollection();
                using (benchmarkSerialization.CreateBenchmark("Serialization"))
                {
#endif
                result.Content = new StringContent(serializeDocument(), Encoding.UTF8, "application/vnd.api+json");
#if DEBUG
            }
            foreach (var benchmark in benchmarkSerialization.Benchmarks)
            {
                Debug.WriteLine($"{benchmark.Name} took {benchmark.Duration} ms");
            }
#endif

                return(result);
            }
            catch (Exception e)
            {
                return(e.ToJsonApiErrorResponseMessage());
            }
        }