Пример #1
0
        public override Course GetCourse(string courseId)
        {
            var course = base.GetCourse(courseId);

            if (IsCourseVersionWasUpdatedRecent(courseId))
            {
                return(course);
            }

            courseVersionFetchTime[courseId] = DateTime.Now;
            var coursesRepo      = new CoursesRepo();
            var publishedVersion = coursesRepo.GetPublishedCourseVersion(courseId);

            if (publishedVersion == null)
            {
                return(course);
            }

            lock (@lock)
            {
                Guid loadedVersionId;
                if (loadedCourseVersions.TryGetValue(courseId, out loadedVersionId) &&
                    loadedVersionId != publishedVersion.Id)
                {
                    log.Info($"Загруженная версия курса {courseId} отличается от актуальной. Обновляю курс.");
                    course = ReloadCourse(courseId);
                }
                loadedCourseVersions[courseId] = publishedVersion.Id;
            }
            return(course);
        }
Пример #2
0
        public override Course GetCourse(string courseId)
        {
            Course course;

            try
            {
                LoadCoursesIfNotYet();
                TryReloadTempCourseIfNecessary(courseId);
                course = base.GetCourse(courseId);
            }
            catch (Exception e) when(e is KeyNotFoundException || e is CourseNotFoundException || e is CourseLoadingException)
            {
                course = null;
            }
            catch (AggregateException e)
            {
                var ie = e.InnerException;
                if (ie is KeyNotFoundException || ie is CourseNotFoundException || ie is CourseLoadingException)
                {
                    course = null;
                }
                else
                {
                    throw;
                }
            }

            if (IsCourseVersionWasUpdatedRecent(courseId) || CourseIsBroken(courseId))
            {
                return(course ?? throw new KeyNotFoundException($"Key {courseId} not found"));
            }

            courseVersionFetchTime[courseId] = DateTime.Now;
            var coursesRepo      = new CoursesRepo();
            var publishedVersion = coursesRepo.GetPublishedCourseVersion(courseId);

            if (publishedVersion == null)
            {
                return(course ?? throw new KeyNotFoundException($"Key {courseId} not found"));
            }

            lock (@lock)
            {
                if (loadedCourseVersions.TryGetValue(courseId.ToLower(), out var loadedVersionId) &&
                    loadedVersionId != publishedVersion.Id)
                {
                    log.Info($"Загруженная версия курса {courseId} отличается от актуальной ({loadedVersionId.ToString()} != {publishedVersion.Id}). Обновляю курс.");
                    if (TryReloadCourse(courseId))
                    {
                        course = base.GetCourse(courseId);
                    }
                }

                loadedCourseVersions[courseId.ToLower()] = publishedVersion.Id;
            }

            return(course ?? throw new KeyNotFoundException($"Key {courseId} not found"));
        }
Пример #3
0
        // returns null if user can't edit git
        private string GetGitEditLink(Course course, FileInfo pageFile)
        {
            var courseRole             = User.GetCourseRole(course.Id);
            var canEditGit             = courseRole != null && courseRole <= CourseRole.CourseAdmin;
            var publishedCourseVersion = coursesRepo.GetPublishedCourseVersion(course.Id);

            if (!canEditGit || publishedCourseVersion.RepoUrl == null)
            {
                return(null);
            }
            var pathRelative2CourseXml = pageFile.FullName.Substring(course.CourseXmlDirectory.FullName.Length + 1);

            if (publishedCourseVersion.PathToCourseXml == null)
            {
                return(null);
            }
            return(GitUtils.GetSlideEditLink(publishedCourseVersion.RepoUrl, publishedCourseVersion.PathToCourseXml, pathRelative2CourseXml));
        }