Skip to content
Snippets Groups Projects
Select Git revision
  • master
  • develop
2 results

README.md

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ProjectController.cs 8.12 KiB
    using Coscine.Action;
    using Coscine.Action.EventArgs;
    using Coscine.Action.Implementations.Project;
    using Coscine.Api.Project.Models;
    using Coscine.Api.Project.ReturnObjects;
    using Coscine.ApiCommons;
    using Coscine.ApiCommons.Exceptions;
    using Coscine.ApiCommons.Factories;
    using Coscine.Database.Model;
    using Microsoft.AspNetCore.Mvc;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Coscine.Configuration;
    
    namespace Coscine.Api.Project.Controllers
    {
        public class ProjectController : Controller
        {
            private readonly Authenticator _authenticator;
            private readonly ProjectModel _projectModel;
            private readonly IConfiguration _configuration;
            private readonly Emitter _emitter; 
            public ProjectController()
            {
                _authenticator = new Authenticator(this, Program.Configuration);
                _configuration = Program.Configuration;
                _projectModel = new ProjectModel();
                _emitter = new Emitter(this._configuration);
            }
    
            [Route("[controller]")]
            public IActionResult Index()
            {
                return Ok(_authenticator.ValidateAndExecute((user) =>
                {
                    return _projectModel.GetAllWhere((project) =>                
                        (from projectRole in project.ProjectRolesProjectIdIds
                                where projectRole.User == user
                                && projectRole.Role.DisplayName == "Owner"
                                select projectRole).Any()
                    ).Select((project) => _projectModel.CreateReturnObjectFromDatabaseObject(project));
                }));
            }
    
            [HttpGet("[controller]/{id}")]
            public IActionResult Get(string id)
            {
                return Ok(_authenticator.ValidateAndExecute((user) =>
                {
                    var project = _projectModel.GetById(Guid.Parse(id));
                    if (_projectModel.CanSeeProject(user, project))
                    {
                        return _projectModel.CreateReturnObjectFromDatabaseObject(project);
                    }
                    else
                    {
                        throw new UnauthorizedAccessException("User is not allowed to see given project Id!");
                    }
                }));
            }
    
            [HttpGet("[controller]/{id}/resources")]
            public IActionResult GetResources(string id)
            {
                return Ok(_authenticator.ValidateAndExecute((user) =>
                {
                    var project = _projectModel.GetById(Guid.Parse(id));
                    ResourceModel resourceModel = new ResourceModel();
                    ResourceTypeModel resourceTypeModel = new ResourceTypeModel();
                    if (_projectModel.CanSeeProject(user, project))
                    {
                        return resourceModel.GetAllWhere((resource) =>
                                (from projectResource in resource.ProjectResourceResourceIdIds
                                where projectResource.ProjectId == project.Id
                                select projectResource).Any())
                                .Select((resource) =>
                                {
                                    return resourceModel.CreateReturnObjectFromDatabaseObject(resource);
                                });
                    }
                    else
                    {
                        throw new UnauthorizedAccessException("User cannot see resources of given project!");
                    }
                }));
            }
    
            [HttpPost("[controller]/{id}")]
            public IActionResult Update(string id)
            {
                return Ok(_authenticator.ValidateAndExecute((user) =>
                {
                    ProjectObject projectObject = ObjectFactory<ProjectObject>.DeserializeFromStream(Request.Body);
                    var project = _projectModel.GetById(Guid.Parse(id));
                    if(_projectModel.OwnsProject(user, project))
                    {
                        return _projectModel.UpdateByObject(project, projectObject);
                    }
                    else
                    {
                        throw new NotAuthorizedException("The user is not authorized to perform an update on the selected project!");
                    }
                }));
            }
    
            [HttpDelete("[controller]/{id}")]
            public IActionResult Delete(string id)
            {
                return Ok(_authenticator.ValidateAndExecute((user) =>
                {
                    var project = _projectModel.GetById(Guid.Parse(id));
                    if (_projectModel.OwnsProject(user, project))
                    {
                        DeleteProject(project);
                        return _projectModel.CreateReturnObjectFromDatabaseObject(project);
                    }
                    else
                    {
                        throw new NotAuthorizedException("The user is not authorized to perform an update on the selected project!");
                    }
                }));
            }
    
            public void DeleteProject(Coscine.Database.Model.Project project)
            {
                SubProjectModel subProjectModel = new SubProjectModel();
                foreach(var subProject in subProjectModel.GetAllWhere((subProject) => subProject.ProjectId == project.Id))
                {
                    subProjectModel.Delete(subProject);
                    DeleteProject(_projectModel.GetById(subProject.SubProjectId));
                }
    
                foreach (var subProject in subProjectModel.GetAllWhere((subProject) => subProject.SubProjectId == project.Id))
                {
                    subProjectModel.Delete(subProject);
                }
    
                ProjectResourceModel projectResourceModel = new ProjectResourceModel();
                ResourceModel resourceModel = new ResourceModel();
                foreach (var projectResource in projectResourceModel.GetAllWhere((projectResource) => projectResource.ProjectId == project.Id))
                {
                    projectResourceModel.Delete(projectResource);
                    resourceModel.Delete(resourceModel.GetById(projectResource.ResourceId));
                }
    
                ProjectRoleModel projectRoleModel = new ProjectRoleModel();
                foreach (var projectRole in projectRoleModel.GetAllWhere((projectRole) => projectRole.ProjectId == project.Id))
                {
                    projectRoleModel.Delete(projectRole);
                }
    
                ProjectDisciplineModel projectDisciplineModel = new ProjectDisciplineModel();
                foreach (var projectDiscipline in projectDisciplineModel.GetAllWhere((projectDiscipline) => projectDiscipline.ProjectId == project.Id))
                {
                    projectDisciplineModel.Delete(projectDiscipline);
                }
    
                ProjectInstituteModel projectInstituteModel = new ProjectInstituteModel();
                foreach (var projectInstitute in projectInstituteModel.GetAllWhere((projectInstitute) => projectInstitute.ProjectId == project.Id))
                {
                    projectInstituteModel.Delete(projectInstitute);
                }
    
                _emitter.EmitProjectDelete(new ProjectEventArgs(_configuration)
                {
                    Project = project
                });
    
                _projectModel.Delete(project);
            }
    
            [HttpPost("[controller]")]
            public IActionResult Store()
            {
                return base.Ok(_authenticator.ValidateAndExecute((user) =>
                {
                    ProjectObject projectObject = ObjectFactory<ProjectObject>.DeserializeFromStream(Request.Body);
                    var project = _projectModel.StoreFromObject(projectObject, user);
    
                    if (projectObject.ParentId != null 
                        && projectObject.ParentId != new Guid()
                        && _projectModel.IsMemberOrHigher(user, _projectModel.GetById(projectObject.ParentId))) // for now, only an owner can add subprojects to projects
                    {
                        SubProjectModel subProjectModel = new SubProjectModel();
                        subProjectModel.LinkSubProject(projectObject.ParentId, project.Id);
                    }
    
                    _emitter.EmitProjectCreate(new ProjectEventArgs(_configuration)
                    {
                        Project = project,
                        ProjectOwner = user
                    });
    
                    return _projectModel.CreateReturnObjectFromDatabaseObject(project);
                }));
            }
        }
    }