public async Task <IActionResult> ChargeACreditCard(PurchaseCourseViewModel model)
        {
            try
            {
                var selectedUserProfile = _userprofileRepo.GetUserProfileById(User.Identity.Name);
                var isUserProfileValid  = selectedUserProfile != null && !selectedUserProfile.DeletedDate.HasValue;
                if (!isUserProfileValid)
                {
                    _logger.LogCritical($"User profile { User.Identity.Name } not found.");
                    ViewBag.ErrorMessage = _errorMsgs.AccountNotFound;
                    return(View("Error"));
                }

                var selectedCourse = _courseCtrl.GetCourseDetail(model.CourseId);
                if (selectedCourse == null)
                {
                    ViewBag.ErrorMessage = _errorMsgs.CourseNotFound;
                    return(View("Error"));
                }

                var selectedClassRoom = _classRoomRepo.GetPublicClassRoomByCourseCatalogId(model.CourseId);
                var isClassRoomValid  = selectedClassRoom != null && !selectedClassRoom.DeletedDate.HasValue;
                if (!isClassRoomValid)
                {
                    _logger.LogCritical($"ClassRoom of CourseId: { model.CourseId } not found.");
                    ViewBag.ErrorMessage = _errorMsgs.SelectedCourseIsNotAvailableForPurchase;
                    return(View("Error"));
                }

                var isAlreadyHaveTheSelectedCourse = !_myCourseCtrl.CanAddNewCourseCatalog(User.Identity.Name, model.CourseId);
                if (isAlreadyHaveTheSelectedCourse)
                {
                    return(RedirectToAction("entercourse", "my", new { @id = model.CourseId }));
                }

                if (ModelState.IsValid)
                {
                    var paymentResult      = Engines.Models.PaymentResult.Unknow;
                    var isPaymentSuccessed = false;
                    var newSubscriptionId  = Guid.NewGuid().ToString();
                    var newPaymentId       = string.Empty;
                    var now = _dateTime.GetCurrentTime();

                    try
                    {
                        // Pay with Paypal
                        paymentResult = _payment.ChargeCreditCard(new Engines.Models.PaymentInformation
                        {
                            Address             = model.PrimaryAddress.Address,
                            City                = model.PrimaryAddress.City,
                            Country             = model.PrimaryAddress.Country.ToString(),
                            PostalCode          = model.PrimaryAddress.ZipCode,
                            State               = model.PrimaryAddress.State,
                            TotalPrice          = selectedCourse.PriceUSD,
                            UserProfileId       = User.Identity.Name,
                            PurchaseForCourseId = model.CourseId,
                            FirstName           = model.CreditCardInfo.FirstName,
                            LastName            = model.CreditCardInfo.LastName,
                            ExpiredYear         = model.CreditCardInfo.ExpiredYear,
                            ExpiredMonth        = model.CreditCardInfo.ExpiredMonth,
                            CVV = model.CreditCardInfo.CVV.ToString(),
                            CreditCardNumber = model.CreditCardInfo.CardNumber,
                            CardType         = model.CreditCardInfo.CardType.ToString()
                        });
                    }
                    catch (Exception e)
                    {
                        _logger.LogError($"Paypal payment error, from user: { User.Identity.Name }, course id: { model.CourseId }, Error: { e.ToString() }");
                        ViewBag.ErrorMessage = _errorMsgs.CanNotChargeACreditCard;
                        return(View("Error"));
                    }
                    finally
                    {
                        isPaymentSuccessed = paymentResult == Engines.Models.PaymentResult.approved;
                        newSubscriptionId  = isPaymentSuccessed ? newSubscriptionId : "None";
                        var payment = createNewPayment(selectedCourse.id, selectedCourse.SideName, newSubscriptionId, model, selectedCourse.PriceUSD, now, isPaymentSuccessed);
                        await _paymentRepo.CreateNewPayment(payment);

                        newPaymentId = payment.id;
                    }

                    if (!isPaymentSuccessed)
                    {
                        ViewBag.ErrorMessage = _errorMsgs.CanNotChargeACreditCard;
                        return(View("Error"));
                    }

                    try
                    {
                        var requestLessonCatalogIds = selectedClassRoom.Lessons.Select(it => it.LessonCatalogId);
                        var lessonCatalogs          = _lessonCatalogRepo.GetLessonCatalogById(requestLessonCatalogIds).ToList();
                        var newClassCalendar        = createClassCalendar(selectedClassRoom, lessonCatalogs, now);
                        newClassCalendar.CalculateCourseSchedule();
                        newClassCalendar.ExpiredDate      = null;
                        selectedUserProfile.Subscriptions = addNewSelfPurchaseSubscription(selectedUserProfile.Subscriptions, selectedClassRoom, newClassCalendar.id, model.CourseId, now, newSubscriptionId);
                        var userActivity = selectedUserProfile.CreateNewUserActivity(selectedClassRoom, newClassCalendar, lessonCatalogs, now);

                        _classCalendarRepo.UpsertClassCalendar(newClassCalendar);
                        _userprofileRepo.UpsertUserProfile(selectedUserProfile);
                        _userActivityRepo.UpsertUserActivity(userActivity);

                        return(RedirectToAction("Finished", new { @id = newPaymentId }));
                    }
                    catch (Exception e)
                    {
                        _logger.LogCritical($"User: '******' already purchased course id: '{ model.CourseId }' with payment id: '{ newPaymentId }' but the system can't create new course.");
                        throw e;
                    }
                }
                return(View(model));
            }
            catch (Exception e)
            {
                _logger.LogError($"MongoDB: { e.ToString() }");
                ViewBag.ErrorMessage = _errorMsgs.CanNotConnectToTheDatabase;
                return(View("Error"));
            }
        }
        public GetCommentRespond Get(string targetUserId, string requestByUserId, string classRoomId)
        {
            var noDataRespond = new GetCommentRespond {
                Comments = Enumerable.Empty <CommentInformation>()
            };
            var areArgumentsValid = !string.IsNullOrEmpty(targetUserId) && !string.IsNullOrEmpty(requestByUserId);

            if (!areArgumentsValid)
            {
                return(noDataRespond);
            }

            var userprofile = _userprofileRepo.GetUserProfileById(requestByUserId);

            if (userprofile == null)
            {
                return(noDataRespond);
            }
            var isTeacher = (bool)userprofile.Subscriptions?.Any(it => !it.DeletedDate.HasValue && it.ClassRoomId == classRoomId && it.Role == UserProfile.AccountRole.Teacher);

            var isSelftRequest = requestByUserId == targetUserId;
            var isFriend       = false;

            if (!isSelftRequest && !isTeacher)
            {
                var friends = _friendRequestRepo.GetFriendRequestByUserProfileId(requestByUserId);
                if (friends == null || !friends.Any())
                {
                    return(noDataRespond);
                }

                isFriend = friends
                           .Where(it => !it.DeletedDate.HasValue)
                           .Where(it => it.Status == FriendRequest.RelationStatus.Friend)
                           .Any(it => it.ToUserProfileId.Equals(targetUserId));

                if (!isFriend && !isSelftRequest)
                {
                    var targetUserProfile = _userprofileRepo.GetUserProfileById(targetUserId);
                    if (requestByUserId == null)
                    {
                        return(noDataRespond);
                    }

                    if (targetUserProfile.IsPrivateAccount)
                    {
                        return new GetCommentRespond {
                                   IsPrivateAccount = true
                        }
                    }
                    ;
                }
            }

            var userComments = _commentRepo.GetCommentsByUserProfileId(targetUserId, classRoomId).ToList();

            if (userComments == null || !userComments.Any())
            {
                return(noDataRespond);
            }

            var selectedClassRoom = _classRoomRepo.GetClassRoomById(classRoomId);

            if (selectedClassRoom == null)
            {
                return(noDataRespond);
            }

            var lessonIds = userComments.Select(it => it.LessonId).Distinct();

            var lessonQry = from it in selectedClassRoom.Lessons
                            where it != null
                            where lessonIds.Contains(it.id)
                            select new
            {
                LessonId        = it.id,
                LessonCatalogId = it.LessonCatalogId,
                LessonCatalog   = _lessonCatalogRepo.GetLessonCatalogById(it.LessonCatalogId)
            };
            var lessons = lessonQry.Where(it => it.LessonCatalog != null).ToList();

            var comments = userComments
                           .Where(it => lessons.Any(lesson => lesson.LessonId == it.LessonId))
                           .Select(it =>
            {
                var selectedLessonCatalog = lessons.FirstOrDefault(l => l.LessonId == it.LessonId);
                if (selectedLessonCatalog == null)
                {
                    return(null);
                }
                var order = 1;
                return(new CommentInformation
                {
                    ClassRoomId = it.ClassRoomId,
                    CreatedByUserProfileId = it.CreatedByUserProfileId,
                    CreatedDate = it.CreatedDate,
                    CreatorDisplayName = it.CreatorDisplayName,
                    CreatorImageUrl = it.CreatorImageUrl,
                    Description = it.Description,
                    id = it.id,
                    Order = order++,
                    LessonId = it.LessonId,
                    LessonWeek = selectedLessonCatalog.LessonCatalog.Order,
                    TotalDiscussions = it.Discussions.Where(dc => !dc.DeletedDate.HasValue).Count(),
                    TotalLikes = it.TotalLikes
                });
            })
                           .Where(it => it != null)
                           .OrderByDescending(it => it.LessonWeek)
                           .ThenByDescending(it => it.CreatedDate)
                           .ToList();

            var canCreateADiscussion = isFriend || isSelftRequest || isTeacher;

            return(new GetCommentRespond
            {
                IsDiscussionAvailable = canCreateADiscussion,
                Comments = comments
            });
        }

        #endregion Methods

        //// GET: api/journal
        //public IEnumerable<string> Get()
        //{
        //    return new string[] { "value1", "value2" };
        //}

        //// GET: api/journal/5
        //public string Get(int id)
        //{
        //    return "value";
        //}

        //// POST: api/journal
        //public void Post([FromBody]string value)
        //{
        //}

        //// PUT: api/journal/5
        //public void Put(int id, [FromBody]string value)
        //{
        //}

        //// DELETE: api/journal/5
        //public void Delete(int id)
        //{
        //}
    }
        public LessonContentRespond Get(string id, string classRoomId, string userId)
        {
            var areArgumentsValid = !string.IsNullOrEmpty(id) &&
                                    !string.IsNullOrEmpty(classRoomId) &&
                                    !string.IsNullOrEmpty(userId);

            if (!areArgumentsValid)
            {
                return(null);
            }

            UserProfile userprofile;
            var         canAccessToTheClassRoom = _userprofileRepo.CheckAccessPermissionToSelectedClassRoom(userId, classRoomId, out userprofile);

            if (!canAccessToTheClassRoom)
            {
                return(null);
            }

            var subscription = userprofile.Subscriptions
                               .Where(it => !it.DeletedDate.HasValue)
                               .Where(it => it.ClassRoomId.Equals(classRoomId, StringComparison.CurrentCultureIgnoreCase))
                               .FirstOrDefault();

            var now = _dateTime.GetCurrentTime();
            var canAccessToTheClassLesson = _classCalendarRepo.CheckAccessPermissionToSelectedClassLesson(classRoomId, id, now);

            if (!canAccessToTheClassLesson)
            {
                return(null);
            }

            var selectedClassRoom = _classRoomRepo.GetClassRoomById(classRoomId);

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

            var selectedLesson = selectedClassRoom.Lessons.FirstOrDefault(it => it.id.Equals(id, StringComparison.CurrentCultureIgnoreCase));

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

            var selectedLessonCatalog = _lessonCatalogRepo.GetLessonCatalogById(selectedLesson.LessonCatalogId);

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

            var selectedUserActivity = _userActivityRepo.GetUserActivityByUserProfileIdAndClassRoomId(userId, classRoomId);

            if (selectedUserActivity == null)
            {
                return(null);
            }
            var selectedLessonActivity = selectedUserActivity.LessonActivities.FirstOrDefault(it => it.LessonId.Equals(id, StringComparison.CurrentCultureIgnoreCase));

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

            var selectedSubscription = userprofile.Subscriptions.FirstOrDefault(it => it.ClassRoomId == classRoomId);

            if (selectedSubscription == null)
            {
                return(null);
            }
            selectedSubscription.LastActiveDate = now;
            _userprofileRepo.UpsertUserProfile(userprofile);

            var shouldUpdateSawPrimaryContent = !selectedLessonActivity.SawContentIds.Contains(selectedLessonCatalog.PrimaryContentURL);

            if (shouldUpdateSawPrimaryContent)
            {
                var sawList = selectedLessonActivity.SawContentIds.ToList();
                sawList.Add(selectedLessonCatalog.PrimaryContentURL);
                selectedLessonActivity.SawContentIds = sawList;
                _userActivityRepo.UpsertUserActivity(selectedUserActivity);
            }

            var isTeacher           = subscription.Role == UserProfile.AccountRole.Teacher;
            var isDisplayTeacherMsg = selectedUserActivity.HideClassRoomMessageDate.HasValue ?
                                      selectedClassRoom.LastUpdatedMessageDate > selectedUserActivity.HideClassRoomMessageDate.Value :
                                      true;

            return(new LessonContentRespond
            {
                Advertisments = selectedLessonCatalog.Advertisments,
                CourseCatalogId = selectedLessonCatalog.CourseCatalogId,
                CreatedDate = selectedLessonCatalog.CreatedDate,
                ExtraContentUrls = selectedLessonCatalog.ExtraContentUrls,
                FullDescription = selectedLessonCatalog.FullDescription,
                FullTeacherLessonPlan = isTeacher ? selectedLessonCatalog.FullTeacherLessonPlan : string.Empty,
                id = id,
                Order = selectedLessonCatalog.Order,
                PrimaryContentURL = selectedLessonCatalog.PrimaryContentURL,
                SemesterName = selectedLessonCatalog.SemesterName,
                ShortDescription = selectedLessonCatalog.ShortDescription,
                ShortTeacherLessonPlan = isTeacher ? selectedLessonCatalog.ShortTeacherLessonPlan : string.Empty,
                Title = selectedLessonCatalog.Title,
                UnitNo = selectedLessonCatalog.UnitNo,
                CourseMessage = isDisplayTeacherMsg ? selectedClassRoom.Message : null,
                IsTeacher = isTeacher,
                TotalLikes = selectedLesson.TotalLikes
            });
        }
示例#4
0
        public AddCourseRespond AddCourse(AddCourseRequest body)
        {
            var addCourseFailRespond = new AddCourseRespond
            {
                Code  = body.Code,
                Grade = body.Grade,
            };
            var areArgumentsValid = body != null &&
                                    !string.IsNullOrEmpty(body.UserProfileId) &&
                                    !string.IsNullOrEmpty(body.Code) &&
                                    !string.IsNullOrEmpty(body.Grade);

            if (!areArgumentsValid)
            {
                return(addCourseFailRespond);
            }

            var selectedStudentKey = _studentKeyRepo.GetStudentKeyByCodeAndGrade(body.Code, body.Grade);

            if (selectedStudentKey == null)
            {
                return(addCourseFailRespond);
            }

            var selectedClassRoom = _classRoomRepo.GetClassRoomById(selectedStudentKey.ClassRoomId);

            if (selectedClassRoom == null)
            {
                return(addCourseFailRespond);
            }

            var selectedClassCalendar = _classCalendarRepo.GetClassCalendarByClassRoomId(selectedStudentKey.ClassRoomId);

            if (selectedClassCalendar == null)
            {
                return(addCourseFailRespond);
            }

            var selectedUserProfile = _userprofileRepo.GetUserProfileById(body.UserProfileId);
            var canUseTheCode       = selectedUserProfile != null &&
                                      selectedUserProfile.Subscriptions != null &&
                                      selectedUserProfile.Subscriptions.All(it => it.ClassRoomId != selectedStudentKey.ClassRoomId);

            if (!canUseTheCode)
            {
                return(addCourseFailRespond);
            }

            var lessonCatalogs = selectedClassRoom.Lessons
                                 .Select(it => _lessonCatalogRepo.GetLessonCatalogById(it.LessonCatalogId))
                                 .ToList();

            if (lessonCatalogs.Any(it => it == null))
            {
                return(addCourseFailRespond);
            }

            var now           = _dateTime.GetCurrentTime();
            var subscriptions = selectedUserProfile.Subscriptions.ToList();

            subscriptions.Add(new UserProfile.Subscription
            {
                id              = Guid.NewGuid().ToString(),
                Role            = UserProfile.AccountRole.Student,
                LastActiveDate  = now,
                ClassRoomId     = selectedClassRoom.id,
                ClassCalendarId = selectedClassCalendar.id,
                CreatedDate     = now,
                ClassRoomName   = selectedClassRoom.Name,
                CourseCatalogId = selectedClassRoom.CourseCatalogId
            });
            selectedUserProfile.Subscriptions = subscriptions;
            _userprofileRepo.UpsertUserProfile(selectedUserProfile);

            const int PrimaryContent   = 1;
            var       lessonActivities = selectedClassRoom.Lessons.Select(lesson =>
            {
                var selectedLessonCalendar = selectedClassCalendar.LessonCalendars
                                             .Where(it => !it.DeletedDate.HasValue)
                                             .FirstOrDefault(lc => lc.LessonId == lesson.id);

                var selectedLessonCatalog = lessonCatalogs
                                            .FirstOrDefault(it => it.id == lesson.LessonCatalogId);

                return(new UserActivity.LessonActivity
                {
                    id = Guid.NewGuid().ToString(),
                    BeginDate = selectedLessonCalendar.BeginDate,
                    TotalContentsAmount = selectedLessonCatalog.ExtraContentUrls.Count() + PrimaryContent,
                    LessonId = lesson.id,
                    SawContentIds = Enumerable.Empty <string>()
                });
            }).ToList();

            var userActivity = new UserActivity
            {
                id = Guid.NewGuid().ToString(),
                UserProfileName     = selectedUserProfile.Name,
                UserProfileImageUrl = selectedUserProfile.ImageProfileUrl,
                UserProfileId       = selectedUserProfile.id,
                ClassRoomId         = selectedClassRoom.id,
                CreatedDate         = now,
                LessonActivities    = lessonActivities
            };

            _userActivityRepo.UpsertUserActivity(userActivity);

            return(new AddCourseRespond
            {
                Code = body.Code,
                Grade = body.Grade,
                IsSuccess = true
            });
        }
        public LessonContentRespond Get(string id, string classRoomId, string userId)
        {
            var areArgumentsValid = !string.IsNullOrEmpty(id) &&
                                    !string.IsNullOrEmpty(classRoomId) &&
                                    !string.IsNullOrEmpty(userId);

            if (!areArgumentsValid)
            {
                return(null);
            }

            UserProfile userprofile;
            var         canAccessToTheClassRoom = _userprofileRepo.CheckAccessPermissionToSelectedClassRoom(userId, classRoomId, out userprofile);

            if (!canAccessToTheClassRoom)
            {
                return(null);
            }

            var subscriptions = userprofile.Subscriptions
                                .Where(it => !it.DeletedDate.HasValue)
                                .Where(it => it.ClassRoomId.Equals(classRoomId, StringComparison.CurrentCultureIgnoreCase));

            if (!subscriptions.Any())
            {
                return(null);
            }
            var now       = _dateTime.GetCurrentTime();
            var isTeacher = subscriptions.Any(it => it.Role == UserProfile.AccountRole.Teacher);
            var canAccessToTheClassLesson = _classCalendarRepo.CheckAccessPermissionToSelectedClassLesson(classRoomId, id, now, isTeacher);

            if (!canAccessToTheClassLesson)
            {
                return(null);
            }

            var selectedClassRoom = _classRoomRepo.GetClassRoomById(classRoomId);
            var isClassRoomValid  = selectedClassRoom != null && !selectedClassRoom.DeletedDate.HasValue;

            if (!isClassRoomValid)
            {
                return(null);
            }

            var selectedLesson = selectedClassRoom.Lessons.FirstOrDefault(it => it.id.Equals(id, StringComparison.CurrentCultureIgnoreCase));

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

            var selectedLessonCatalog = _lessonCatalogRepo.GetLessonCatalogById(selectedLesson.LessonCatalogId);

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

            var selectedUserActivity = _userActivityRepo.GetUserActivityByUserProfileIdAndClassRoomId(userId, classRoomId);
            var isUserActivityValid  = selectedUserActivity != null && !selectedUserActivity.DeletedDate.HasValue;

            if (!isUserActivityValid)
            {
                return(null);
            }
            var selectedLessonActivity = selectedUserActivity.LessonActivities.FirstOrDefault(it => it.LessonId.Equals(id, StringComparison.CurrentCultureIgnoreCase));

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

            var selectedSubscription = userprofile.Subscriptions.FirstOrDefault(it => it.ClassRoomId == classRoomId);

            if (selectedSubscription == null)
            {
                return(null);
            }
            selectedSubscription.LastActiveDate = now;
            _userprofileRepo.UpsertUserProfile(userprofile);

            var shouldUpdateSawPrimaryContent = !selectedLessonActivity.SawContentIds.Contains(selectedLessonCatalog.id);

            if (shouldUpdateSawPrimaryContent)
            {
                var sawList = selectedLessonActivity.SawContentIds.ToList();
                sawList.Add(selectedLessonCatalog.id);
                selectedLessonActivity.SawContentIds = sawList;
                _userActivityRepo.UpsertUserActivity(selectedUserActivity);
            }

            var isDisplayTeacherMsg = selectedUserActivity.HideClassRoomMessageDate.HasValue ?
                                      selectedClassRoom.LastUpdatedMessageDate > selectedUserActivity.HideClassRoomMessageDate.Value :
                                      true;

            var result = new LessonContentRespond
            {
                id              = id,
                Order           = selectedLessonCatalog.Order,
                SemesterName    = selectedLessonCatalog.SemesterName,
                UnitNo          = selectedLessonCatalog.UnitNo,
                CourseCatalogId = selectedLessonCatalog.CourseCatalogId,
                Title           = selectedLessonCatalog.Title,
                CreatedDate     = selectedLessonCatalog.CreatedDate,
                Advertisments   = selectedLessonCatalog.Advertisments,
                CourseMessage   = isDisplayTeacherMsg ? selectedClassRoom.Message : null,
                IsTeacher       = isTeacher,
                TotalLikes      = selectedLesson.TotalLikes,
                StudentItems    = selectedLessonCatalog.StudentItems ?? Enumerable.Empty <LessonCatalog.LessonItem>(),
                TeacherItems    = selectedLessonCatalog.TeacherItems ?? Enumerable.Empty <LessonCatalog.LessonItem>(),
                PostAssessments = selectedLessonCatalog.PostAssessments ?? Enumerable.Empty <LessonCatalog.AssessmentItem>(),
                PreAssessments  = selectedLessonCatalog.PreAssessments ?? Enumerable.Empty <LessonCatalog.AssessmentItem>(),
            };

            result.StudentItems    = result.StudentItems.OrderBy(it => it.Order);
            result.TeacherItems    = result.TeacherItems.OrderBy(it => it.Order);
            result.PostAssessments = result.PostAssessments.OrderBy(it => it.Order);
            result.PreAssessments  = result.PreAssessments.OrderBy(it => it.Order);
            return(result);
        }