public int InviteUser(CreateInvitationBindingModel model, string loggerUserId)
        {
            var contest = this.Data.Contests.Find(model.ContestId);

            if (contest == null)
            {
                throw new NotFoundException(string.Format("Contest with id {0} not found", model.ContestId));
            }

            var loggedUser = this.Data.Users.Find(loggerUserId);

            if (contest.OrganizatorId != loggedUser.Id)
            {
                throw new BadRequestException("Only the contest organizator can invite users.");
            }

            if (model.Type == InvitationType.Committee
                && contest.VotingStrategy.VotingStrategyType != VotingStrategyType.Closed)
            {
                throw new BadRequestException("The contest voting strategy type is not 'CLOSED'.");
            }

            if (model.Type == InvitationType.ClosedContest
                && contest.ParticipationStrategy.ParticipationStrategyType != ParticipationStrategyType.Closed)
            {
                throw new BadRequestException("The contest participation strategy type is not 'CLOSED'.");
            }

            if (!contest.IsOpenForSubmissions)
            {
                throw new BadRequestException("The contest is closed for submissions/registrations.");
            }

            var userToInvite = this.Data.Users.All().FirstOrDefault(u => u.UserName == model.Username);

            if (userToInvite == null)
            {
                throw new NotFoundException(string.Format("User with username {0} not found", model.Username));
            }

            if (contest.Participants.Contains(userToInvite))
            {
                throw new BadRequestException("You cannot invite user who already participates in the contest");
            }

            if (contest.Committee.Contains(userToInvite))
            {
                throw new BadRequestException("You cannot invite user who already is in the contest committee");
            }

            if (userToInvite.UserName == loggedUser.UserName)
            {
                throw new BadRequestException("Users cannot invite themselves.");
            }

            if (userToInvite.PendingInvitations.Any(i => i.ContestId == model.ContestId && i.Type == model.Type))
            {
                throw new BadRequestException(string.Format("User is already invited to contest with id {0}", contest.Id));
            }

            var invitation = new Invitation
            {
                ContestId = model.ContestId,
                InviterId = loggedUser.Id,
                InvitedId = userToInvite.Id,
                DateOfInvitation = DateTime.Now,
                Type = model.Type,
                Status = InvitationStatus.Neutral
            };

            if (model.Type == InvitationType.ClosedContest)
            {
                contest.InvitedUsers.Add(userToInvite);
            }

            userToInvite.PendingInvitations.Add(invitation);
            loggedUser.SendedInvitations.Add(invitation);

            this.Data.SaveChanges();

            return invitation.Id;
        }
        public ActionResult InviteUser(CreateInvitationBindingModel model)
        {
            if (model == null)
            {
                this.Response.StatusCode = (int) HttpStatusCode.BadRequest;
                return this.Json(new {ErrorMessage = "Missing data"});
            }

            if (!this.ModelState.IsValid)
            {
                this.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return this.Json(new { ErrorMessage = this.ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage) });
            }

            try
            {
                var invitationId = this._service.InviteUser(model, this.User.Identity.GetUserId());

                var hub = GlobalHost.ConnectionManager.GetHubContext<PhotoContestHub>();
                hub.Clients.User(model.Username).notificationReceived(invitationId);
            }
            catch (NotFoundException exception)
            {
                this.Response.StatusCode = (int) HttpStatusCode.NotFound;
                return this.Json(new {ErrorMessage = exception.Message});
            }
            catch (BadRequestException exception)
            {
                this.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return this.Json(new { ErrorMessage = exception.Message });
            }

            this.Response.StatusCode = (int)HttpStatusCode.OK;
            return this.Json(new { SuccessfulMessage = string.Format("User with username {0} successfully invited", model.Username) });
        }