Skip to content
Snippets Groups Projects
Select Git revision
  • 28299069e0dbb7ebe614f788eb615b8cddd676fb
  • master default protected
  • gitkeep
  • dev protected
  • Issue/2449-GuidPidSlugToProjectSettings
  • Issue/2309-docs
  • Issue/2355-topLevelOrg
  • Issue/2328-noFailOnLog
  • Hotfix/2371-fixGitLabinRCV
  • Issue/2287-guestRole
  • Fix/xxxx-activateGitlab
  • Test/xxxx-enablingGitLab
  • Issue/2349-gitlabHttps
  • Issue/2259-updatePids
  • Issue/2101-gitLabResTypeUi
  • Hotfix/2202-fixNaNQuota
  • Issue/2246-quotaResoval
  • Issue/2221-projectDateCreated
  • Hotfix/2224-quotaSizeAnalytics
  • Fix/xxxx-resourceVisibility
  • Issue/2000-gitlabResourcesAPI
  • v4.4.3
  • v4.4.2
  • v4.4.1
  • v4.4.0
  • v4.3.4
  • v4.3.3
  • v4.3.2
  • v4.3.1
  • v4.3.0
  • v4.2.8
  • v4.2.7
  • v4.2.6
  • v4.2.5
  • v4.2.4
  • v4.2.3
  • v4.2.2
  • v4.2.1
  • v4.2.0
  • v4.1.1
  • v4.1.0
41 results

ProjectController.cs

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ProjectController.cs 8.56 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;
    
    namespace Coscine.Api.Project.Controllers
    {
        public class ProjectController : Controller
        {
            private readonly Authenticator _authenticator;
            private readonly List<IProjectAction> _projectActions;
            private readonly ProjectModel _projectModel;
    
            public ProjectController()
            {
                _authenticator = new Authenticator(this, Program.Configuration);
                _projectActions = new List<IProjectAction>()
                {
                    new PIDAction(),
                    new SharePointSiteAction()
                };
                _projectModel = new ProjectModel();
            }
    
            [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) =>
                                {
                                    ResourceType resourceType = resource.Type;
                                    if (resourceType == null)
                                    {
                                        resourceType = resourceTypeModel.GetById(resource.TypeId);
                                    }
                                    return new ResourceObject(resource.Id, resource.ExternalId, resource.Url, resource.DisplayName, new ResourceTypeObject(resourceType.Id, resourceType.DisplayName));
                                });
                    }
                    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!");
                    }
                }));
            }
    
            private 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));
                }
    
                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);
                }
    
                FireEvents((projectAction, projectEventArgs) => projectAction.OnProjectDelete(project, projectEventArgs));
    
                _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);
                    }
    
                    FireEvents((projectAction, projectEventArgs) => projectAction.OnProjectCreate(project, projectEventArgs));
    
                    return _projectModel.CreateReturnObjectFromDatabaseObject(project);
                }));
            }
    
            private void FireEvents(Action<IProjectAction, ProjectEventArgs> eventAction)
            {
                ProjectEventArgs projectEventArgs = new ProjectEventArgs(Program.Configuration, new object[0]);
                foreach (var projectAction in _projectActions)
                {
                    eventAction(projectAction, projectEventArgs);
                }
            }
        }
    }