private bool InsertOrUpdateUser(UserInformationDto userInformation)
        {
            var user = _unitOfWork.UserRepository.GetSingle(p => p.Email == userInformation.email);

            if (user != null)
            {
                user.ExternalId = userInformation.id;
                user.Token      = userInformation.accessToken;
                _unitOfWork.UserRepository.Update(user);
            }
            else
            {
                user = new User()
                {
                    Id         = -1,
                    Email      = userInformation.email,
                    ExternalId = userInformation.id,
                    Token      = userInformation.accessToken
                };
                _unitOfWork.UserRepository.Insert(user);
            }

            _unitOfWork.Save();

            SimplerNewsSQLDb db = new SimplerNewsSQLDb();

            db.ResetUserPreferences(user.Id);

            return(true);
        }
        public bool UpdateUserPreferences(UserInformationDto userInformation)
        {
            try
            {
                InsertOrUpdateUser(userInformation);
                var user = _unitOfWork.UserRepository.GetSingle(p => p.Email == userInformation.email);

                if (userInformation.facebookJSON?.likes != null)
                {
                    SimplerNewsSQLDb db = new SimplerNewsSQLDb();
                    db.ResetUserPreferences(user.Id);

                    foreach (var like in userInformation.facebookJSON.likes)
                    {
                        var facebookLikeCategory =
                            _unitOfWork.FacebookCategoryRepository.GetSingle(p => p.CategoryName == like.category);
                        if (facebookLikeCategory != null)
                        {
                            var pref =
                                _unitOfWork.UserPreferencesRepository.GetSingle(
                                    p => p.YoutubeCategoryId == facebookLikeCategory.VideoCategoryId && p.UserId == user.Id);
                            if (pref != null)
                            {
                                double additionalScore = (1.0 / (DateTime.Now.Year - DateTime.Parse(like.liked_date).Year + 1));
                                // ReSharper disable once PossibleLossOfFraction
                                decimal addition = Convert.ToDecimal(additionalScore);
                                pref.Score += addition;
                                _unitOfWork.UserPreferencesRepository.Update(pref);
                                _unitOfWork.Save();
                            }
                        }
                    }
                }

                return(true);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
 public UnitOfWork()
 {
     _context = new SimplerNewsSQLDb();
 }
        public List <VideoDto> GetPersonalizedVideos(string token, int numberOfVideos)
        {
            SimplerNewsSQLDb db        = new SimplerNewsSQLDb();
            List <VideoDto>  videoList = new List <VideoDto>();
            var user = _unitOfWork.UserRepository.GetSingle(p => p.Token == token);

            if (user == null)
            {
                return(videoList);
            }

            var userPreferences = _unitOfWork.UserPreferencesRepository.GetMany(p => p.UserId == user.Id).ToList();

            decimal sumPref = userPreferences.Sum(p => p.Score);

            while (videoList.Count < numberOfVideos)
            {
                decimal randomNumber = Convert.ToDecimal(RandomHelper.RandomNumberBetween(0, Convert.ToDouble(sumPref)));

                userPreferences = userPreferences.OrderBy(p => new Guid()).ToList();

                for (int i = 1; i < userPreferences.Count; i++)
                {
                    var sum = userPreferences.Take(i).Sum(p => p.Score);
                    if (sum >= randomNumber)
                    {
                        var categoryId = userPreferences[i - 1].YoutubeCategoryId;
                        //var videoId  = _unitOfWork.VideoRepository.GetFirst(p => p.PublishedAt > DateTime.Now.AddDays(-5)
                        //                                                    && p.VideoCategoryId == categoryId
                        //                                                    && !user.UserVideoWatched.Select(x => x.VideoId).Contains(p.Id));


                        int videoId = -1;

                        var userVideoWatched = user.UserVideoWatched.Select(p => p.VideoId).ToList();
                        var dateFrom         = DateTime.Now.AddDays(-7);
                        var v =
                            db.Video.FirstOrDefault(
                                p =>
                                p.PublishedAt > dateFrom && p.VideoCategoryId == categoryId &&
                                !userVideoWatched.Contains(p.Id));
                        if (v != null)
                        {
                            videoId = v.Id;
                        }

                        var video = _unitOfWork.VideoRepository.GetByID(videoId);

                        if (video != null)
                        {
                            VideoDto videoDto = new VideoDto()
                            {
                                YoutubeChannelId = video.YoutubeChannelId,
                                Description      = video.Description,
                                VideoCategory    =
                                    new VideoCategoryDto()
                                {
                                    Id = video.VideoCategory.Id,
                                    YoutbeVideoCategoryId = video.VideoCategory.YoutbeVideoCategoryId,
                                    VideoCategoryName     = video.VideoCategory.VideoCategoryName
                                },
                                Id               = video.Id,
                                PublishedAt      = video.PublishedAt,
                                YoutubeId        = video.YoutubeId,
                                Title            = video.Title,
                                VideoTagList     = video.VideoTag.ToList().Select(p => p.Tag).ToList(),
                                YoutubeLink      = video.YoutubeLink,
                                NumberOfDislikes = video.NumberOfDislikes ?? 0,
                                NumberOfViews    = video.NumberOfViews ?? 0,
                                NumberOfLikes    = video.NumberOfLikes ?? 0,
                                Etag             = video.Etag,
                                NumberOfComments = video.NumberOfComments ?? 0,
                                Kind             = video.Kind
                            };
                            if (!videoList.Select(p => p.Id).Contains(videoDto.Id))
                            {
                                videoList.Add(videoDto);
                            }
                        }
                    }
                }
            }


            foreach (var videoDto in videoList)
            {
                _unitOfWork.UserVideoWatchedRepository.Insert(new UserVideoWatched()
                {
                    Id      = -1,
                    UserId  = user.Id,
                    VideoId = videoDto.Id
                });
            }

            _unitOfWork.Save();

            return(videoList);
        }
 /// <summary>
 /// Public Constructor,initializes privately declared local variables.
 /// </summary>
 /// <param name="context"></param>
 public GenericRepositorySQL(SimplerNewsSQLDb context)
 {
     this.Context = context;
     this.DbSet   = context.Set <TEntity>();
 }