Просмотр файла app/Controllers/Admin/ModuleController.php

Размер файла: 5.38Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Controllers\Admin;
  6.  
  7. use App\Commands\RouteClear;
  8. use App\Models\Module;
  9. use App\Models\User;
  10. use Exception;
  11. use Illuminate\Http\Request;
  12.  
  13. class ModuleController extends AdminController
  14. {
  15. /**
  16. * ModuleController constructor.
  17. */
  18. public function __construct()
  19. {
  20. parent::__construct();
  21.  
  22. if (! isAdmin(User::BOSS)) {
  23. abort(403, __('errors.forbidden'));
  24. }
  25. }
  26.  
  27. /**
  28. * Главная страница
  29. *
  30. * @return string
  31. */
  32. public function index(): string
  33. {
  34. $modules = Module::query()->get();
  35. $moduleInstall = [];
  36. foreach ($modules as $module) {
  37. $moduleInstall[$module->name] = $module;
  38. }
  39.  
  40. $moduleNames = [];
  41. $modulesLoaded = glob(MODULES . '/*', GLOB_ONLYDIR);
  42. foreach ($modulesLoaded as $module) {
  43. if (file_exists($module . '/module.php')) {
  44. $moduleNames[basename($module)] = include $module . '/module.php';
  45. }
  46. }
  47.  
  48. return view('admin/modules/index', compact('moduleInstall', 'moduleNames'));
  49. }
  50.  
  51. /**
  52. * Просмотр модуля
  53. *
  54. * @param Request $request
  55. *
  56. * @return string
  57. */
  58. public function module(Request $request): string
  59. {
  60. $moduleName = $request->input('module');
  61. $modulePath = MODULES . '/' . $moduleName;
  62.  
  63. if (! preg_match('|^[A-Z][\w\-]+$|', $moduleName) || ! file_exists($modulePath)) {
  64. abort('default', __('admin.modules.module_not_found'));
  65. }
  66.  
  67. $moduleConfig = include $modulePath . '/module.php';
  68.  
  69. if (file_exists($modulePath . '/screenshots')) {
  70. $moduleConfig['screenshots'] = glob($modulePath . '/screenshots/*.{gif,png,jpg,jpeg}', GLOB_BRACE);
  71. }
  72.  
  73. if (file_exists($modulePath . '/migrations')) {
  74. $moduleConfig['migrations'] = array_map('basename', glob($modulePath . '/migrations/*.php'));
  75. }
  76.  
  77. if (file_exists($modulePath . '/resources/assets')) {
  78. $moduleConfig['symlink'] = str_replace(HOME, '', (new Module())->getLinkName($modulePath));
  79. }
  80.  
  81. $module = Module::query()->where('name', $moduleName)->first();
  82.  
  83. return view('admin/modules/module', compact('module', 'moduleConfig', 'moduleName'));
  84. }
  85.  
  86. /**
  87. * Установка модуля
  88. *
  89. * @param Request $request
  90. *
  91. * @return void
  92. */
  93. public function install(Request $request): void
  94. {
  95. $moduleName = $request->input('module');
  96. $enable = int($request->input('enable'));
  97. $update = int($request->input('update'));
  98. $modulePath = MODULES . '/' . $moduleName;
  99.  
  100. if (! preg_match('|^[A-Z][\w\-]+$|', $moduleName) || ! file_exists($modulePath)) {
  101. abort('default', __('admin.modules.module_not_found'));
  102. }
  103.  
  104. /** @var Module $module */
  105. $module = Module::query()->firstOrNew(['name' => $moduleName]);
  106.  
  107. $moduleConfig = include $modulePath . '/module.php';
  108. $module->createSymlink($modulePath);
  109. $module->migrate($modulePath);
  110.  
  111. runCommand(new RouteClear());
  112.  
  113. $result = __('admin.modules.module_success_installed');
  114.  
  115. if ($module->exists) {
  116. if ($update) {
  117. $module->update([
  118. 'version' => $moduleConfig['version'],
  119. 'updated_at' => SITETIME,
  120. ]);
  121. $result = __('admin.modules.module_success_updated');
  122. }
  123.  
  124. if ($enable) {
  125. $module->update([
  126. 'disabled' => 0,
  127. 'updated_at' => SITETIME,
  128. ]);
  129. $result = __('admin.modules.module_success_enabled');
  130. }
  131. } else {
  132. $module->fill([
  133. 'version' => $moduleConfig['version'],
  134. 'updated_at' => SITETIME,
  135. 'created_at' => SITETIME,
  136. ])->save();
  137. }
  138.  
  139. setFlash('success', $result);
  140. redirect('/admin/modules/module?module=' . $moduleName);
  141. }
  142.  
  143. /**
  144. * Удаление/Выключение модуля
  145. *
  146. * @param Request $request
  147. *
  148. * @return void
  149. * @throws Exception
  150. */
  151. public function uninstall(Request $request): void
  152. {
  153. $moduleName = $request->input('module');
  154. $disable = int($request->input('disable'));
  155. $modulePath = MODULES . '/' . $moduleName;
  156.  
  157. if (! preg_match('|^[A-Z][\w\-]+$|', $moduleName) || ! file_exists($modulePath)) {
  158. abort('default', __('admin.modules.module_not_found'));
  159. }
  160.  
  161. /** @var Module $module */
  162. $module = Module::query()->where('name', $moduleName)->first();
  163. if (! $module) {
  164. abort('default', __('admin.modules.module_not_found'));
  165. }
  166.  
  167. $module->deleteSymlink($modulePath);
  168.  
  169. runCommand(new RouteClear());
  170.  
  171. if ($disable) {
  172. $module->update([
  173. 'disabled' => 1,
  174. 'updated_at' => SITETIME,
  175. ]);
  176. $result = __('admin.modules.module_success_disabled');
  177. } else {
  178. $module->rollback($modulePath);
  179. $module->delete();
  180. $result = __('admin.modules.module_success_deleted');
  181. }
  182.  
  183. setFlash('success', $result);
  184. redirect('/admin/modules/module?module=' . $moduleName);
  185. }
  186. }