Ejemplo n.º 1
0
 public async Task<bool> AssociatePicturesWithPoll<TQuestion>(PollBase<TQuestion> pollBase,PicturesAssociateMode mode) where TQuestion:Question
 {
     var pollId = pollBase.Id;
     var resultsTasks = pollBase.Questions.Select(async question =>
     {
         var questionResultsTasks = question.AnswerOptions!=null?
             question.AnswerOptions.Select(async option =>
             option.PictureId != null ? await UpdatePictureMetadataAsync(option.PictureId, pollId, mode) : null).ToList()
             :new List<Task<UpdateResult>>();
         var questionResults = (await Task.WhenAll(questionResultsTasks)).ToList();
         questionResults.Add(question?.PictureId != null ? await UpdatePictureMetadataAsync(question.PictureId, pollId, mode) : null);
         return questionResults;
     });
     var results=(await Task.WhenAll(resultsTasks)).SelectMany(list=>list).ToList();
     return results.Where(result=>result!=null).All(result => result.ModifiedCount == 1);
 }
Ejemplo n.º 2
0
 private async Task<BsonArray> GetNewPictureMetadataAsync(string id,string pollId, PicturesAssociateMode mode)
 {
     ObjectId.TryParse(id, out ObjectId oid);
     var filter = Builders<GridFSFileInfo>.Filter.Eq("_id", oid);
     var fileInfo = await Bucket.Find(filter).SingleAsync();
     var bsonArray = fileInfo.Metadata["related_polls"].AsBsonArray;
     switch (mode)
     {
         case PicturesAssociateMode.Link:
             bsonArray.Add(pollId);
             break;
         case PicturesAssociateMode.Unlink:
             bsonArray.Remove(pollId);
             break;
     }
     return bsonArray;
 }
Ejemplo n.º 3
0
 private async Task<UpdateResult> UpdatePictureMetadataAsync(string pictureId, string pollId, PicturesAssociateMode mode)
 {
     if (! await ExistsAsync(pictureId))
         return null;
     var filesCollection = _db.GetCollection<BsonDocument>("fs.files");
     ObjectId.TryParse(pictureId, out ObjectId oid);
     var filter = Builders<BsonDocument>.Filter.Eq("_id", oid);
     var bsonArray = await GetNewPictureMetadataAsync(pictureId, pollId,mode);
     if (bsonArray.Count == 0)
     {
         await DeleteAsync(pictureId);
         return null;
     }
     var update = Builders<BsonDocument>.Update.Set("metadata.related_polls", bsonArray);
     return await filesCollection.UpdateOneAsync(filter, update);
 }