public async Task SaveAdditionalThesisFiles(Guid thesisGuid, IFormFile[] files) { var thesis = await _thesisRepository.GetAsync(thesisGuid); var user = await _userRepository.GetAsync(_userContext.CurrentUser.Id); foreach (var file in files) { try { var fileGuid = Guid.NewGuid(); var thesisFile = new Core.Models.DbModels.File { Guid = fileGuid, FileName = file.FileName, Extension = Path.GetExtension(file.FileName), Path = Path.Combine(thesisGuid.ToString(), fileGuid.ToString()), ContentType = file.ContentType, CreatedBy = user, Size = file.Length, Checksum = GenerateChecksum(file.OpenReadStream()) }; if (thesis.ThesisAdditionalFiles == null) { thesis.ThesisAdditionalFiles = new List <Core.Models.DbModels.ThesisAdditionalFile>(); } await SaveFile(file.OpenReadStream(), thesisGuid.ToString(), fileGuid.ToString()); thesis.ThesisAdditionalFiles.Add(new Core.Models.DbModels.ThesisAdditionalFile { Thesis = thesis, File = thesisFile }); thesis.LogChange(user, ModificationType.AddtionalFilesAdded); await _thesisRepository.UpdateAsync(thesis); } catch (Exception e) { _logger.LogError($"Failed to save file. Reason: {e.Message}"); } } }
public async Task <IActionResult> CreateThesis([FromForm] ThesisRequest request) { var currentUser = HttpContext.GetCurrentUser(); var getDeadline = _settingsService.GetDeadline(HttpContext.BuildOAuthRequest()); var getCurrentTerm = _usosService.GetCurrentAcademicYear(); await Task.WhenAll(getCurrentTerm, getDeadline); if (DateTime.Now > getDeadline.Result) { return(new BadRequestObjectResult("Nie można dodać pracy po upływie terminu końcowego.")); } var requestData = JsonConvert.DeserializeObject <ThesisRequestData>(request.Data); if (currentUser.Id.ToString() == requestData.ReviewerUsosId) { return(new ConflictObjectResult("Promotor nie może być jednocześnie recenzentem.")); } //Getting/Creating users var promoter = await _userRepository.GetAsync(currentUser.Id); var reviewer = await _userRepository.GetAsync(requestData.ReviewerUsosId); if (reviewer == null) { var usosUser = await _usosService.GetUser(HttpContext.BuildOAuthRequest(), requestData.ReviewerUsosId); if (usosUser == null) { return(new BadRequestObjectResult("Użytkownik nie istnieje.")); } reviewer = usosUser.ToDbModel(); await _userRepository.AddAsync(reviewer); } var authors = _userRepository.GetAll().Where(p => requestData.AuthorUsosIds.Contains(p.UsosId)).ToList(); if (authors.Count != requestData.AuthorUsosIds.Count) { var newUsers = requestData.AuthorUsosIds.Where(p => !authors.Select(a => a.UsosId).Contains(p)); var newUsosUsers = await _usosService.GetUsers(HttpContext.BuildOAuthRequest(), newUsers); if (newUsosUsers.Any(p => p == null)) { return(new BadRequestObjectResult("Użytkownik nie istnieje.")); } var newAuthors = newUsosUsers.ToDbModel(); await _userRepository.AddRangeAsync(newAuthors); authors.AddRange(newAuthors); } //Getting/Creating keywords var keywords = _keywordRepository.GetAll() .Where(p => requestData.Keywords.Select(k => k.Text).Contains(p.Text)).ToList(); var newKeywords = requestData.Keywords.Select(k => k.Text) .Where(k => !keywords.Select(p => p.Text).Contains(k)) .Select(k => new Keyword { Text = k, CreatedBy = promoter }); if (newKeywords.Count() != 0) { keywords.AddRange(newKeywords); } //Preparing thesis object var thesisGuid = Guid.NewGuid(); var thesisAuthors = new List <ThesisAuthor>( authors.Select(user => new ThesisAuthor { Author = user })); var thesisKeywords = new List <ThesisKeyword>( keywords.Select(keyword => new ThesisKeyword { Keyword = keyword })); var thesisLogs = new List <ThesisLog> { new ThesisLog { ModificationType = ModificationType.Created, User = promoter } }; //TODO: Save files locally var fileGuid = Guid.NewGuid(); var thesisFile = new Core.Models.DbModels.File { Guid = fileGuid, FileName = request.ThesisFile.FileName, Extension = Path.GetExtension(request.ThesisFile.FileName), Path = Path.Combine(thesisGuid.ToString(), fileGuid.ToString()), ContentType = request.ThesisFile.ContentType, CreatedBy = promoter, Size = request.ThesisFile.Length, Checksum = _fileService.GenerateChecksum(request.ThesisFile.OpenReadStream()) }; await _fileService.SaveFile(request.ThesisFile.OpenReadStream(), thesisGuid.ToString(), fileGuid.ToString()); var thesis = new Thesis() { Guid = thesisGuid, TermId = getCurrentTerm.Result.Id, Title = requestData.Title, Abstract = requestData.Abstract, Promoter = promoter, Reviewer = reviewer, ThesisAuthors = thesisAuthors, ThesisKeywords = thesisKeywords, ThesisLogs = thesisLogs, File = thesisFile, CreatedBy = promoter, }; await _thesisRepository.AddAsync(thesis); await _thesisService.SendEmailThesisCreated(thesisGuid); return(new CreatedResult("/theses", thesisGuid)); }