public async Task <ActionResult> UpdateAllCoursesConfirmed()
        {
            IEnumerable <CourseCatalog> allCourseCatalog;

            using (var dctx = new EF.MindSageDataModelsContainer())
            {
                allCourseCatalog = dctx.CourseCatalogs
                                   .Include("Semesters.Units.Lessons.Advertisements")
                                   .Include("Semesters.Units.Lessons.TopicOfTheDays")
                                   .Include("Semesters.Units.Lessons.TeacherLessonItems")
                                   .Include("Semesters.Units.Lessons.StudentLessonItems")
                                   .Include("Semesters.Units.Lessons.PreAssessments.Assessments.Choices")
                                   .Include("Semesters.Units.Lessons.PostAssessments.Assessments.Choices")
                                   .ToList();
            }
            var canUpdateCourses = allCourseCatalog != null && allCourseCatalog.Any();

            if (!canUpdateCourses)
            {
                return(RedirectToAction("Index"));
            }

            // TODO: Handle update to MongoDB error
            await updateLessonCatalog(allCourseCatalog);
            await updateCourseCatalog(allCourseCatalog);
            await createPublicClassRooms(allCourseCatalog);

            return(RedirectToAction("Index"));
        }
Exemplo n.º 2
0
        private string generateTeacherCode(License license)
        {
            var teacherKey = string.Empty;

            while (true)
            {
                var       courseCatalog         = license.CourseCatalog;
                var       contract              = license.Contract;
                var       random                = Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 4);
                var       rgx                   = new System.Text.RegularExpressions.Regex("[^a-zA-Z0-9]");
                var       safeSchoolName        = rgx.Replace(contract.SchoolName, string.Empty);
                const int MaxSchoolNameLength   = 10;
                var       canUseSchoolMaxLength = safeSchoolName.Length >= MaxSchoolNameLength;
                const int BeginSchoolNameIndex  = 0;
                var       schoolName            = safeSchoolName.Substring(BeginSchoolNameIndex, canUseSchoolMaxLength ? MaxSchoolNameLength : safeSchoolName.Length);
                teacherKey = string.Format("{0:00}{1}{2}{3}{4}", courseCatalog.Grade, contract.State, contract.ZipCode, random, schoolName);

                var canUseTheNewKey = false;
                using (var dctx = new EF.MindSageDataModelsContainer())
                {
                    canUseTheNewKey = !dctx.TeacherKeys
                                      .Where(it => !it.RecLog.DeletedDate.HasValue && it.Code == teacherKey)
                                      .Any();
                }

                if (canUseTheNewKey)
                {
                    break;
                }
            }

            return(teacherKey);
        }
Exemplo n.º 3
0
        public async Task <OwnCarousel> GetAds(int id)
        {
            Lesson lessonCatalog;

            using (var dctx = new EF.MindSageDataModelsContainer())
            {
                lessonCatalog = await dctx.Lessons
                                .Include("Advertisements")
                                .FirstOrDefaultAsync(it => it.Id == id);
            }
            if (lessonCatalog == null)
            {
                return(null);
            }
            var adsUrls = (lessonCatalog.Advertisements ?? Enumerable.Empty <Advertisement>())
                          .Where(it => !it.RecLog.DeletedDate.HasValue)
                          .Select(it => it.ImageUrl);
            var result = new OwnCarousel
            {
                owl = adsUrls.Select(it => new OwnCarousel.OwnItem
                {
                    item = $"<div class='item'><img src='{ it }' /></div>"
                })
            };

            return(result);
        }
        public async Task <OwnCarousel> GetAds(int id)
        {
            EF.CourseCatalog courseCatalog;
            using (var dctx = new EF.MindSageDataModelsContainer())
            {
                courseCatalog = await dctx.CourseCatalogs
                                .Include("Semesters.Units.Lessons.Advertisements")
                                .Include("Semesters.Units.Lessons.TopicOfTheDays")
                                .FirstOrDefaultAsync(it => it.Id == id);
            }
            if (courseCatalog == null)
            {
                return(null);
            }
            var adsUrls = courseCatalog?.Advertisements?.Split(new string[] { "#;" }, StringSplitOptions.RemoveEmptyEntries) ?? Enumerable.Empty <string>();
            var result  = new OwnCarousel
            {
                owl = adsUrls.Select(it => new OwnCarousel.OwnItem
                {
                    item = $"<div class='item'><img src='{ it }' /></div>"
                })
            };

            return(result);
        }
        public async Task<LessonContentRespond> GetLesson(int id)
        {
            EF.CourseCatalog courseCatalog;
            Lesson lessonCatalog;
            using (var dctx = new EF.MindSageDataModelsContainer())
            {
                lessonCatalog = await dctx.Lessons
                    .Include("Unit.Semester")
                    .Include("TeacherLessonItems")
                    .Include("TeacherLessonItems")
                    .Include("StudentLessonItems")
                    .Include("PreAssessments.Assessments.Choices")
                    .Include("PostAssessments.Assessments.Choices")
                    .FirstOrDefaultAsync(it => it.Id == id);
                if (lessonCatalog == null) return null;

                courseCatalog = await dctx.CourseCatalogs
                    .Include("Semesters.Units")
                    .FirstOrDefaultAsync(it => it.Id == lessonCatalog.Unit.Semester.CourseCatalogId);
                if (courseCatalog == null) return null;
            }

            var semesters = courseCatalog.Semesters.Where(it => !it.RecLog.DeletedDate.HasValue).OrderBy(it => it.RecLog.CreatedDate);
            var semesterRunner = 65;
            foreach (var item in semesters)
            {
                if (item.Id == lessonCatalog.Unit.SemesterId) break;
                semesterRunner++;
            }

            var units = semesters.SelectMany(it => it.Units).Where(it => !it.RecLog.DeletedDate.HasValue).OrderBy(it => it.RecLog.CreatedDate);
            var unitRunner = 1;
            foreach (var item in units)
            {
                if (item.Id == lessonCatalog.UnitId) break;
                unitRunner++;
            }
            var teacherItemQry = createLessonItems(lessonCatalog.TeacherLessonItems);
            var studentItemQry = createLessonItems(lessonCatalog.StudentLessonItems);
            var preAssessmentQry = createAssessmentItems(lessonCatalog.PreAssessments);
            var postAssessmentQry = createAssessmentItems(lessonCatalog.PostAssessments);
            var result = new LessonContentRespond
            {
                //ExtraContents = extraContents,
                CreatedDate = lessonCatalog.RecLog.CreatedDate,
                IsPreviewable = lessonCatalog.IsPreviewable,
                SemesterName = string.Format("{0}", (char)semesterRunner),
                Title = lessonCatalog.Title,
                Order = unitRunner,
                TeacherItems = teacherItemQry,
                StudentItems = studentItemQry,
                PreAssessments = preAssessmentQry,
                PostAssessments = postAssessmentQry,
            };
            return result;
        }
        // GET: ImportContent
        public ActionResult Index()
        {
            EF.ImportContentConfiguration importContent;
            using (var dctx = new EF.MindSageDataModelsContainer())
            {
                importContent = dctx.ImportContentConfigurations.Where(it => !it.RecLog.DeletedDate.HasValue).ToList().OrderBy(it => it.RecLog.CreatedDate).LastOrDefault();
            }

            var isImportSettingAvailable = importContent != null;
            var result = new ImportContentViewModel
            {
                Id = isImportSettingAvailable ? importContent.Id : -1,
                BaseURL = isImportSettingAvailable ? importContent.BaseURL : string.Empty,
                HomePageURL = isImportSettingAvailable ? importContent.HomePageURL : string.Empty,
                PagesURLs = isImportSettingAvailable ? JsonConvert.DeserializeObject<IEnumerable<string>>(importContent.PagesURLs) : Enumerable.Empty<string>(),
                ReferenceFileURLs = isImportSettingAvailable ? JsonConvert.DeserializeObject<IEnumerable<string>>(importContent.ReferenceFileURLs) : Enumerable.Empty<string>(),
                ReplaceSections = isImportSettingAvailable ? JsonConvert.DeserializeObject<List<ReplaceSectionInformation>>(importContent.ReplaceSections) : new List<ReplaceSectionInformation>(),
                StorageInfo = isImportSettingAvailable ? JsonConvert.DeserializeObject<StorageInformation>(importContent.StorageInfo) : new StorageInformation(),
            };
            return View(result);
        }
Exemplo n.º 7
0
        // GET: ImportContent
        public ActionResult Index()
        {
            EF.ImportContentConfiguration importContent;
            using (var dctx = new EF.MindSageDataModelsContainer())
            {
                importContent = dctx.ImportContentConfigurations.Where(it => !it.RecLog.DeletedDate.HasValue).ToList().OrderBy(it => it.RecLog.CreatedDate).LastOrDefault();
            }

            var isImportSettingAvailable = importContent != null;
            var result = new ImportContentViewModel
            {
                Id                = isImportSettingAvailable ? importContent.Id : -1,
                BaseURL           = isImportSettingAvailable ? importContent.BaseURL : string.Empty,
                HomePageURL       = isImportSettingAvailable ? importContent.HomePageURL : string.Empty,
                PagesURLs         = isImportSettingAvailable ? JsonConvert.DeserializeObject <IEnumerable <string> >(importContent.PagesURLs) : Enumerable.Empty <string>(),
                ReferenceFileURLs = isImportSettingAvailable ? JsonConvert.DeserializeObject <IEnumerable <string> >(importContent.ReferenceFileURLs) : Enumerable.Empty <string>(),
                ReplaceSections   = isImportSettingAvailable ? JsonConvert.DeserializeObject <List <ReplaceSectionInformation> >(importContent.ReplaceSections) : new List <ReplaceSectionInformation>(),
                StorageInfo       = isImportSettingAvailable ? JsonConvert.DeserializeObject <StorageInformation>(importContent.StorageInfo) : new StorageInformation(),
            };

            return(View(result));
        }
Exemplo n.º 8
0
 private ImportContentConfiguration updateDatabase(ImportContentViewModel model)
 {
     using (var dctx = new EF.MindSageDataModelsContainer())
     {
         var selectedObj = dctx.ImportContentConfigurations.FirstOrDefault(it => it.Id == model.Id);
         if (selectedObj == null)
         {
             selectedObj = new EF.ImportContentConfiguration
             {
                 BaseURL           = model.BaseURL,
                 HomePageURL       = model.HomePageURL,
                 PagesURLs         = JsonConvert.SerializeObject(model.PagesURLs),
                 ReferenceFileURLs = JsonConvert.SerializeObject(model.ReferenceFileURLs),
                 ReplaceSections   = JsonConvert.SerializeObject(model.ReplaceSections),
                 StorageInfo       = JsonConvert.SerializeObject(model.StorageInfo),
                 RecLog            = new EF.RecordLog {
                     CreatedDate = DateTime.Now
                 }
             };
             dctx.ImportContentConfigurations.Add(selectedObj);
         }
         else
         {
             selectedObj.BaseURL           = model.BaseURL;
             selectedObj.HomePageURL       = model.HomePageURL;
             selectedObj.PagesURLs         = JsonConvert.SerializeObject(model.PagesURLs);
             selectedObj.ReferenceFileURLs = JsonConvert.SerializeObject(model.ReferenceFileURLs);
             selectedObj.ReplaceSections   = JsonConvert.SerializeObject(model.ReplaceSections);
             selectedObj.StorageInfo       = JsonConvert.SerializeObject(model.StorageInfo);
             selectedObj.RecLog            = new EF.RecordLog {
                 CreatedDate = DateTime.Now
             };
         }
         dctx.SaveChanges();
         return(selectedObj);
     }
 }
        public async Task<GetCourseDetailRespond> GetDetail(int id)
        {
            EF.CourseCatalog courseCatalog;
            var relatedCourseList = Enumerable.Empty<EF.CourseCatalog>();
            using (var dctx = new EF.MindSageDataModelsContainer())
            {
                courseCatalog = await dctx.CourseCatalogs
                    .Include("Semesters.Units.Lessons.Advertisements")
                    .Include("Semesters.Units.Lessons.TopicOfTheDays")
                    .Include("Semesters.Units.Lessons.TeacherLessonItems")
                    .Include("Semesters.Units.Lessons.StudentLessonItems")
                    .Include("Semesters.Units.Lessons.PreAssessments.Assessments.Choices")
                    .Include("Semesters.Units.Lessons.PostAssessments.Assessments.Choices")
                    .FirstOrDefaultAsync(it => it.Id == id);

                if (courseCatalog != null)
                {
                    relatedCourseList = dctx.CourseCatalogs
                        .Where(it => it.GroupName == courseCatalog.GroupName)
                        .Where(it => it.Id != courseCatalog.Id)
                        .Where(it => !it.RecLog.DeletedDate.HasValue)
                        .ToList();
                }
            }
            if (courseCatalog == null) return null;

            var semesterQry = courseCatalog.Semesters.Where(it => !it.RecLog.DeletedDate.HasValue);
            var unitQry = semesterQry.SelectMany(it => it.Units).Where(it => !it.RecLog.DeletedDate.HasValue);
            var lessonQry = unitQry.SelectMany(it => it.Lessons).Where(it => !it.RecLog.DeletedDate.HasValue);

            var lessonIdRunner = 1;
            var unitIdRunner = 1;
            var semesterNameRunner = (byte)65;
            var semesters = semesterQry.Select(semester => new GetCourseDetailRespond.Semester
            {
                Title = semester.Title,
                Description = semester.Description,
                Name = string.Format("{0}", (char)semesterNameRunner++),
                TotalWeeks = semester.TotalWeeks,
                Units = unitQry.Where(unit => unit.SemesterId == semester.Id).Select(unit => new GetCourseDetailRespond.Unit
                {
                    Title = unit.Title,
                    Description = unit.Description,
                    UnitNo = unitIdRunner++,
                    Lessons = lessonQry.Where(it => it.UnitId == unit.Id).Select(lesson =>
                    {
                        var studentContentQry = lesson.StudentLessonItems
                                .Where(it => !it.RecLog.DeletedDate.HasValue)
                                .Select(it => new GetCourseDetailRespond.LessonContent
                                {
                                    ContentUrl = it.ContentURL,
                                    ImageUrl = it.IconURL,
                                    Description = it.Description,
                                    IsPreviewable = it.IsPreviewable,
                                });
                        return new GetCourseDetailRespond.Lesson
                        {
                            id = lesson.Id.ToString(),
                            Order = lessonIdRunner++,
                            Contents = studentContentQry
                        };
                    }),
                    TotalWeeks = unit.TotalWeeks
                }),
            });

            var relatedCourses = (relatedCourseList ?? Enumerable.Empty<EF.CourseCatalog>())
                .Select(it => new GetCourseDetailRespond.RelatedCourse
                {
                    CourseId = it.Id.ToString(),
                    Name = it.SideName
                });
            var result = new GetCourseDetailRespond
            {
                id = courseCatalog.Id.ToString(),
                CreatedDate = courseCatalog.RecLog.CreatedDate,
                DescriptionImageUrl = courseCatalog.DescriptionImageUrl,
                FullDescription = courseCatalog.FullDescription,
                Grade = courseCatalog.Grade.ToString(),
                GroupName = courseCatalog.GroupName,
                PriceUSD = courseCatalog.PriceUSD,
                Semesters = semesters,
                Series = courseCatalog.Series,
                SideName = courseCatalog.SideName,
                Title = courseCatalog.Title,
                RelatedCourses = relatedCourses,
                TotalWeeks = courseCatalog.TotalWeeks
            };
            return result;
        }
 public async Task<OwnCarousel> GetAds(int id)
 {
     EF.CourseCatalog courseCatalog;
     using (var dctx = new EF.MindSageDataModelsContainer())
     {
         courseCatalog = await dctx.CourseCatalogs
             .Include("Semesters.Units.Lessons.Advertisements")
             .Include("Semesters.Units.Lessons.TopicOfTheDays")
             .FirstOrDefaultAsync(it => it.Id == id);
     }
     if (courseCatalog == null) return null;
     var adsUrls = courseCatalog?.Advertisements?.Split(new string[] { "#;" }, StringSplitOptions.RemoveEmptyEntries) ?? Enumerable.Empty<string>();
     var result = new OwnCarousel
     {
         owl = adsUrls.Select(it => new OwnCarousel.OwnItem
         {
             item = $"<div class='item'><img src='{ it }' /></div>"
         })
     };
     return result;
 }
Exemplo n.º 11
0
        private string generateTeacherCode(License license)
        {
            var teacherKey = string.Empty;
            while (true)
            {
                var courseCatalog = license.CourseCatalog;
                var contract = license.Contract;
                var random = Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 4);
                var rgx = new System.Text.RegularExpressions.Regex("[^a-zA-Z0-9]");
                var safeSchoolName = rgx.Replace(contract.SchoolName, string.Empty);
                const int MaxSchoolNameLength = 10;
                var canUseSchoolMaxLength = safeSchoolName.Length >= MaxSchoolNameLength;
                const int BeginSchoolNameIndex = 0;
                var schoolName = safeSchoolName.Substring(BeginSchoolNameIndex, canUseSchoolMaxLength ? MaxSchoolNameLength : safeSchoolName.Length);
                teacherKey = string.Format("{0:00}{1}{2}{3}{4}", courseCatalog.Grade, contract.State, contract.ZipCode, random, schoolName);

                var canUseTheNewKey = false;
                using (var dctx = new EF.MindSageDataModelsContainer())
                {
                    canUseTheNewKey = !dctx.TeacherKeys
                        .Where(it => !it.RecLog.DeletedDate.HasValue && it.Code == teacherKey)
                        .Any();
                }

                if (canUseTheNewKey) break;
            }

            return teacherKey;
        }
Exemplo n.º 12
0
        public async Task <LessonContentRespond> GetLesson(int id)
        {
            EF.CourseCatalog courseCatalog;
            Lesson           lessonCatalog;

            using (var dctx = new EF.MindSageDataModelsContainer())
            {
                lessonCatalog = await dctx.Lessons
                                .Include("Unit.Semester")
                                .Include("TeacherLessonItems")
                                .Include("TeacherLessonItems")
                                .Include("StudentLessonItems")
                                .Include("PreAssessments.Assessments.Choices")
                                .Include("PostAssessments.Assessments.Choices")
                                .FirstOrDefaultAsync(it => it.Id == id);

                if (lessonCatalog == null)
                {
                    return(null);
                }

                courseCatalog = await dctx.CourseCatalogs
                                .Include("Semesters.Units")
                                .FirstOrDefaultAsync(it => it.Id == lessonCatalog.Unit.Semester.CourseCatalogId);

                if (courseCatalog == null)
                {
                    return(null);
                }
            }

            var semesters      = courseCatalog.Semesters.Where(it => !it.RecLog.DeletedDate.HasValue).OrderBy(it => it.RecLog.CreatedDate);
            var semesterRunner = 65;

            foreach (var item in semesters)
            {
                if (item.Id == lessonCatalog.Unit.SemesterId)
                {
                    break;
                }
                semesterRunner++;
            }

            var units      = semesters.SelectMany(it => it.Units).Where(it => !it.RecLog.DeletedDate.HasValue).OrderBy(it => it.RecLog.CreatedDate);
            var unitRunner = 1;

            foreach (var item in units)
            {
                if (item.Id == lessonCatalog.UnitId)
                {
                    break;
                }
                unitRunner++;
            }
            var teacherItemQry    = createLessonItems(lessonCatalog.TeacherLessonItems);
            var studentItemQry    = createLessonItems(lessonCatalog.StudentLessonItems);
            var preAssessmentQry  = createAssessmentItems(lessonCatalog.PreAssessments);
            var postAssessmentQry = createAssessmentItems(lessonCatalog.PostAssessments);
            var result            = new LessonContentRespond
            {
                //ExtraContents = extraContents,
                CreatedDate     = lessonCatalog.RecLog.CreatedDate,
                IsPreviewable   = lessonCatalog.IsPreviewable,
                SemesterName    = string.Format("{0}", (char)semesterRunner),
                Title           = lessonCatalog.Title,
                Order           = unitRunner,
                TeacherItems    = teacherItemQry,
                StudentItems    = studentItemQry,
                PreAssessments  = preAssessmentQry,
                PostAssessments = postAssessmentQry,
            };

            return(result);
        }
        public async Task<ActionResult> UpdateAllCoursesConfirmed()
        {
            IEnumerable<CourseCatalog> allCourseCatalog;
            using (var dctx = new EF.MindSageDataModelsContainer())
            {
                allCourseCatalog = dctx.CourseCatalogs
                    .Include("Semesters.Units.Lessons.Advertisements")
                    .Include("Semesters.Units.Lessons.TopicOfTheDays")
                    .Include("Semesters.Units.Lessons.TeacherLessonItems")
                    .Include("Semesters.Units.Lessons.StudentLessonItems")
                    .Include("Semesters.Units.Lessons.PreAssessments.Assessments.Choices")
                    .Include("Semesters.Units.Lessons.PostAssessments.Assessments.Choices")
                    .ToList();
            }
            var canUpdateCourses = allCourseCatalog != null && allCourseCatalog.Any();
            if (!canUpdateCourses) return RedirectToAction("Index");

            // TODO: Handle update to MongoDB error
            await updateLessonCatalog(allCourseCatalog);
            await updateCourseCatalog(allCourseCatalog);
            await createPublicClassRooms(allCourseCatalog);
            return RedirectToAction("Index");
        }
 private ImportContentConfiguration updateDatabase(ImportContentViewModel model)
 {
     using (var dctx = new EF.MindSageDataModelsContainer())
     {
         var selectedObj = dctx.ImportContentConfigurations.FirstOrDefault(it => it.Id == model.Id);
         if (selectedObj == null)
         {
             selectedObj = new EF.ImportContentConfiguration
             {
                 BaseURL = model.BaseURL,
                 HomePageURL = model.HomePageURL,
                 PagesURLs = JsonConvert.SerializeObject(model.PagesURLs),
                 ReferenceFileURLs = JsonConvert.SerializeObject(model.ReferenceFileURLs),
                 ReplaceSections = JsonConvert.SerializeObject(model.ReplaceSections),
                 StorageInfo = JsonConvert.SerializeObject(model.StorageInfo),
                 RecLog = new EF.RecordLog { CreatedDate = DateTime.Now }
             };
             dctx.ImportContentConfigurations.Add(selectedObj);
         }
         else
         {
             selectedObj.BaseURL = model.BaseURL;
             selectedObj.HomePageURL = model.HomePageURL;
             selectedObj.PagesURLs = JsonConvert.SerializeObject(model.PagesURLs);
             selectedObj.ReferenceFileURLs = JsonConvert.SerializeObject(model.ReferenceFileURLs);
             selectedObj.ReplaceSections = JsonConvert.SerializeObject(model.ReplaceSections);
             selectedObj.StorageInfo = JsonConvert.SerializeObject(model.StorageInfo);
             selectedObj.RecLog = new EF.RecordLog { CreatedDate = DateTime.Now };
         }
         dctx.SaveChanges();
         return selectedObj;
     }
 }
 public async Task<OwnCarousel> GetAds(int id)
 {
     Lesson lessonCatalog;
     using (var dctx = new EF.MindSageDataModelsContainer())
     {
         lessonCatalog = await dctx.Lessons
             .Include("Advertisements")
             .FirstOrDefaultAsync(it => it.Id == id);
     }
     if (lessonCatalog == null) return null;
     var adsUrls = (lessonCatalog.Advertisements ?? Enumerable.Empty<Advertisement>())
         .Where(it => !it.RecLog.DeletedDate.HasValue)
         .Select(it => it.ImageUrl);
     var result = new OwnCarousel
     {
         owl = adsUrls.Select(it => new OwnCarousel.OwnItem
         {
             item = $"<div class='item'><img src='{ it }' /></div>"
         })
     };
     return result;
 }
        public async Task <GetCourseDetailRespond> GetDetail(int id)
        {
            EF.CourseCatalog courseCatalog;
            var relatedCourseList = Enumerable.Empty <EF.CourseCatalog>();

            using (var dctx = new EF.MindSageDataModelsContainer())
            {
                courseCatalog = await dctx.CourseCatalogs
                                .Include("Semesters.Units.Lessons.Advertisements")
                                .Include("Semesters.Units.Lessons.TopicOfTheDays")
                                .Include("Semesters.Units.Lessons.TeacherLessonItems")
                                .Include("Semesters.Units.Lessons.StudentLessonItems")
                                .Include("Semesters.Units.Lessons.PreAssessments.Assessments.Choices")
                                .Include("Semesters.Units.Lessons.PostAssessments.Assessments.Choices")
                                .FirstOrDefaultAsync(it => it.Id == id);

                if (courseCatalog != null)
                {
                    relatedCourseList = dctx.CourseCatalogs
                                        .Where(it => it.GroupName == courseCatalog.GroupName)
                                        .Where(it => it.Id != courseCatalog.Id)
                                        .Where(it => !it.RecLog.DeletedDate.HasValue)
                                        .ToList();
                }
            }
            if (courseCatalog == null)
            {
                return(null);
            }

            var semesterQry = courseCatalog.Semesters.Where(it => !it.RecLog.DeletedDate.HasValue);
            var unitQry     = semesterQry.SelectMany(it => it.Units).Where(it => !it.RecLog.DeletedDate.HasValue);
            var lessonQry   = unitQry.SelectMany(it => it.Lessons).Where(it => !it.RecLog.DeletedDate.HasValue);

            var lessonIdRunner     = 1;
            var unitIdRunner       = 1;
            var semesterNameRunner = (byte)65;
            var semesters          = semesterQry.Select(semester => new GetCourseDetailRespond.Semester
            {
                Title       = semester.Title,
                Description = semester.Description,
                Name        = string.Format("{0}", (char)semesterNameRunner++),
                TotalWeeks  = semester.TotalWeeks,
                Units       = unitQry.Where(unit => unit.SemesterId == semester.Id).Select(unit => new GetCourseDetailRespond.Unit
                {
                    Title       = unit.Title,
                    Description = unit.Description,
                    UnitNo      = unitIdRunner++,
                    Lessons     = lessonQry.Where(it => it.UnitId == unit.Id).Select(lesson =>
                    {
                        var studentContentQry = lesson.StudentLessonItems
                                                .Where(it => !it.RecLog.DeletedDate.HasValue)
                                                .Select(it => new GetCourseDetailRespond.LessonContent
                        {
                            ContentUrl    = it.ContentURL,
                            ImageUrl      = it.IconURL,
                            Description   = it.Description,
                            IsPreviewable = it.IsPreviewable,
                        });
                        return(new GetCourseDetailRespond.Lesson
                        {
                            id = lesson.Id.ToString(),
                            Order = lessonIdRunner++,
                            Contents = studentContentQry
                        });
                    }),
                    TotalWeeks = unit.TotalWeeks
                }),
            });

            var relatedCourses = (relatedCourseList ?? Enumerable.Empty <EF.CourseCatalog>())
                                 .Select(it => new GetCourseDetailRespond.RelatedCourse
            {
                CourseId = it.Id.ToString(),
                Name     = it.SideName
            });
            var result = new GetCourseDetailRespond
            {
                id                  = courseCatalog.Id.ToString(),
                CreatedDate         = courseCatalog.RecLog.CreatedDate,
                DescriptionImageUrl = courseCatalog.DescriptionImageUrl,
                FullDescription     = courseCatalog.FullDescription,
                Grade               = courseCatalog.Grade.ToString(),
                GroupName           = courseCatalog.GroupName,
                PriceUSD            = courseCatalog.PriceUSD,
                Semesters           = semesters,
                Series              = courseCatalog.Series,
                SideName            = courseCatalog.SideName,
                Title               = courseCatalog.Title,
                RelatedCourses      = relatedCourses,
                TotalWeeks          = courseCatalog.TotalWeeks
            };

            return(result);
        }