public List <ExternalInterview> GetQuestions() { List <Interview> interviews = Adapter.ReadByContext(c => c.Interview.OrderBy(e => e.ParentInterviewId).ToList()); var result = new Dictionary <long, ExternalInterview>(); foreach (Interview interview in interviews) { if (interview.ParentInterviewId == null) { result.Add(interview.Id, new ExternalInterview(interview.Id, interview.Text)); continue; } long parentId = interview.ParentInterviewId.Value; ExternalInterview question; if (!result.TryGetValue(parentId, out question)) { LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat( "InterviewsQuery.GetQuestions не найден родитель с идентификатором {0}!", parentId); continue; } question.AddAnswer(interview.Id, interview.Text); } return(result.Values.Where(e => EnumerableValidator.IsNotNullAndNotEmpty(e.Answers)).OrderBy(e => e.Id).ToList()); }
/// <summary> /// Устанавливает отложенные настройки /// </summary> /// <param name="args">функции по отложенным вычислениям</param> public void SetDeferredSettings(params Action <WebSettingsConfig>[] args) { const int MAX_ATTEMPTS = 3; _deferredActions = args; if (EnumerableValidator.IsNullOrEmpty(_deferredActions)) { return; } Task.Run(() => { foreach (var action in _deferredActions) { for (int i = 0; i < MAX_ATTEMPTS; i++) { try { action(this); break; } catch (ThreadAbortException e) {} catch (Exception e) { if (i - 1 == MAX_ATTEMPTS) { LoggerWrapper.RemoteMessage(LoggingSource.Mail, LoggingType.Error, "WebSettingsConfig.SetDeferredSettings вылетело исключение {0}. Сделали {1} попыток!", e, MAX_ATTEMPTS); } } } } }); }
public FileResult GetVideo(string urlPart) { if (WebSettingsConfig.Instance.IsSectionForbidden(SectionId.TVSeries)) { return(null); } TVSeriesWatch seriesWatch = GetSeriesWatch(urlPart); if (seriesWatch == null) { return(null); } string fullFileName = WebSettingsConfig.Instance.GetDataFileName(SERIES_FOLDER, seriesWatch.GetPathToFiles(), seriesWatch.VideoFileName); byte[] fileContents = ReadFile(fullFileName); if (EnumerableValidator.IsNullOrEmpty(fileContents)) { return(null); } TVSeriesInfo seriesInfo = seriesWatch.GetSeriesInfo(); return(File(fileContents, "video/mp4", seriesInfo.OrigTitle + "_" + seriesWatch.VideoFileName)); }
public void AddRow(params string[] fields) { if (EnumerableValidator.IsNotEmpty(fields)) { AddRow(fields.Select(TableDataCell.CreateText).ToList()); } }
private void LoadLanguages() { if (EnumerableValidator.IsNotNullAndNotEmpty(_languages)) { //ранее уже загрузили языки return; } Adapter.ActionByContext(c => { _languages = c.Language.ToList(); _languagesByIds = new Dictionary <long, Language>(_languages.Count); _languagesByShortNames = new Dictionary <LanguageShortName, Language>(_languages.Count); foreach (Language language in _languages) { LanguageShortName parsedShortName = ParseShortName(language.ShortName); if (parsedShortName == LanguageShortName.Unknown) { continue; } _languagesByIds.Add(language.Id, language); _languagesByShortNames.Add(parsedShortName, language); } }); }
private static void AddSubmenu(HashSet <SectionId> availableSectionIds, string title, IEnumerable <MenuItem> menuItems, List <MenuItem> result) { var children = menuItems.Where(menuItem => menuItem.SectionId == SectionId.No || availableSectionIds.Contains(menuItem.SectionId)).ToList(); if (EnumerableValidator.IsEmpty(children)) { return; } MenuItem item; if (children.Count == 1) { item = children[0]; } else { item = new MenuItem(SectionId.No, title + " <b class=\"caret\"></b>", null, null) { Children = children }; } result.Add(item); }
public GeneratorModel(ControllerContext controllerContext, Dictionary <KnowledgeDataType, List <GeneratedKnowledgeItem> > items) { HtmlItems = new List <string>(); IEnumerable <GeneratedKnowledgeItem> generatedWords = GetGeneratedItems(KnowledgeDataType.WordTranslation, items); List <SourceWithTranslation> words = generatedWords.Select(e => (SourceWithTranslation)e.ParsedData).ToList(); if (EnumerableValidator.IsNotNullAndNotEmpty(words)) { HtmlItems.Add(GetHtml(controllerContext, KnowledgeDataType.WordTranslation, words)); } IEnumerable <GeneratedKnowledgeItem> generatedPhrases = GetGeneratedItems( KnowledgeDataType.PhraseTranslation, items); List <SourceWithTranslation> phrases = generatedPhrases.Select(e => (SourceWithTranslation)e.ParsedData).ToList(); if (EnumerableValidator.IsNotNullAndNotEmpty(phrases)) { HtmlItems.Add(GetHtml(controllerContext, KnowledgeDataType.PhraseTranslation, phrases)); } IEnumerable <GeneratedKnowledgeItem> generatedSentences = GetGeneratedItems(KnowledgeDataType.SentenceTranslation, items); List <SourceWithTranslation> sentences = generatedSentences.Select(e => (SourceWithTranslation)e.ParsedData).ToList(); if (EnumerableValidator.IsNotNullAndNotEmpty(sentences)) { HtmlItems.Add(GetHtml(controllerContext, KnowledgeDataType.SentenceTranslation, sentences)); } }
public ActionResult Index(long userId, UserLanguages userLanguages) { const string EMPTY_WALL_VIEW = "EmptyWall"; if (WebSettingsConfig.Instance.IsSectionForbidden(SectionId.MyKnowledge)) { return(RedirectToAction("Index", RouteConfig.MAIN_CONTROLLER_NAME)); } if (IdValidator.IsInvalid(userId) || UserLanguages.IsInvalid(userLanguages)) { return(View(EMPTY_WALL_VIEW)); } IUserKnowledgeQuery userKnowledgeQuery = CreateUserKnowledgeQuery(userId); List <UserKnowledgeItem> items = GetData(userKnowledgeQuery, userLanguages, long.MaxValue); if (items == null || EnumerableValidator.IsEmpty(items)) { return(View(EMPTY_WALL_VIEW)); } //TODO: если будет тормозить - получать ajax'ом данные через action GetStatistic UserKnowledgeStatistic statistic = userKnowledgeQuery.GetStatistic(); return(View("Index", new KnowledgeWallModel(userLanguages, items) { Statistic = statistic })); }
public List <string> FindSentences(string words, OrderWordsInSearch orderWordsInSearch) { var uniqueWords = new HashSet <string>(words.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); List <Sentence> sentences = _sentenceWordsQuery.FindSentencesByWords(uniqueWords.Select(e => e.Trim()).ToList(), orderWordsInSearch); if (EnumerableValidator.IsEmpty(sentences)) { NLPWrapper.ExternalObjects.Sentence sentence = _textAnalyzer.ParseSentence(words, false); var normalWords = new List <string>(); foreach (Word word in sentence.Words) { if (EnumerableValidator.IsNotEmpty(word.NormalForms)) { normalWords.AddRange(word.NormalForms); } else { normalWords.Add(word.GetAppropriateWordText()); } } sentences = _sentenceWordsQuery.FindSentencesByWords(normalWords, orderWordsInSearch); } return(sentences.Select(e => e.Text).ToList()); }
private static bool IsInvalid(RepresentationForUser representationForUser) { Size size = representationForUser != null ? representationForUser.Size : null; bool result = representationForUser == null || string.IsNullOrEmpty(representationForUser.Title) || IsInvalidSize(size) || IsInvalidImage(representationForUser.Image) || !EnumerableValidator.IsNotNullAndNotEmpty(representationForUser.Areas); if (!result) { IWordsQuery wordsQuery = new WordsQuery(); //проверить области List <RepresentationAreaForUser> areas = representationForUser.Areas; foreach (RepresentationAreaForUser area in areas) { if (wordsQuery.IsInvalid(area.Source) || wordsQuery.IsInvalid(area.Translation) || IsInvalid(size, area.LeftUpperCorner) || IsInvalid(size, area.RightBottomCorner)) { result = true; break; } } } return(result); }
/// <summary> /// Возвращает count данных, которые нужно повторить /// </summary> /// <param name="sourceLanguageId">идентификатор языка с которого переводят</param> /// <param name="translationLanguageId">идентификатор языка на который переводят</param> /// <param name="count">кол-во записей</param> /// <returns>если есть, то данные которые нужно повторить, иначе пустой набор</returns> public List <UserRepetitionIntervalItem> GetRepetitionIntervalItems(long sourceLanguageId, long translationLanguageId, int count) { List <UserRepetitionIntervalItem> result = Adapter.ReadByContext(c => { DateTime dateTimeNow = DateTime.Now; //получать данные для которых подошло данные для показа List <Tuple <UserKnowledge, UserRepetitionInterval> > joinedData = _repetitionQuery.GetRepetitionQuery(c, DateTime . MinValue, dateTimeNow, count); //NOTE: определяем время для показа, для данных, которые никогда и никому не показывали - чтобы эти данные всегда были перед данными //NOTE: время для показа, которых еще не подошло, но после данных, время которых просрочено DateTime unknownNextTimeToShow = EnumerableValidator.IsEmpty(joinedData) ? new DateTime().GetDbDateTime() : dateTimeNow.AddMilliseconds(1); if (_repetitionType == RepetitionType.All) { //получать данные, которые ни разу не показывали пользователю AddOtherData(count, joinedData, wantage => _repetitionQuery.GetRepetitionNewQuery(c, wantage)); //получать данные для которых время показа - еще не подошло AddOtherData(count, joinedData, wantage => _repetitionQuery.GetRepetitionQuery(c, dateTimeNow, DateTime.MaxValue, wantage)); } return(ConvertToItems(sourceLanguageId, translationLanguageId, joinedData, unknownNextTimeToShow)); }, new List <UserRepetitionIntervalItem>(0)); return(result); }
public void AddHeader(params string[] headers) { if (EnumerableValidator.IsNotEmpty(headers)) { AddHeader(headers.ToList()); } }
protected ActionResult GetIndex(long userId, UserLanguages userLanguages, long groupId, Action <TrainerModel> modelSetter) { if (WebSettingsConfig.Instance.IsSectionForbidden(SectionId)) { return(RedirectToAction("Index", RouteConfig.MAIN_CONTROLLER_NAME)); } if (IdValidator.IsInvalid(userId) || UserLanguages.IsInvalid(userLanguages) || IdValidator.IsInvalid(groupId)) { return(RedirectToParentPage()); } IUserRepetitionIntervalQuery userRepetitionIntervalQuery = CreateUserRepetitionIntervalQuery(userId, groupId); var trainerHelper = new TrainerHelper(userRepetitionIntervalQuery, userLanguages); TrainerModel model = trainerHelper.GetTrainerModel(Request); modelSetter(model); if (EnumerableValidator.IsNullOrEmpty(model.Items)) { return(RedirectToParentPage()); } ViewData[OurHtmlHelper.ViewDataFlags.SKIP_POPUP_PANEL] = true; return(View("../Trainer/Index", model)); }
/// <summary> /// Конструктор /// </summary> /// <param name="video">данные о видео</param> internal VideoForUser(Data.Video.Video video) : this(video.Title, video.HtmlCode) { Id = video.Id; HasImage = EnumerableValidator.IsNotNullAndNotEmpty(video.Image); SortInfo = new SortInfo(video); }
public void Create(string file) { var csvReader = new CsvReader(file); //var sentences = IoCModule.Create<SentencesQuery>(); var languages = new LanguagesQuery(LanguageShortName.Unknown, LanguageShortName.Unknown); Language from = languages.GetByShortName(_from); Language russian = languages.GetByShortName(LanguageShortName.Ru); string[] firstLine = csvReader.ReadLine(); if (firstLine == null || EnumerableValidator.IsEmpty(firstLine)) { return; } string groupName = TextFormatter.FirstUpperCharAndTrim(firstLine[0]); if (string.IsNullOrEmpty(groupName) || groupName.Length < 2) { return; } var groupsQuery = new GroupsQuery(from.Id); string fileName = firstLine.Length > 1 && !string.IsNullOrWhiteSpace(firstLine[1]) ? firstLine[1].Trim() : groupName; string imageFileName = Path.Combine(@"C:\Projects\StudyLanguages\Источники для групп\Источники картинок\", fileName + ".jpg"); //создает или получает раннее созданную группу byte[] image = !string.IsNullOrEmpty(imageFileName) ? File.ReadAllBytes(imageFileName) : null; GroupForUser groupForUser = groupsQuery.GetOrCreate(GroupType, groupName, image); do { string[] line = csvReader.ReadLine(); if (line == null) { break; } if (line.Length < 2) { continue; } image = line.Length > 2 && !string.IsNullOrEmpty(line[2]) ? File.ReadAllBytes(line[2]) : null; int?rating = null; int rat; if (line.Length > 3 && int.TryParse(line[3], out rat)) { rating = rat; } bool isSuccess = Create(groupForUser, line, from, russian, image, rating); Console.WriteLine("{0}: {1}", isSuccess ? "Сохранено" : "Не сохранено", line.Aggregate((e1, e2) => e1 + " -> " + e2)); } while (true); }
public void ValidateEnumerableToBeNullOrEmpty() { // Given var validator = new EnumerableValidator <int>(null); // When validator.BeNullOrEmpty(); // Then Assert.True(true); }
public DocumentationGenerator Download(DocumentType docType, string fileName, ComparisonForUser comparisonForUser) { string header = comparisonForUser.Title; DocumentationGenerator documentGenerator = DocumentationGenerator.Create(_domain, _fontPath, docType, fileName); documentGenerator.AddHeader(header, false); if (comparisonForUser.HasDescription) { documentGenerator.AddParagraph(TextFormatter.AppendCharIfNeed(comparisonForUser.Description)); } foreach (ComparisonItemForUser item in comparisonForUser.Items) { string title = item.Title; if (item.HasTranslatedTitle) { title += " – " + item.TitleTranslated; } documentGenerator.AddSubheader(title); documentGenerator.AddParagraph(item.GetRuleHeader()); int ruleNumber = 1; foreach (ComparisonRuleForUser rule in item.Rules) { string ruleDescription = TextFormatter.AppendCharIfNeed(rule.Description); if (!item.IsOneRule) { ruleDescription = ruleNumber + ". " + ruleDescription; ruleNumber++; } documentGenerator.AddParagraph(ruleDescription); if (EnumerableValidator.IsNotEmpty(rule.Examples)) { foreach (ComparisonRuleExampleForUser example in @rule.Examples) { documentGenerator.AddParagraph(example.Example.Source.Text + " – " + example.Example.Translation.Text, new TextFormat { CountLeftPaddings = 1 }); if (!string.IsNullOrWhiteSpace(example.Description)) { documentGenerator.AddParagraph("Пояснение к примеру: " + TextFormatter.AppendCharIfNeed(example.Description), new TextFormat { IsItalic = true, CountLeftPaddings = 1 }); } } } } } return(documentGenerator); }
private static void TranslationsToElement(XElement container, string name, List <string> translations) { if (EnumerableValidator.IsEmpty(translations)) { return; } foreach (string translation in translations) { container.Add(new XElement(name, translation)); } }
public void ValidateEnumerableHaveCountOf() { // Given var validator = new EnumerableValidator <int>(new List <int> { 1 }); // When validator.HaveCountOf(1); // Then Assert.True(true); }
public void ValidateEnumerableHaveCountLessThanOrEqualTo() { // Given var validator = new EnumerableValidator <int>(new List <int> { 1 }); // When validator.HaveCountLessThanOrEqualTo(10); // Then Assert.True(true); }
/*public JsonResult GetExamples(UserLanguages userLanguages, * GroupForUser group) { * if (userLanguages == null || group == null || UserLanguages.IsInvalid(userLanguages)) { * return JsonResultHelper.Error(); * } * GroupModel model = GetModel(userLanguages, group); * if (model.IsInvalid()) { * return JsonResultHelper.Error(); * } * * var resultExamples = new List<Tuple<long, List<string>>>(); * var searchEngineFactory = new SentencesSearchEngineFactory(); * ISentencesSearchEngine fromSentencesSearchEngine = searchEngineFactory.Create(userLanguages.From.Id); * ISentencesSearchEngine toSentencesSearchEngine = searchEngineFactory.Create(userLanguages.To.Id); * * foreach (SourceWithTranslation elem in model.ElemsWithTranslations) { * model.SetCurrent(elem); * * AddExample(fromSentencesSearchEngine, elem.Source, resultExamples); * AddExample(toSentencesSearchEngine, elem.Translation, resultExamples); * } * return JsonResultHelper.GetUnlimitedJsonResult(resultExamples); * }*/ /*protected JsonResult GetKnowledgeInfo(long userId, UserLanguages userLanguages, GroupForUser group) { * if (IdValidator.IsInvalid(userId) || group == null) { * return JsonResultHelper.Error(); * } * GroupModel model = GetModel(userLanguages, group, GetPatternsForAll(group)); * if (model.IsInvalid()) { * return JsonResultHelper.Error(); * } * var knowledgeQuery = IoCModule.Create<UserKnowledgeQuery>(); * var statuses = //knowledgeQuery.GetStatusesByDataIds(model.ElemsWithTranslations.Select(e => e.Id).ToList()); * return GetUnlimitedJsonResult(statuses); * }*/ public void AddExample(ISentencesSearchEngine sentencesSearcher, PronunciationForUser entity, List <Tuple <long, List <string> > > result) { List <string> examples = sentencesSearcher.FindSentences(entity.Text, OrderWordsInSearch.ExactWordForWord); if (EnumerableValidator.IsEmpty(examples)) { return; } result.Add(new Tuple <long, List <string> >(entity.Id, examples)); }
public static T Get <T>(XElement element, params string[] names) { if (EnumerableValidator.IsEmpty(names)) { return(default(T)); } XElement elem = GetElementByNames(element, names); string valueElementName = names[names.Length - 1]; XElement valueElement = elem != null?elem.Element(valueElementName) : null; return(valueElement != null?ParseValue <T>(GetElementValue(valueElement)) : default(T)); }
public JsonResult AnswerInterview(List <long> answersIds) { List <long> validAnswersIds = (answersIds ?? new List <long>(0)).Where(IdValidator.IsValid).ToList(); if (EnumerableValidator.IsNullOrEmpty(validAnswersIds)) { return(JsonResultHelper.Error()); } IInterviewsQuery interviewsQuery = new InterviewsQuery(); bool isSuccess = interviewsQuery.IncrementCountAnswers(validAnswersIds); return(JsonResultHelper.Success(isSuccess)); }
public void ConvertGroupWords() { string path = string.Format(@"C:\Projects\StudyLanguages\Источники для групп\Word\{0}\", _languageTo); string[] files = Directory.GetFiles(Path.Combine(path, "Xml"), "*.xml"); var xmlTranslationReader = new XmlTranslationReader(); foreach (string file in files) { string name = Path.GetFileNameWithoutExtension(file); Console.WriteLine("Обрабатываем группу слов \"{0}\"", name); List <XmlTranslationReader.Item> items = xmlTranslationReader.Read(file); string destinationFile = Path.Combine(path, name + ".csv"); using (var csvWriter = new CsvWriter(destinationFile)) { csvWriter.WriteLine(name); foreach (XmlTranslationReader.Item item in items) { var fields = new List <string>(); string source; if (EnumerableValidator.IsNotEmpty(item.Best)) { source = item.Best[0].Trim(); } else { source = "<UNKNOWN> - " + string.Join("|", item.Other); } fields.Add(source); fields.Add(item.Source); /* string imageFileName = * string.Format( * @"C:\Projects\StudyLanguages\Источники для групп\Источники картинок\{0}\{1}.jpg", * name, item.Translation); * if (File.Exists(imageFileName)) { * fields.Add(item.Translation); * }*/ csvWriter.WriteLine(fields.ToArray()); } } } Console.WriteLine("Все группы слов обработаны!"); }
public List <VideoForUser> GetVisibleWithText(VideoType type, int count = 0) { var result = GetVisible(type, count); if (EnumerableValidator.IsNullOrEmpty(result)) { return(result); } Adapter.ActionByContext(c => { IQueryable <long> videoIdsWithText = c.VideoSentence.Select(e => e.VideoId).Distinct(); var fast = new HashSet <long>(videoIdsWithText); result = result.Where(e => fast.Contains(e.Id)).ToList(); }); return(result); }
internal string GetAdditionalInfo() { if (EnumerableValidator.IsEmpty(_additionalInfo)) { return(null); } var xElement = new XElement("Info"); foreach (var additionalInfo in _additionalInfo) { xElement.Add(new XElement(additionalInfo.Key.ToString(), additionalInfo.Value)); } return(xElement.ToString(SaveOptions.DisableFormatting)); }
private WordsByPattern GetKeyboardLayoutResult(UserLanguages userLanguages, string query, WordsQuery wordsQuery) { var keyboardLayoutConverter = new KeyboardLayoutConverter(); List <string> convertedQueries = keyboardLayoutConverter.Convert(query); foreach (string convertedQuery in convertedQueries) { WordsByPattern result = wordsQuery.GetLikeWords(userLanguages, convertedQuery, WordType); if (EnumerableValidator.IsNotEmpty(result.Words)) { result.NewPattern = convertedQuery; return(result); } } return(new WordsByPattern()); }
public void ValidateEnumerableToBeNullViolated() { // Given var validator = new EnumerableValidator <int>(new List <int>()); // When var exception = Assert.Throws <XunitException>(() => validator.BeNull("that's the bottom line")); // Then Assert.NotNull(exception); var rn = Environment.NewLine; Assert.Equal( $"{rn}validator{rn}contains \"0\" item(s){rn}but was expected to be null{rn}because that's the bottom line", exception.UserMessage); }
public JsonResult GetExistenceIds(long userId, List <long> ids, KnowledgeDataType dataType) { /* List<long> ids = new List<long>(); * KnowledgeDataType dataType = KnowledgeDataType.SentenceTranslation;*/ List <long> parsedIds = ids != null?ids.Where(IdValidator.IsValid).ToList() : new List <long>(0); if (IdValidator.IsInvalid(userId) || EnumerableValidator.IsEmpty(parsedIds) || EnumValidator.IsInvalid(dataType)) { return(JsonResultHelper.Error(INVALID_DATA)); } IUserKnowledgeQuery userKnowledgeQuery = CreateUserKnowledgeQuery(userId); List <long> existenceIds = userKnowledgeQuery.GetExistenceIds(parsedIds, dataType); return(JsonResultHelper.GetUnlimitedJsonResult(existenceIds)); }
public JsonResult AddMany(long userId, List <UserKnowledgeItem> knowledgeItems) { IUserKnowledgeQuery userKnowledgeQuery = CreateUserKnowledgeQuery(userId); if (EnumerableValidator.IsNullOrEmpty(knowledgeItems) || knowledgeItems.Any(userKnowledgeQuery.IsInvalid)) { LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat( "KnowledgeController.AddMany пользователь с идентификатором {0}, передал некорректные данные", userId); return(JsonResultHelper.Error(INVALID_DATA)); } List <KnowledgeAddStatus> statuses = userKnowledgeQuery.Add(knowledgeItems, MAX_COUNT_ITEMS_PER_DAY); KnowledgeAddStatus summaryStatus = EnumerableValidator.IsCountEquals(statuses, knowledgeItems) ? GetSummaryStatus(statuses) : KnowledgeAddStatus.Error; if (summaryStatus == KnowledgeAddStatus.Ok) { return(JsonResultHelper.Success(true)); } if (summaryStatus == KnowledgeAddStatus.ReachMaxLimit) { LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat( "KnowledgeController.AddMany пользователь с идентификатором {0}, достиг лимит данных за сегодня", userId); return(JsonResultHelper.Error( string.Format( "Сегодня вы уже добавили максимальное количество данных на обучение. В день вы можете добавлять не более {0} порций знаний. Завтра Вы вновь сможете добавлять новые элементы, а пока, рекомендуем изучить сегодняшний материал.", MAX_COUNT_ITEMS_PER_DAY))); } if (summaryStatus == KnowledgeAddStatus.AlreadyExists) { LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat( "KnowledgeController.AddMany пользователь с идентификатором {0}, уже добавлял данные", userId); return(JsonResultHelper.Error("Ранее вы уже добавляли эти данные на обучение.")); } LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat( "KnowledgeController.AddMany. Для пользователя с идентификатором {0} не удалось добавить данные, какая-то ошибка!", userId); return (JsonResultHelper.Error("Не удалось добавить порцию знаний! Попробуйте позже.")); }