Esempio n. 1
0
        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}");
                }
            }
        }
Esempio n. 2
0
        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));
        }