@@ -82,59 +82,85 @@ public Task<BsonDocument> AddAlternateKeyNameAsync(Guid id, string alternateKeyN
8282 /// <summary>
8383 /// Create encrypted collection.
8484 /// </summary>
85- /// <param name="collectionNamespace">The collection namespace.</param>
85+ /// <param name="database">The database.</param>
86+ /// <param name="collectionName">The collection name.</param>
8687 /// <param name="createCollectionOptions">The create collection options.</param>
8788 /// <param name="kmsProvider">The kms provider.</param>
8889 /// <param name="dataKeyOptions">The datakey options.</param>
8990 /// <param name="cancellationToken">The cancellation token.</param>
91+ /// <returns>The operation result.</returns>
9092 /// <remarks>
9193 /// if EncryptionFields contains a keyId with a null value, a data key will be automatically generated and assigned to keyId value.
9294 /// </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 )
9496 {
95- Ensure . IsNotNull ( collectionNamespace , nameof ( collectionNamespace ) ) ;
97+ Ensure . IsNotNull ( database , nameof ( database ) ) ;
98+ Ensure . IsNotNull ( collectionName , nameof ( collectionName ) ) ;
9699 Ensure . IsNotNull ( createCollectionOptions , nameof ( createCollectionOptions ) ) ;
97100 Ensure . IsNotNull ( dataKeyOptions , nameof ( dataKeyOptions ) ) ;
98101 Ensure . IsNotNull ( kmsProvider , nameof ( kmsProvider ) ) ;
99102
100- foreach ( var fieldDocument in EncryptedCollectionHelper . IterateEmptyKeyIds ( collectionNamespace , createCollectionOptions . EncryptedFields ) )
103+ var encryptedFields = createCollectionOptions . EncryptedFields ? . DeepClone ( ) ? . AsBsonDocument ;
104+ try
101105 {
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 ) ;
104119 }
105120
106- var database = _libMongoCryptController . KeyVaultClient . GetDatabase ( collectionNamespace . DatabaseNamespace . DatabaseName ) ;
107-
108- database . CreateCollection ( collectionNamespace . CollectionName , createCollectionOptions , cancellationToken ) ;
121+ return new CreateEncryptedCollectionResult ( encryptedFields ) ;
109122 }
110123
111124 /// <summary>
112125 /// Create encrypted collection.
113126 /// </summary>
114- /// <param name="collectionNamespace">The collection namespace.</param>
127+ /// <param name="database">The database.</param>
128+ /// <param name="collectionName">The collection name.</param>
115129 /// <param name="createCollectionOptions">The create collection options.</param>
116130 /// <param name="kmsProvider">The kms provider.</param>
117131 /// <param name="dataKeyOptions">The datakey options.</param>
118132 /// <param name="cancellationToken">The cancellation token.</param>
133+ /// <returns>The operation result.</returns>
119134 /// <remarks>
120135 /// if EncryptionFields contains a keyId with a null value, a data key will be automatically generated and assigned to keyId value.
121136 /// </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 )
123138 {
124- Ensure . IsNotNull ( collectionNamespace , nameof ( collectionNamespace ) ) ;
139+ Ensure . IsNotNull ( database , nameof ( database ) ) ;
140+ Ensure . IsNotNull ( collectionName , nameof ( collectionName ) ) ;
125141 Ensure . IsNotNull ( createCollectionOptions , nameof ( createCollectionOptions ) ) ;
126142 Ensure . IsNotNull ( dataKeyOptions , nameof ( dataKeyOptions ) ) ;
127143 Ensure . IsNotNull ( kmsProvider , nameof ( kmsProvider ) ) ;
128144
129- foreach ( var fieldDocument in EncryptedCollectionHelper . IterateEmptyKeyIds ( collectionNamespace , createCollectionOptions . EncryptedFields ) )
145+ var encryptedFields = createCollectionOptions . EncryptedFields ? . DeepClone ( ) ? . AsBsonDocument ;
146+ try
130147 {
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 ) ;
133161 }
134162
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 ) ;
138164 }
139165
140166 /// <summary>
0 commit comments