public ActivityCommand(ServiceFacade serviceFacade, ConfigureUserSite configureUserSite, DataGenerator.Activity activityDataGenerator, DataGenerator.DateTime dateTimeDataGenerator, ActivityService activityService) : base(serviceFacade, configureUserSite) { _activityDataGenerator = activityDataGenerator ?? throw new ArgumentNullException(nameof(activityDataGenerator)); _dateTimeDataGenerator = dateTimeDataGenerator ?? throw new ArgumentNullException(nameof(dateTimeDataGenerator)); _activityService = activityService ?? throw new ArgumentNullException(nameof(activityService)); _facade.App.Command("activity", _ => { _.Description = "Create, read, update, or delete activity"; _.HelpOption("-?|-h|--help"); var createRandomOption = _.Option("-er|--enterrandom <count>", "Enter <count> random activity items", CommandOptionType.SingleValue); var displayStatusOption = _.Option("-q|--quiet", "Suppress status while entering activity items", CommandOptionType.NoValue); var challengeStatusOption = _.Option("-c|--challenge", "Include random challenge tasks when entering random activity items", CommandOptionType.NoValue); var challengePercentOption = _.Option("-cp|--challengepercent <percentage>", "Specify what percentage of activities should be challenges. Defaults to 30.", CommandOptionType.SingleValue); var codePercentOption = _.Option("-scp|--secretcodepercent <percentage>", "Specify what percentage of non-challenge activities should be secret codes. Defaults to 30.", CommandOptionType.SingleValue); _.OnExecute(async() => { bool quiet = displayStatusOption.HasValue() && displayStatusOption.Value().Equals("on", StringComparison.CurrentCultureIgnoreCase); bool challenges = challengeStatusOption.HasValue() && challengeStatusOption.Value().Equals("on", StringComparison.CurrentCultureIgnoreCase); int challengePercent = challenges ? 30 : 0; if (challenges && challengePercentOption.HasValue()) { if (!(int.TryParse(challengePercentOption.Value(), out challengePercent) && challengePercent >= 0 && challengePercent < 101)) { throw new ArgumentException("Error: <percentage> must be a number between 0 and 100."); } } int codePercent = 30; if (codePercentOption.HasValue()) { if (!(int.TryParse(codePercentOption.Value(), out codePercent) && codePercent >= 0 && codePercent < 101)) { throw new ArgumentException("Error: <percentage> must be a number between 0 and 100."); } } if (createRandomOption.HasValue()) { if (!int.TryParse(createRandomOption.Value(), out int howMany)) { throw new ArgumentException("Error: <count> must be a number random activity items to enter."); } return(await EnterActivity(howMany, challengePercent, codePercent, quiet)); } else { _.ShowHelp(); return(2); } }); }, throwOnUnexpectedArg: true); async Task <int> EnterActivity(int howMany, int challengePercent, int codePercent, bool quiet) { int inserted = 0; var issues = new List <string>(); var activities = await _activityDataGenerator.Generate(Site, howMany, challengePercent, codePercent, quiet); if (!quiet) { Console.Write($"Inserting {howMany} activity items... "); } ProgressBar progress = quiet ? null : new ProgressBar(); try { foreach (var activity in activities) { _dateTimeDataGenerator.SetRandom(Site, activity.User); try { await _configureUserSite.Lookup(activity.User.Id); _activityService.ClearCachedUserContext(); switch (activity.ActivityType) { case DataGenerator.ActivityType.SecretCode: await _activityService .LogSecretCodeAsync(activity.User.Id, activity.SecretCode); break; case DataGenerator.ActivityType.ChallengeTasks: await _activityService .UpdateChallengeTasksAsync(activity.ChallengeId, activity.ChallengeTasks); break; default: case DataGenerator.ActivityType.Default: await _activityService .LogActivityAsync(activity.User.Id, activity.ActivityAmount); break; } inserted++; } catch (GraException gex) { switch (activity.ActivityType) { case DataGenerator.ActivityType.ChallengeTasks: issues.Add($"Problem logging challenge tasks for {activity.User.Id}: {gex.Message}"); break; case DataGenerator.ActivityType.SecretCode: issues.Add($"Problem logging code {activity.SecretCode} for {activity.User.Id}: {gex.Message}"); break; default: case DataGenerator.ActivityType.Default: issues.Add($"Problem logging {activity.ActivityAmount} for {activity.User.Id}: {gex.Message}"); break; } } if (progress != null) { progress.Report((double)inserted / howMany); } } } finally { if (progress != null) { progress.Dispose(); } } Console.WriteLine($"Inserted {inserted} random activity items in {Site.Name}."); if (issues.Count > 0) { Console.WriteLine("Some issues were encountered:"); foreach (string issue in issues) { Console.WriteLine($"- {issue}"); } } return(inserted == howMany ? 0 : 1); } }
public UserCommand(ServiceFacade facade, ConfigureUserSite configureUserSite, DataGenerator.DateTime dateTimeDataGenerator, DataGenerator.User userDataGenerator, ReportService reportService) : base(facade, configureUserSite) { _dateTimeDataGenerator = dateTimeDataGenerator ?? throw new ArgumentNullException(nameof(dateTimeDataGenerator)); _userDataGenerator = userDataGenerator ?? throw new ArgumentNullException(nameof(userDataGenerator)); _reportService = reportService ?? throw new ArgumentNullException(nameof(reportService)); _facade.App.Command("user", _ => { _.Description = "Create, read, update, or delete users"; _.HelpOption("-?|-h|--help"); var repeatOption = _.Option("-r|--repeat <count>", "Repeat <count> times", CommandOptionType.SingleValue); var createRandomOption = _.Option("-cr|--createrandom <count>", "Create <count> random users", CommandOptionType.SingleValue); var displayStatusOption = _.Option("-q|--quiet", "Suppress status while creating users", CommandOptionType.NoValue); var householdOption = _.Option("-hh|--household", "Also create households when inserting random users", CommandOptionType.NoValue); var countCommand = _.Command("count", _c => { _c.Description = "Get a total number of users in a site."; _c.HelpOption("-?|-h|--help"); _c.OnExecuteAsync(async cancellationToken => { await EnsureUserAndSiteLoaded(); return(await DisplayUserCount()); }); }); _.OnExecuteAsync(async cancellationToken => { bool quiet = displayStatusOption.HasValue() && displayStatusOption.Value().Equals("on", StringComparison.OrdinalIgnoreCase); bool household = householdOption.HasValue() && householdOption.Value().Equals("on", StringComparison.OrdinalIgnoreCase); int repeat = 1; if (repeatOption.HasValue() && !int.TryParse(repeatOption.Value(), out repeat)) { throw new ArgumentException("Error: <count> must be a number of times to repeat."); } if (createRandomOption.HasValue()) { if (!int.TryParse(createRandomOption.Value(), out int howMany)) { throw new ArgumentException("Error: <count> must be a number of users to create."); } int result = 0; while (repeat >= 1) { var thisResult = await CreateUsers(howMany, household, quiet); result = Math.Max(result, thisResult); repeat--; Console.WriteLine(); if (repeat > 0) { Console.WriteLine($"Repeating {repeat} more time(s)."); } } return(result); } else { _.ShowHelp(); return(2); } }); }); }