/// <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));
        }