@@ -82,59 +82,85 @@ public Task<BsonDocument> AddAlternateKeyNameAsync(Guid id, string alternateKeyN
82
82
/// <summary>
83
83
/// Create encrypted collection.
84
84
/// </summary>
85
- /// <param name="collectionNamespace">The collection namespace.</param>
85
+ /// <param name="database">The database.</param>
86
+ /// <param name="collectionName">The collection name.</param>
86
87
/// <param name="createCollectionOptions">The create collection options.</param>
87
88
/// <param name="kmsProvider">The kms provider.</param>
88
89
/// <param name="dataKeyOptions">The datakey options.</param>
89
90
/// <param name="cancellationToken">The cancellation token.</param>
91
+ /// <returns>The operation result.</returns>
90
92
/// <remarks>
91
93
/// if EncryptionFields contains a keyId with a null value, a data key will be automatically generated and assigned to keyId value.
92
94
/// </remarks>
93
- public void CreateEncryptedCollection < TCollection > ( CollectionNamespace collectionNamespace , CreateCollectionOptions createCollectionOptions , string kmsProvider , DataKeyOptions dataKeyOptions , CancellationToken cancellationToken = default )
95
+ public CreateEncryptedCollectionResult CreateEncryptedCollection ( IMongoDatabase database , string collectionName , CreateCollectionOptions createCollectionOptions , string kmsProvider , DataKeyOptions dataKeyOptions , CancellationToken cancellationToken = default )
94
96
{
95
- Ensure . IsNotNull ( collectionNamespace , nameof ( collectionNamespace ) ) ;
97
+ Ensure . IsNotNull ( database , nameof ( database ) ) ;
98
+ Ensure . IsNotNull ( collectionName , nameof ( collectionName ) ) ;
96
99
Ensure . IsNotNull ( createCollectionOptions , nameof ( createCollectionOptions ) ) ;
97
100
Ensure . IsNotNull ( dataKeyOptions , nameof ( dataKeyOptions ) ) ;
98
101
Ensure . IsNotNull ( kmsProvider , nameof ( kmsProvider ) ) ;
99
102
100
- foreach ( var fieldDocument in EncryptedCollectionHelper . IterateEmptyKeyIds ( collectionNamespace , createCollectionOptions . EncryptedFields ) )
103
+ var encryptedFields = createCollectionOptions . EncryptedFields ? . DeepClone ( ) ? . AsBsonDocument ;
104
+ try
101
105
{
102
- var dataKey = CreateDataKey ( kmsProvider , dataKeyOptions , cancellationToken ) ;
103
- EncryptedCollectionHelper . ModifyEncryptedFields ( fieldDocument , dataKey ) ;
106
+ foreach ( var fieldDocument in EncryptedCollectionHelper . IterateEmptyKeyIds ( new CollectionNamespace ( database . DatabaseNamespace . DatabaseName , collectionName ) , encryptedFields ) )
107
+ {
108
+ var dataKey = CreateDataKey ( kmsProvider , dataKeyOptions , cancellationToken ) ;
109
+ EncryptedCollectionHelper . ModifyEncryptedFields ( fieldDocument , dataKey ) ;
110
+ }
111
+
112
+ var effectiveCreateEncryptionOptions = createCollectionOptions . Clone ( ) ;
113
+ effectiveCreateEncryptionOptions . EncryptedFields = encryptedFields ;
114
+ database . CreateCollection ( collectionName , effectiveCreateEncryptionOptions , cancellationToken ) ;
115
+ }
116
+ catch ( Exception ex )
117
+ {
118
+ throw new MongoEncryptionCreateCollectionException ( ex , encryptedFields ) ;
104
119
}
105
120
106
- var database = _libMongoCryptController . KeyVaultClient . GetDatabase ( collectionNamespace . DatabaseNamespace . DatabaseName ) ;
107
-
108
- database . CreateCollection ( collectionNamespace . CollectionName , createCollectionOptions , cancellationToken ) ;
121
+ return new CreateEncryptedCollectionResult ( encryptedFields ) ;
109
122
}
110
123
111
124
/// <summary>
112
125
/// Create encrypted collection.
113
126
/// </summary>
114
- /// <param name="collectionNamespace">The collection namespace.</param>
127
+ /// <param name="database">The database.</param>
128
+ /// <param name="collectionName">The collection name.</param>
115
129
/// <param name="createCollectionOptions">The create collection options.</param>
116
130
/// <param name="kmsProvider">The kms provider.</param>
117
131
/// <param name="dataKeyOptions">The datakey options.</param>
118
132
/// <param name="cancellationToken">The cancellation token.</param>
133
+ /// <returns>The operation result.</returns>
119
134
/// <remarks>
120
135
/// if EncryptionFields contains a keyId with a null value, a data key will be automatically generated and assigned to keyId value.
121
136
/// </remarks>
122
- public async Task CreateEncryptedCollectionAsync < TCollection > ( CollectionNamespace collectionNamespace , CreateCollectionOptions createCollectionOptions , string kmsProvider , DataKeyOptions dataKeyOptions , CancellationToken cancellationToken = default )
137
+ public async Task < CreateEncryptedCollectionResult > CreateEncryptedCollectionAsync ( IMongoDatabase database , string collectionName , CreateCollectionOptions createCollectionOptions , string kmsProvider , DataKeyOptions dataKeyOptions , CancellationToken cancellationToken = default )
123
138
{
124
- Ensure . IsNotNull ( collectionNamespace , nameof ( collectionNamespace ) ) ;
139
+ Ensure . IsNotNull ( database , nameof ( database ) ) ;
140
+ Ensure . IsNotNull ( collectionName , nameof ( collectionName ) ) ;
125
141
Ensure . IsNotNull ( createCollectionOptions , nameof ( createCollectionOptions ) ) ;
126
142
Ensure . IsNotNull ( dataKeyOptions , nameof ( dataKeyOptions ) ) ;
127
143
Ensure . IsNotNull ( kmsProvider , nameof ( kmsProvider ) ) ;
128
144
129
- foreach ( var fieldDocument in EncryptedCollectionHelper . IterateEmptyKeyIds ( collectionNamespace , createCollectionOptions . EncryptedFields ) )
145
+ var encryptedFields = createCollectionOptions . EncryptedFields ? . DeepClone ( ) ? . AsBsonDocument ;
146
+ try
130
147
{
131
- var dataKey = await CreateDataKeyAsync ( kmsProvider , dataKeyOptions , cancellationToken ) . ConfigureAwait ( false ) ;
132
- EncryptedCollectionHelper . ModifyEncryptedFields ( fieldDocument , dataKey ) ;
148
+ foreach ( var fieldDocument in EncryptedCollectionHelper . IterateEmptyKeyIds ( new CollectionNamespace ( database . DatabaseNamespace . DatabaseName , collectionName ) , encryptedFields ) )
149
+ {
150
+ var dataKey = await CreateDataKeyAsync ( kmsProvider , dataKeyOptions , cancellationToken ) . ConfigureAwait ( false ) ;
151
+ EncryptedCollectionHelper . ModifyEncryptedFields ( fieldDocument , dataKey ) ;
152
+ }
153
+
154
+ var effectiveCreateEncryptionOptions = createCollectionOptions . Clone ( ) ;
155
+ effectiveCreateEncryptionOptions . EncryptedFields = encryptedFields ;
156
+ await database . CreateCollectionAsync ( collectionName , effectiveCreateEncryptionOptions , cancellationToken ) . ConfigureAwait ( false ) ;
157
+ }
158
+ catch ( Exception ex )
159
+ {
160
+ throw new MongoEncryptionCreateCollectionException ( ex , encryptedFields ) ;
133
161
}
134
162
135
- var database = _libMongoCryptController . KeyVaultClient . GetDatabase ( collectionNamespace . DatabaseNamespace . DatabaseName ) ;
136
-
137
- await database . CreateCollectionAsync ( collectionNamespace . CollectionName , createCollectionOptions , cancellationToken ) . ConfigureAwait ( false ) ;
163
+ return new CreateEncryptedCollectionResult ( encryptedFields ) ;
138
164
}
139
165
140
166
/// <summary>
0 commit comments