/// <summary> /// Adds the specified user to the list of current users. /// The user name can either be a known user name (i.e. a user /// that has already joined the schedule sometime before) or /// a new user name (in this case the user's info is added to the DB). /// </summary> /// <param name="userVM"></param> public async Task AddUserAsync(UserViewModel userVM, ErrorReporter errorReporter) { if (userVM == null) { errorReporter.Throw( new ArgumentNullException(nameof(userVM), UserErrorsViewModel.GenericErrorMessage)); } if (string.IsNullOrWhiteSpace(userVM.Name)) { errorReporter.Throw( new ArgumentException("The name of the specified user is invalid", nameof(userVM)), UserErrorsViewModel.UserNameInvalidMessage); } if (Users.Any(o => o.Name == userVM.Name)) { errorReporter.Throw( new ArgumentException($"The user name '{userVM.Name}' is already in use", nameof(userVM.Name)), UserErrorsViewModel.UserNameAlreadyInUseMessage); } if (Schedule.Users.Any(o => o.Name == userVM.Name)) { // This is a known user name Users.Add(userVM); AvailableUserNames.Remove(userVM.Name); } else { // The client is a new user Users.Add(userVM); // Create new known user in DB var dbUser = new User { Name = userVM.Name }; await PaulRepository.AddUserToScheduleAsync(Schedule, dbUser); } }