public RealtimeService(IRealtimeServer server, IOptions <SiteOptions> siteOptions, IOptions <DataAccessOptions> dataAccessOptions, IOptions <RealtimeOptions> realtimeOptions, IOptions <AuthOptions> authOptions, IMongoClient mongoClient, IConfiguration configuration) { Server = server; _siteOptions = siteOptions; _dataAccessOptions = dataAccessOptions; _realtimeOptions = realtimeOptions; _authOptions = authOptions; _database = mongoClient.GetDatabase(_dataAccessOptions.Value.MongoDatabaseName); _configuration = configuration; RealtimeOptions options = _realtimeOptions.Value; _docConfigs = new Dictionary <Type, DocConfig>(); AddDocConfig(options.UserDoc); AddDocConfig(options.ProjectDoc); foreach (DocConfig projectDataDoc in options.ProjectDataDocs) { AddDocConfig(projectDataDoc); } foreach (DocConfig userDataDoc in options.UserDataDocs) { AddDocConfig(userDataDoc); } }
/// <summary> /// Delete project-related docs from various collections. /// </summary> public async Task DeleteProjectAsync(string projectId) { if (string.IsNullOrEmpty(projectId)) { throw new ArgumentException("", nameof(projectId)); } RealtimeOptions options = _realtimeOptions.Value; var tasks = new List <Task>(); foreach (DocConfig docConfig in options.ProjectDataDocs) { tasks.Add(DeleteProjectDocsAsync(docConfig.CollectionName, projectId)); } await Task.WhenAll(tasks); IMongoCollection <BsonDocument> snapshotCollection = _database.GetCollection <BsonDocument>( options.ProjectDoc.CollectionName); FilterDefinition <BsonDocument> idFilter = Builders <BsonDocument> .Filter.Eq("_id", projectId); await snapshotCollection.DeleteManyAsync(idFilter); IMongoCollection <BsonDocument> opsCollection = _database.GetCollection <BsonDocument>( $"o_{options.ProjectDoc.CollectionName}"); FilterDefinition <BsonDocument> dFilter = Builders <BsonDocument> .Filter.Eq("d", projectId); await opsCollection.DeleteManyAsync(dFilter); }
/// <summary> /// Delete user-related docs from various collections. /// </summary> public async Task DeleteUserAsync(string userId) { if (string.IsNullOrEmpty(userId)) { throw new ArgumentException("", nameof(userId)); } RealtimeOptions options = _realtimeOptions.Value; IEnumerable <DocConfig> collectionsToProcess = options.UserDataDocs.Append(options.UserDoc); FilterDefinition <BsonDocument> idFilter = Builders <BsonDocument> .Filter.Regex("_id", $"{userId}$"); FilterDefinition <BsonDocument> dFilter = Builders <BsonDocument> .Filter.Regex("d", $"{userId}$"); foreach (var collection in collectionsToProcess) { IMongoCollection <BsonDocument> snapshotCollection = _database.GetCollection <BsonDocument>( collection.CollectionName); await snapshotCollection.DeleteManyAsync(idFilter); IMongoCollection <BsonDocument> opsCollection = _database.GetCollection <BsonDocument>( $"o_{collection.CollectionName}"); await opsCollection.DeleteManyAsync(dFilter); } }