コード例 #1
0
        public async Task<ActionResult> SendNotification(NotificationBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                var errorList = ModelState.Values.SelectMany(m => m.Errors)
                                 .Select(e => e.ErrorMessage)
                                 .ToList(); 

                return new HttpStatusCodeResult(400, string.Join("\n", errorList));
            }

            NotificationType type = (NotificationType)model.NotificationType;

            var notification = new Notification()
            {
                Content = model.Content,
                Type = type,
                SendOn = DateTime.Now
            };

            var template = System.IO.File.ReadAllText(Path.Combine(
                    AppDomain.CurrentDomain.BaseDirectory,
                    @"Views\RazorEngine\_PagedNotificationViewModel.cshtml"));
            var renderedPartialView = Razor.Parse(template, 
                Mapper.Map<Notification, PagedNotificationViewModel>(notification));

            var hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationsHub>();
            hubContext.Clients.All.receiveNotification(renderedPartialView);

            hubContext.Clients.All.receiveNotificationCount();

            var allUsers = this.Data.Users.All();

            foreach (var user in allUsers)
            {
                var n = new Notification()
                {
                    Content = model.Content,
                    Type = type,
                    SendOn = DateTime.Now,
                    User = user
                };

                user.Notifications.Add(n);
            }

            this.Data.SaveChanges();  

            return new HttpStatusCodeResult(200, "Notification sent succssesfully.");
        }
コード例 #2
0
        public ActionResult Create(NotificationInputModel notification)
        {
            if (ModelState.IsValid)
            {
                var newNotification = new Notification()
                {
                    SenderId = this.UserProfile.Id,
                    ReceiverId = notification.RecieverId,
                    ContestId = notification.ContestId,
                };

                this.Data.Notifications.Add(newNotification);

                this.Data.SaveChanges();
            }
            return new EmptyResult();
        }
コード例 #3
0
        public ActionResult Pause(int contestId)
        {
            var contest = this.Data.Contests.Find(contestId);
            if (contest == null)
            {
                HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.NotFound);
                message.Content = new StringContent(Messages.ContestNotFound);
                throw new System.Web.Http.HttpResponseException(message);
            }

            if (contest.OwnerId != this.User.Identity.GetUserId() && !this.User.IsInRole("Administrator"))
            {
                HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.Unauthorized);
                message.Content = new StringContent(Messages.NotOwnerOfContest);
                throw new System.Web.Http.HttpResponseException(message);
            }

            if (contest.Status != ContestStatus.Active)
            {
                this.TempData["message"] = Messages.ContestCannotBePaused;
                return this.RedirectToAction("GetContestById", new { id = contestId });
            }

            contest.Status = ContestStatus.Inactive;
            var notification = new Notification()
            {
                CreatedOn = DateTime.Now,
                IsRead = false,
                Content = string.Format(Messages.ContestWasPaused, contest.Title),
                RecipientId = contest.OwnerId,
            };
            this.Data.Notifications.Add(notification);
            this.Data.SaveChanges();

            this.TempData["message"] = Messages.ContestPaused;
            return this.RedirectToAction("GetContestById", new { id = contestId });
        }
コード例 #4
0
        public ActionResult GetContestById(int id)
        {
            var dbContest = this.Data.Contests.Find(id);
            var contest = Mapper.Map<DetailsContestViewModel>(dbContest);

            if (contest == null)
            {
                HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.NotFound);
                message.Content = new StringContent(Messages.ContestNotFound);
                throw new System.Web.Http.HttpResponseException(message);
            }

            ICollection<ContestWinnerViewModel> contestWinners = null;
            if (dbContest.Status == ContestStatus.Finished)
            {
                contestWinners = this.GetContestWinners(dbContest);
            }

            if ((contest.Status == ContestStatus.Active || contest.Status == ContestStatus.Inactive) &&
                contest.EndDate.AddDays(1.0) < DateTime.Now)
            {
                dbContest.Status = ContestStatus.Finished;
                var notification = new Notification()
                {
                    Content = string.Format(
                        Messages.ContestFinished,
                        contest.Title),
                    RecipientId = dbContest.Owner.Id,
                    CreatedOn = DateTime.Now,
                    IsRead = false,
                };
                this.Data.Notifications.Add(notification);
                this.Data.SaveChanges();

                contestWinners = this.GetContestWinners(dbContest);

                foreach (var winner in contestWinners)
                {
                    var noty = new Notification()
                    {
                        Content = string.Format(
                            Messages.PictureWonPrize,
                            winner.Picture.Title ?? "(not available)",
                            winner.PrizeName,
                            contest.Title),
                        RecipientId = winner.WinnerId,
                        CreatedOn = DateTime.Now,
                        IsRead = false,
                    };
                    this.Data.Notifications.Add(notification);
                }
                this.Data.SaveChanges();
            }

            var userId = this.User.Identity.GetUserId();
            var user = this.Data.Users.Find(userId);

            if (userId != null && dbContest.Owner.Id == userId)
            {
                contest.IsOwner = true;
            }

            if (userId != null && dbContest.ParticipationType == ParticipationType.Open ||
                dbContest.Participants.Any(p => p.Id == userId))
            {
                contest.CanParticipate = true;
            }

            if (userId != null && dbContest.ParticipationType == ParticipationType.Closed &&
                !dbContest.Candidates.Any(p => p.Id == userId) &&
                !dbContest.Participants.Any(p => p.Id == userId))
            {
                contest.CanApply = true;
            }

            var fullContestModel = new FullContestViewModel()
            {
                ContestSummary = contest,
                Winners = contestWinners,
            };

            return this.View(fullContestModel);
        }
コード例 #5
0
        public ActionResult Create(CreateContestBindingModel model)
        {
            if (!this.ModelState.IsValid)
            {
                return this.View(model);
            }

            var loggedUserId = this.User.Identity.GetUserId();

            string thumbnailImageData = "";
            try
            {
                var image = PictureUtills.CreateImageFromBase64(model.Thumbnail);
                var thumbnail = PictureUtills.CreateThumbnailFromImage(image, 316);
                thumbnailImageData = PictureUtills.ConvertImageToBase64(thumbnail);
            }
            catch (Exception ex)
            {
                thumbnailImageData = model.Thumbnail;
            }

            var contest = new Contest()
            {
                Title = model.Title,
                Description = model.Description,
                StartDate = model.StartDate,
                EndDate = model.EndDate,
                OwnerId = loggedUserId,
                VotingType = model.VotingType,
                ParticipationType = model.ParticipationType,
                DeadlineType = model.DeadlineType,
                Picture = model.Thumbnail,
                Thumbnail = thumbnailImageData,
                Status = model.StartDate < DateTime.Now ? ContestStatus.Active : ContestStatus.Inactive,
            };

            if (contest.DeadlineType == DeadlineType.ParticipationLimit)
            {
                contest.ParticipationLimit = model.ParticipationLimit;
            }

            this.Data.Contests.Add(contest);
            this.Data.SaveChanges();

            if (model.VotingType == VotingType.Closed)
            {
                contest.Jury = new VotingCommittee();
                contest.Jury.ContestId = contest.Id;
            }

            foreach (var prize in model.Prizes)
            {
                var dbPrize = new Prize()
                {
                    Name = prize.Name,
                    Description = prize.Description,
                    ContestId = contest.Id,
                };
                contest.Prizes.Add(dbPrize);
            }

            this.Data.SaveChanges();

            var members = this.Data.Users.All().ToList();
            foreach (var member in members)
            {
                var notification = new Notification()
                {
                    RecipientId = member.Id,
                    Content = string.Format(
                        Messages.NewContest,
                        contest.Title,
                        contest.StartDate),
                    CreatedOn = DateTime.Now,
                    IsRead = false,
                };
                this.Data.Notifications.Add(notification);
            }
            this.Data.SaveChanges();

            var hubContext = GlobalHost.ConnectionManager.GetHubContext<ContestsHub>();
            hubContext.Clients.All.receiveMessage(contest.Id);

            return this.RedirectToAction("Contests", "Me");
        }
コード例 #6
0
        public ActionResult Apply(int contestId)
        {
            var contest = this.Data.Contests.Find(contestId);
            if (contest == null)
            {
                throw new System.Web.Http.HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
            }

            var user = this.Data.Users.Find(this.User.Identity.GetUserId());
            if (contest.Candidates.Any(u => u.Id == user.Id))
            {
                this.TempData["message"] = Messages.UserAlreadyAppliedToParticipate;
                return this.RedirectToAction("GetContestById", new { id = contestId });
            }

            if (contest.Participants.Any(u => u.Id == user.Id))
            {
                this.TempData["message"] = Messages.UserAlreadyApprovedToParticipate;
                return this.RedirectToAction("GetContestById", new { id = contestId });
            }

            contest.Candidates.Add(user);
            var notification = new Notification()
            {
                RecipientId = contest.Owner.Id,
                CreatedOn = DateTime.Now,
                Content = string.Format("Member {0} applied to participate in the contest '{1}'. Please, go to contest page to process his/her application.",
                    user.UserName, contest.Title)
            };
            this.Data.Notifications.Add(notification);
            this.Data.SaveChanges();

            this.TempData["message"] = string.Format(Messages.SuccessfulyAppliedToContest, contest.Title);
            return this.RedirectToAction("GetContestById", new { id = contestId });
        }
コード例 #7
0
        private int Vote(int pictureId, int contestId, bool vote = true)
        {
            var picture = this.Data.Pictures.Find(pictureId);
            if (picture == null)
            {
                HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.NotFound);
                message.Content = new StringContent(Messages.NoSuchPicture);
                throw new System.Web.Http.HttpResponseException(message);
            }

            var contest = this.Data.Contests.Find(contestId);
            if (contest == null)
            {
                HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.NotFound);
                message.Content = new StringContent(Messages.ContestNotFound);
                throw new System.Web.Http.HttpResponseException(message);
            }

            if (!contest.Pictures.Any(p => p.Id == pictureId))
            {
                HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.NotFound);
                message.Content = new StringContent(Messages.NoSuchPictureInContest);
                throw new System.Web.Http.HttpResponseException(message);
            }

            int votes = picture.Votes.Where(v => v.ContestId == contestId).Count();

            var userId = this.User.Identity.GetUserId();
            var user = this.Data.Users.Find(userId);

            if (picture.AuthorId == user.Id)
            {
                return votes;
            }

            if (contest.Status != ContestStatus.Active)
            {
                return votes;
            }

            if (contest.VotingType == VotingType.Closed)
            {
                if (!contest.Jury.Members.Any(m => m.Id == userId))
                {
                    return votes;
                }
            }

            if (userId == contest.OwnerId)
            {
                return votes;
            }

            if (vote)
            {
                if (picture.Votes.Any(v => v.ContestId == contestId && v.VoterId == userId))
                {
                    return votes;
                }

                this.Data.Votes.Add(new Vote
                {
                    ContestId = contestId,
                    PictureId = pictureId,
                    VoterId = userId
                });

                var notification = new Notification
                {
                    Content = string.Format(
                    Messages.PictureVoteNotification,
                    user.UserName,
                    picture.Title ?? Messages.NoTitle,
                    contest.Title),
                    CreatedOn = DateTime.Now,
                    IsRead = false,
                    RecipientId = picture.AuthorId,
                };
                this.Data.Notifications.Add(notification);

                this.Data.SaveChanges();
                return ++votes;
            }
            else
            {
                var dbVote = picture.Votes.FirstOrDefault(v => v.ContestId == contestId && v.VoterId == userId);
                if (dbVote == null)
                {
                    return votes;
                }

                this.Data.Votes.Delete(dbVote);
                this.Data.SaveChanges();

                return --votes;
            }
        }
コード例 #8
0
        public ActionResult AddToContest(string username, int contestId)
        {
            var resultMessage = "";

            // Check whether invited user exist
            var invitedUser = this.Data.Users.All().FirstOrDefault(u => u.UserName == username);
            if (invitedUser == null)
            {
                resultMessage = UserMessage.NoUser;
                return this.Json(resultMessage, JsonRequestBehavior.AllowGet);
            }

            // Check whether author and invited user are same person
            var currentUserId = this.User.Identity.GetUserId();
            var currentUser = this.Data.Users.Find(currentUserId);
            if (currentUser.UserName == invitedUser.UserName)
            {
                resultMessage = UserMessage.CannotInviteYourself;
                return this.Json(resultMessage, JsonRequestBehavior.AllowGet);
            }

            // Check whether contest exist
            var contest = this.Data.Contests.Find(contestId);
            if (contest == null)
            {
                resultMessage = UserMessage.NoContest;
                return this.Json(resultMessage, JsonRequestBehavior.AllowGet);
            }

            // Check whether ivited user is already in the contest
            var invitedUsersNames = contest.InvitedUsers.Select(iu => iu.UserName).ToList();
            if (invitedUsersNames.Contains(invitedUser.UserName))
            {
                resultMessage = UserMessage.UserIsInTheContest;
                return this.Json(resultMessage, JsonRequestBehavior.AllowGet);
            }

            contest.InvitedUsers.Add(invitedUser);
            invitedUser.InvitedToContests.Add(contest);

            var notification = new Notification()
            {
                NotificationContent = NotificationContent.InvitedToContest + contest.Title,
                Type = NotificationType.InvitedToContest,
                UserId = invitedUser.Id
            };
            this.Data.Notifications.Add(notification);
            this.Data.SaveChanges();

            return this.Json(resultMessage, JsonRequestBehavior.AllowGet);
        }
コード例 #9
0
        public ActionResult ChooseWinner(string username, int contestId)
        {
            var resultMessage = "";
            var contest = this.Data.Contests.Find(contestId);
            var user = this.Data.Users.All().FirstOrDefault(u => u.UserName == username);
            if (user == null)
            {
                resultMessage = UserMessage.NoUser;
                return this.Json(resultMessage, JsonRequestBehavior.AllowGet);
            }
               
            contest.Winners.Add(user);
            contest.IsClosed = IsClosed.Yes;
            user.ContestsWon.Add(contest);
            user.Coints = user.Coints + contest.PrizeValues;

            var notification = new Notification()
            {
                NotificationContent = NotificationContent.Winning,
                Type = NotificationType.Winning,
                UserId = user.Id
            };

            this.Data.SaveChanges();
            
            return this.Json(resultMessage, JsonRequestBehavior.AllowGet);
        }
コード例 #10
0
        public ActionResult WinnerByVotes(int contestId)
        {
            var resultMessage = "";
            var contest = this.Data.Contests.Find(contestId);
            var numberOfWinners = contest.PrizeCount;
            contest.IsClosed = IsClosed.Yes;
            var pictureWinner = contest.ContestPictures.OrderByDescending(cp => cp.Votes.Count).Take(numberOfWinners).ToList();
            if (contest.RewardStrategy == RewardStrategy.SingleWinner)
            {
                if (contest.ContestPictures.Any())
                {
                    var picture = contest.ContestPictures
                        .OrderByDescending(cp => cp.Votes.Count)
                        .FirstOrDefault();
                    var firstWinner = picture.Owner;
                    if (firstWinner != null)
                    {
                        firstWinner.Coints += contest.PrizeValues;
                        resultMessage = firstWinner.UserName + " is the winner of " + contest.Title + "!";
                        contest.Winners.Add(firstWinner);
                        firstWinner.ContestsWon.Add(contest);

                        var notification = new Notification()
                        {
                            NotificationContent = NotificationContent.Winning,
                            Type = NotificationType.Winning,
                            UserId = firstWinner.Id
                        };
                        this.Data.Notifications.Add(notification);
                    }
                } 
            }
            else
            {
                var firstOrDefault = contest.ContestPictures.OrderByDescending(cp => cp.Votes.Count).FirstOrDefault();
                if (firstOrDefault != null)
                {
                    var firstWinnerId = firstOrDefault.OwnerId;
                    var firstWinnerUser = this.Data.Users.Find(firstWinnerId);
                    firstWinnerUser.Coints = firstWinnerUser.Coints + contest.PrizeValues;
                    resultMessage = firstWinnerUser.UserName + " is the winner of " + contest.Title + "!";
                }
                
                foreach (var currentWinner in pictureWinner)
                {
                    var winner = this.Data.Users.Find(currentWinner.OwnerId);
                    contest.Winners.Add(winner);
                    winner.ContestsWon.Add(contest);

                    var notification = new Notification()
                    {
                        NotificationContent = NotificationContent.Winning,
                        Type = NotificationType.Winning,
                        UserId = winner.Id
                    };
                    this.Data.Notifications.Add(notification);
                }
            }
            this.Data.SaveChanges();
            return this.Json(resultMessage, JsonRequestBehavior.AllowGet);
        }