Example #1
0
        public async Task <IActionResult> UploadProject([FromForm] ProjectUploadModel project)
        {
            _logger.LogInformation("Upload request for a new project with name {0}\n\n", project.ProjectName);

            IDictionary <string, object> payload;

            try
            {
                var accessToken = Request.Headers["Bearer"];
                payload = Authorize(accessToken);
            }
            catch (ApiException e)
            {
                return(Unauthorized(new UnauthorizedError(e.Message)));
            }

            try
            {
                Guid    designerId     = Guid.Parse(payload["userId"].ToString());
                Project createdProject = await _projectService.CreateProject(project, designerId);

                return(Created("/", createdProject));
            }
            catch (ApiException e)
            {
                if (e.StatusCode == 400)
                {
                    return(BadRequest(new BadRequestError(e.Message)));
                }

                return(StatusCode(StatusCodes.Status500InternalServerError, new InternalServerError(e.Message)));
            }
        }
Example #2
0
        public async Task <Project> CreateProject(ProjectUploadModel newProject, Guid designerId)
        {
            // Validate the creator
            User creator = await _userRepository.GetUserById(designerId);

            if (creator == null)
            {
                _logger.LogError("User with Id {0} not found, cannot create a new project", designerId.ToString());
                throw new ApiException(404, "User with Id " + designerId.ToString() + " not found");
            }
            if (creator.Role != 0 && creator.Role != 1)
            {
                _logger.LogError("User with Id {0} does not have permission to upload projects", creator.Id.ToString());
                throw new ApiException(403, "Insufficient permisions to create a new project");
            }

            // Validate the file
            string fileHash;

            try
            {
                fileHash = await ValidateFile(newProject.ProjectArchive);
            }
            catch (ApiException e)
            {
                throw e;
            }

            // Create the Project entry in the database
            Project databaseProject = Project.Create(newProject.ProjectName, fileHash);

            databaseProject.Designer = creator;

            Project createdProject = await _projectRepository.CreateProject(databaseProject);

            if (createdProject == null)
            {
                throw new ApiException(500, "Project could not be created");
            }

            try
            {
                await WriteFileIntoFilesystem(newProject.ProjectArchive, createdProject.Id);
            }
            catch (ApiException e)
            {
                throw e;
            }

            return(createdProject);

            /*
             * TODO:
             * Prevent invalid Database entries when filesystem writing raises an exception
             * Prevent writing the same project for the same user multiple times
             * Decrease the number of open streams for the project archive file
             */
        }