diff --git a/app/Http/Controllers/Admin/TelemetryController.php b/app/Http/Controllers/Admin/TelemetryController.php index b0ac841193..9aea8f4c5f 100644 --- a/app/Http/Controllers/Admin/TelemetryController.php +++ b/app/Http/Controllers/Admin/TelemetryController.php @@ -21,7 +21,10 @@ namespace FireflyIII\Http\Controllers\Admin; +use Carbon\Carbon; use FireflyIII\Http\Controllers\Controller; +use FireflyIII\Jobs\SubmitTelemetryData; +use FireflyIII\Repositories\Telemetry\TelemetryRepositoryInterface; use Illuminate\Contracts\View\Factory; use Illuminate\View\View; @@ -30,14 +33,18 @@ use Illuminate\View\View; */ class TelemetryController extends Controller { + /** @var TelemetryRepositoryInterface */ + private $repository; + public function __construct() { parent::__construct(); $this->middleware( - static function ($request, $next) { + function ($request, $next) { app('view')->share('title', (string) trans('firefly.administration')); app('view')->share('mainTitleIcon', 'fa-hand-spock-o'); + $this->repository = app(TelemetryRepositoryInterface::class); return $next($request); } @@ -47,15 +54,43 @@ class TelemetryController extends Controller /** * @return string */ - public function delete() + public function deleteSubmitted() { - session()->flash('info', 'No telemetry to delete. Does not work yet.'); + $this->repository->deleteSubmitted(); - return redirect(route('admin.telemetry.index')); + session()->flash('success', trans('firefly.telemetry_submitted_deleted')); + + return redirect(url()->previous(route('admin.telemetry.index'))); } /** - * + * @return string + */ + public function deleteAll() + { + $this->repository->deleteAll(); + + session()->flash('success', trans('firefly.telemetry_all_deleted')); + + return redirect(url()->previous(route('admin.telemetry.index'))); + } + + /** + * Run job to submit telemetry. + */ + public function submit() + { + $job = app(SubmitTelemetryData::class); + $job->setDate(new Carbon); + $job->setForce(true); + $job->handle(); + session()->flash('info', trans('firefly.telemetry_submission_executed')); + + return redirect(url()->previous(route('admin.telemetry.index'))); + } + + /** + * Index */ public function index() { @@ -63,16 +98,22 @@ class TelemetryController extends Controller app('view')->share('subTitle', (string) trans('firefly.telemetry_admin_index')); $version = config('firefly.version'); $enabled = config('firefly.telemetry', false); - $count = 1; + $count = $this->repository->count(); return view('admin.telemetry.index', compact('version', 'enabled', 'count')); } /** + * View telemetry. Paginated because you never know how much will be collected. + * * @return Factory|View */ public function view() { - return view('admin.telemetry.view'); + $format = trans('config.date_time'); + $size = 100; + $records = $this->repository->paginated($size); + + return view('admin.telemetry.view', compact('records', 'format')); } } diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index 43a7bc223e..67c82adc29 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -37,6 +37,8 @@ use FireflyIII\Helpers\Report\PopupReport; use FireflyIII\Helpers\Report\PopupReportInterface; use FireflyIII\Helpers\Report\ReportHelper; use FireflyIII\Helpers\Report\ReportHelperInterface; +use FireflyIII\Repositories\Telemetry\TelemetryRepository; +use FireflyIII\Repositories\Telemetry\TelemetryRepositoryInterface; use FireflyIII\Repositories\TransactionType\TransactionTypeRepository; use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface; use FireflyIII\Repositories\User\UserRepository; @@ -178,6 +180,7 @@ class FireflyServiceProvider extends ServiceProvider $this->app->bind(ReportHelperInterface::class, ReportHelper::class); $this->app->bind(FiscalHelperInterface::class, FiscalHelper::class); $this->app->bind(UpdateRequestInterface::class, UpdateRequest::class); + $this->app->bind(TelemetryRepositoryInterface::class, TelemetryRepository::class); $class = (string)config(sprintf('firefly.cer_providers.%s', (string)config('firefly.cer_provider'))); if ('' === $class) { diff --git a/app/Repositories/Telemetry/TelemetryRepository.php b/app/Repositories/Telemetry/TelemetryRepository.php new file mode 100644 index 0000000000..bae61595d5 --- /dev/null +++ b/app/Repositories/Telemetry/TelemetryRepository.php @@ -0,0 +1,67 @@ +. + */ + +namespace FireflyIII\Repositories\Telemetry; + +use FireflyIII\Models\Telemetry; +use Illuminate\Pagination\LengthAwarePaginator; + +/** + * Class TelemetryRepository + */ +class TelemetryRepository implements TelemetryRepositoryInterface +{ + + /** + * @inheritDoc + */ + public function count(): int + { + return Telemetry::count(); + } + + /** + * @inheritDoc + */ + public function deleteAll(): void + { + // created_at is never NULL. + Telemetry::whereNotNull('created_at')->delete(); + } + + /** + * @inheritDoc + */ + public function paginated(int $pageSize): LengthAwarePaginator + { + return Telemetry::orderBy('created_at', 'DESC')->paginate($pageSize); + } + + /** + * @inheritDoc + */ + public function deleteSubmitted(): void + { + // created_at is never NULL. + Telemetry::whereNotNull('submitted')->delete(); + } +} \ No newline at end of file diff --git a/app/Repositories/Telemetry/TelemetryRepositoryInterface.php b/app/Repositories/Telemetry/TelemetryRepositoryInterface.php new file mode 100644 index 0000000000..16f5dc749b --- /dev/null +++ b/app/Repositories/Telemetry/TelemetryRepositoryInterface.php @@ -0,0 +1,59 @@ +. + */ + +namespace FireflyIII\Repositories\Telemetry; + + +use Illuminate\Pagination\LengthAwarePaginator; + +/** + * Interface TelemetryRepositoryInterface + */ +interface TelemetryRepositoryInterface +{ + /** + * Return the number of stored telemetry records. + * + * @return int + */ + public function count(): int; + + /** + * Return paginated result of telemetry records. + * + * @param int $pageSize + * + * @return LengthAwarePaginator + */ + public function paginated( int $pageSize): LengthAwarePaginator; + + /** + * Delete all records. + */ + public function deleteAll(): void; + + /** + * + */ + public function deleteSubmitted(): void; + +} \ No newline at end of file diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 3d30ca40c8..4dea05d786 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -1589,7 +1589,7 @@ return [ // telemetry 'telemetry_admin_index' => 'Telemetry', 'telemetry_intro' => 'Firefly III supports the collection and sending of usage telemetry. This means that Firefly III will try to collect info on how you use Firefly III, and send it to the developer of Firefly III. This is always opt-in, and is disabled by default. Firefly III will never collect or send financial information. Firefly III will also never collect or send financial meta-information, like sums or calculations. The collected data will never be made publicly accessible.', - 'telemetry_what_collected' => 'What Firefly III collects and sends exactly is different for each version. You are running version :version. What Firefly III collects in version :version is something you can read in the help pages. Click the (?)-icon in the top-right corner or visit the help page directly on GitHub.', + 'telemetry_what_collected' => 'What Firefly III collects and sends exactly is different for each version. You are running version :version. What Firefly III collects in version :version is something you can read in the help pages. Click the (?)-icon in the top-right corner or visit the documentation page.', 'telemetry_is_enabled_yes_no' => 'Is Firefly III telemetry enabled?', 'telemetry_disabled_no' => 'Telemetry is NOT enabled', 'telemetry_disabled_yes' => 'Telemetry is enabled', @@ -1599,7 +1599,14 @@ return [ 'no_telemetry_present' => 'Firefly III has collected zero telemetry records.', 'records_telemetry_present' => 'Firefly III has collected :count telemetry record(s).', 'telemetry_button_view' => 'View telemetry', - 'telemetry_button_delete' => 'Delete telemetry', + 'telemetry_button_delete' => 'Delete all telemetry', 'telemetry_admin_overview' => 'Telemetry overview', - 'telemetry_back_to_index' => 'Back to telemetry' + 'telemetry_back_to_index' => 'Back to telemetry index', + 'not_yet_submitted' => 'Not yet submitted', + 'telemetry_type_feature' => 'Feature flag', + 'telemetry_submit_all' => 'Submit records', + 'telemetry_delete_submitted_records' => 'Delete submitted records', + 'telemetry_submission_executed' => 'Records have been submitted. Check your log files for more info.', + 'telemetry_all_deleted' => 'All telemetry records have been deleted.', + 'telemetry_submitted_deleted' => 'All submitted telemetry records have been deleted.' ]; diff --git a/resources/lang/en_US/form.php b/resources/lang/en_US/form.php index e9fed2e35f..0ae76d1a92 100644 --- a/resources/lang/en_US/form.php +++ b/resources/lang/en_US/form.php @@ -265,5 +265,10 @@ return [ 'auto_budget_amount' => 'Auto-budget amount', 'auto_budget_period' => 'Auto-budget period', + 'collected' => 'Collected', + 'submitted' => 'Submitted', + 'key' => 'Key', + 'value' => 'Content of record' + ]; diff --git a/resources/views/v1/admin/telemetry/view.twig b/resources/views/v1/admin/telemetry/view.twig index f9bf785544..f366257a89 100644 --- a/resources/views/v1/admin/telemetry/view.twig +++ b/resources/views/v1/admin/telemetry/view.twig @@ -11,17 +11,91 @@
- (this version does not yet support telemetry) -
+| {{ trans('form.collected') }} | +{{ trans('form.submitted') }} | +{{ trans('form.type') }} | +{{ trans('form.key') }} | +{{ trans('form.value') }} | +
|---|---|---|---|---|
| + {{ record.created_at.formatLocalized(format) }} + | ++ + {% if record.submitted %} + {{ record.submitted.formatLocalized(format) }} + {% else %} + {{ 'not_yet_submitted'|_ }} + {% endif %} + + | ++ {{ trans('firefly.telemetry_type_'~record.type) }} + | +
+ {{ record.key }}
+ |
+
+ {% if record.value|json_encode|length > 100 %}
+
+ {{ record.value|json_encode|slice(0, 30) }}...
+
+ {% else %}
+ {{ record.value|json_encode }}
+ {% endif %}
+ |
+