public static async Task TestUserExists(this ControllerBase controller, IMongoCollection <Models.User> userCollection, string email) { var filterBuilder = new FilterDefinitionBuilder <Models.User>(); var filter = filterBuilder.And( filterBuilder.Eq(u => u.Email, email), GeneralUtils.NotDeactivated(filterBuilder) ); var existingUserCount = (await userCollection.CountDocumentsAsync(filter)); if (existingUserCount > 0) { throw new ResultException ( new ObjectResult ( new ResponseBody() { Code = ResponseCode.AlreadyExists, Success = false, Message = "Usuário com este e-mail já existe!", } ), (int)HttpStatusCode.Conflict ); } }
/// <summary> /// Resolves a token to a FileReference, if the token exists for this user. /// The action should be called once the calling code can ensure the file is handled ok. /// </summary> /// <param name="mongoWrapper">For accessing the database</param> /// <param name="tokenId">The token ID to search for</param> /// <param name="userId">The user ID to correlate with the token</param> /// <returns>A Tuple of the FileReference and an async action to expire the token</returns> public static async Task <(FileReference, Func <Task>)> GetFileForReferenceToken(MongoWrapper mongoWrapper, string tokenId, ObjectId userId) { var tokenCollection = mongoWrapper.Database.GetCollection <DataReferenceToken <ConsumableData <ObjectId> > >(nameof(ReferenceToken)); var tokenFilterBuilder = new FilterDefinitionBuilder <DataReferenceToken <ConsumableData <ObjectId> > >(); var tokenFilter = tokenFilterBuilder.And ( GeneralUtils.NotDeactivated(tokenFilterBuilder), tokenFilterBuilder.Eq(t => t._id, tokenId), tokenFilterBuilder.Eq(t => t.UserId, userId) ); var tokenUpdateBuilder = new UpdateDefinitionBuilder <DataReferenceToken <ConsumableData <ObjectId> > >(); var tokenUpdate = tokenUpdateBuilder .Set(t => t.DeactivationDate, DateTime.UtcNow) .Set(t => t.AdditionalData.IsConsumed, true); DataReferenceToken <ConsumableData <ObjectId> > token = (await tokenCollection.FindAsync(tokenFilter, new FindOptions <DataReferenceToken <ConsumableData <ObjectId> >, DataReferenceToken <ConsumableData <ObjectId> > > { Limit = 1, AllowPartialResults = false, })).SingleOrDefault(); if (token == null) { throw new ValidationException("Token de Arquivo não encontrado!"); } var gridFsBucket = new GridFSBucket <ObjectId>(mongoWrapper.Database); var fileFilterBuilder = new FilterDefinitionBuilder <GridFSFileInfo <ObjectId> >(); var fileFilter = fileFilterBuilder.Eq(finfo => finfo.Id, token.AdditionalData.Data); var fileInfo = (await gridFsBucket.FindAsync(fileFilter, new GridFSFindOptions <ObjectId> { Limit = 1, })).SingleOrDefault(); if (fileInfo == null) { throw new ApplicationException("Arquivo não encontrado, mas havia um token ativado referenciando-o!"); } var fileReference = new FileReference { FileInfo = new Models.FileInfo { FileMetadata = BsonSerializer.Deserialize <FileMetadata>(fileInfo.Metadata), Size = fileInfo.Length }, _id = token.AdditionalData.Data }; return ( fileReference, async() => { var tokenUpdateTask = tokenCollection.UpdateOneAsync ( tokenFilter, tokenUpdate ); var userCollection = mongoWrapper.Database.GetCollection <User>(nameof(User)); var userFilterBuilder = new FilterDefinitionBuilder <User>(); var userFilter = userFilterBuilder.And ( GeneralUtils.NotDeactivated(userFilterBuilder), userFilterBuilder.Eq(u => u._id, userId) ); var userUpdateBuilder = new UpdateDefinitionBuilder <User>(); var userUpdate = userUpdateBuilder.Inc(u => u.FileBytesOccupied, fileReference.FileInfo.Size); var userUpdateTask = userCollection.UpdateOneAsync ( userFilter, userUpdate ); await tokenUpdateTask; await userUpdateTask; } ); }