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))); } }
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 */ }