From 8a0abc23c363c8e888cdd33d11367a0bc7ada268 Mon Sep 17 00:00:00 2001
From: James Cole
Date: Fri, 27 Sep 2019 21:35:21 +0200
Subject: [PATCH] New feature: option to delete all meta data from your
account.
---
.../Controllers/Profile/DataController.php | 89 +++++++++++++++++++
.../Budget/AvailableBudgetRepository.php | 8 ++
.../AvailableBudgetRepositoryInterface.php | 6 ++
.../Budget/BudgetLimitRepository.php | 12 +++
.../Budget/BudgetLimitRepositoryInterface.php | 6 ++
app/Repositories/Budget/BudgetRepository.php | 18 ++++
.../Budget/BudgetRepositoryInterface.php | 6 ++
.../Category/CategoryRepository.php | 18 ++++
.../Category/CategoryRepositoryInterface.php | 4 +
app/Repositories/Tag/TagRepository.php | 13 +++
.../Tag/TagRepositoryInterface.php | 5 ++
resources/lang/en_US/firefly.php | 7 ++
resources/views/v1/profile/index.twig | 25 ++++--
routes/web.php | 6 ++
14 files changed, 218 insertions(+), 5 deletions(-)
create mode 100644 app/Http/Controllers/Profile/DataController.php
diff --git a/app/Http/Controllers/Profile/DataController.php b/app/Http/Controllers/Profile/DataController.php
new file mode 100644
index 0000000000..201ca286e2
--- /dev/null
+++ b/app/Http/Controllers/Profile/DataController.php
@@ -0,0 +1,89 @@
+.
+ */
+
+namespace FireflyIII\Http\Controllers\Profile;
+
+
+use FireflyIII\Http\Controllers\Controller;
+use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
+use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
+use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
+use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
+use FireflyIII\Repositories\Tag\TagRepositoryInterface;
+use Illuminate\Http\RedirectResponse;
+
+/**
+ * Class DataController
+ */
+class DataController extends Controller
+{
+
+ /**
+ *
+ */
+ public function deleteBudgets(): RedirectResponse
+ {
+ /** @var AvailableBudgetRepositoryInterface $abRepository */
+ $abRepository = app(AvailableBudgetRepositoryInterface::class);
+ $abRepository->destroyAll();
+
+ /** @var BudgetLimitRepositoryInterface $blRepository */
+ $blRepository = app(BudgetLimitRepositoryInterface::class);
+ $blRepository->destroyAll();
+
+ /** @var BudgetRepositoryInterface $budgetRepository */
+ $budgetRepository = app(BudgetRepositoryInterface::class);
+ $budgetRepository->destroyAll();
+
+ session()->flash('success', trans('firefly.deleted_all_budgets'));
+
+ return redirect(route('profile.index'));
+ }
+
+ /**
+ *
+ */
+ public function deleteCategories(): RedirectResponse
+ {
+ /** @var CategoryRepositoryInterface $categoryRepos */
+ $categoryRepos = app(CategoryRepositoryInterface::class);
+ $categoryRepos->destroyAll();
+
+ session()->flash('success', trans('firefly.deleted_all_categories'));
+
+ return redirect(route('profile.index'));
+ }
+
+
+ /**
+ *
+ */
+ public function deleteTags(): RedirectResponse
+ {
+ /** @var TagRepositoryInterface $tagRepository */
+ $tagRepository = app(TagRepositoryInterface::class);
+ $tagRepository->destroyAll();
+
+ session()->flash('success', trans('firefly.deleted_all_tags'));
+
+ return redirect(route('profile.index'));
+ }
+}
\ No newline at end of file
diff --git a/app/Repositories/Budget/AvailableBudgetRepository.php b/app/Repositories/Budget/AvailableBudgetRepository.php
index d84c394eb3..3c5be2d7c0 100644
--- a/app/Repositories/Budget/AvailableBudgetRepository.php
+++ b/app/Repositories/Budget/AvailableBudgetRepository.php
@@ -282,4 +282,12 @@ class AvailableBudgetRepository implements AvailableBudgetRepositoryInterface
return $availableBudget;
}
+
+ /**
+ * Delete all available budgets.
+ */
+ public function destroyAll(): void
+ {
+ $this->user->availableBudgets()->delete();
+ }
}
\ No newline at end of file
diff --git a/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php b/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php
index 7076e01923..b626e2ebdd 100644
--- a/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php
+++ b/app/Repositories/Budget/AvailableBudgetRepositoryInterface.php
@@ -34,6 +34,12 @@ use Illuminate\Support\Collection;
*/
interface AvailableBudgetRepositoryInterface
{
+
+ /**
+ * Delete all available budgets.
+ */
+ public function destroyAll(): void;
+
/**
* @param AvailableBudget $availableBudget
*/
diff --git a/app/Repositories/Budget/BudgetLimitRepository.php b/app/Repositories/Budget/BudgetLimitRepository.php
index 9c8a1b63fa..2babe4f175 100644
--- a/app/Repositories/Budget/BudgetLimitRepository.php
+++ b/app/Repositories/Budget/BudgetLimitRepository.php
@@ -447,4 +447,16 @@ class BudgetLimitRepository implements BudgetLimitRepositoryInterface
return $limit;
}
+
+ /**
+ * Destroy all budget limits.
+ */
+ public function destroyAll(): void
+ {
+ $budgets = $this->user->budgets()->get();
+ /** @var Budget $budget */
+ foreach ($budgets as $budget) {
+ $budget->budgetlimits()->delete();
+ }
+ }
}
\ No newline at end of file
diff --git a/app/Repositories/Budget/BudgetLimitRepositoryInterface.php b/app/Repositories/Budget/BudgetLimitRepositoryInterface.php
index a9a795d08c..7833461a74 100644
--- a/app/Repositories/Budget/BudgetLimitRepositoryInterface.php
+++ b/app/Repositories/Budget/BudgetLimitRepositoryInterface.php
@@ -35,6 +35,12 @@ use Illuminate\Support\Collection;
*/
interface BudgetLimitRepositoryInterface
{
+
+ /**
+ * Destroy all budget limits.
+ */
+ public function destroyAll(): void;
+
/**
* Tells you which amount has been budgeted (for the given budgets)
* in the selected query. Returns a positive amount as a string.
diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php
index 1092446454..66b4a9a943 100644
--- a/app/Repositories/Budget/BudgetRepository.php
+++ b/app/Repositories/Budget/BudgetRepository.php
@@ -23,9 +23,11 @@ declare(strict_types=1);
namespace FireflyIII\Repositories\Budget;
use Carbon\Carbon;
+use DB;
use Exception;
use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit;
+use FireflyIII\Models\RecurrenceTransactionMeta;
use FireflyIII\Models\RuleAction;
use FireflyIII\Models\RuleTrigger;
use FireflyIII\Services\Internal\Destroy\BudgetDestroyService;
@@ -341,4 +343,20 @@ class BudgetRepository implements BudgetRepositoryInterface
Log::debug(sprintf('Updated trigger %d: %s', $trigger->id, $trigger->trigger_value));
}
}
+
+ /**
+ * Destroy all budgets.
+ */
+ public function destroyAll(): void
+ {
+ $budgets = $this->getBudgets();
+ /** @var Budget $budget */
+ foreach ($budgets as $budget) {
+ DB::table('budget_transaction')->where('budget_id', $budget->id)->delete();
+ DB::table('budget_transaction_journal')->where('budget_id', $budget->id)->delete();
+ RecurrenceTransactionMeta::where('name', 'budget_id')->where('value', $budget->id)->delete();
+ RuleAction::where('action_type', 'set_budget')->where('action_value', $budget->id)->delete();
+ $budget->delete();
+ }
+ }
}
diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php
index 4597bd1599..f3a21c2da9 100644
--- a/app/Repositories/Budget/BudgetRepositoryInterface.php
+++ b/app/Repositories/Budget/BudgetRepositoryInterface.php
@@ -32,6 +32,12 @@ use Illuminate\Support\Collection;
*/
interface BudgetRepositoryInterface
{
+ /**
+ * Destroy all budgets.
+ */
+ public function destroyAll(): void;
+
+
/**
* @return bool
*/
diff --git a/app/Repositories/Category/CategoryRepository.php b/app/Repositories/Category/CategoryRepository.php
index 0151345d26..0295767221 100644
--- a/app/Repositories/Category/CategoryRepository.php
+++ b/app/Repositories/Category/CategoryRepository.php
@@ -23,8 +23,11 @@ declare(strict_types=1);
namespace FireflyIII\Repositories\Category;
use Carbon\Carbon;
+use DB;
use FireflyIII\Factory\CategoryFactory;
use FireflyIII\Models\Category;
+use FireflyIII\Models\RecurrenceTransactionMeta;
+use FireflyIII\Models\RuleAction;
use FireflyIII\Services\Internal\Destroy\CategoryDestroyService;
use FireflyIII\Services\Internal\Update\CategoryUpdateService;
use FireflyIII\User;
@@ -347,4 +350,19 @@ class CategoryRepository implements CategoryRepositoryInterface
return null;
}
+ /**
+ * Delete all categories.
+ */
+ public function destroyAll(): void
+ {
+ $categories = $this->getCategories();
+ /** @var Category $category */
+ foreach ($categories as $category) {
+ DB::table('category_transaction')->where('category_id', $category->id)->delete();
+ DB::table('category_transaction_journal')->where('category_id', $category->id)->delete();
+ RecurrenceTransactionMeta::where('name', 'category_id')->where('value', $category->id)->delete();
+ RuleAction::where('action_type', 'set_category')->where('action_value', $category->name)->delete();
+ $category->delete();
+ }
+ }
}
diff --git a/app/Repositories/Category/CategoryRepositoryInterface.php b/app/Repositories/Category/CategoryRepositoryInterface.php
index 4f3e33cd10..6cc43a62ec 100644
--- a/app/Repositories/Category/CategoryRepositoryInterface.php
+++ b/app/Repositories/Category/CategoryRepositoryInterface.php
@@ -32,6 +32,10 @@ use Illuminate\Support\Collection;
*/
interface CategoryRepositoryInterface
{
+ /**
+ * Delete all categories.
+ */
+ public function destroyAll(): void;
/**
* @param Category $category
diff --git a/app/Repositories/Tag/TagRepository.php b/app/Repositories/Tag/TagRepository.php
index 71c0048669..cd6ffcaa27 100644
--- a/app/Repositories/Tag/TagRepository.php
+++ b/app/Repositories/Tag/TagRepository.php
@@ -486,4 +486,17 @@ class TagRepository implements TagRepositoryInterface
return $tagQuery->get(['tags.id', 'tags.tag','tags.created_at', DB::raw('SUM(transactions.amount) as amount_sum')]);
}
+
+ /**
+ * Destroy all tags.
+ */
+ public function destroyAll(): void
+ {
+ $tags = $this->get();
+ /** @var Tag $tag */
+ foreach ($tags as $tag) {
+ DB::table('tag_transaction_journal')->where('tag_id', $tag->id)->delete();
+ $tag->delete();
+ }
+ }
}
diff --git a/app/Repositories/Tag/TagRepositoryInterface.php b/app/Repositories/Tag/TagRepositoryInterface.php
index 93e31a5e9c..70e84773a7 100644
--- a/app/Repositories/Tag/TagRepositoryInterface.php
+++ b/app/Repositories/Tag/TagRepositoryInterface.php
@@ -32,6 +32,11 @@ use Illuminate\Support\Collection;
*/
interface TagRepositoryInterface
{
+ /**
+ * Destroy all tags.
+ */
+ public function destroyAll(): void;
+
/**
* @return int
*/
diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php
index b65549a92f..66e2ca7607 100644
--- a/resources/lang/en_US/firefly.php
+++ b/resources/lang/en_US/firefly.php
@@ -539,6 +539,13 @@ return [
'optional_field_meta_data' => 'Optional meta data',
// profile:
+ 'permanent_delete_stuff' => 'Be careful with these buttons. Deleting stuff is permanent.',
+ 'delete_all_budgets' => 'Delete ALL your budgets',
+ 'delete_all_categories' => 'Delete ALL your categories',
+ 'delete_all_tags' => 'Delete ALL your tags',
+ 'deleted_all_budgets' => 'All budgets have been deleted',
+ 'deleted_all_categories' => 'All categories have been deleted',
+ 'deleted_all_tags' => 'All tags have been deleted',
'change_your_password' => 'Change your password',
'delete_account' => 'Delete account',
'current_password' => 'Current password',
diff --git a/resources/views/v1/profile/index.twig b/resources/views/v1/profile/index.twig
index ba14b59710..787cfab75d 100644
--- a/resources/views/v1/profile/index.twig
+++ b/resources/views/v1/profile/index.twig
@@ -17,11 +17,26 @@
{{ trans('firefly.user_id_is',{user: userId})|raw }}
{% if not SANDSTORM %}
-
+
+
+
+
+ {{ 'permanent_delete_stuff'|_ }}
+
+
+
+
+
{% endif %}
diff --git a/routes/web.php b/routes/web.php
index f583310ca9..aa4d3f548e 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -655,6 +655,12 @@ Route::group(
Route::get('/delete-code', ['uses' => 'ProfileController@deleteCode', 'as' => 'delete-code']);
Route::get('2fa/new-codes', ['uses' => 'ProfileController@newBackupCodes', 'as' => 'new-backup-codes']);
+ // routes to delete stuff.
+ Route::get('delete-budgets', ['uses' => 'Profile\DataController@deleteBudgets', 'as' => 'delete-budgets']);
+ Route::get('delete-categories', ['uses' => 'Profile\DataController@deleteCategories', 'as' => 'delete-categories']);
+ Route::get('delete-tags', ['uses' => 'Profile\DataController@deleteTags', 'as' => 'delete-tags']);
+
+
}
);