Esempio n. 1
0
        public async Task <bool> Handle(AddRatingOfMovieCommand message, CancellationToken cancellationToken)
        {
            var userAuthenticatedId = _movieRepository.GetUserAuthenticatedId();

            if (!userAuthenticatedId.HasValue || userAuthenticatedId == Guid.Empty)
            {
                NotifyValidationErrors("Invalid user");
                return(false);
            }

            var ratingOfMovieRepo = _movieRepository.GetRatingOfMoviesByFilters(mr =>
                                                                                mr.UserId == userAuthenticatedId.Value &&
                                                                                mr.MovieId == message.MovieId).FirstOrDefault();

            RatingOfMovieAddedEvent ratingOfMovieAddedEvent = null;

            if (ratingOfMovieRepo == null)
            {
                var ratingOfMovie = RatingOfMovieFactory
                                    .Create(message.Rate, message.MovieId, userAuthenticatedId.Value);

                if (!ratingOfMovie.IsValid())
                {
                    NotifyValidationErrors(ratingOfMovie.ValidationResult);
                    return(false);
                }

                _movieRepository.AddRatingOfMovie(ratingOfMovie);
                ratingOfMovieAddedEvent = new RatingOfMovieAddedEvent(ratingOfMovie.Id, ratingOfMovie.Rate, ratingOfMovie.MovieId);
            }
            else
            {
                var ratingOfMovie = ratingOfMovieRepo;
                ratingOfMovie.UpdateRate(message.Rate);

                if (!ratingOfMovie.IsValid())
                {
                    NotifyValidationErrors(ratingOfMovie.ValidationResult);
                    return(false);
                }

                _movieRepository.UpdateRatingOfMovie(ratingOfMovie);
                ratingOfMovieAddedEvent = new RatingOfMovieAddedEvent(ratingOfMovie.Id, ratingOfMovie.Rate, ratingOfMovie.MovieId);
            }

            if (Commit())
            {
                if (ratingOfMovieAddedEvent != null)
                {
                    await _bus.RaiseEvent(ratingOfMovieAddedEvent);
                }

                return(await Task.FromResult(true));
            }

            return(false);
        }