/// <summary>
        /// <inheritdoc />
        /// </summary>
        /// <param name="id"></param>
        /// <param name="model"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public virtual async Task <Project> EditProjectAsync(int id, EditProjectViewModel model,
                                                             CancellationToken cancellationToken = default(CancellationToken))
        {
            var loadProjectCondition = new SearchProjectViewModel();

            loadProjectCondition.Ids = new HashSet <int>();
            loadProjectCondition.Ids.Add(id);

            var profile = _profileService.GetProfile(_httpRequestMessage);

            if (profile == null)
            {
                throw new HttpException((int)HttpStatusCode.Forbidden, HttpMessages.ActionIsForbidden);
            }

            // Non admin user can only edit his/her project.
            if (profile.Role != UserRoles.Admin)
            {
                loadProjectCondition.UserIds = new HashSet <int>();
                loadProjectCondition.UserIds.Add(profile.Id);
            }

            var project = await GetProjects(loadProjectCondition).FirstOrDefaultAsync(cancellationToken);

            if (project == null)
            {
                throw new HttpException((int)HttpStatusCode.NotFound, HttpMessages.ProjectNotFound);
            }

            // Transaction begin.
            var transaction = _unitOfWork.BeginTransactionScope();

            //Update information
            project.UserId       = model.UserId;
            project.Name         = model.Name;
            project.Description  = model.Description;
            project.FinishedTime = model.FinishedTime;
            project.StartedTime  = model.StatedTime;

            // Update skills
            if (model.SkillIds != null)
            {
                // Get the list of available skills.
                var skills          = _unitOfWork.Skills.Search();
                var availableSkills = await skills.Where(x => model.SkillIds.Contains(x.Id)).ToListAsync(cancellationToken);

                var projectSkills = _unitOfWork.ProjectSkills.Search();
                projectSkills = projectSkills.Where(x => x.ProjectId == id);
                _unitOfWork.ProjectSkills.Remove(projectSkills);

                foreach (var availableSkill in availableSkills)
                {
                    var projectSkill = new ProjectSkill();
                    projectSkill.ProjectId = id;
                    projectSkill.SkillId   = availableSkill.Id;

                    _unitOfWork.ProjectSkills.Insert(projectSkill);
                }
            }

            // Update responsibilities
            if (model.ResponsibilityIds != null)
            {
                // Get the list of available skills.
                var responsibilities          = _unitOfWork.Responsibilities.Search();
                var availableResponsibilities = await responsibilities.Where(x => model.ResponsibilityIds.Contains(x.Id)).ToListAsync(cancellationToken);

                var projectResponsibilities = _unitOfWork.ProjectResponsibilities.Search();
                projectResponsibilities = projectResponsibilities.Where(x => x.ProjectId == id);
                _unitOfWork.ProjectResponsibilities.Remove(projectResponsibilities);

                foreach (var availableResponsibility in availableResponsibilities)
                {
                    var projectResponsibility = new ProjectResponsibility();
                    projectResponsibility.ProjectId        = id;
                    projectResponsibility.ResponsibilityId = availableResponsibility.Id;

                    _unitOfWork.ProjectResponsibilities.Insert(projectResponsibility);
                }
            }

            await _unitOfWork.CommitAsync();

            transaction.Commit();
            return(project);
        }
        public async Task <IHttpActionResult> AddProject([FromBody] AddProjectViewModel model)
        {
            if (model == null)
            {
                model = new AddProjectViewModel();
                Validate(model);
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            //Check exists project in database
            var projects = _unitOfWork.Projects.Search();

            projects = projects.Where(x => x.Name.Contains(model.Name));

            var project = await projects.FirstOrDefaultAsync();

            if (project != null)
            {
                return(ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.Conflict, "EXISTS_CODE_ERROR")));
            }

            var transaction = _unitOfWork.BeginTransactionScope();

            try
            {
                //Inial Project object
                project = new Project();

                project.UserId       = model.UserId;
                project.Name         = model.Name;
                project.Description  = model.Description;
                project.FinishedTime = model.FinishedTime;
                project.StartedTime  = model.StatedTime;

                //Add project to database
                _unitOfWork.Projects.Insert(project);
                if (model.SkillIds != null)
                {
                    #region add project skill

                    //check exists skill
                    var skills          = _unitOfWork.Skills.Search();
                    var availableSkills = await skills.Where(x => model.SkillIds.Contains(x.Id)).ToListAsync();

                    // Insert to projectSkill table
                    foreach (var skill in availableSkills)
                    {
                        var projectSkill = new ProjectSkill();

                        projectSkill.ProjectId = project.Id;
                        projectSkill.SkillId   = skill.Id;

                        //Add to db context
                        _unitOfWork.ProjectSkills.Insert(projectSkill);
                    }

                    #endregion
                }

                if (model.ResponsibilityIds != null)
                {
                    #region Project responsibilitis

                    // Find available responsibilities.
                    var responsibilities          = _unitOfWork.Responsibilities.Search();
                    var availableResponsibilities = await responsibilities.Where(x => model.ResponsibilityIds.Contains(x.Id)).ToListAsync();

                    //Insert project responsibility to db context
                    foreach (var responsibility in availableResponsibilities)
                    {
                        var projectResponsibility = new ProjectResponsibility();

                        projectResponsibility.ProjectId        = project.Id;
                        projectResponsibility.ResponsibilityId = responsibility.Id;
                        projectResponsibility.CreatedTime      = DateTime.UtcNow.ToOADate();

                        //Add to db context
                        _unitOfWork.ProjectResponsibilities.Insert(projectResponsibility);
                    }

                    #endregion
                }

                //Save changes to database
                await _unitOfWork.CommitAsync();

                //Commit transaction
                transaction.Commit();

                //Success
                return(Ok(project));
            }
            catch (Exception e)
            {
                transaction.Rollback();
                return(Conflict());
            }
        }
        public async Task <IHttpActionResult> Update([FromUri] int id, [FromBody] EditProjectViewModel model)
        {
            if (model == null)
            {
                model = new EditProjectViewModel();
                Validate(model);
            }
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            //Find  Project
            var projects = _unitOfWork.Projects.Search();
            var project  = await projects.FirstOrDefaultAsync(x => x.Id == id);

            if (project == null)
            {
                return(ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.NotFound,
                                                                   HttpMessages.ProjectNotFound)));
            }

            //Update information
            project.UserId       = model.UserId;
            project.Name         = model.Name;
            project.Description  = model.Description;
            project.FinishedTime = model.FinishedTime;
            project.StartedTime  = model.StatedTime;

            #region  Update skills

            // Update skills
            if (model.SkillIds != null)
            {
                // Get the list of available skills.
                var skills          = _unitOfWork.Skills.Search();
                var availableSkills = await skills.Where(x => model.SkillIds.Contains(x.Id)).ToListAsync();

                var projectSkills = _unitOfWork.ProjectSkills.Search();
                projectSkills = projectSkills.Where(x => x.ProjectId == id);
                _unitOfWork.ProjectSkills.Remove(projectSkills);

                foreach (var availableSkill in availableSkills)
                {
                    var projectSkill = new ProjectSkill();
                    projectSkill.ProjectId = id;
                    projectSkill.SkillId   = availableSkill.Id;

                    _unitOfWork.ProjectSkills.Insert(projectSkill);
                }
            }

            // Update responsibilities
            if (model.ResponsibilityIds != null)
            {
                // Get the list of available skills.
                var responsibilities          = _unitOfWork.Responsibilities.Search();
                var availableResponsibilities = await responsibilities.Where(x => model.ResponsibilityIds.Contains(x.Id)).ToListAsync();

                var projectResponsibilities = _unitOfWork.ProjectResponsibilities.Search();
                projectResponsibilities = projectResponsibilities.Where(x => x.ProjectId == id);
                _unitOfWork.ProjectResponsibilities.Remove(projectResponsibilities);

                foreach (var availableResponsibility in availableResponsibilities)
                {
                    var projectResponsibility = new ProjectResponsibility();
                    projectResponsibility.ProjectId        = id;
                    projectResponsibility.ResponsibilityId = availableResponsibility.Id;

                    _unitOfWork.ProjectResponsibilities.Insert(projectResponsibility);
                }
            }

            #endregion

            //Save changes to database
            await _unitOfWork.CommitAsync();

            return(Ok(project));
        }
Beispiel #4
0
        public async Task <Project> AddProjectAsync(AddProjectViewModel model,
                                                    CancellationToken cancellationToken = default(CancellationToken))
        {
            //Check exists project in database
            var isExists = await _dbContext.Projects.AnyAsync(c => c.Name == model.Name, cancellationToken);

            if (isExists)
            {
                throw new Exception();
            }

            var transaction = _dbContext.Database.BeginTransaction();

            try
            {
                //Inial Project object
                var project = new Project();

                project.UserId       = model.UserId;
                project.Name         = model.Name;
                project.Description  = model.Description;
                project.FinishedTime = model.FinishedTime;
                project.StartedTime  = model.StatedTime;

                //Add project to database
                project = _dbContext.Projects.Add(project);
                if (model.SkillIds != null)
                {
                    #region add project skill

                    //check exists skill
                    var countSkills = await _dbContext.Skills.Where(c => model.SkillIds.Contains(c.Id)).CountAsync();

                    var isExistSkills = countSkills == model.SkillIds.Count;

                    if (!isExistSkills)
                    {
                        throw new Exception();
                    }

                    //Insert to projectSkill table
                    foreach (var skillId in model.SkillIds)
                    {
                        var projectSkill = new ProjectSkill();

                        projectSkill.ProjectId = project.Id;
                        projectSkill.SkillId   = skillId;

                        //Add to db context
                        _dbContext.ProjectSkills.Add(projectSkill);
                    }

                    #endregion
                }

                if (model.ResponsibilityIds != null)
                {
                    #region Project responsibilitis

                    // check exists responsibilities
                    var countRespon = await _dbContext.Responsibilities
                                      .Where(c => model.ResponsibilityIds.Contains(c.Id)).CountAsync();

                    var isExistsRespon = countRespon == model.ResponsibilityIds.Count;

                    if (!isExistsRespon)
                    {
                        throw new Exception();
                    }

                    //Insert project responsibility to db context
                    foreach (var responsibilityId in model.ResponsibilityIds)
                    {
                        var projectResponsibility = new ProjectResponsibility();

                        projectResponsibility.ProjectId        = project.Id;
                        projectResponsibility.ResponsibilityId = responsibilityId;
                        projectResponsibility.CreatedTime      = DateTime.UtcNow.ToOADate();

                        //Add to db context
                        _dbContext.ProjectResponsibilities.Add(projectResponsibility);
                    }

                    #endregion
                }


                //Save changes to database
                await _dbContext.SaveChangesAsync(cancellationToken);

                //Commit transaction
                transaction.Commit();
                return(project);
            }
            catch (Exception e)
            {
                transaction.Rollback();
                throw new Exception(e.Message);
            }
        }