add new middleware for module limitation

This commit is contained in:
Cihan Şentürk 2025-12-11 21:46:49 +03:00 committed by GitHub
parent aa393c58fc
commit 421cc1091a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 127 additions and 8 deletions

View File

@ -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,

View File

@ -0,0 +1,40 @@
<?php
namespace App\Http\Middleware;
use App\Traits\Modules;
use App\Utilities\Versions;
use Closure;
class RedirectIfHitModuleSubscription
{
use Modules;
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (! $request->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);
}
}

View File

@ -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';

View File

@ -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