diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 7fda971c7..1e0d40bda 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -84,6 +84,7 @@ class Kernel extends HttpKernel 'menu.admin', 'permission:read-admin-panel', 'plan.limits', + 'module.subscription', ], 'wizard' => [ @@ -175,6 +176,7 @@ class Kernel extends HttpKernel 'dropzone' => \App\Http\Middleware\Dropzone::class, 'header.x' => \App\Http\Middleware\AddXHeader::class, 'plan.limits' => \App\Http\Middleware\RedirectIfHitPlanLimits::class, + 'module.subscription' => \App\Http\Middleware\RedirectIfHitModuleSubscription::class, 'menu.admin' => \App\Http\Middleware\AdminMenu::class, 'menu.portal' => \App\Http\Middleware\PortalMenu::class, 'date.format' => \App\Http\Middleware\DateFormat::class, diff --git a/app/Http/Middleware/RedirectIfHitModuleSubscription.php b/app/Http/Middleware/RedirectIfHitModuleSubscription.php new file mode 100644 index 000000000..67e945394 --- /dev/null +++ b/app/Http/Middleware/RedirectIfHitModuleSubscription.php @@ -0,0 +1,40 @@ +isMethod(strtolower('GET'))) { + return $next($request); + } + + if ($request->ajax()) { + return $next($request); + } + + if ($request->is(company_id() . '/apps/*')) { + return $next($request); + } + + if (! $this->getModulesLimitOfSubscription()->action_status) { + return redirect()->route('dashboard'); + } + + return $next($request); + } +} diff --git a/app/Traits/Modules.php b/app/Traits/Modules.php index 8382b19e6..8c2c17fd5 100644 --- a/app/Traits/Modules.php +++ b/app/Traits/Modules.php @@ -2,10 +2,13 @@ namespace App\Traits; +use App\Jobs\Install\DisableModule; +use App\Jobs\Install\UninstallModule; use App\Models\Module\Module; use App\Traits\SiteApi; use App\Utilities\Date; use App\Utilities\Info; +use App\Utilities\Versions; use Illuminate\Support\Facades\Cache; trait Modules @@ -423,6 +426,86 @@ trait Modules return ! $this->moduleIsEnabled($alias); } + public function getModulesLimitOfSubscription() + { + $limit = new \stdClass(); + + $limit->action_status = true; + $limit->view_status = true; + $limit->message = "Success"; + + if (! config('app.installed') || running_in_test()) { + return $limit; + } + + if (is_cloud()) { + return $limit; + } + + $modules = module()->all(); + + $versions = Versions::all($modules); + + foreach ($versions as $alias => $version) { + if ($alias == 'core') { + continue; + } + + $module_limit = $this->getModuleLimitOfSubscription($alias, $version); + + if ($module_limit->action_status === false) { + $limit->action_status = false; + $limit->view_status = false; + $limit->message = $module_limit->message; + } + } + + return $limit; + } + + public function getModuleLimitOfSubscription($alias, $version = null) + { + $limit = new \stdClass(); + + $limit->action_status = true; + $limit->view_status = true; + $limit->message = "Success"; + + if (empty($version)) { + $version = Versions::getVersionByAlias($alias); + } + + if (! $version->subscription) { + return $limit; + } + + if (! in_array($version->subscription->action_status, ['disabled', 'uninstalled'])) { + return $limit; + } + + $limit->action_status = false; + $limit->view_status = false; + $limit->message = "Not able to app $alias."; + + $module_companies = Module::allCompanies()->alias($alias)->get(); + + foreach ($module_companies as $module) { + switch ($version->subscription->action_status) { + case 'disabled': + dispatch(new DisableModule($alias, $module->company_id)); + break; + case 'uninstalled': + dispatch(new UninstallModule($alias, $module->company_id)); + break; + default: + // Do nothing + break; + } + } + + return $limit; + } + public function loadSubscriptions() { $key = 'apps.subscriptions'; diff --git a/app/Utilities/Versions.php b/app/Utilities/Versions.php index fabbcb8a2..c9dfdd78e 100644 --- a/app/Utilities/Versions.php +++ b/app/Utilities/Versions.php @@ -140,8 +140,6 @@ class Versions $url = 'apps/' . $alias . '/version/' . $version . '/' . $info['akaunting']; $versions[$alias] = static::getLatestVersion($url, $version); - - static::enforceSubscriptionStatus($alias, $versions[$alias]); } return $versions; @@ -167,10 +165,6 @@ class Versions $versions[$alias] = static::getLatestVersion($url, $version); - if ($alias != 'core') { - static::enforceSubscriptionStatus($alias, $versions[$alias]); - } - Cache::put('versions', $versions, Date::now()->addHours(6)); return $versions[$alias]; @@ -240,10 +234,10 @@ class Versions foreach ($module_companies as $module) { switch ($status) { case 'disabled': - dispatch_sync(new DisableModule($alias, $module->company_id)); + dispatch(new DisableModule($alias, $module->company_id)); break; case 'uninstalled': - dispatch_sync(new UninstallModule($alias, $module->company_id)); + dispatch(new UninstallModule($alias, $module->company_id)); break; default: // Do nothing