Example #1
0
        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);
                    }
                });
            });
        }