예제 #1
0
        public CourseSubscription UpdateCourseSubscription(CourseSubscription subscription)
        {
            unitOfWork.CourseSubscriptions.Update(subscription);
            unitOfWork.Save();

            return(subscription);
        }
예제 #2
0
        public SubscriptionStatus GetSubscriptionStatus(string username, int courseId)
        {
            User user = _users.All().FirstOrDefault(x => x.Username == username);

            if (user == null)
            {
                throw new UserNotFoundException(username);
            }

            Course course = _courses.GetById(courseId);

            if (course == null)
            {
                throw new CourseNotFoundException(courseId);
            }

            CourseSubscription subscription = _courseSubscriptions.All().FirstOrDefault(x => x.UserId == user.Id && x.CourseId == courseId);

            if (subscription != null)
            {
                return(subscription.Status);
            }

            return(SubscriptionStatus.None);
        }
예제 #3
0
        public SubscriptionStatus JoinCourse(string username, int courseId)
        {
            User   user   = _usersService.GetByUsername(username);
            Course course = _courses.GetById(courseId);

            if (user == null)
            {
                throw new UserNotFoundException(username);
            }

            if (course == null)
            {
                throw new CourseNotFoundException(courseId);
            }

            CourseSubscription subscription = _courseSubscriptions.All().FirstOrDefault(x => x.UserId == user.Id && x.CourseId == courseId);

            if (subscription == null)
            {
                bool isPaidCourse = _coursesService.IsPaidCourse(course);
                subscription = new CourseSubscription
                {
                    UserId        = user.Id,
                    CourseId      = courseId,
                    RequestedDate = DateTime.Now
                };

                if (isPaidCourse)
                {
                    subscription.Status           = SubscriptionStatus.AwaitingPayment;
                    subscription.SubscriptionType = SubscriptionType.Paid;

                    subscription.Order = _ordersService.Generate(course, user);
                }
                else
                {
                    subscription.Status           = SubscriptionStatus.Active;
                    subscription.SubscriptionType = SubscriptionType.Free;
                    subscription.ApprovedDate     = DateTime.Now;
                }

                _courseSubscriptions.Add(subscription);
                //TODO implement proper Unit of Work
                _courseSubscriptions.SaveChanges();
                string courseUrl        = _routeProvider.GetCourseRoute(subscription.CourseId);
                string coursePictureUrl = _routeProvider.GetCoursePictureRoute(subscription.CourseId);
                if (isPaidCourse)
                {
                    _messageService.SendPaidCourseSignUpMessage(user, course, subscription, courseUrl, coursePictureUrl);
                }
                else
                {
                    _messageService.SendFreeCourseSignUpMessage(user, course, courseUrl, coursePictureUrl);
                }
            }

            return(subscription.Status);
        }
예제 #4
0
        public async Task <ActionResult> DeleteConfirmed(int subscriptionId, int courseId)
        {
            CourseSubscription courseSubscription = await GetCourseSubscription(subscriptionId, courseId);

            db.CourseSubscriptions.Remove(courseSubscription);
            await db.SaveChangesAsync();

            return(RedirectToAction("Index"));
        }
예제 #5
0
        public async Task <ActionResult> Create([Bind(Include = "CourseId,SubscriptionId")] CourseSubscription courseSubscription)
        {
            if (ModelState.IsValid)
            {
                db.CourseSubscriptions.Add(courseSubscription);
                await db.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }

            return(View(courseSubscription));
        }
예제 #6
0
        public void SendPaidCourseSignUpMessage(User user, Course course, CourseSubscription subscription, string courseUrl, string coursePictureUrl)
        {
            MessageTemplate template = _templateProvider.GetPaidCourseSignUpTemplate();

            template.Body = template.Body.Replace("{{firstName}}", user.FirstName);
            template.Body = template.Body.Replace("{{courseName}}", course.Title);
            template.Body = template.Body.Replace("{{courseShortDescription}}", course.Description);
            template.Body = template.Body.Replace("{{coursePrice}}", course.Price?.ToString());
            template.Body = template.Body.Replace("/{{courseUrl}}", courseUrl);
            template.Body = template.Body.Replace("/{{courseImageUrl}}", coursePictureUrl);
            template.Body = template.Body.Replace("{{subscriptionNumber}}", subscription.Id.ToString());
            _emailService.SendMail(user.Username, template.Subject, template.Body);
        }
예제 #7
0
        public async Task <ActionResult> Edit([Bind(Include = "CourseId,SubscriptionId,OldCourseId,OldSubscriptionId")] CourseSubscription courseSubscription)
        {
            if (ModelState.IsValid)
            {
                var canChange = await courseSubscription.CanChange(db);

                if (canChange)
                {
                    await courseSubscription.Change(db);
                }
                return(RedirectToAction("Index"));
            }
            return(View(courseSubscription));
        }
예제 #8
0
        public static async Task <bool> CanChange(
            this CourseSubscription courseSubscriptions,
            ApplicationDbContext db)
        {
            var oldCS = await db.CourseSubscriptions.CountAsync(sp =>
                                                                sp.CourseId.Equals(courseSubscriptions.OldCourseId) &&
                                                                sp.SubscriptionId.Equals(courseSubscriptions.OldSubscriptionId));

            var newCS = await db.CourseSubscriptions.CountAsync(sp =>
                                                                sp.CourseId.Equals(courseSubscriptions.CourseId) &&
                                                                sp.SubscriptionId.Equals(courseSubscriptions.SubscriptionId));

            return(oldCS.Equals(1) && newCS.Equals(0));
        }
예제 #9
0
        // GET: Admin/CourseSubscription/Edit/5
        public async Task <ActionResult> Edit(int?subscriptionId, int?courseId)
        {
            if (subscriptionId == null || courseId == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            CourseSubscription courseSubscription = await GetCourseSubscription(subscriptionId, courseId);

            if (courseSubscription == null)
            {
                return(HttpNotFound());
            }
            return(View(await courseSubscription.Convert(db)));
        }
        public ActionResult AddPayment(int subscriptionId)
        {
            CourseSubscription subscription = _subscriptions.AllIncluding(x => x.Course).FirstOrDefault(x => x.Id == subscriptionId);

            if (subscription == null)
            {
                return(HttpNotFound());
            }

            ViewBag.SubscriptionName = subscription.Course.Title;

            return(View(new PaymentEditViewModel {
                SubscriptionId = subscriptionId
            }));
        }
예제 #11
0
        public CourseSubscriptionDTO ConvertToCourseSubscriptionDTO(CourseSubscription subscription)
        {
            if (subscription != null)
            {
                return(new CourseSubscriptionDTO
                {
                    Id = subscription.Id,
                    Rating = subscription.Rating,
                    UserLogin = subscription.User?.UserName,
                    CourseId = subscription.CourseId
                });
            }

            return(null);
        }
예제 #12
0
        public static async Task <CourseSubscriptionModel> Convert(
            this CourseSubscription courseSubscription,
            ApplicationDbContext db, bool addListData = true)
        {
            var model = new CourseSubscriptionModel
            {
                SubscriptionId    = courseSubscription.SubscriptionId,
                CourseId          = courseSubscription.CourseId,
                Subscriptions     = addListData ? await db.Subscriptions.ToListAsync() : null,
                courses           = addListData ? await db.Courses.ToListAsync() : null,
                SubscriptionTitle = (await db.Subscriptions.FirstOrDefaultAsync(s =>
                                                                                s.Id.Equals(courseSubscription.SubscriptionId))).Title,
                CourseTitle = (await db.Courses.FirstOrDefaultAsync(p =>
                                                                    p.Id.Equals(courseSubscription.CourseId))).Title
            };

            return(model);
        }
        public ActionResult AwaitingPayment(string courseNiceUrl)
        {
            Course             course       = _coursesContent.GetCourseByNiceUrl(courseNiceUrl);
            string             username     = User.Identity.Name;
            CourseSubscription subscription = _subscriptions.GetSubscription(username, course.Id);

            if (subscription.Status != SubscriptionStatus.AwaitingPayment)
            {
                return(Redirect("/"));
            }

            AwaitingPaymentViewModel viewModel = new AwaitingPaymentViewModel
            {
                CourseName     = course.Title,
                SubscriptionId = subscription.Id,
                CoursePrice    = course.Price
            };

            return(View(viewModel));
        }
예제 #14
0
        public CourseSubscription CreateCourseSubscription(string userLogin, int courseId)
        {
            var subscription = unitOfWork.CourseSubscriptions.GetAll()
                               .FirstOrDefault(x => x.User.UserName == userLogin &&
                                               x.CourseId == courseId);

            if (subscription == null)
            {
                var course = unitOfWork.Courses.Get(courseId);
                subscription = new CourseSubscription
                {
                    Rating = -1,
                    User   = unitOfWork.Users.FindByName(userLogin),
                    Course = course
                };
                unitOfWork.CourseSubscriptions.Create(subscription);
                unitOfWork.Save();
            }

            return(subscription);
        }
예제 #15
0
        public void AddPayment(Payment payment)
        {
            _payments.Add(payment);
            //TODO UoW
            _payments.SaveChanges();
            CourseSubscription subscription = _courseSubscriptions.GetById(payment.SubscriptionId);

            subscription.ApprovedDate = DateTime.Now;
            subscription.Status       = SubscriptionStatus.Active;
            var order = subscription.Order;

            order.Payment = payment;
            order.Status  = OrderStatusType.Completed;
            _courseSubscriptions.Update(subscription);
            //TODO implement proper UoW pattern
            _courseSubscriptions.SaveChanges();

            string courseUrl        = _routeProvider.GetCourseRoute(subscription.CourseId);
            string coursePictureUrl = _routeProvider.GetCoursePictureRoute(subscription.CourseId);

            _messageService.SendPaymentApprovedMessage(subscription.User, subscription.Course, payment, courseUrl, coursePictureUrl);
        }
예제 #16
0
        public static async Task Change(
            this CourseSubscription courseSubscriptions,
            ApplicationDbContext db)
        {
            var oldCourseSubscription = await db.CourseSubscriptions.FirstOrDefaultAsync(
                sp => sp.CourseId.Equals(courseSubscriptions.OldCourseId) &&
                sp.SubscriptionId.Equals(courseSubscriptions.OldSubscriptionId));

            var newCourseSubscription = await db.CourseSubscriptions.FirstOrDefaultAsync(
                sp => sp.CourseId.Equals(courseSubscriptions.CourseId) &&
                sp.SubscriptionId.Equals(courseSubscriptions.SubscriptionId));

            if (oldCourseSubscription != null && newCourseSubscription == null)
            {
                newCourseSubscription = new CourseSubscription
                {
                    SubscriptionId = courseSubscriptions.SubscriptionId,
                    CourseId       = courseSubscriptions.CourseId
                };

                using (var transaction = new TransactionScope(
                           TransactionScopeAsyncFlowOption.Enabled))
                {
                    try
                    {
                        db.CourseSubscriptions.Remove(oldCourseSubscription);
                        db.CourseSubscriptions.Add(newCourseSubscription);

                        await db.SaveChangesAsync();

                        transaction.Complete();
                    }
                    catch { transaction.Dispose(); }
                }
            }
        }
 public void SendPaidCourseSignUpMessage(User user, Course course, CourseSubscription subscription, string courseUrl, string coursePictureUrl)
 {
     _taskRunner.Run <IMessageService>(x => x.SendPaidCourseSignUpMessage(user, course, subscription, courseUrl, coursePictureUrl));
 }