Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[4.x] Optionally delete storage after tenant deletion #938

Merged
merged 7 commits into from
Sep 20, 2022

Conversation

lukinovec
Copy link
Contributor

The PR adds a test in which I propose a way of deleting the tenant's storage after the tenant's deletion (#226). Apart from the addition of the config key, nothing new is really implemented – I only tested the solution, and I'll wait for @stancl's feedback (not sure if it's the best way or where's the best place to put the listener).

The storage directory would get deleted on the TenantDeleted event:

Event::listen(TenantDeleted::class, function(TenantDeleted $event) {
    if (config('tenancy.filesystem.delete_storage_after_tenant_deletion')) {
        File::deleteDirectory($event->tenant->run(fn () => storage_path()));
    }
});

@lukinovec lukinovec requested a review from stancl September 2, 2022 12:38
@codecov-commenter
Copy link

codecov-commenter commented Sep 2, 2022

Codecov Report

Merging #938 (99c071d) into master (62d19c5) will decrease coverage by 0.50%.
The diff coverage is 100.00%.

@@             Coverage Diff              @@
##             master     #938      +/-   ##
============================================
- Coverage     88.01%   87.51%   -0.51%     
- Complexity      400      412      +12     
============================================
  Files           110      113       +3     
  Lines          1110     1145      +35     
============================================
+ Hits            977     1002      +25     
- Misses          133      143      +10     
Impacted Files Coverage Δ
src/Features/CrossDomainRedirect.php 100.00% <100.00%> (ø)
src/Listeners/DeleteTenantStorage.php 100.00% <100.00%> (ø)
src/Tenancy.php 92.45% <100.00%> (ø)
src/helpers.php 55.55% <100.00%> (-2.34%) ⬇️
src/Commands/Run.php 100.00% <0.00%> (ø)
src/Database/Models/ImpersonationToken.php 100.00% <0.00%> (ø)
src/Middleware/InitializeTenancyByPath.php 100.00% <0.00%> (ø)
src/Exceptions/StatefulGuardRequiredException.php 100.00% <0.00%> (ø)
...trappers/Integrations/ScoutTenancyBootstrapper.php 0.00% <0.00%> (ø)

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

@lukinovec lukinovec changed the title Delete storage after tenant deletion optionally [4.x] Delete storage after tenant deletion optionally Sep 2, 2022
@lukinovec lukinovec changed the title [4.x] Delete storage after tenant deletion optionally [WIP] [4.x] Delete storage after tenant deletion optionally Sep 2, 2022
@lukinovec lukinovec changed the title [WIP] [4.x] Delete storage after tenant deletion optionally [WIP] [4.x] Optionally delete storage after tenant deletion Sep 2, 2022
tests/BootstrapperTest.php Outdated Show resolved Hide resolved
@stancl
Copy link
Member

stancl commented Sep 2, 2022

And the event listener can probably go into the TenancyServiceProvider. Or do you think we could make this an optional feature, and move the logic there?

So the config option would have a note that you need to enable the feature.

Not sure if separating this into a feature is good, but it's a potential way to find a good place for the event listener.

@stancl stancl added feature New feature or request v4 incomplete labels Sep 2, 2022
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
@lukinovec
Copy link
Contributor Author

And the event listener can probably go into the TenancyServiceProvider. Or do you think we could make this an optional feature, and move the logic there?

So the config option would have a note that you need to enable the feature.

Not sure if separating this into a feature is good, but it's a potential way to find a good place for the event listener.

This doesn't feel like an optional feature in the same way as user impersonation, tenant config, etc., so I'm not sure about making this a feature too.

Maybe we could put the logic in a job and add that job to TenantDeleted's job pipeline in the TenancyServiceProvider stub's events()? We could also remove the config key and just let the users enable/disable this by adding/removing the job from the pipeline

@stancl
Copy link
Member

stancl commented Sep 9, 2022

Yeah, that sounds like a good idea — get rid of the config key, and just make it a commented out listener in the TenancyServiceProvider stub. That would solve the problem with putting the listener somewhere perfectly.

And yeah, it isn't an optional feature of the same "category" as the other ones.

So in the test, you'd just enable the listener using Event::listen() instead of setting config keys.

@lukinovec lukinovec changed the title [WIP] [4.x] Optionally delete storage after tenant deletion [4.x] Optionally delete storage after tenant deletion Sep 12, 2022
@lukinovec lukinovec marked this pull request as ready for review September 12, 2022 10:39
@stancl
Copy link
Member

stancl commented Sep 12, 2022

I'm thinking if we even need the new events now? If the developers are already adding this by interacting with listeners, and the class can be easily extended, then the events may be unnecessary?

@lukinovec
Copy link
Contributor Author

I'm thinking if we even need the new events now? If the developers are already adding this by interacting with listeners, and the class can be easily extended, then the events may be unnecessary?

I see, you're right. I removed the events.

@stancl
Copy link
Member

stancl commented Sep 15, 2022

I think this should be changed (in all places) to use the deleting tenant event. It's similar to what we discussed — while hooking into TenantDeleted does work, it feels wrong to be initializing tenancy for a tenant that doesn't exist anymore.

@stancl stancl removed the incomplete label Sep 20, 2022
@stancl
Copy link
Member

stancl commented Sep 20, 2022

Can you create a TODO in the docs repo so that we document this in v4?

@stancl stancl merged commit ab5fa7a into master Sep 20, 2022
@stancl stancl deleted the delete-storage-with-tenant-optionally branch September 20, 2022 17:42
lukinovec added a commit that referenced this pull request Sep 28, 2022
* Add test for deleting storage after tenant deletion

* Save `storage_path()` in a variable after initializing tenant in test

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>

* Add DeleteTenantStorage listener

* Update test name

* Remove storage deletion config key

* Remove tenant storage deletion events

* Move tenant storage deletion to the DeletingTenant event

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
stancl added a commit that referenced this pull request Oct 31, 2022
* Add readied tenants

Add config for readied tenants
Add `create` and `clear` command
Add Readied scope and static functions
Add tests

* Fix initialize function name

* Add readied events

* Fix readied column cast

* Laravel 6 compatible

* Add readied scope tests

* Rename config from include_in_scope to include_in_queries

* Change terminology to pending

* Update CreatePendingTenants.php

* Laravel 6 compatible

* Update CreatePendingTenants.php

* runForMultiple can scope pending tenants

* Fix issues

* Code and comment style improvements

* Change 'tenant' to 'tenants' in command signature

* Fix code style (php-cs-fixer)

* Rename variables in CreatePendingTenants

* Remove withPending from runForMultiple

* Update tenants option trait

* Update command that use tenants

* Fix code style (php-cs-fixer)

* Improve getTenants condition

* Update config comments

* Minor config comment corrections

* Grammar fix

* Update comments and naming

* Correct comments

* Improve writing

* Remove pending tenant clearing time constraints

* Allow using only one time constraint for clearing the pending tenants

* phpunit to pest

* Fix code style (php-cs-fixer)

* Fix code style (php-cs-fixer)

* [4.x] Optionally delete storage after tenant deletion (#938)

* Add test for deleting storage after tenant deletion

* Save `storage_path()` in a variable after initializing tenant in test

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>

* Add DeleteTenantStorage listener

* Update test name

* Remove storage deletion config key

* Remove tenant storage deletion events

* Move tenant storage deletion to the DeletingTenant event

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>

* [4.x] Finish incomplete and missing tests (#947)

* complete test sqlite manager customize path

* complete test seed command works

* complete uniqe exists test

* Update SingleDatabaseTenancyTest.php

* refactor the ternary into if condition

* custom path

* simplify if condition

* random dir name

* Update SingleDatabaseTenancyTest.php

* Update CommandsTest.php

* prefix random DB name with custom_

Co-authored-by: Samuel Štancl <samuel@archte.ch>

* [4.x] Add batch tenancy queue bootstrapper (#874)

* exclude master from CI

* Add batch tenancy queue bootstrapper

* add test case

* skip tests for old versions

* variable docblocks

* use Laravel's connection getter and setter

* convert test to pest

* bottom space

* singleton regis in TestCase

* Update src/Bootstrappers/BatchTenancyBootstrapper.php

Co-authored-by: Samuel Štancl <samuel@archte.ch>

* convert batch class resolution to property level

* enabled BatchTenancyBootstrapper by default

* typehint DatabaseBatchRepository

* refactore name

* DI DB manager

* typehint

* Update config.php

* use initialize() twice without end()ing tenancy to assert that previousConnection logic works correctly

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
Co-authored-by: Abrar Ahmad <abrar.dev99@gmail.com>
Co-authored-by: Samuel Štancl <samuel@archte.ch>

* [4.x] Storage::url() support (modified #689) (#909)

* This adds support for tenancy aware  Storage::url() method

* Trigger CI build

* Fixed Link command for Laravel v6, added StorageLink Events, more StorageLink tests, added RemoveStorageSymlinks Job, added Storage Jobs to TenancyServiceProvider stub, renamed misleading config example.

* Fix typo

* Fix code style (php-cs-fixer)

* Update config comments

* Format code in Link command, make writing more concise

* Change "symLinks" to "symlinks"

* Refactor Link command

* Fix test name typo

* Test fetching files using the public URL

* Extract Link command logic into actions

* Fix code style (php-cs-fixer)

* Check if closure is null in CreateStorageSymlinksAction

* Stop using command terminology in CreateStorageSymlinksAction

* Separate the Storage::url() test cases

* Update url_override comments

* Remove afterLink closures, add types, move actions, add usage explanation to the symlink trait

* Fix code style (php-cs-fixer)

* Update public storage URL test

* Fix issue with using str()

* Improve url_override comment, add todos

* add todo comment

* fix docblock style

* Add link command tests back

* Add types to $tenants in the action handle() methods

* Fix typo, update variable name formatting

* Add tests for the symlink actions

* Change possibleTenantSymlinks not to prefix the paths twice while tenancy is initialized

* Fix code style (php-cs-fixer)

* Stop testing storage directory existence in symlink test

* Don't specify full namespace for Tenant model annotation

* Don't specify full namespace in ActionTest

* Remove "change to DI" todo

* Remove possibleTenantSymlinks return annotation

* Remove symlink-related jobs, instantiate and use actions

* Revert "Remove symlink-related jobs, instantiate and use actions"

This reverts commit 547440c.

* Add a comment line about the possible tenant symlinks

* Correct storagePath and publicPath variables

* Revert "Correct storagePath and publicPath variables"

This reverts commit e3aa8e2.

* add a todo

Co-authored-by: Martin Vlcek <martin@dontfreakout.eu>
Co-authored-by: lukinovec <lukinovec@gmail.com>
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>

* Use HasTenantOptions in Link

* Correct the tenant order in Run command

* Fix code style (php-cs-fixer)

* Fix formatting issue

* Add missing imports

* Fix code style (php-cs-fixer)

* Use HasTenantOptions instead of the old trait name in Up/Down commands

* Fix test name typo

* Remove redundant passing of $withPending to runForMultiple in TenantCollection's runForEach

* Make `with-pending` default to `config('tenancy.pending.include_in_queries')` in HasTenantOptions

* Make `createPending()` return the created tenant

* Fix code style (php-cs-fixer)

* Remove tenant ordering

* Fix code style (php-cs-fixer)

* Remove duplicate tenancy bootstrappers config setting

* Add and use getWithPendingOption method

* Fix code style (php-cs-fixer)

* Add optionNotPassedValue property

* Test using --with-pending and the include_in_queries config value

* Make with-pending VALUE_NONE

* use plural in test names

* fix test names

* add pullPendingTenantFromPool

* Add docblock type

* Import commands

* Fix code style (php-cs-fixer)

* Move pending tenant tests to a more appropriate file

* Delete queuetest from gitignore

* Delete queuetest file

* Add queuetest to gitignore

* Rename pullPendingTenant to pullPending and don't pass bool to that method

* Add a test that checks if pulling a pending tenant removes it from the pool

* bump stancl/virtualcolumn to ^1.3

* Update pending tenant pulling test

* Dynamically get columns for pending queries

* Dynamically get virtual column name in ClearPendingTenants

* Fix ClearPendingTenants bug

* Make test name more accurate

* Update test name

* add a todo

* Update include in queries test name

* Remove `Tenant::query()->delete()` from pending tenant check test

* Rename the pending tenant check test name

* Update HasPending.php

* fix all() call

* code style

* all() -> get()

* Remove redundant `Tenant::all()` call

Co-authored-by: j.stein <joristein@gmail.com>
Co-authored-by: lukinovec <lukinovec@gmail.com>
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
Co-authored-by: Abrar Ahmad <abrar.dev99@gmail.com>
Co-authored-by: Riley19280 <rileyaven88@gmail.com>
Co-authored-by: Martin Vlcek <martin@dontfreakout.eu>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature New feature or request v4
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Calling Storage::fake() doesn't remove tenant directories as one would expect inline with Laravel Docs
3 participants