private async Task ImportExpression(DbTranslatedExpression expression, Language language) { if (await TryUseExisting(expression, language)) { return; } if (await TryAddTranslation(expression, language)) { return; } await Task.WhenAll(expression.Words.Select(word => ImportWord(word, language))); expression.Validate(); var wordIds = expression.Words.Select(word => word.Id).ToArray(); var newExpression = new DbExpression { Cefr = expression.Cefr, ExprType = expression.ExprType, Translations = new Dictionary <string, DbWords> { { language, new DbWords { WordIds = wordIds } } } }; var importedExpression = await _expressions.Add(newExpression); expression.ExpressionId = importedExpression.Id; }
private async Task <bool> TryUseExisting(DbTranslatedExpression expression, Language language) { var existing = await _exprTranslator.Translate(expression.ExpressionId, language); if (existing != null) { expression.Cefr = existing.Expression.Cefr; expression.ExprType = existing.Expression.ExprType; expression.Words = existing.Words.Select( word => new DbTranslatedWord { Id = word.Word.Id, Cefr = word.Word.Cefr, PartOfSpeech = word.Word.PartOfSpeech, PictureId = word.Word.PictureId, Translation = new DbTranslation { Native = word.Native, Spoken = word.Spoken, AudioId = word.AudioId } }).ToArray(); return(true); } else { return(false); } }
private async Task <bool> TryAddTranslation(DbTranslatedExpression expression, Language language) { var existing = await _expressions.Get(expression.ExpressionId); if (existing != null && !existing.Translations !.ContainsKey(language)) { var wordsIds = expression.Words.Select(x => x.Id).ToArray(); existing.Translations.Add(language, new DbWords { WordIds = wordsIds }); await _expressions.Replace(existing); return(true); } return(false); }