/// <summary> /// Create <see cref="ContentAndTranslationsEditViewModel"/>. /// </summary> /// <param name="contentPrivateEditData">The data required to edit a content.</param> public ContentAndTranslationsEditViewModel(ContentPrivateEditData contentPrivateEditData) { if (contentPrivateEditData is null) { throw new ArgumentNullException(nameof(contentPrivateEditData)); } Id = contentPrivateEditData.Id; InternalCaption = contentPrivateEditData.InternalCaption; Translations = contentPrivateEditData.Translations.Select(x => new TranslationEditViewModel(x)).ToList(); }
/// <summary> /// Update a content. /// </summary> /// <param name="data">Data to update with.</param> /// <returns>Updated content.</returns> public async Task <ContentPrivateEditData> UpdateAsync(ContentPrivateEditData data) { if (data is null) { throw new ArgumentNullException(nameof(data)); } var content = await _context.Content.Include(c => c.Translations) .SingleAsync(x => x.Id == data.Id); var updateTime = DateTime.UtcNow; content.InternalCaption = data.InternalCaption; var newTranslations = from x in data.Translations where x.Id == default(int) let translation = (new Translation()).UpdateFromTranslationPrivateEditData(x) select translation; var updatedOldData = from x in data.Translations where x.Id != default(int) select x; var translationsAndChanges = from translation in content.Translations join changes in updatedOldData on translation.Id equals changes.Id select new { translation, changes }; // Update existing translations foreach (var translationAndChange in translationsAndChanges) { translationAndChange.translation.UpdateFromTranslationPrivateEditData(translationAndChange.changes); translationAndChange.translation.UpdatedAt = updateTime; } // Add new translations foreach (var newTranslation in newTranslations) { newTranslation.UpdatedAt = updateTime; content.Translations.Add(newTranslation); } _context.Content.Update(content); await _context.SaveChangesAsync(); return(data); }
/// <summary> /// Read a content. /// </summary> /// <param name="contentId">Id of a content to read.</param> /// <returns>Content representation.</returns> public async Task <ContentPrivateEditData> ReadAsync(int contentId) { var content = await _context.Content.Include(c => c.Translations).FirstAsync(x => x.Id == contentId); var data = new ContentPrivateEditData(content); // Build missing translations var missingTranslations = from x in Enum.GetValues(typeof(LanguageDefinition)).Cast <LanguageDefinition>() where !data.Translations.Select(t => t.Version).Contains(x) select new TranslationPrivateEditData(new Translation()) { ContentId = data.Id, Version = x }; data.Translations = data.Translations.Concat(missingTranslations).ToList(); return(data); }
/// <summary> /// Create <see cref="ContentPrivateEditData"/> representation in DB. /// </summary> /// <param name="contentEditViewModel">Content representation to store in DB.</param> /// <returns>Updated content representation.</returns> public async Task <ContentPrivateEditData> CreateAsync(ContentPrivateEditData contentEditViewModel) { if (contentEditViewModel is null) { throw new ArgumentNullException(nameof(contentEditViewModel)); } var content = _context.Content.Add(new Content { InternalCaption = contentEditViewModel.InternalCaption }); await _context.SaveChangesAsync(); var entity = content.Entity; return(new ContentPrivateEditData(entity)); }