* Add option to update attributes of pending tenants while pulling them
* Fix failing toEqualCanonicalizing tests
* Fix code style (php-cs-fixer)
* fix code errors
* lock phpcsfixer to 3.62.0 due to a bug in 3.63.1
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
Co-authored-by: Samuel Štancl <samuel@archte.ch>
* route cloning: Trim '/' from original route prefixes
* Add test for the trimming of route prefixes
* Revert "Add test for the trimming of route prefixes"
This reverts commit 568ae17d2bf8d5542a0e46840f7604c6a0df236d.
* Add test for the trimming of route prefixes
* Delete extra comments [ci skip]
* Fix regression test [ci skip]
* trigger CI
* Add routes with trailing slashes to the cloned route prefixing test
* Test nested '/' route cloning
* Update cloned route creation as suggested
* fix terminology
* add comment to test
---------
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
Co-authored-by: Samuel Štancl <samuel@archte.ch>
* Add and correct pivot record tests
* Implement and test deleting pivot records when using morph pivot
* Use dataset to test deleting pivot records with both MorphTenantPivot and TenantPivot
* Delete extra test, use createTenantsAndRunMigrations() where appropriate
* FIx PHPStan errors
* Revert DB::table() assertion changes
* minor test improvements
---------
Co-authored-by: Samuel Štancl <samuel@archte.ch>
* Make universal route logic part of tbe early ID trait
* Add requstHasTenant to prevent access MW, add todo@samuel
* Delete PathIdentificationManager, move the used methods appropriately
* Correct and refactor code related to the deleted PathIdentificationManager class
* Add docblock
* Fix code style (php-cs-fixer)
* refactor globalStackMiddleware()
* remove todos [ci skip]
* refactor routeMiddleware()
* revert bool assertions
* revert more changes
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
Co-authored-by: Samuel Štancl <samuel@archte.ch>
* Only retrieve domains if the relationship and the domains table exist (DomianTenantResolver)
* Resolve todo, add other todos
* Use constructor promotion in DeleteDomains
* Fix imports + domain deletion test
* Confirm that turning on resolver caching doesn't break the tests
* Fix Tenant model imports
* Fix code style (php-cs-fixer)
* remove runtime schema check
* temp: enable resolver cache
* make 'autoincrement ids are supported' pass
* disable resolver cache
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
Co-authored-by: Samuel Štancl <samuel@archte.ch>
* Run cache tests on all supported drivers
* update ci healthcheck for memcached
* remove memcached healthcheck
* fix typos in test comments, expand internal.md [ci skip]
* add empty line [ci skip]
* switch to using $store->setPrefix()
* add dynamodb
* refactor try-finally to try-catch
* remove unnecessary clearResolvedInstances() call
* add dual Cache:: and cache() assertions
* add apc
* Flush APCu cache in test setup
* Revert "add dual Cache:: and cache() assertions"
This reverts commit a0bab162fbe2dd0d25e7056ceca4fb7ce54efc77.
* phpstan fix
* Add logic for scoping 'file' disks to FilesystemTenancyBootstrapper
* minor changes, add todos
* refactor how the session.connection is used in the DB session bootstrapper
* add session forgery prevention logic to the db session bootstrapper
* only use the fs bootstrapper for file disk in 'cache data is separated' dataset
* minor session scoping test changes
* Add session scoping logic to FilesystemTenancyBootstrapper, correctly update disk roots even with storage_path_tenancy disabled
* Fix code style (php-cs-fixer)
* update docblock
* make not-null check more explicit
* separate bootstrapper tests, fix swapped test names for two tests
* refactor cache bootstrapper tests
* resolve global cache todo
* expand tests: session separation tests, more filesystem separation assertions; change prefix_base-type config keys to templates/formats
* add apc session scoping test, various session separation bugfixes
* phpstan + minor logic fixes
* prefix_format -> prefix
* fix database session separation test
* revert composer.json changes, update laravel dependencies to expected next release
* only run session scoping logic in cache bootstrapper for redis, memcached, dynamodb, apc; update gitattributes
* tenancy.central_domains -> tenancy.identification.central_domains
* db session separation test: add datasets
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
* Add suffix_storage_path test
* Get filesystem bootstrapper coverage to 100%
* Delete enabling DB bootstrapper in TestCase
* Complete most of test todos
* Complete last tests todo
* Fix docblock
* add todo
---------
Co-authored-by: lukinovec <lukinovec@gmail.com>
* resolver refactor
* Fix code style (php-cs-fixer)
* make tenant column used in PathTenantResolver configurable, fix phpstan errors, minor improvements
* support binding route fields, write tests for customizable tenant columns
* Invalidate cache for all possible columns in path resolver
* implement proper cache separation logic for different columns used by PathTenantResolver
* improve return type
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
* Add RandomHexGenerator, create new namespace
* phpstan ignore
* add base64 generator
* add note about base64 being case sensitive
* docblock updates
* replace old UUIDGenerator with a class that throws an exception
* replace base64 generator with a random string generator
* Fix namespace
* Fix code style (php-cs-fixer)
* add test for the deprecated uuid generator
* update comments
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
* wip
* bump jobpipeline dependency
* bump pest dependency
* fix composer.json syntax
* minor changes to docker setup
* more docker changes
* compact pest output, remove unnecessary env vars from composer.json
* minor pest tweaks
* mssql fix
* try enabling colors in CI
* try setting --columns=max for pest in CI
* try setting columns using env var instead of --columns in CI
* Revert "try setting columns using env var instead of --columns in CI"
This reverts commit eb3c177aefa97b0a3140d7f0e89c5012a854ff42.
* replace --compact with --no-progress
* try setting a hardcoded columns value in CI
* remove --columns (doesn't work), add back --compact
* try setting COLUMNS to a hardcoded value in CI
* remove alternative env syntax from CI
* fix PrefixCacheBootstrapperTest on L11, skip on L10
* add one more skip() call
* fix validate.yml
* Simplify schema dump, skip dump-related tests in L10
* Rename 'dump' table to 'example'
* Bring schema dump-related tests together, add comments
* Merge schema path-related tests into one, add comments
* Rename dataset parameter
---------
Co-authored-by: lukinovec <lukinovec@gmail.com>
* Add &Model to docblock
* Fix code style (php-cs-fixer)
* Only delete synced resource if the central resource shouldSync
* Add central resource detached event and listener
* Add SyncedTenant interface
* Use the event & listener in the test file
* Add getGlobalIdentifierKey(Name) to TenantMorphPivot
* Refactor TriggerSyncingEvents
* Fix code style (php-cs-fixer)
* Test queueing the detaching listener
* Move finding the central resource into the event, naming changes
* Fix code style (php-cs-fixer)
* Simplify listener code
* Refactor detaching logic
* Create tenant resource after attaching central to tenant, test queueing related listener
* Delete dd()
* Fix code style (php-cs-fixer)
* Move triggerAttachEvent from SyncMaster
* Update attach event-related code
* Move findResource from SyncedTenant to the pivot trait
* Add annotation
* Update annotation
* Simplify getAttributesForCreation in CreateTenantResourceFromSyncMaster
* Update naming
* Add tenant trait for attaching/detaching resources
* Update test names
* Move creation attribute parsing method to trait
* Rename variable
* Fix code style (php-cs-fixer)
* Delete complete to-do
* Delete event comment
* Rename event property
* Find tenant resource in detach listener
* Use global ID key of tenant resource in cascade deletes listener
* Use global ID key name of the central resource while creating/deleting tenant resources
* Add getSyncedCreationAttributes example in the annotation
* Fix inconsistencies in SyncedTenant methods
* Improve annotation
* Don't return the query in `$scopeGetModelQuery`
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
* Fix code style (php-cs-fixer)
* Update scoping getModel query
* Only use detach event instead of using both detach and delete events, refactor code
* Test that detaching tenant from a central resource doesn't affect other tenants
* Delete extra imports
* Fix code style (php-cs-fixer)
* Add PivotWithRelation, test attaching/detaching resources without polymorphic relations
* Refactor TriggerSyncingEvents to work with non-polymorphic relations too
* Fix code style (php-cs-fixer)
* Rename synced resource changed event, fix tests
* Enforce passing Tenant&Model to attach/detach events
* Prevent firing saved event automatically in CreateTenantResource
* Improve TriggerSyncingEvents trait
* Delete unused import
* Make TriggerSyncingEvents methods non-static, improve annotations
* Pass saved model to event
* Move attach/detach queueing tests to ResourceSyncingTest, pass models instead of IDs to attach/detach
* Move events to ResourceSyncing\Events
* Fix code style (php-cs-fixer)
* Use SerializesModels in queueable listeners instead of events
* Delete redundant $shouldQueue setting
* Rename listener, test cascade deletes from both sides of many-to-many
* Move creation attributes-related code to a separate test file, improve comments (wip)
* Improve comments, fix variable name capitalization
* Delete tracing comma
* Extract duplicate code into a trait
* Don't accept nullable tenant in SyncMasterDeleted
* Fix annotation
* Fix code style (php-cs-fixer)
* Update annotation
* Fix PHPStan error
* Fix annotation
* Update comments and test naming
* Move triggerDeleteEvent to CascadeDeletes interface
* Rename test file
* Import TenantPivot in Tenant class (tests/Etc)
* Add central resource not available in pivot exception
* Rename SaveSyncedResource to UpdateOrCreateSyncedResource
* Add new events and listeners to TSP stub
* Improve comments and naming
* Only keep SerializesModels in classes that utilize it
* Use tenant->run()
* Import events in stub
* Move RS listeners to separate namespace, use `Event/`Listener/` in stub for consistency
* Fix code style (php-cs-fixer)
* Fix namespace changes
* Use cursor instead of get
* Update src/ResourceSyncing/ParsesCreationAttributes.php
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
* Update naming, structure (discussed on Discord)
* Update uses in in test file
* remove double ;;
* Add comments
* Test if static properties work fine with queueable listeners
* Update $shouldQuery test
* Update creation attributes
* Work on updating the tests
* Make synced attributes configurable using static properties
* Update resource syncing tests
* Get rid of mixed attribute classes
* Get rid of TenantUserWIthCreationAttributes
* Fix imports
* Get rid of the conditionally synced classes, improve tests
* Simplify resource creation tests (only test the more complex cases instead of each case - if the complex case works, the simpler cases work too)
* Clean up ResourceSyncingTest (mostly duplicate tests that were already in AutomaticResourceCreationTest)
* Simplify class naming in polymorhpic tests
* Move automatic resource creation tests to ResourceSyncingTest
* Test that the sync event doesn't get triggered excessively
* Only trigger the sync event if the synced attributes were changed or if the resource was recently created
* Update synced attribute instead of unsynced in test
* Fix sync event test
* Update static property redefining test
* Use getGlobalIdentifierKeyName() instead of hardcoding the key name
* Delete static properties from the ResourceSyncing trait
* Reuse user classes in polymorphic tests
* Update tests/ResourceSyncingTest.php
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
* Use the default tenants() method in central user, override the default in ResourceSyncingTest
* Use BelongsToMany as tenants() return type
* Fix code style (php-cs-fixer)
* Delete extra static property from trait
* Delete duplicate events/listeners from TSP stub
* Delete weird expectation, use $model->trashed()
* Change ResourceUser to TenantUser
* Add defaults for getGlobalIdentifierKey(Name)
* Use singular tenant in DeleteResourceInTenants name
* Rename getSyncedCreationAttributes to getCreationAttributes
* Fix comma position in comment
* minor fixes in traits and interfaces
* Fix code style (php-cs-fixer)
* Correct comment
* Use $tenant->run()
* Update scopeGetModelQuery annotation
* Use static property for testing shouldSync
* Improve test
* Get rid of datasets
* Add trashed assertions
* Always merge synced attributes with the creation attributes during parsing
* Update creation attributes in test's beforeEach
* Use only the necessary creation attributes (no need to include the synced attributes because they get merged automatically)
* Rename ResourceTenant to MorphTenant
* Add TriggerSyncingEvents docblock
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
* Add force deletes test
* Fix code style (php-cs-fixer)
* Delete pivot if it can't access the resource class
* Make parseCreationAttributes more readable
* Comment out setting $scopeGetModelQuery in the stub
* Add @var annotations to bootTriggerSyncingEvents
* Fix attach()/detach() exception test
* Interrupt creation of broken pivots instead of deleting the pivots at a later point
* Add more comments
* Update CreateTenantResource comment
* Assert that forceDelete() doesn't affect other tenant resources
* Rename test
* Correct with() array formatting
* Expand test with soft deletes
* Merge SyncedResourceSaved tests
* Improve naming, comments and minor details in the assertions
* Move test
* Fix failing test
* Delete duplicate test
* Minor test improvement
* Delete duplicate test
* Improve old test
* Minor test improvement
* Improve event test
* Improve tests (naming, code, comments)
* Delete extra test, add comments to the larger test
* Refactor central -> tenant attach() test
* Apply changes from central -> tenant attach() test on tenant -> central test
* Fix assertions in central -> tenant
* Correct comment and assertion
* Refactor tenant -> central attach() test
* Fix inconsistency
* Delete unused import
* Add comments
* Update polymorphic test names
* Rename polymorphic tests
* Update listener test name
* Delete redundant tenant ID assignments
* Improve test names
* Move polymorphic tests to ResourceSyncingTest
* Mention alternative solutions in CentralResourceNotAvailableInPivotException
* Add comments
* Update test comments
* minor changes to tests + review comments
* Delete extra tests, update comments
* Remove unneeded part of test
* Fix comment
* Improve comments
* Add test for companies() realationship accessibility
* Update test name
* Complete to-do, add comment
* Improve naming and comments (resolve some priority reviews)
* Move test
* Comment, resolve to-dos
* Add low-level pivot assertions
* Restore trashed resources if the central resource got restored, try improving tests
* Fix code style (php-cs-fixer)
* Dekete redundnat unsynced comments
* Add to-do, test WIP
* Fix restoring logic
* Update todo
* Add todo to fix phpdoc
* Fix code style (php-cs-fixer)
* PHPStan error fix wip
* Fix PHPStan error
* Add regression test
* Delete unused trait
* Add and test restoring WIP
* Fix code style (php-cs-fixer)
* Add to-do
* Delete comment from test
* Focus on restoring in the restore test
* Improve maming
* Fix stub
* Delete redundant part of test
* Delete incorrect test leftover
* Add triggerRestoredEvent
* Fix restore test
* Correct tests and restore(() logic
* Fix code style (php-cs-fixer)
* Check if SoftDeletes are used before firing SyncMasterRestored
* Fix comment
* Revert restore action changes (phpstan errors)
* Delete CascadeDeletes interface
* Remove CascadeDeletes from most of the tests
* Fix code style (php-cs-fixer)
* Rename tests
* Fix restoring + tests WIP
* Fix restoring
* Fix restoring tests
* Fix code style (php-cs-fixer)
* Test that detaching force deletes the tenant resources
* Implement cacscade force deleting
* Delete redundant changes
* Fix typo
* Fix SyncMaster
* Improve test
* Add force deleting logic back and fix tests
* Improve comment
* Delete extra assertion
* Improve restoring test
* Simplify assertion
* Delete redundant query scoping from test
* Test restore listener queueing
* use strict in_array() checks
* fix phpstan errors
---------
Co-authored-by: lukinovec <lukinovec@gmail.com>
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
* Resolve delete tenant storage todo
* Delete outdated todo (resolved in #25)
* Delete resource syncing todo (resolved in #11)
* Make it clear that getArgsForTenant() is used during cache invalidation
* Delete redundant __call() and __callStatic() annotations
* Fix code style (php-cs-fixer)
* Revert %tenant_id% to-do removal
* Test all cached resolvers instead of just the domain one
* Make docblock more concise, delete renaming to-do (the name seems fine)
* Fix method in tests
* If route is the only resolver arg, use the tenant as the cache key instead of encoded route instance
* Resolve to-do
* make docblock more clear
* Add comments to getResolverArgument()
* Rename $id to $tenantKey
* Fix code style (php-cs-fixer)
* Add regression test for forgetting tenant parameters of cached tenants
* Forget route parameter when tenant gets resolved
* Add parameter type
* Simplify getCacheKey()
* Resolvers wip
* Resolvers wip
* Fix code style (php-cs-fixer)
* Bring back the route instance check to getCacheKey, fix test
* add todo
* add assertion
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
Co-authored-by: Samuel Štancl <samuel@archte.ch>
* Make universal routes work for controller middleware
* add a fallback
---------
Co-authored-by: chillbram <7299762+chillbram@users.noreply.github.com>
Co-authored-by: Samuel Štancl <samuel@archte.ch>
* Add permission controleld MSSQL DB manager
* Fix code style (php-cs-fixer)
* Fix manager
* Don't change databases when creating MSSQL user
* Test permission controlled MSSQL DB manager
* Fix code style (php-cs-fixer)
* Delete redundant config resetting in tests
* Grant user permissions insteead of making the user the database owner
* Test that user gets created in the tenant DB
* Test that the correct permissions are granted to the DB users
* Fix code style (php-cs-fixer)
* Update config comment
* Fix typo
* Add perm controlled sqlsr db manager to test dataset
* Close all connections before deleting MSSQL DBs
* Fix code style (php-cs-fixer)
* Add explanation to deleteDatabase()
* Update tests/DatabaseUsersTest.php
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
* Fix code style (php-cs-fixer)
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
* Add origin ID MW
* Test origin ID MW
* Test origin ID MW with early identification
* Fix code style (php-cs-fixer)
* Fix PHPStan errors
* Add getDomain() to domain ID MW, simplify origin ID MW
* Fix code style (php-cs-fixer)
* Rename InitializeTenancyByOrigin to InitializeTenancyByOriginHeader
* Add onFail test
* Stop throwing the exception in getDomain()
* FIx merge
* Improve origin identification test file
* Clean up test
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
* Stop bypassing tenancy initialization when host is central domain in domain ID MW
* Delete dataset for testing global domain ID MW + route-level prevent access MW
* Provide ID MW statically in TenantAssetController
* Fix code style (php-cs-fixer)
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
* pass BroadcastManager to override closures
* Improve the broadcaster override syntax in the bootstrapper test
* remove unnecessary return
---------
Co-authored-by: lukinovec <lukinovec@gmail.com>
* Use data_get() to allow mapping nested tenant attributes to mail config
* Fix code style (php-cs-fixer)
* Test the data_get() change
* Improve code, add info to docblock
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
* Add SingleDomainTenant
* Add logic for single domain tenants
* Test that the single domain approach works (wip)
* Fix code style (php-cs-fixer)
* Simplify SubdomainTest tests
* Add single domain tenant conditions to DomainTenantResolver
* Test single domain tenants in resolver test
* Fix test name typo
* Improve runUsingBothDomainApproaches()
* Delete extra tenancy()->end()
* Test early identification with both domain approaches
* Test that things work with both domain approaches in the rest of the tests
* Fix falsely passing test
* Fix PHPStan errors
* Change SingleDomainTenant to a contract, add SingleDomainTenant test model
* Fix TenantList domainsCLI()
* Improve setCurrentDomain() check
* Fix code style (php-cs-fixer)
* Add annotation
* Revert getCustomColumns() change
* Add comments
* Use the domain returned by the closure in runUsingBoth..()
* Delete `migrate` from test
* Improve test names
* Use variable instead of repeating the same string multiple times
* Update comment
* Add comment
* Clean up PreventAccess test
* Don't assign domain to a single-use variable
* Update comments
* Uncomment datasets
* Add todo
* Fix user impersonation test
* Don't specify tenant key when creating tenant in runUsingBoth..()
* Improve universal route test
* Improve `runUsingBothDomainApproaches()`
* Add tests specific to single domain tenants
* Get rid of the runUsingBothDomainApproaches method
* Add test file specific for the single domain tenant feature
* Rename test
* Make getCustomColumns() function static
* Positiopn datasets differently
* Fix early id test
* Add prevent MW to route MW in test
* Fix single domain tenant tests
* Delete SingleDomainTenantTest (CI testing)
* Add the test file back
* TUrn APP_DEBUG on temporarily
* Turn debug off
* Try creating tenant with non-unique domain (CI testing)
* dd duplicate tenant records
* Revert testing change
* Make SingleDomainTenant not extend base tenant (VirtualColumn issues)
* Fix early id test
* add todo
* Use dev-master stancl/virtualcolumn
* Make SingleDomainTenant extend the tenant base model
* remove todo
* Clean up EarlyIdentificationTest changes
* Finish test file cleanup
* Fix test
* improve test
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
* Make asset_helper_tenancy false by default
* Make tenant_asset() respect ASSET_URL
* Set asset helper tenancy to true in tests where needed
* If the `asset_helper_tenancy` key is missing, default to false in filesystem bootstrapper
* Make temporary clone action changes
* Make tenancy asset route universal
* Make the asset controller's asset method behave differently if path ID MW is the default
* Test that asset helper works with path identification
* Fix code style (php-cs-fixer)
* Delete path traversal attack prevention
* Fix code style (php-cs-fixer)
* Skip cloning of stancl.tenancy.asset route in some tests
* Fix code style (php-cs-fixer)
* Clone asset route in TSP stub
* Add cloning only the passed route
* Clone asset route in tenant asset test beforeEach
* Skip asset route cloning by default
* Fix typo
* Change public method back to protected
* Remove cloning of specific routes, skip cloning routes flagged as tenant
* Delete constructor from asset controiler, change asset method to invoke
* Update asset route registration, add prefixed asest route for path identification
* Use default middleware from config instead of `tenancy()->defaultMiddleware()`
* Delete old code from TSP stub
* Revert TSP stub change
* Revert FilesystemTenancyBootstrapper changes
* Suffix asset url in tenant_asset()
* Simplify `tenant_asset()`
* Ensure the base asset url is always suffixed with '/'
* remove unnecessary ?? false
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
* Allow cloning routes when only kernel identification is used, explicitly enable specific cloning modes
* Explicitly enable needed clone modes in tests, use "clone" instead of "reregister"
* Fix code style (php-cs-fixer)
* Use "cloning" instead of "re-registration" in UniversalRouteTest
* Only clone routes using path identification
* Revert clone mode changes
* Fix code style (php-cs-fixer)
* Update comment
* Skip cloning 'stancl.tenancy.asset' by default
* Decide which routes should get cloned in the filtering step, improve method organization
* Return `RouteMode::UNIVERSAL` in getMiddlewareContext if route is universal
* Give universal route the path ID MW so that it gets cloned
* Fix code style (php-cs-fixer)
* Simplify UsableWithEarlyIdentification code
* Handle universal route mode in ForgetTenantParameter
* Fix code style (php-cs-fixer)
* Rename getMiddlewareContext to getRouteMode
* Append '/' to the route prefix
* Rename variable
* Wrap part of condition in parentheses
* Refresh name lookups after cloning routes
* Test giving tenant flag to cloned routes
* Add routeIsUniversal method
* Correct ForgetTenantParameter condition
* Improve tenant flag giving logic
* Improve test name
* Delete leftover testing code
* Put part of condition into `()`
* Improve CloneRoutesAsTenant code + comments
* Extract route mode-related code into methods, refactor and improve code
* Improve ForgetTenantParameter, test tenant parameter removing in universal routes
* Fix code style (php-cs-fixer)
* Fix test
* Simplify adding tenant flag
* Don't skip stancl.tenancy.asset route cloning
* clean up comment
* fix in_array() argument
* Fix code style (php-cs-fixer)
---------
Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>