@@ 24-127 (lines=104) @@ | ||
21 | /** |
|
22 | * Command to take a record snapshot |
|
23 | */ |
|
24 | class SnapshotCommand extends AbstractCommand |
|
25 | { |
|
26 | /** |
|
27 | * The default command name |
|
28 | * |
|
29 | * @var string|null |
|
30 | */ |
|
31 | protected static $defaultName = 'snapshot'; |
|
32 | ||
33 | /** |
|
34 | * JSON view for displaying the statistics. |
|
35 | * |
|
36 | * @var StatsJsonView |
|
37 | */ |
|
38 | private $view; |
|
39 | ||
40 | /** |
|
41 | * Filesystem adapter for the snapshots space. |
|
42 | * |
|
43 | * @var Filesystem |
|
44 | */ |
|
45 | private $filesystem; |
|
46 | ||
47 | /** |
|
48 | * Constructor. |
|
49 | * |
|
50 | * @param StatsJsonView $view JSON view for displaying the statistics. |
|
51 | * @param Filesystem $filesystem Filesystem adapter for the snapshots space. |
|
52 | */ |
|
53 | public function __construct(StatsJsonView $view, Filesystem $filesystem) |
|
54 | { |
|
55 | $this->view = $view; |
|
56 | $this->filesystem = $filesystem; |
|
57 | ||
58 | parent::__construct(); |
|
59 | } |
|
60 | ||
61 | /** |
|
62 | * Internal function to execute the command. |
|
63 | * |
|
64 | * @param InputInterface $input The input to inject into the command. |
|
65 | * @param OutputInterface $output The output to inject into the command. |
|
66 | * |
|
67 | * @return integer The command exit code |
|
68 | */ |
|
69 | protected function doExecute(InputInterface $input, OutputInterface $output): int |
|
70 | { |
|
71 | $symfonyStyle = new SymfonyStyle($input, $output); |
|
72 | ||
73 | $symfonyStyle->title('Creating Statistics Snapshot'); |
|
74 | ||
75 | // We want the full raw data set for our snapshot |
|
76 | $this->view->isAuthorizedRaw(true); |
|
77 | ||
78 | $source = $input->getOption('source'); |
|
79 | ||
80 | $filename = date('YmdHis'); |
|
81 | ||
82 | if ($source) |
|
83 | { |
|
84 | if (!\in_array($source, StatisticsRepository::ALLOWED_SOURCES)) |
|
85 | { |
|
86 | throw new InvalidOptionException( |
|
87 | \sprintf( |
|
88 | 'Invalid source "%s" given, valid options are: %s', |
|
89 | $source, |
|
90 | implode(', ', StatisticsRepository::ALLOWED_SOURCES) |
|
91 | ) |
|
92 | ); |
|
93 | } |
|
94 | ||
95 | $this->view->setSource($source); |
|
96 | ||
97 | $filename .= '_' . $source; |
|
98 | } |
|
99 | ||
100 | if (!$this->filesystem->write($filename, $this->view->render())) |
|
101 | { |
|
102 | $symfonyStyle->error('Failed writing snapshot to the filesystem.'); |
|
103 | ||
104 | return 1; |
|
105 | } |
|
106 | ||
107 | $symfonyStyle->success('Snapshot recorded.'); |
|
108 | ||
109 | return 0; |
|
110 | } |
|
111 | ||
112 | /** |
|
113 | * Configures the current command. |
|
114 | * |
|
115 | * @return void |
|
116 | */ |
|
117 | protected function configure(): void |
|
118 | { |
|
119 | $this->setDescription('Takes a snapshot of the statistics data.'); |
|
120 | $this->addOption( |
|
121 | 'source', |
|
122 | null, |
|
123 | InputOption::VALUE_OPTIONAL, |
|
124 | 'If given, filters the snapshot to a single source.' |
|
125 | ); |
|
126 | } |
|
127 | } |
|
128 |
@@ 24-128 (lines=105) @@ | ||
21 | /** |
|
22 | * Command to take a record snapshot for recently updated records |
|
23 | */ |
|
24 | class SnapshotRecentlyUpdatedCommand extends AbstractCommand |
|
25 | { |
|
26 | /** |
|
27 | * The default command name |
|
28 | * |
|
29 | * @var string|null |
|
30 | */ |
|
31 | protected static $defaultName = 'snapshot:recently-updated'; |
|
32 | ||
33 | /** |
|
34 | * JSON view for displaying the statistics. |
|
35 | * |
|
36 | * @var StatsJsonView |
|
37 | */ |
|
38 | private $view; |
|
39 | ||
40 | /** |
|
41 | * Filesystem adapter for the snapshots space. |
|
42 | * |
|
43 | * @var Filesystem |
|
44 | */ |
|
45 | private $filesystem; |
|
46 | ||
47 | /** |
|
48 | * Constructor. |
|
49 | * |
|
50 | * @param StatsJsonView $view JSON view for displaying the statistics. |
|
51 | * @param Filesystem $filesystem Filesystem adapter for the snapshots space. |
|
52 | */ |
|
53 | public function __construct(StatsJsonView $view, Filesystem $filesystem) |
|
54 | { |
|
55 | $this->view = $view; |
|
56 | $this->filesystem = $filesystem; |
|
57 | ||
58 | parent::__construct(); |
|
59 | } |
|
60 | ||
61 | /** |
|
62 | * Internal function to execute the command. |
|
63 | * |
|
64 | * @param InputInterface $input The input to inject into the command. |
|
65 | * @param OutputInterface $output The output to inject into the command. |
|
66 | * |
|
67 | * @return integer The command exit code |
|
68 | */ |
|
69 | protected function doExecute(InputInterface $input, OutputInterface $output): int |
|
70 | { |
|
71 | $symfonyStyle = new SymfonyStyle($input, $output); |
|
72 | ||
73 | $symfonyStyle->title('Creating Statistics Snapshot'); |
|
74 | ||
75 | // We want the full raw data set for our snapshot |
|
76 | $this->view->isAuthorizedRaw(true); |
|
77 | $this->view->isRecent(true); |
|
78 | ||
79 | $source = $input->getOption('source'); |
|
80 | ||
81 | $filename = date('YmdHis') . '_recent'; |
|
82 | ||
83 | if ($source) |
|
84 | { |
|
85 | if (!\in_array($source, StatisticsRepository::ALLOWED_SOURCES)) |
|
86 | { |
|
87 | throw new InvalidOptionException( |
|
88 | \sprintf( |
|
89 | 'Invalid source "%s" given, valid options are: %s', |
|
90 | $source, |
|
91 | implode(', ', StatisticsRepository::ALLOWED_SOURCES) |
|
92 | ) |
|
93 | ); |
|
94 | } |
|
95 | ||
96 | $this->view->setSource($source); |
|
97 | ||
98 | $filename .= '_' . $source; |
|
99 | } |
|
100 | ||
101 | if (!$this->filesystem->write($filename, $this->view->render())) |
|
102 | { |
|
103 | $symfonyStyle->error('Failed writing snapshot to the filesystem.'); |
|
104 | ||
105 | return 1; |
|
106 | } |
|
107 | ||
108 | $symfonyStyle->success('Snapshot recorded.'); |
|
109 | ||
110 | return 0; |
|
111 | } |
|
112 | ||
113 | /** |
|
114 | * Configures the current command. |
|
115 | * |
|
116 | * @return void |
|
117 | */ |
|
118 | protected function configure(): void |
|
119 | { |
|
120 | $this->setDescription('Takes a snapshot of the recently updated statistics data.'); |
|
121 | $this->addOption( |
|
122 | 'source', |
|
123 | null, |
|
124 | InputOption::VALUE_OPTIONAL, |
|
125 | 'If given, filters the snapshot to a single source.' |
|
126 | ); |
|
127 | } |
|
128 | } |
|
129 |