11using System . ComponentModel . DataAnnotations ;
22using System . Reflection ;
3- using System . Text . Json ;
3+ using JsonApiDotNetCore . Configuration ;
44using JsonApiDotNetCore . OpenApi . JsonApiObjects ;
55using JsonApiDotNetCore . OpenApi . JsonApiObjects . Relationships ;
66using JsonApiDotNetCore . OpenApi . JsonApiObjects . ResourceObjects ;
@@ -23,24 +23,27 @@ internal sealed class ResourceFieldObjectSchemaBuilder
2323 private readonly ISchemaRepositoryAccessor _schemaRepositoryAccessor ;
2424 private readonly SchemaGenerator _defaultSchemaGenerator ;
2525 private readonly ResourceTypeSchemaGenerator _resourceTypeSchemaGenerator ;
26+ private readonly IJsonApiOptions _options ;
2627 private readonly SchemaRepository _resourceSchemaRepository = new ( ) ;
2728 private readonly NullableReferenceSchemaGenerator _nullableReferenceSchemaGenerator ;
2829 private readonly IDictionary < string , OpenApiSchema > _schemasForResourceFields ;
2930
3031 public ResourceFieldObjectSchemaBuilder ( ResourceTypeInfo resourceTypeInfo , ISchemaRepositoryAccessor schemaRepositoryAccessor ,
31- SchemaGenerator defaultSchemaGenerator , ResourceTypeSchemaGenerator resourceTypeSchemaGenerator , JsonNamingPolicy ? namingPolicy )
32+ SchemaGenerator defaultSchemaGenerator , ResourceTypeSchemaGenerator resourceTypeSchemaGenerator , IJsonApiOptions options )
3233 {
3334 ArgumentGuard . NotNull ( resourceTypeInfo , nameof ( resourceTypeInfo ) ) ;
3435 ArgumentGuard . NotNull ( schemaRepositoryAccessor , nameof ( schemaRepositoryAccessor ) ) ;
3536 ArgumentGuard . NotNull ( defaultSchemaGenerator , nameof ( defaultSchemaGenerator ) ) ;
3637 ArgumentGuard . NotNull ( resourceTypeSchemaGenerator , nameof ( resourceTypeSchemaGenerator ) ) ;
38+ ArgumentGuard . NotNull ( options , nameof ( options ) ) ;
3739
3840 _resourceTypeInfo = resourceTypeInfo ;
3941 _schemaRepositoryAccessor = schemaRepositoryAccessor ;
4042 _defaultSchemaGenerator = defaultSchemaGenerator ;
4143 _resourceTypeSchemaGenerator = resourceTypeSchemaGenerator ;
44+ _options = options ;
4245
43- _nullableReferenceSchemaGenerator = new NullableReferenceSchemaGenerator ( schemaRepositoryAccessor , namingPolicy ) ;
46+ _nullableReferenceSchemaGenerator = new NullableReferenceSchemaGenerator ( schemaRepositoryAccessor , options . SerializerOptions . PropertyNamingPolicy ) ;
4447 _schemasForResourceFields = GetFieldSchemas ( ) ;
4548 }
4649
@@ -113,7 +116,7 @@ private bool IsFieldRequired(ResourceFieldAttribute field)
113116
114117 return fieldTypeCategory switch
115118 {
116- TypeCategory . NonNullableReferenceType => true ,
119+ TypeCategory . NonNullableReferenceType => hasRequiredAttribute || _options . ValidateModelState ,
117120 TypeCategory . ValueType => hasRequiredAttribute ,
118121 TypeCategory . NullableReferenceType or TypeCategory . NullableValueType => hasRequiredAttribute ,
119122 _ => throw new UnreachableCodeException ( )
0 commit comments