Esempio n. 1
0
        /// <summary>
        /// Update seen status for season's episodes
        /// </summary>
        /// <param name="id">Season Id</param>
        /// <param name="seen">Seen status</param>
        public void UpdateSeenStatus(int id, bool seen)
        {
            var user   = this.Utils.GetCurrentUser();
            var season = this._databaseContext.Seasons.Find(id);

            var episodes = this._databaseContext.Episodes.Where(x => x.Season.Id == id).ToList();

            foreach (var i in episodes)
            {
                var connection = i.ConnectedUsers.FirstOrDefault(x => x.User.Id == user.Id);
                if (connection != null)
                {
                    connection.Seen   = seen;
                    connection.SeenOn = seen ? (DateTime?)DateTime.Now : null;
                    this._databaseContext.UserEpisodeSwitch.Update(connection);
                }
                else
                {
                    if (seen)
                    {
                        var userEpisode = new UserEpisode
                        {
                            UserId    = user.Id,
                            EpisodeId = i.Id,
                            Seen      = true,
                            SeenOn    = DateTime.Now
                        };
                        this._databaseContext.UserEpisodeSwitch.Add(userEpisode);
                    }
                }
            }

            this._databaseContext.SaveChanges();

            this.Logger.LogInformation(user, this.GetService(), this.GetEvent("set season seen status for"), id);
            this.Notification.AddStatusLibraryNotificationByType(StatusLibraryNotificationType.SeasonSeenStatusUpdated,
                                                                 user, season?.Series.Title ?? "", season?.Number.ToString() ?? "", seen ? "Seen" : "Unseen");
        }
        public MUser Update(int id, UserUpdateRequest request)
        {
            var user         = _ctx.Users.Find(id);
            var userToReturn = _mapper.Map <MUser>(user);

            userToReturn.FavouriteEpisodes = _ctx.UserEpisodes.Where(y => y.UserId == user.Id).Select(y => new
                                                                                                      MEpisode
            {
                Id        = y.EpisodeId,
                MediaFile = _mapper.Map <MMediaFile>(y.Episode.MediaFile),
                Title     = y.Episode.Title,
                AirDate   = (DateTime)y.Episode.AirDate,
                OverallNumberOfEpisode = (int)y.Episode.OverallNumberOfEpisode,
                SeasonEpisodeNumber    = y.Episode.SeasonEpisodeNumber,
                Season     = _mapper.Map <MSeason>(y.Episode.Season),
                Summary    = y.Episode.Summary,
                Viewcount  = y.Episode.Viewcount,
                Characters = _mapper.Map <List <MCharacter> >(_ctx.EpisodeCharacters.Include(z => z.Character.CharacterMediaFile).Where(z => z.EpisodeId == y.EpisodeId).Select(x => x.Character).ToList())
            }).ToList();

            userToReturn.FavouriteCharacters = _ctx.UserCharacters.Where(y => y.UserId == user.Id).Select(y => new
                                                                                                          MCharacter
            {
                Id                 = y.CharacterId,
                Biography          = y.Character.Biography,
                BirthDate          = y.Character.BirthDate,
                FirstName          = y.Character.FirstName,
                LastName           = y.Character.LastName,
                CharacterMediaFile = _mapper.Map <MCharacterMediaFile>(y.Character.CharacterMediaFile),
                Occupation         = y.Character.Occupation,
                FamilyId           = (int)y.Character.FamilyId
            }).ToList();

            userToReturn.WatchedEpisodes = _ctx.UserEpisodeActivities.Where(y => y.UserId == id).Select(y => new MEpisode
            {
                Id        = y.EpisodeId,
                MediaFile = _mapper.Map <MMediaFile>(y.Episode.MediaFile),
                Title     = y.Episode.Title,
                AirDate   = (DateTime)y.Episode.AirDate,
                OverallNumberOfEpisode = (int)y.Episode.OverallNumberOfEpisode,
                SeasonEpisodeNumber    = y.Episode.SeasonEpisodeNumber,
                Season    = _mapper.Map <MSeason>(y.Episode.Season),
                Summary   = y.Episode.Summary,
                Viewcount = y.Episode.Viewcount
            }).ToList();

            if (request.NewFavouriteCharacter != null)
            {
                UserCharacter uc = new UserCharacter {
                    CharacterId = request.NewFavouriteCharacter.Id, UserId = user.Id
                };

                if (request.ToAdd)
                {
                    _ctx.UserCharacters.Add(uc);
                    _ctx.SaveChanges();

                    userToReturn.FavouriteCharacters.Add(new MCharacter
                    {
                        Id                 = request.NewFavouriteCharacter.Id,
                        FirstName          = request.NewFavouriteCharacter.FirstName,
                        CharacterMediaFile = _mapper.Map <MCharacterMediaFile>(request.NewFavouriteCharacter.CharacterMediaFile),
                        FamilyId           = request.NewFavouriteCharacter.FamilyId,
                        Biography          = request.NewFavouriteCharacter.Biography,
                        BirthDate          = request.NewFavouriteCharacter.BirthDate,
                        LastName           = request.NewFavouriteCharacter.LastName,
                        Occupation         = request.NewFavouriteCharacter.Occupation
                    });
                }
                else
                {
                    _ctx.UserCharacters.Remove(uc);
                    _ctx.SaveChanges();

                    var ch = userToReturn.FavouriteCharacters.Where(x => x.Id == request.NewFavouriteCharacter.Id).FirstOrDefault();
                    userToReturn.FavouriteCharacters.Remove(ch);
                }
            }

            if (request.NewFavouriteEpisode != null)
            {
                UserEpisode ue = new UserEpisode {
                    EpisodeId = request.NewFavouriteEpisode.Id, UserId = user.Id
                };

                if (request.ToAdd)
                {
                    _ctx.UserEpisodes.Add(ue);
                    _ctx.SaveChanges();

                    userToReturn.FavouriteEpisodes.Add(new MEpisode
                    {
                        Id        = request.NewFavouriteEpisode.Id,
                        Title     = request.NewFavouriteEpisode.Title,
                        MediaFile = _mapper.Map <MMediaFile>(request.NewFavouriteEpisode.MediaFile),
                        AirDate   = request.NewFavouriteEpisode.AirDate,
                        OverallNumberOfEpisode = request.NewFavouriteEpisode.OverallNumberOfEpisode,
                        SeasonEpisodeNumber    = request.NewFavouriteEpisode.SeasonEpisodeNumber,
                        Summary    = request.NewFavouriteEpisode.Summary,
                        Viewcount  = request.NewFavouriteEpisode.Viewcount,
                        Season     = request.NewFavouriteEpisode.Season,
                        Characters = _mapper.Map <List <MCharacter> >(_ctx.EpisodeCharacters.Include(z => z.Character.CharacterMediaFile).Where(z => z.EpisodeId == request.NewFavouriteEpisode.Id).Select(x => x.Character).ToList())
                    });
                }
                else
                {
                    _ctx.UserEpisodes.Remove(ue);
                    _ctx.SaveChanges();


                    var ep = userToReturn.FavouriteEpisodes.Where(x => x.Id == request.NewFavouriteEpisode.Id).FirstOrDefault();
                    userToReturn.FavouriteEpisodes.Remove(ep);
                }
            }

            return(userToReturn);
        }
Esempio n. 3
0
        public void RateEpisode(string episodeIdString, string ratingString, string seriesIdString, string seasonIdString)
        {
            var episodeId = Convert.ToInt64(episodeIdString);
            var rating    = Convert.ToInt32(ratingString);
            var seriesId  = Convert.ToInt64(seriesIdString);
            var seasonId  = Convert.ToInt64(seasonIdString);

            string userId = User.FindFirstValue(ClaimTypes.NameIdentifier);

            var userEpisode = _context.UserEpisodes
                              .Where(x => x.EpisodeId == episodeId && x.UserId == userId)
                              .FirstOrDefault();

            var oldEpisodesWatched = _context.UserEpisodes
                                     .Include(x => x.Episode)
                                     .ThenInclude(x => x.Season)
                                     .Where(x => x.Episode.Season.SeriesId == seriesId);

            var oldSeasonEpisodeWatchedCount = oldEpisodesWatched.Where(x => x.Episode.SeasonId == seasonId).Count();

            if (userEpisode == null)
            {
                var episodeRating = new UserEpisode
                {
                    EpisodeId = episodeId,
                    UserId    = userId,
                    Rating    = rating,
                    CreatedAt = DateTime.UtcNow,
                    CreatedBy = userId
                };
                _context.UserEpisodes.Add(episodeRating);
                _context.SaveChanges();
            }
            else
            {
                userEpisode.Rating        = rating;
                userEpisode.LastChangedAt = DateTime.UtcNow;
                userEpisode.LastChangedBy = userId;
                _context.Update(userEpisode);
                _context.SaveChanges();
            }

            var episode = _context.Episodes.Where(x => x.Id == episodeId).FirstOrDefault();

            // TODO handle when episode vote is updated not added

            var userEpisodes  = _context.UserEpisodes.Where(x => x.EpisodeId == episodeId).ToList();
            var numberOfVotes = userEpisodes.Count();
            var ratingSum     = userEpisodes.Sum(x => x.Rating);

            var newRating = (decimal)ratingSum / numberOfVotes;

            episode.UserRating = newRating;

            _context.Update(episode);
            _context.SaveChanges();

            var episodesWatched = _context.UserEpisodes
                                  .Include(x => x.Episode)
                                  .ThenInclude(x => x.Season)
                                  .Where(x => x.Episode.Season.SeriesId == seriesId);

            var episodesCount             = episodesWatched.Count();
            var seasonEpisodeWatchedCount = episodesWatched.Where(x => x.Episode.SeasonId == seasonId).Count();
            var seasonEpisodesCount       = episodesWatched.FirstOrDefault().Episode.Season.NumberOfEpisodes;

            bool isFullSeasonWatched = false;

            if (seasonEpisodesCount.HasValue)
            {
                isFullSeasonWatched = seasonEpisodeWatchedCount >= seasonEpisodesCount.Value &&
                                      oldSeasonEpisodeWatchedCount != seasonEpisodeWatchedCount;
            }

            var userSeries = _context.UsersSeries
                             .Where(x => x.SeriesId == seriesId && x.UserId == userId)
                             .FirstOrDefault();

            if (userSeries != null)
            {
                userSeries.EpisodesWatched = episodesCount;
                if (isFullSeasonWatched)
                {
                    userSeries.SeasonsWatched++;
                }
                _context.Update(userSeries);
                _context.SaveChanges();
            }
        }