private int SaveNewVersion(CreateVersionViewModel model)
        {
            byte[] byteArray = null;

            using (var memory = new MemoryStream())
            {
                model.Archive.InputStream.CopyTo(memory);
                byteArray = memory.GetBuffer();
            }

            var fileName            = string.Format(GlobalPatternConstants.VERSION_NAME, DateTime.Now.ToUniversalTime(), model.Archive.FileName);
            var fullPath            = storage.UploadFile(byteArray, fileName, GlobalConstants.STORAGE_FOLDER);
            var extensionStartIndex = model.Archive.FileName.LastIndexOf('.');
            var fileExtension       = model.Archive.FileName.Substring(extensionStartIndex + 1, model.Archive.FileName.Length - extensionStartIndex - 1).ToLower();

            var version = new ThesesSystem.Models.Version()
            {
                ThesisId      = model.Id,
                StoragePath   = fullPath,
                FileName      = model.Archive.FileName,
                FileExtension = fileExtension
            };

            this.Data.Versions.Add(version);
            this.Data.SaveChanges();

            return(version.Id);
        }
        public ActionResult AddVersion(int id, CreateVersionViewModel model)
        {
            if (this.IsThesisStudentOrTeacher(id))
            {
                if (ModelState.IsValid && model.Archive != null && model.Archive.ContentLength > 0)
                {
                    var userId = this.User.Identity.GetUserId();

                    var versionId = 0;

                    try
                    {
                        versionId = SaveNewVersion(model);
                    }
                    catch (Exception)
                    {
                        return(View(model));
                    }

                    UpdateParts(model.Id, model.ThesisParts);
                    UpdatePages(model.Id, model.Pages);

                    var logger = this.loggerCreator.Create(this.Data);
                    var log    = new ThesisLog
                    {
                        ThesisId   = model.Id,
                        UserId     = userId,
                        LogType    = LogType.AddedVersion,
                        ForwardUrl = string.Format(GlobalPatternConstants.FORWARD_URL_WITH_ID, "Thesis", "Version", versionId)
                    };
                    logger.Log(log);

                    CreateNotification(id, userId, log.ForwardUrl, GlobalPatternConstants.NOTIFICATION_ADDED_VERSION);

                    return(RedirectToAction("Version", "Thesis", new { id = versionId }));
                }

                return(View(model));
            }

            return(RedirectToAction("Index", "Storage"));
        }
        public async Task <IActionResult> Create(CreateVersionViewModel model, string projectUrl)
        {
            if (ModelState.IsValid)
            {
                if (model.StartDate > model.DueDate)
                {
                    ModelState.AddModelError("DueDate", "Due date cannot be before start date.");
                    return(View(model));
                }

                int versionCount = Database.ProjectVersion
                                   .Include(v => v.Project)
                                   .Where(v => v.Project.Url == projectUrl && v.Url == model.Url)
                                   .Select(v => v.Id)
                                   .Count();

                bool isUnique = versionCount == 0 ? true : false;
                if (!isUnique)
                {
                    ModelState.AddModelError("Version", "Such url is taken.");
                    return(View(model));
                }

                Project project = Database.Project
                                  .Where(p => p.Url == projectUrl)
                                  .FirstOrDefault();

                if (model.StartDate < project.StartDate)
                {
                    ModelState.AddModelError("StartDate", $"Start date must be after or equal {project.StartDate:dd.MM.yy}");
                    return(View(model));
                }
                if (model.DueDate > project.DueDate)
                {
                    ModelState.AddModelError("DueDate", $"Due date must be before or equal {project.DueDate:dd.MM.yy}");
                    return(View(model));
                }

                ProjectVersion version = new ProjectVersion
                {
                    Name      = model.Name,
                    Overview  = model.Overview,
                    StartDate = model.StartDate,
                    DueDate   = model.DueDate,
                    Url       = model.Url,
                    ProjectId = project.Id
                };

                Database.ProjectVersion.Add(version);

                int userId = int.Parse(User.Claims.First(c => c.Type == "UserId").Value);

                ProjectActivity activity = new ProjectActivity
                {
                    ProjectId = project.Id,
                    AuthorId  = userId,
                    Content   = $"Created version '{version.Name}'"
                };
                Database.ProjectActivity.Add(activity);

                await Database.SaveChangesAsync();

                return(RedirectToAction("Index", "Version", new { versionUrl = version.Url }));
            }

            return(View(model));
        }
        private int SaveNewVersion(CreateVersionViewModel model)
        {
            byte[] byteArray = null;

            using (var memory = new MemoryStream())
            {
                model.Archive.InputStream.CopyTo(memory);
                byteArray = memory.GetBuffer();
            }

            var fileName = string.Format(GlobalPatternConstants.VERSION_NAME, DateTime.Now.ToUniversalTime(), model.Archive.FileName);
            var fullPath = storage.UploadFile(byteArray, fileName, GlobalConstants.STORAGE_FOLDER);
            var extensionStartIndex = model.Archive.FileName.LastIndexOf('.');
            var fileExtension = model.Archive.FileName.Substring(extensionStartIndex + 1, model.Archive.FileName.Length - extensionStartIndex - 1).ToLower();

            var version = new ThesesSystem.Models.Version()
            {
                ThesisId = model.Id,
                StoragePath = fullPath,
                FileName = model.Archive.FileName,
                FileExtension = fileExtension
            };

            this.Data.Versions.Add(version);
            this.Data.SaveChanges();

            return version.Id;
        }
        public ActionResult AddVersion(int id, CreateVersionViewModel model)
        {
            if (this.IsThesisStudentOrTeacher(id))
            {
                if (ModelState.IsValid && model.Archive != null && model.Archive.ContentLength > 0)
                {
                    var userId = this.User.Identity.GetUserId();

                    var versionId = 0;

                    try
                    {
                        versionId = SaveNewVersion(model);
                    }
                    catch (Exception)
                    {
                        return View(model);
                    }

                    UpdateParts(model.Id, model.ThesisParts);
                    UpdatePages(model.Id, model.Pages);

                    var logger = this.loggerCreator.Create(this.Data);
                    var log = new ThesisLog
                    {
                        ThesisId = model.Id,
                        UserId = userId,
                        LogType = LogType.AddedVersion,
                        ForwardUrl = string.Format(GlobalPatternConstants.FORWARD_URL_WITH_ID, "Thesis", "Version", versionId)
                    };
                    logger.Log(log);

                    CreateNotification(id, userId, log.ForwardUrl, GlobalPatternConstants.NOTIFICATION_ADDED_VERSION);

                    return RedirectToAction("Version", "Thesis", new { id = versionId });
                }

                return View(model);
            }

            return RedirectToAction("Index", "Storage");
        }