Skip to content

CSHARP-5453: Add builder for CSFLE schemas #1631

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 39 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
db1dea7
CSHARP-5453: Improve field encryption usability with attributes/API
papafe Mar 7, 2025
cee7a93
Small corrections
papafe Mar 7, 2025
7d1c109
Fixed stub
papafe Mar 11, 2025
87b1c2f
Small fix
papafe Mar 11, 2025
ee898d3
Various improvements
papafe Mar 12, 2025
a3a06a7
Conversion to records
papafe Mar 12, 2025
e599cc0
Various improvements
papafe Mar 12, 2025
400b8b0
Fixed API
papafe Mar 12, 2025
0a32d51
Small comment
papafe Mar 12, 2025
c3bfde4
Fix to naming
papafe Mar 13, 2025
dd1aeaf
Several improvements
papafe Mar 19, 2025
f21b87a
Removed unused
papafe Mar 19, 2025
f88465c
First improvement
papafe Mar 20, 2025
33fcbeb
Removed old things
papafe Apr 9, 2025
6a265c2
Improvements
papafe Apr 14, 2025
c37c6bb
Some simplifications
papafe Apr 14, 2025
6f1b2a3
Simplified
papafe Apr 14, 2025
4942f97
Improved API
papafe Apr 14, 2025
93f46f9
Small fix
papafe Apr 14, 2025
670c663
Fixing schema builder
papafe Apr 30, 2025
517db94
Various improvements plus fixed tests
papafe May 1, 2025
8f10903
Small fix
papafe May 1, 2025
ef5faa9
Added first basic test
papafe May 2, 2025
601169e
Corrections plus more tests
papafe May 2, 2025
4ddfdf8
Corrected order
papafe May 2, 2025
f31c705
Improved tests
papafe May 2, 2025
0069760
Added exceptions and improved testing
papafe May 5, 2025
bd88e8b
Moved builder to encryption project and removed CsfleEncryptionEnum (…
papafe May 5, 2025
20379df
Put bsontypes to be nullable and removed unsupported bsonTypes
papafe May 5, 2025
a8390d3
Corrected test naming
papafe May 5, 2025
d30739d
Fixed API for overloads
papafe May 5, 2025
fa3143c
Added exception for empty schema
papafe May 5, 2025
134622e
Added docs
papafe May 5, 2025
6098c29
Small fix
papafe May 5, 2025
7a4f46a
Fix
papafe May 5, 2025
a25ad56
Removed unnecessary
papafe May 5, 2025
84ddfbd
Name fix
papafe May 5, 2025
eca0ace
Removed unnecessaty
papafe May 5, 2025
b6ef4d2
Added common method BsonType --> string and removed unnecessary files.
papafe Jun 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Small fix
  • Loading branch information
papafe committed May 5, 2025
commit 93f46f979f0ee60e9a7cd2220e5e280ae99e2800
61 changes: 48 additions & 13 deletions src/MongoDB.Driver/Encryption/CsfleSchemaBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ internal override BsonDocument Build(RenderArgs<TDocument> args)
/// <summary>
///
/// </summary>
public abstract class SubdocumentPropertyBuilder<TDocument>
public abstract class NestedPropertyBuilderBase<TDocument>
{
internal abstract BsonDocument Build(RenderArgs<TDocument> args);
}
Expand All @@ -263,7 +263,7 @@ public abstract class SubdocumentPropertyBuilder<TDocument>
/// </summary>
/// <typeparam name="TDocument"></typeparam>
/// <typeparam name="TField"></typeparam>
public class NestedPropertyBuilder<TDocument, TField> : SubdocumentPropertyBuilder<TDocument>
public class NestedPropertyBuilder<TDocument, TField> : NestedPropertyBuilderBase<TDocument>
{
private readonly FieldDefinition<TDocument> _path;
private readonly Action<TypedBuilder<TField>> _configure;
Expand All @@ -287,12 +287,20 @@ internal override BsonDocument Build(RenderArgs<TDocument> args)
}
}

/// <summary>
///
/// </summary>
public abstract class NestedPatternPropertyBuilderBase<TDocument>
{
internal abstract BsonDocument Build(RenderArgs<TDocument> args);
}

/// <summary>
///
/// </summary>
/// <typeparam name="TDocument"></typeparam>
/// <typeparam name="TField"></typeparam>
public class NestedPatternPropertyBuilder<TDocument, TField> : SubdocumentPropertyBuilder<TDocument>
public class NestedPatternPropertyBuilder<TDocument, TField> : NestedPatternPropertyBuilderBase<TDocument>
{
private readonly FieldDefinition<TDocument> _path;
private readonly Action<TypedBuilder<TField>> _configure;
Expand Down Expand Up @@ -330,7 +338,8 @@ public abstract class TypedBuilder
/// <typeparam name="TDocument"></typeparam>
public class TypedBuilder<TDocument> : TypedBuilder
{
private readonly List<SubdocumentPropertyBuilder<TDocument>> _subdocumentProperties = [];
private readonly List<NestedPropertyBuilderBase<TDocument>> _nestedProperties = [];
private readonly List<NestedPatternPropertyBuilderBase<TDocument>> _nestedPatternProperties = [];
private readonly List<PropertyBuilder<TDocument>> _properties = [];
private readonly List<PatternPropertyBuilder<TDocument>> _patternProperties = [];
private EncryptMetadataBuilder _metadata;
Expand Down Expand Up @@ -388,7 +397,7 @@ public PatternPropertyBuilder<TDocument> PatternProperty(string pattern)
public NestedPropertyBuilder<TDocument, TField> NestedProperty<TField>(FieldDefinition<TDocument> path, Action<TypedBuilder<TField>> configure)
{
var nestedProperty = new NestedPropertyBuilder<TDocument,TField>(path, configure);
_subdocumentProperties.Add(nestedProperty);
_nestedProperties.Add(nestedProperty);
return nestedProperty;
}

Expand All @@ -412,7 +421,7 @@ public NestedPropertyBuilder<TDocument, TField> NestedProperty<TField>(Expressio
public NestedPatternPropertyBuilder<TDocument, TField> NestedPatternProperty<TField>(string pattern, Action<TypedBuilder<TField>> configure)
{
var nestedProperty = new NestedPatternPropertyBuilder<TDocument,TField>(pattern, configure);
_subdocumentProperties.Add(nestedProperty);
_nestedPatternProperties.Add(nestedProperty);
return nestedProperty;
}

Expand All @@ -429,24 +438,45 @@ internal override BsonDocument Build()


BsonDocument properties = null;
BsonDocument patternProperties = null;

if (_subdocumentProperties.Any())
if (_properties.Any())
{
properties = new BsonDocument();
properties ??= new BsonDocument();

foreach (var nestedProperty in _subdocumentProperties)
foreach (var property in _properties)
{
properties.Merge(nestedProperty.Build(args));
properties.Merge(property.Build(args));
}
}

if (_properties.Any())
if (_nestedProperties.Any())
{
properties ??= new BsonDocument();

foreach (var property in _properties)
foreach (var nestedProperty in _nestedProperties)
{
properties.Merge(property.Build(args));
properties.Merge(nestedProperty.Build(args));
}
}

if (_patternProperties.Any())
{
patternProperties ??= new BsonDocument();

foreach (var patternProperty in _patternProperties)
{
patternProperties.Merge(patternProperty.Build(args));
}
}

if (_nestedPatternProperties.Any())
{
patternProperties ??= new BsonDocument();

foreach (var nestedPatternProperty in _nestedPatternProperties)
{
patternProperties.Merge(nestedPatternProperty.Build(args));
}
}

Expand All @@ -455,6 +485,11 @@ internal override BsonDocument Build()
schema.Add("properties", properties);
}

if (patternProperties != null)
{
schema.Add("patternProperties", patternProperties);
}

return schema;
}
}
Expand Down