public ICollection <PresentationTag> MapToPresentationTag(PresentationViewModel presentationViewModel, SpeakerProfile presentationOwner)
        {
            ICollection <string> tags = presentationViewModel.Tags.Split(" ");

            Presentation presentation = new Presentation()
            {
                Title             = presentationViewModel.Title,
                ShortDescription  = presentationViewModel.ShortDescription,
                LongDescription   = presentationViewModel.LongDescription,
                PresentationOwner = presentationOwner
            };

            ICollection <PresentationTag> presentationTags = new List <PresentationTag>();

            foreach (var tagName in tags)
            {
                PresentationTag presentationTag = new PresentationTag()
                {
                    Presentation = presentation,
                    Tag          = new Tag()
                    {
                        TagName = tagName
                    }
                };
                presentationTags.Add(presentationTag);
            }
            return(presentationTags);
        }
        private async Task <OperationStatus> ModifyPresentationInPlace(string userId, Presentation p, UploadPresentationModel updateModel)
        {
            p.Name             = updateModel.Name;
            p.Description      = updateModel.Description;
            p.CategoryId       = updateModel.CategoryId;
            p.IsPublic         = updateModel.IsPublic;
            p.PresentationTags = new List <PresentationTag>();

            var associatedPTs = await _context.PresentationTags.Where(pt => pt.PresentationId == p.Id).ToListAsync();

            _context.PresentationTags.RemoveRange(associatedPTs);

            var newTagsResult = await _tagsRepository.CreateOrGetTags(updateModel.Tags);

            if (newTagsResult.ErrorMessageIfAny != null)
            {
                return(newTagsResult);
            }

            foreach (var tag in newTagsResult.Value)
            {
                var pt = new PresentationTag
                {
                    Tag          = tag,
                    Presentation = p
                };

                tag.PresentationTags.Add(pt);
                p.PresentationTags.Add(pt);
            }

            if (updateModel.SourceStream != null)
            {
                await _filesRepository.DeleteFileWithId(p.FileID);

                var createResult = await _filesRepository.SaveFile(updateModel.SourceStream);

                if (createResult.ErrorMessageIfAny != null)
                {
                    return(createResult);
                }

                p.FileID = createResult.Value;
            }

            _context.Presentations.Update(p);
            var rows = await _context.SaveChangesAsync();

            if (rows == 0)
            {
                return(new OperationStatus
                {
                    ErrorMessageIfAny = "An error ocurred while trying to update the database"
                });
            }

            return(new OperationStatus());
        }
        public async Task <OperationStatus> UploadPresentationForUser(string userId, UploadPresentationModel model)
        {
            var upList = await _context.UserPresentations.Where(userPresentation => userPresentation.UserId == userId)
                         .Include(userp => userp.Presentation).Where(userp => userp.Presentation.Name == model.Name).ToListAsync();

            if (upList.Count > 0)
            {
                return(new OperationStatus {
                    ErrorMessageIfAny = OperationStatus.kPresentationWithSameNameExists
                });
            }

            if (!_context.Categories.Any(c => c.Id == model.CategoryId))
            {
                return(new OperationStatus {
                    ErrorMessageIfAny = OperationStatus.kNoSuchCategoryWithId
                });
            }

            var tagsForPresentationResult = await _tagsRepository.CreateOrGetTags(model.Tags);

            if (tagsForPresentationResult.ErrorMessageIfAny != null)
            {
                return(tagsForPresentationResult);
            }
            var tagsForPresentation = tagsForPresentationResult.Value;

            var currentPresentation = new Presentation
            {
                Name              = model.Name,
                Description       = model.Description,
                UserPresentations = new List <UserPresentation>(),
                CategoryId        = model.CategoryId,
                PresentationTags  = new List <PresentationTag>(),
                IsPublic          = model.IsPublic
            };

            var saveResult = await _filesRepository.SaveFile(model.SourceStream);

            if (saveResult.ErrorMessageIfAny != null)
            {
                return(saveResult);
            }
            currentPresentation.FileID = saveResult.Value;

            await _context.Presentations.AddAsync(currentPresentation);

            foreach (var tag in tagsForPresentation)
            {
                var pt = new PresentationTag
                {
                    Tag          = tag,
                    Presentation = currentPresentation
                };

                tag.PresentationTags.Add(pt);
                currentPresentation.PresentationTags.Add(pt);
            }

            var up = new UserPresentation
            {
                PresentationId = currentPresentation.Id,
                UserId         = userId
            };

            _context.UserPresentations.Add(up);


            int rows = await _context.SaveChangesAsync();

            if (rows > 0)
            {
                return(new OperationStatus());
            }

            return(new OperationStatus()
            {
                ErrorMessageIfAny = OperationStatus.kUnknownError
            });
        }