*/ public function index(ReadPluginRequest $request): array { $plugins = QueryBuilder::for(Plugin::class) ->allowedFilters(['id', 'name', 'author', 'category']) ->allowedSorts(['id', 'name', 'author', 'category']) ->paginate($request->query('per_page') ?? 10); return $this->fractal->collection($plugins) ->transformWith($this->getTransformer(PluginTransformer::class)) ->toArray(); } /** * View plugin * * Return a single plugin. * * @return array */ public function view(ReadPluginRequest $request, Plugin $plugin): array { return $this->fractal->item($plugin) ->transformWith($this->getTransformer(PluginTransformer::class)) ->toArray(); } /** * Import plugin (file) * * Imports a new plugin file. * * @throws Exception */ public function importFile(WritePluginRequest $request): Response { if (!$request->hasFile('plugin')) { throw new PanelException("No 'plugin' file in request"); } $this->pluginService->downloadPluginFromFile($request->file('plugin')); return new Response('', Response::HTTP_CREATED); } /** * Import plugin (url) * * Imports a new plugin from an url. * * @throws Exception */ public function importUrl(ImportFilePluginRequest $request): Response { $this->pluginService->downloadPluginFromUrl($request->input('url')); return new Response('', Response::HTTP_CREATED); } /** * Install plugin * * Installs and enables a plugin. * * @return array * * @throws Exception */ public function install(WritePluginRequest $request, Plugin $plugin): array { if ($plugin->status !== PluginStatus::NotInstalled) { throw new PanelException('Plugin is already installed'); } $this->pluginService->installPlugin($plugin); return $this->fractal->item($plugin) ->transformWith($this->getTransformer(PluginTransformer::class)) ->toArray(); } /** * Update plugin * * Downloads and installs an update for a plugin. Will throw if no update is available. * * @return array * * @throws Exception */ public function update(WritePluginRequest $request, Plugin $plugin): array { if (!$plugin->isUpdateAvailable()) { throw new PanelException("Plugin doesn't need updating"); } $this->pluginService->updatePlugin($plugin); return $this->fractal->item($plugin) ->transformWith($this->getTransformer(PluginTransformer::class)) ->toArray(); } /** * Uninstall plugin * * Uninstalls a plugin. Optionally it will delete the plugin folder too. * * @return array * * @throws Exception */ public function uninstall(UninstallPluginRequest $request, Plugin $plugin): array { if ($plugin->status === PluginStatus::NotInstalled) { throw new PanelException('Plugin is not installed'); } $this->pluginService->uninstallPlugin($plugin, $request->boolean('delete')); return $this->fractal->item($plugin) ->transformWith($this->getTransformer(PluginTransformer::class)) ->toArray(); } /** * Enable plugin * * Enables a plugin. * * @return array * * @throws Exception */ public function enable(WritePluginRequest $request, Plugin $plugin): array { if (!$plugin->canEnable()) { throw new PanelException("Plugin can't be enabled"); } $this->pluginService->enablePlugin($plugin); return $this->fractal->item($plugin) ->transformWith($this->getTransformer(PluginTransformer::class)) ->toArray(); } /** * Disable plugin * * Disables a plugin. * * @return array * * @throws Exception */ public function disable(WritePluginRequest $request, Plugin $plugin): array { if (!$plugin->canDisable()) { throw new PanelException("Plugin can't be disabled"); } $this->pluginService->disablePlugin($plugin); return $this->fractal->item($plugin) ->transformWith($this->getTransformer(PluginTransformer::class)) ->toArray(); } }