@@ -11,13 +11,15 @@ namespace SimpleEventStore.AzureDocumentDb
1111 internal class AzureDocumentDbStorageEngine : IStorageEngine
1212 {
1313 private const string AppendStoredProcedureName = "appendToStream" ;
14+ private const string DeleteStoredProcedureName = "deleteStream" ;
1415 private const string ConcurrencyConflictErrorKey = "Concurrency conflict." ;
1516
1617 private readonly DocumentClient client ;
1718 private readonly string databaseName ;
1819 private readonly CollectionOptions collectionOptions ;
1920 private readonly Uri commitsLink ;
20- private readonly Uri storedProcLink ;
21+ private readonly Uri appendStoredProcedureLink ;
22+ private readonly Uri deleteStoredProcedureLink ;
2123 private readonly LoggingOptions loggingOptions ;
2224 private readonly ISerializationTypeMap typeMap ;
2325
@@ -27,7 +29,8 @@ internal AzureDocumentDbStorageEngine(DocumentClient client, string databaseName
2729 this . databaseName = databaseName ;
2830 this . collectionOptions = collectionOptions ;
2931 commitsLink = UriFactory . CreateDocumentCollectionUri ( databaseName , collectionOptions . CollectionName ) ;
30- storedProcLink = UriFactory . CreateStoredProcedureUri ( databaseName , collectionOptions . CollectionName , AppendStoredProcedureName ) ;
32+ appendStoredProcedureLink = UriFactory . CreateStoredProcedureUri ( databaseName , collectionOptions . CollectionName , AppendStoredProcedureName ) ;
33+ deleteStoredProcedureLink = UriFactory . CreateStoredProcedureUri ( databaseName , collectionOptions . CollectionName , DeleteStoredProcedureName ) ;
3134 this . loggingOptions = loggingOptions ;
3235 this . typeMap = typeMap ;
3336 }
@@ -36,7 +39,8 @@ public async Task<IStorageEngine> Initialise()
3639 {
3740 await CreateDatabaseIfItDoesNotExist ( ) ;
3841 await CreateCollectionIfItDoesNotExist ( ) ;
39- await CreateAppendStoredProcedureIfItDoesNotExist ( ) ;
42+ await CreateStoredProcedureIfItDoesNotExist ( AppendStoredProcedureName , "appendToStream.js" ) ;
43+ await CreateStoredProcedureIfItDoesNotExist ( DeleteStoredProcedureName , "deleteStream.js" ) ;
4044
4145 return this ;
4246 }
@@ -48,7 +52,7 @@ public async Task AppendToStream(string streamId, IEnumerable<StorageEvent> even
4852 try
4953 {
5054 var result = await client . ExecuteStoredProcedureAsync < dynamic > (
51- storedProcLink ,
55+ appendStoredProcedureLink ,
5256 new RequestOptions { PartitionKey = new PartitionKey ( streamId ) , ConsistencyLevel = collectionOptions . ConsistencyLevel } ,
5357 docs ) ;
5458
@@ -90,6 +94,26 @@ public async Task<IReadOnlyCollection<StorageEvent>> ReadStreamForwards(string s
9094 return events . AsReadOnly ( ) ;
9195 }
9296
97+ public async Task DeleteStream ( string streamId )
98+ {
99+ while ( true )
100+ {
101+ var result = await client . ExecuteStoredProcedureAsync < dynamic > (
102+ deleteStoredProcedureLink ,
103+ new RequestOptions { PartitionKey = new PartitionKey ( streamId ) , ConsistencyLevel = collectionOptions . ConsistencyLevel } ,
104+ streamId ) ;
105+
106+ if ( ( bool ) result . Response . continuation )
107+ {
108+ continue ;
109+ }
110+
111+ loggingOptions . OnSuccess ( ResponseInformation . FromWriteResponse ( nameof ( DeleteStream ) , result ) ) ;
112+
113+ break ;
114+ }
115+ }
116+
93117 private async Task CreateDatabaseIfItDoesNotExist ( )
94118 {
95119 await client . CreateDatabaseIfNotExistsAsync ( new Database { Id = databaseName } ) ;
@@ -117,18 +141,18 @@ private async Task CreateCollectionIfItDoesNotExist()
117141 await client . CreateDocumentCollectionIfNotExistsAsync ( databaseUri , collection , requestOptions ) ;
118142 }
119143
120- private async Task CreateAppendStoredProcedureIfItDoesNotExist ( )
144+ private async Task CreateStoredProcedureIfItDoesNotExist ( string procedureName , string resourceName )
121145 {
122146 var query = client . CreateStoredProcedureQuery ( commitsLink )
123- . Where ( x => x . Id == AppendStoredProcedureName )
147+ . Where ( x => x . Id == procedureName )
124148 . AsDocumentQuery ( ) ;
125149
126150 if ( ! ( await query . ExecuteNextAsync < StoredProcedure > ( ) ) . Any ( ) )
127151 {
128152 await client . CreateStoredProcedureAsync ( commitsLink , new StoredProcedure
129153 {
130- Id = AppendStoredProcedureName ,
131- Body = Resources . GetString ( "appendToStream.js" )
154+ Id = procedureName ,
155+ Body = Resources . GetString ( resourceName )
132156 } ) ;
133157 }
134158 }
0 commit comments