public async Task HandleAsync(UpdateTrainingCommand command, CancellationToken cancellationToken = default)
        {
            Guid.TryParse(httpContext.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value,
                          out Guid coachId);

            var coach = await repository.GetByAsync(p => p.Id == coachId, new[] { "Runners" }, cancellationToken);

            if (coach.Equals(null))
            {
                throw new ArgumentNullException($"There is no coach with Id {coachId}");
            }

            var runnerFromDB = coach.Runners.Find(r => r.Id == command.RunnerId);

            if (runnerFromDB == null)
            {
                throw new ArgumentNullException($"Coach {coachId} does not have this runner {command.RunnerId}!");
            }

            var trainingFromDB = runnerFromDB.Trainings.Find(t => t.Id == command.Id);

            if (trainingFromDB == null)
            {
                throw new ArgumentNullException("Runner does not have this training!");
            }

            var trainingDetails = TraningDetails.Create(command.Details, command.Comments);

            trainingFromDB.Update(command.TimeToDo, trainingDetails);

            await repository.SaveAsync(coach);
        }
        public static DataBaseContext CreateWithData()
        {
            var options = new DbContextOptionsBuilder <DataBaseContext>()
                          .UseInMemoryDatabase(Guid.NewGuid().ToString())
                          .Options;

            var context = new DataBaseContext(options);

            context.Database.EnsureCreated();

            var coachEmail = Email.Create("*****@*****.**");
            var coach      = Coach.Create("DbContextFactorylogin", "DbContextFactorypassword", "DbContextFactoryfirstName", "DbContextFactorylastName", "Qwertyqwerty", coachEmail);

            var runnerEmail = Email.Create("*****@*****.**");
            var runner      = Runner.Create("DbContextFactoryrunnerName", "DbContextFactoryrunnerLastName", runnerEmail);


            var trainingDetails = TraningDetails.Create("details", "comment");
            var training        = Training.Create(DateTime.UtcNow, trainingDetails);

            coach.AddRunner(runner);

            coach.AddTrainigForRunner(runner, training);

            context.Add(coach);
            context.Runners.Add(runner);
            context.Traings.Add(training);

            context.SaveChanges();

            return(context);
        }
        public async Task HandleAsync(CreateTrainingCommand command, CancellationToken cancellationToken = default)
        {
            Guid.TryParse(httpContext.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value,
                          out Guid coachId);

            var coach = await repository.GetByAsync(p => p.Id == coachId, new[] { "Runners" }, cancellationToken);

            if (coach.Runners.Capacity == 0)
            {
                throw new ArgumentNullException("Coach does not have this runner!");
            }

            var runner = coach.Runners.Find(r => r.Id == command.RunnerId);

            if (runner == null)
            {
                throw new ArgumentNullException("Coach does not have this runner!");
            }

            var trainingDetails = TraningDetails.Create(command.Details, command.Comments);

            var training = Training.Create(command.TimeToDo, trainingDetails);

            coach.AddTrainigForRunner(runner, training);

            var coachName = $"{coach.FirstName} {coach.LastName}";

            await eventPublisher.PublishAsync <TrainingCreated>
                (new TrainingCreated(training.Id, DateTime.Now, coachName, runner.Email.EmailAdress));

            await repository.SaveAsync(coach);
        }