public async Task UpdateProjectStatuses()
        {
            var projects = await _projectRepository.GetProjectsAsync();

            foreach (var project in projects)
            {
                project.Status = StatusHelper.GetProjectStatusFromString(project.ProjectStatus);

                switch (project.Status)
                {
                case Status.Draft:
                    break;

                case Status.Initiative:
                    break;

                case Status.Registration:
                    if (project.CompetitionRegistrationDeadline < DateTime.UtcNow.Date)
                    {
                        project.ProjectStatus = Status.Submission.ToString();
                        await _projectRepository.UpdateAsync(project);
                    }
                    break;

                case Status.Submission:
                    if (project.ImplementationDeadline < DateTime.UtcNow.Date)
                    {
                        project.ProjectStatus = project.SkipVoting ? Status.Archive.ToString() : Status.Voting.ToString();
                        await _projectRepository.UpdateAsync(project);
                    }
                    break;

                case Status.Voting:
                    if (project.VotingDeadline < DateTime.UtcNow.Date)
                    {
                        project.ProjectStatus = Status.Archive.ToString();
                        await _winnersService.SaveWinners(project.Id);

                        await _projectRepository.UpdateAsync(project);
                    }
                    break;

                case Status.Archive:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
        }
Exemple #2
0
        public async Task UpdateProjectStatuses()
        {
            var projects = await _projectRepository.GetProjectsAsync();

            foreach (var project in projects)
            {
                project.Status = (Status)Enum.Parse(typeof(Status), project.ProjectStatus, true);

                switch (project.Status)
                {
                case Status.Initiative:
                    break;

                case Status.CompetitionRegistration:
                    if (project.CompetitionRegistrationDeadline < DateTime.Today)
                    {
                        project.ProjectStatus = Status.Implementation.ToString();
                        await _projectRepository.UpdateAsync(project);
                    }
                    break;

                case Status.Implementation:
                    if (project.ImplementationDeadline < DateTime.Today)
                    {
                        project.ProjectStatus = Status.Voting.ToString();
                        await _projectRepository.UpdateAsync(project);
                    }
                    break;

                case Status.Voting:
                    if (project.VotingDeadline < DateTime.Today)
                    {
                        project.ProjectStatus = Status.Archive.ToString();
                        await _winnersService.SaveWinners(project.Id);

                        await _projectRepository.UpdateAsync(project);
                    }
                    break;

                case Status.Archive:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
        }
        public async Task <IActionResult> SaveEditedProject(ProjectViewModel projectViewModel, bool draft = false,
                                                            bool enableVoting = false, bool enableRegistration = false)
        {
            if (projectViewModel.ProjectUrl == null)
            {
                projectViewModel.ProjectUrl = projectViewModel.Id;
            }

            projectViewModel.Tags = SerializeTags(projectViewModel.Tags);

            projectViewModel.ProjectStatus = projectViewModel.Status.ToString();

            projectViewModel.SkipVoting       = !enableVoting;
            projectViewModel.SkipRegistration = !enableRegistration;
            if (projectViewModel.CompetitionRegistrationDeadline == DateTime.MinValue)
            {
                projectViewModel.CompetitionRegistrationDeadline = DateTime.UtcNow.Date;
            }

            if (projectViewModel.VotingDeadline == DateTime.MinValue)
            {
                projectViewModel.VotingDeadline = DateTime.UtcNow.Date;
            }

            var project = await _projectRepository.GetAsync(projectViewModel.Id);

            if (projectViewModel.AuthorId == null)
            {
                projectViewModel.AuthorId = project.AuthorId;
            }

            if (projectViewModel.AuthorFullName == null)
            {
                projectViewModel.AuthorFullName = project.AuthorFullName;
            }

            project.Status = StatusHelper.GetProjectStatusFromString(project.ProjectStatus);

            projectViewModel.LastModified = DateTime.UtcNow;

            projectViewModel.UserAgent = HttpContext.Request.Headers["User-Agent"].ToString();

            projectViewModel.ParticipantsCount = project.ParticipantsCount;

            var projectId           = projectViewModel.Id;
            var statusAndUrlChanged = projectViewModel.Status != Status.Draft &&
                                      projectViewModel.ProjectUrl != projectId;

            if (!statusAndUrlChanged)
            {
                await _projectRepository.UpdateAsync(projectViewModel);
            }

            var idValid = false;

            if (!string.IsNullOrEmpty(projectViewModel.ProjectUrl))
            {
                idValid = Regex.IsMatch(projectViewModel.ProjectUrl, @"^[a-z0-9-]+$");
            }
            else
            {
                return(await EditWithProjectUrlError(projectViewModel.Id, "Project Url cannot be empty!"));
            }

            if (!idValid)
            {
                return(await EditWithProjectUrlError(projectViewModel.Id, "Project Url can only contain lowercase letters, numbers and the dash symbol!"));
            }

            if (projectViewModel.ProjectUrl != projectId)
            {
                if (projectViewModel.Status != Status.Draft)
                {
                    var oldProjUrl = projectViewModel.ProjectUrl;
                    projectViewModel = await GetProjectViewModel(projectId);

                    projectViewModel.ProjectUrl        = oldProjUrl;
                    projectViewModel.ProjectCategories = _categoriesRepository.GetCategories();
                    ModelState.AddModelError("Status", "Status cannot be changed while changing Project Url!");
                    return(View("EditProject", projectViewModel));
                }

                if (!string.IsNullOrEmpty(projectViewModel.ProjectUrl))
                {
                    idValid = Regex.IsMatch(projectViewModel.ProjectUrl, @"^[a-z0-9-]+$");
                }
                else
                {
                    return(await EditWithProjectUrlError(projectViewModel.Id, "Project Url cannot be empty!"));
                }

                if (!idValid)
                {
                    return(await EditWithProjectUrlError(projectViewModel.Id, "Project Url can only contain lowercase letters, numbers and the dash symbol!"));
                }

                var projectExists = await _projectRepository.GetAsync(projectViewModel.ProjectUrl);

                if (projectExists != null)
                {
                    return(await EditWithProjectUrlError(projectViewModel.Id, "Project with that Project Url already exists!"));
                }

                projectViewModel.Id      = projectViewModel.ProjectUrl;
                projectViewModel.Created = DateTime.UtcNow;

                await _projectRepository.SaveAsync(projectViewModel);

                await _projectRepository.DeleteAsync(projectId);

                return(RedirectToAction("ProjectDetails", "Project", new { id = projectViewModel.ProjectUrl }));
            }

            if (project.Status != Status.Registration && projectViewModel.Status == Status.Registration)
            {
                await AddCompetitionMailToQueue(project);
            }

            if (project.Status != Status.Submission && projectViewModel.Status == Status.Submission)
            {
                await AddImplementationMailToQueue(project);
            }

            if (project.Status != Status.Voting && projectViewModel.Status == Status.Voting)
            {
                await AddVotingMailToQueue(project);
            }

            if (project.Status != Status.Archive && projectViewModel.Status == Status.Archive)
            {
                if (!project.SkipVoting)
                {
                    await _winnersService.SaveWinners(projectViewModel.Id);
                }

                await AddArchiveMailToQueue(project);
            }

            await SaveProjectFile(projectViewModel.File, projectId);

            return(RedirectToAction("ProjectDetails", "Project", new { id = projectViewModel.Id }));
        }
        public async Task <IActionResult> SaveEditedProject(ProjectViewModel projectViewModel, bool draft = false,
                                                            bool enableVoting = false, bool enableRegistration = false)
        {
            if (projectViewModel.ProjectUrl == null)
            {
                projectViewModel.ProjectUrl = projectViewModel.Id;
            }

            projectViewModel.Tags = SerializeTags(projectViewModel.Tags);

            projectViewModel.ProjectStatus = projectViewModel.Status.ToString();

            var sanitizer = new HtmlSanitizer();

            projectViewModel.PrizeDescription = sanitizer.Sanitize(projectViewModel.PrizeDescription);
            projectViewModel.Description      = sanitizer.Sanitize(projectViewModel.Description);

            projectViewModel.SkipVoting       = !enableVoting;
            projectViewModel.SkipRegistration = !enableRegistration;
            if (projectViewModel.CompetitionRegistrationDeadline == DateTime.MinValue)
            {
                projectViewModel.CompetitionRegistrationDeadline = DateTime.UtcNow.Date;
            }

            if (projectViewModel.VotingDeadline == DateTime.MinValue)
            {
                projectViewModel.VotingDeadline = DateTime.UtcNow.Date;
            }

            var project = await _projectRepository.GetAsync(projectViewModel.Id);

            if (projectViewModel.AuthorId == null)
            {
                projectViewModel.AuthorId = project.AuthorId;
            }

            if (projectViewModel.AuthorFullName == null)
            {
                projectViewModel.AuthorFullName = project.AuthorFullName;
            }

            if (projectViewModel.AuthorIdentifier == null)
            {
                projectViewModel.AuthorIdentifier = project.AuthorIdentifier;

                var profile = await _personalDataService.FindClientsByEmail(projectViewModel.AuthorId);

                if (profile != null)
                {
                    projectViewModel.AuthorIdentifier = profile.Id;
                }
            }

            project.Status = StatusHelper.GetProjectStatusFromString(project.ProjectStatus);

            var user     = UserModel.GetAuthenticatedUser(User.Identity);
            var userRole = await _userRolesRepository.GetAsync(user.Email.ToLower());

            //Don't let non-admin users edit their draft projects to Initiative status
            if (userRole == null || userRole.Role != "ADMIN")
            {
                if (await IsOkKycStatusAsync(user) && projectViewModel.Status != Status.Draft)
                {
                    return(View("CreateInitiativeClosed"));
                }
            }

            projectViewModel.LastModified = DateTime.UtcNow;

            projectViewModel.UserAgent = HttpContext.Request.Headers["User-Agent"].ToString();

            projectViewModel.ParticipantsCount = project.ParticipantsCount;

            var projectId           = projectViewModel.Id;
            var statusAndUrlChanged = projectViewModel.Status != Status.Draft &&
                                      projectViewModel.ProjectUrl != projectId;

            if (!statusAndUrlChanged)
            {
                var currentProjectIsInStream     = false;
                var currentProjectWasInOldStream = false;
                var streamId = "";

                if (projectViewModel.StreamType == "New")
                {
                    var streamProjects = JsonConvert.DeserializeObject <List <StreamProject> >(projectViewModel.SerializedStream);

                    if (streamProjects.Any())
                    {
                        var newStream = new StreamEntity
                        {
                            Name        = projectViewModel.NewStreamName,
                            AuthorId    = user.Id,
                            AuthorEmail = user.Email,
                            Stream      = projectViewModel.SerializedStream
                        };

                        streamId = await _streamRepository.SaveAsync(newStream);

                        foreach (var proj in streamProjects)
                        {
                            var streamProject = await _projectRepository.GetAsync(proj.ProjectId);

                            streamProject.StreamId = streamId;
                            await _projectRepository.UpdateAsync(streamProject);
                        }

                        currentProjectIsInStream = streamProjects.Any(p => p.ProjectId == projectViewModel.Id);
                    }
                }
                if (projectViewModel.StreamType == "Existing")
                {
                    var existingStream = await _streamRepository.GetAsync(projectViewModel.ExistingStreamId);

                    var oldProjects = JsonConvert.DeserializeObject <List <StreamProject> >(existingStream.Stream);
                    currentProjectWasInOldStream = oldProjects.Any(p => p.ProjectId == projectViewModel.Id);

                    foreach (var oldProj in oldProjects)
                    {
                        var oldProject = await _projectRepository.GetAsync(oldProj.ProjectId);

                        oldProject.StreamId = null;
                        await _projectRepository.UpdateAsync(oldProject);
                    }

                    existingStream.Stream = projectViewModel.SerializedStream;
                    await _streamRepository.UpdateAsync(existingStream);

                    var newProjects = JsonConvert.DeserializeObject <List <StreamProject> >(projectViewModel.SerializedStream);

                    foreach (var newProj in newProjects)
                    {
                        var streamProject = await _projectRepository.GetAsync(newProj.ProjectId);

                        streamProject.StreamId = existingStream.Id;
                        await _projectRepository.UpdateAsync(streamProject);
                    }

                    currentProjectIsInStream = newProjects.Any(p => p.ProjectId == projectViewModel.Id);
                    streamId = existingStream.Id;
                }

                if (currentProjectIsInStream)
                {
                    projectViewModel.StreamId = streamId;
                }
                else if (currentProjectWasInOldStream)
                {
                    projectViewModel.StreamId = null;
                }
                await _projectRepository.UpdateAsync(projectViewModel);
            }


            if (project.Status == Status.Draft && projectViewModel.Status == Status.Initiative)
            {
                await SendProjectCreateNotification(projectViewModel);
            }

            var idValid = false;

            if (!string.IsNullOrEmpty(projectViewModel.ProjectUrl))
            {
                idValid = Regex.IsMatch(projectViewModel.ProjectUrl, @"^[a-z0-9-]+$");
            }
            else
            {
                return(await EditWithProjectUrlError(projectViewModel.Id, "Project Url cannot be empty!"));
            }

            if (!idValid)
            {
                return(await EditWithProjectUrlError(projectViewModel.Id, "Project Url can only contain lowercase letters, numbers and the dash symbol!"));
            }

            if (projectViewModel.ProjectUrl != projectId)
            {
                if (projectViewModel.Status != Status.Draft)
                {
                    var oldProjUrl = projectViewModel.ProjectUrl;
                    projectViewModel = await GetProjectViewModel(projectId);

                    projectViewModel.ProjectUrl        = oldProjUrl;
                    projectViewModel.ProjectCategories = _categoriesRepository.GetCategories();
                    ModelState.AddModelError("Status", "Status cannot be changed while changing Project Url!");
                    return(View("EditProject", projectViewModel));
                }

                if (!string.IsNullOrEmpty(projectViewModel.ProjectUrl))
                {
                    idValid = Regex.IsMatch(projectViewModel.ProjectUrl, @"^[a-z0-9-]+$");
                }
                else
                {
                    return(await EditWithProjectUrlError(projectViewModel.Id, "Project Url cannot be empty!"));
                }

                if (!idValid)
                {
                    return(await EditWithProjectUrlError(projectViewModel.Id, "Project Url can only contain lowercase letters, numbers and the dash symbol!"));
                }

                var projectExists = await _projectRepository.GetAsync(projectViewModel.ProjectUrl);

                if (projectExists != null)
                {
                    return(await EditWithProjectUrlError(projectViewModel.Id, "Project with that Project Url already exists!"));
                }

                projectViewModel.Id      = projectViewModel.ProjectUrl;
                projectViewModel.Created = DateTime.UtcNow;

                await _projectRepository.SaveAsync(projectViewModel);

                await _projectRepository.DeleteAsync(projectId);

                return(RedirectToAction("ProjectDetails", "Project", new { id = projectViewModel.ProjectUrl }));
            }

            if (project.Status != Status.Registration && projectViewModel.Status == Status.Registration)
            {
                await AddCompetitionMailToQueue(project);
            }

            if (project.Status != Status.Submission && projectViewModel.Status == Status.Submission)
            {
                await AddImplementationMailToQueue(project);
            }

            if (project.Status != Status.Voting && projectViewModel.Status == Status.Voting)
            {
                await AddVotingMailToQueue(project);
            }

            if (projectViewModel.Status == Status.Archive)
            {
                if (!project.SkipVoting)
                {
                    await _winnersService.SaveWinners(projectViewModel.Id, projectViewModel.Winners);
                }
                else
                {
                    await _winnersService.SaveCustomWinners(projectViewModel.Id, projectViewModel.Winners);
                }

                await AddArchiveMailToQueue(project);
            }

            await _expertsService.SaveExperts(projectViewModel.Id, projectViewModel.Experts);

            await SaveProjectFile(projectViewModel.File, projectId);

            return(RedirectToAction("ProjectDetails", "Project", new { id = projectViewModel.Id }));
        }
Exemple #5
0
        public async Task <IActionResult> SaveProject(ProjectViewModel projectViewModel)
        {
            projectViewModel.Tags = SerializeTags(projectViewModel.Tags);

            projectViewModel.ProjectStatus = projectViewModel.Status.ToString();

            string projectId;

            if (projectViewModel.Id == null)
            {
                var user = GetAuthenticatedUser();

                projectViewModel.AuthorId       = user.Email;
                projectViewModel.AuthorFullName = user.GetFullName();

                projectViewModel.Created           = DateTime.UtcNow;
                projectViewModel.ParticipantsCount = 0;

                projectId = await _projectRepository.SaveAsync(projectViewModel);

                if (_emailsQueue != null)
                {
                    var message = NotificationMessageHelper.ProjectCreatedMessage(user.Email, user.GetFullName(),
                                                                                  projectViewModel.Name);
                    await _emailsQueue.PutMessageAsync(message);
                }
            }
            else
            {
                var project = await _projectRepository.GetAsync(projectViewModel.Id);

                project.Status = (Status)Enum.Parse(typeof(Status), project.ProjectStatus, true);

                projectViewModel.LastModified = DateTime.UtcNow;

                projectId = projectViewModel.Id;

                await _projectRepository.UpdateAsync(projectViewModel);

                if (project.Status != Status.CompetitionRegistration && projectViewModel.Status == Status.CompetitionRegistration)
                {
                    await AddCompetitionMailToQueue(project);
                }

                if (project.Status != Status.Implementation && projectViewModel.Status == Status.Implementation)
                {
                    await AddImplementationMailToQueue(project);
                }

                if (project.Status != Status.Voting && projectViewModel.Status == Status.Voting)
                {
                    await AddVotingMailToQueue(project);
                }

                if (project.Status != Status.Archive && projectViewModel.Status == Status.Archive)
                {
                    await _winnersService.SaveWinners(projectViewModel.Id);
                }
            }

            await SaveProjectFile(projectViewModel.File, projectId);

            return(RedirectToAction("Index", "Home"));
        }