Skip to content

Commit 8a2477f

Browse files
author
Chris Santero
committed
add attribute to allow not serializing a relationship
1 parent 9768449 commit 8a2477f

7 files changed

Lines changed: 60 additions & 10 deletions
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System;
2+
3+
namespace JSONAPI.Attributes
4+
{
5+
/// <summary>
6+
/// This attribute should be added to a property to override DefaultLinkConventions's default
7+
/// behavior for serializing links.
8+
/// </summary>
9+
[AttributeUsage(AttributeTargets.Property)]
10+
public class LinkSettingsAttribute : Attribute
11+
{
12+
internal bool SerializeRelationshipLink;
13+
14+
internal bool SerializeRelatedResourceLink;
15+
16+
/// <summary>
17+
/// Creates a new LinkSettingsAttribute.
18+
/// </summary>
19+
public LinkSettingsAttribute(bool serializeRelationshipLink = true, bool serializeRelatedResourceLink = true)
20+
{
21+
SerializeRelationshipLink = serializeRelationshipLink;
22+
SerializeRelatedResourceLink = serializeRelatedResourceLink;
23+
}
24+
}
25+
}

JSONAPI/Core/ResourceTypeRegistrar.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.Linq.Expressions;
55
using System.Reflection;
66
using JSONAPI.Attributes;
7-
using JSONAPI.Configuration;
87
using JSONAPI.Extensions;
98
using Newtonsoft.Json;
109

@@ -165,17 +164,23 @@ protected virtual ResourceTypeField CreateResourceTypeField(PropertyInfo prop)
165164
}
166165

167166
var selfLinkTemplateAttribute = prop.GetCustomAttributes().OfType<RelationshipLinkTemplate>().FirstOrDefault();
168-
var selfLinkTemplate = selfLinkTemplateAttribute == null ? null : selfLinkTemplateAttribute.TemplateString;
167+
var selfLinkTemplate = selfLinkTemplateAttribute?.TemplateString;
169168
var relatedResourceLinkTemplateAttribute = prop.GetCustomAttributes().OfType<RelatedResourceLinkTemplate>().FirstOrDefault();
170-
var relatedResourceLinkTemplate = relatedResourceLinkTemplateAttribute == null ? null : relatedResourceLinkTemplateAttribute.TemplateString;
169+
var relatedResourceLinkTemplate = relatedResourceLinkTemplateAttribute?.TemplateString;
171170

172171
var isToMany =
173172
type.IsArray ||
174173
(type.GetInterfaces().Contains(typeof(System.Collections.IEnumerable)) && type.IsGenericType);
175174

176-
if (!isToMany) return new ToOneResourceTypeRelationship(prop, jsonKey, type, selfLinkTemplate, relatedResourceLinkTemplate);
175+
var linkSettingsAttribute = prop.GetCustomAttributes().OfType<LinkSettingsAttribute>().FirstOrDefault();
176+
var serializeRelationshipLink = linkSettingsAttribute == null || linkSettingsAttribute.SerializeRelationshipLink;
177+
var serializeRelatedResourceLink = linkSettingsAttribute == null || linkSettingsAttribute.SerializeRelatedResourceLink;
178+
179+
if (!isToMany) return new ToOneResourceTypeRelationship(prop, jsonKey, type, selfLinkTemplate, relatedResourceLinkTemplate,
180+
serializeRelationshipLink, serializeRelatedResourceLink);
177181
var relatedType = type.IsGenericType ? type.GetGenericArguments()[0] : type.GetElementType();
178-
return new ToManyResourceTypeRelationship(prop, jsonKey, relatedType, selfLinkTemplate, relatedResourceLinkTemplate);
182+
return new ToManyResourceTypeRelationship(prop, jsonKey, relatedType, selfLinkTemplate, relatedResourceLinkTemplate,
183+
serializeRelationshipLink, serializeRelatedResourceLink);
179184
}
180185

181186
/// <summary>

JSONAPI/Core/ResourceTypeRelationship.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ namespace JSONAPI.Core
99
public abstract class ResourceTypeRelationship : ResourceTypeField
1010
{
1111
internal ResourceTypeRelationship(PropertyInfo property, string jsonKey, Type relatedType,
12-
string selfLinkTemplate, string relatedResourceLinkTemplate, bool isToMany)
12+
string selfLinkTemplate, string relatedResourceLinkTemplate, bool isToMany,
13+
bool serializeRelationshipLink = true, bool serializeRelatedResourceLink = true)
1314
: base(property, jsonKey)
1415
{
1516
RelatedType = relatedType;
1617
SelfLinkTemplate = selfLinkTemplate;
1718
RelatedResourceLinkTemplate = relatedResourceLinkTemplate;
1819
IsToMany = isToMany;
20+
SerializeRelationshipLink = serializeRelationshipLink;
21+
SerializeRelatedResourceLink = serializeRelatedResourceLink;
1922
}
2023

2124
/// <summary>
@@ -41,5 +44,17 @@ internal ResourceTypeRelationship(PropertyInfo property, string jsonKey, Type re
4144
/// relationship belongs to.
4245
/// </summary>
4346
public string RelatedResourceLinkTemplate { get; private set; }
47+
48+
/// <summary>
49+
/// Whether to include a link to the relationship URL when serializing relationship objects for
50+
/// this relationship
51+
/// </summary>
52+
public bool SerializeRelationshipLink { get; private set; }
53+
54+
/// <summary>
55+
/// Whether to include a link to the related resource URL when serializing relationship objects for
56+
/// this relationship
57+
/// </summary>
58+
public bool SerializeRelatedResourceLink { get; private set; }
4459
}
4560
}

JSONAPI/Core/ToManyResourceTypeRelationship.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ namespace JSONAPI.Core
99
public sealed class ToManyResourceTypeRelationship : ResourceTypeRelationship
1010
{
1111
internal ToManyResourceTypeRelationship(PropertyInfo property, string jsonKey, Type relatedType,
12-
string selfLinkTemplate, string relatedResourceLinkTemplate)
13-
: base(property, jsonKey, relatedType, selfLinkTemplate, relatedResourceLinkTemplate, true)
12+
string selfLinkTemplate, string relatedResourceLinkTemplate, bool serializeRelationshipLink = true, bool serializeRelatedResourceLink = true)
13+
: base(property, jsonKey, relatedType, selfLinkTemplate, relatedResourceLinkTemplate, true, serializeRelationshipLink, serializeRelatedResourceLink)
1414
{
1515
}
1616
}

JSONAPI/Core/ToOneResourceTypeRelationship.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ namespace JSONAPI.Core
99
public sealed class ToOneResourceTypeRelationship : ResourceTypeRelationship
1010
{
1111
internal ToOneResourceTypeRelationship(PropertyInfo property, string jsonKey, Type relatedType,
12-
string selfLinkTemplate, string relatedResourceLinkTemplate)
13-
: base(property, jsonKey, relatedType, selfLinkTemplate, relatedResourceLinkTemplate, false)
12+
string selfLinkTemplate, string relatedResourceLinkTemplate, bool serializeRelationshipLink = true, bool serializeRelatedResourceLink = true)
13+
: base(property, jsonKey, relatedType, selfLinkTemplate, relatedResourceLinkTemplate, false, serializeRelationshipLink, serializeRelatedResourceLink)
1414
{
1515
}
1616
}

JSONAPI/Documents/DefaultLinkConventions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ public class DefaultLinkConventions : ILinkConventions
1010
{
1111
public ILink GetRelationshipLink<TResource>(TResource relationshipOwner, IResourceTypeRegistry resourceTypeRegistry, ResourceTypeRelationship property, string baseUrl)
1212
{
13+
if (!property.SerializeRelationshipLink) return null;
14+
1315
var url = BuildRelationshipUrl(relationshipOwner, resourceTypeRegistry, property, baseUrl);
1416
var metadata = GetMetadataForRelationshipLink(relationshipOwner, property);
1517
return new Link(url, metadata);
1618
}
1719

1820
public ILink GetRelatedResourceLink<TResource>(TResource relationshipOwner, IResourceTypeRegistry resourceTypeRegistry, ResourceTypeRelationship property, string baseUrl)
1921
{
22+
if (!property.SerializeRelatedResourceLink) return null;
23+
2024
var url = BuildRelatedResourceUrl(relationshipOwner, resourceTypeRegistry, property, baseUrl);
2125
var metadata = GetMetadataForRelatedResourceLink(relationshipOwner, property);
2226
return new Link(url, metadata);

JSONAPI/JSONAPI.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
<Reference Include="System.Xml" />
6868
</ItemGroup>
6969
<ItemGroup>
70+
<Compile Include="Attributes\LinkSettingsAttribute.cs" />
7071
<Compile Include="Configuration\IResourceTypeConfiguration.cs" />
7172
<Compile Include="Configuration\IResourceTypeConfigurator.cs" />
7273
<Compile Include="Configuration\IResourceTypeRelationshipConfiguration.cs" />

0 commit comments

Comments
 (0)