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']); + + } );