public override async Task ReassignCourseSpecializationsAsync(UpdateDbContext context, bool useArchiveData = false)
        {
            if (!IsInitialized)
            {
                throw new InvalidOperationException(Resources.InvalidOperation_PluralsightCatalog_InitializeMethodInvokeRequired);
            }

            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var allCourses = await context.Courses
                             .Where(x => x.TrainingProviderId == TrainingProviderId && !x.IsDeleted)
                             .Select(x => new
            {
                x.Id,
                x.UrlName,
                CourseSpecializations = x.CourseSpecializations.ToList()
            })
                             .AsNoTracking()
                             .ToListAsync();

            var courseSpecializationsContainer = await GetCourseSpecializationsContainerAsync(useArchiveData);

            try
            {
                context.Configuration.AutoDetectChangesEnabled = false;

                foreach (var dbCourse in allCourses)
                {
                    Specializations specializationsForCourse;
                    if (courseSpecializationsContainer.TryGetValue(dbCourse.UrlName, out specializationsForCourse))
                    {
                        var currentSpecializations = specializationsForCourse.GetFlags <Specializations>().ToList();

                        foreach (var dbCourseSpecialization in dbCourse.CourseSpecializations)
                        {
                            if (currentSpecializations.Contains(dbCourseSpecialization.Specialization))
                            {
                                currentSpecializations.Remove(dbCourseSpecialization.Specialization);
                            }
                            else
                            {
                                context.SetStateToDeleted(dbCourseSpecialization);
                            }
                        }
                        foreach (var specialization in currentSpecializations)
                        {
                            var courseSpecialization = new CourseSpecialization
                            {
                                CourseId       = dbCourse.Id,
                                Specialization = specialization
                            };
                            context.SetStateToAdded(courseSpecialization);
                        }
                    }
                }
            }
            finally
            {
                context.Configuration.AutoDetectChangesEnabled = true;
            }

            await context.SaveChangesAsync();
        }
예제 #2
0
        private async Task ApplayAuthorResolve(AuthorResolve currentAuthorResolve, int resolvedId, string resolvedUrl, string resolvedUrlName)
        {
            currentAuthorResolve.ResolveState     = ResolveState.Resolved;
            currentAuthorResolve.ResolvedAuthorId = resolvedId;
            currentAuthorResolve.AuthorSiteUrl    = resolvedUrl;
            currentAuthorResolve.AuthorUrlName    = resolvedUrlName;

            var trainingProviderAuthor = await _db.TrainingProviderAuthors
                                         .SingleOrDefaultAsync(x => x.TrainingProviderId == currentAuthorResolve.TrainingProviderId && x.AuthorId == resolvedId);

            if (trainingProviderAuthor == null)
            {
                trainingProviderAuthor = new TrainingProviderAuthor
                {
                    TrainingProviderId = currentAuthorResolve.TrainingProviderId,
                    AuthorId           = resolvedId,
                    FullName           = currentAuthorResolve.AuthorFullName,
                    SiteUrl            = currentAuthorResolve.AuthorSiteUrl,
                    UrlName            = currentAuthorResolve.AuthorUrlName
                };

                _db.TrainingProviderAuthors.Add(trainingProviderAuthor);
            }
            else if (trainingProviderAuthor.IsDeleted)
            {
                trainingProviderAuthor.IsDeleted = false;
            }

            var courseAuthor = await _db.CourseAuthors
                               .SingleOrDefaultAsync(x => x.CourseId == currentAuthorResolve.CourseId && x.AuthorId == resolvedId);

            if (courseAuthor == null)
            {
                courseAuthor = new CourseAuthor
                {
                    TrainingProviderId = currentAuthorResolve.TrainingProviderId,
                    AuthorId           = resolvedId,
                    CourseId           = currentAuthorResolve.CourseId,
                    IsAuthorCoAuthor   = currentAuthorResolve.IsAuthorCoAuthor
                };

                _db.CourseAuthors.Add(courseAuthor);
            }
            else if (courseAuthor.IsDeleted)
            {
                courseAuthor.IsDeleted = false;
            }

            await _db.SaveChangesAsync();

            var unresolvedAuthorCount = await _db.AuthorsResolves
                                        .CountAsync(x => x.UpdateEventId == currentAuthorResolve.UpdateEventId && x.ResolveState == ResolveState.Pending);

            if (unresolvedAuthorCount == 0)
            {
                var currentUpdateEvent = await _db.UpdateEvents
                                         .SingleOrDefaultAsync(x => x.Id == currentAuthorResolve.UpdateEventId && x.UpdateResult == UpdateResult.NeedManualResolve);

                if (currentUpdateEvent != null)
                {
                    currentUpdateEvent.UpdateResult = UpdateResult.Resolved;
                    await _db.SaveChangesAsync();
                }
            }
        }