diff --git a/app/Http/Controllers/Admin/Backup/ApiController.php b/app/Http/Controllers/Admin/Backup/ApiController.php index d052dd08..049a69e8 100644 --- a/app/Http/Controllers/Admin/Backup/ApiController.php +++ b/app/Http/Controllers/Admin/Backup/ApiController.php @@ -9,6 +9,9 @@ use Illuminate\Http\JsonResponse; class ApiController extends Controller { + /** + * Resoibd wutg syccess + */ public function respondSuccess(): JsonResponse { return response()->json([ diff --git a/app/Http/Controllers/Admin/Backup/BackupsController.php b/app/Http/Controllers/Admin/Backup/BackupsController.php index 24749a41..3b9ef7c5 100644 --- a/app/Http/Controllers/Admin/Backup/BackupsController.php +++ b/app/Http/Controllers/Admin/Backup/BackupsController.php @@ -7,6 +7,7 @@ namespace App\Http\Controllers\Admin\Backup; use App\Jobs\CreateBackupJob; use App\Models\FileDisk; use App\Rules\Backup\PathToZip; +use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; @@ -19,9 +20,10 @@ class BackupsController extends ApiController /** * Display a listing of the resource. * - * @return JsonResponse + * + * @throws AuthorizationException */ - public function index(Request $request) + public function index(Request $request): JsonResponse { $this->authorize('manage backups'); @@ -70,9 +72,10 @@ class BackupsController extends ApiController /** * Store a newly created resource in storage. * - * @return JsonResponse + * + * @throws AuthorizationException */ - public function store(Request $request) + public function store(Request $request): JsonResponse { $this->authorize('manage backups'); @@ -87,9 +90,10 @@ class BackupsController extends ApiController /** * Remove the specified resource from storage. * - * @return JsonResponse + * + * @throws AuthorizationException */ - public function destroy($disk, Request $request) + public function destroy($disk, Request $request): JsonResponse { $this->authorize('manage backups'); diff --git a/app/Http/Controllers/Admin/Backup/DownloadBackupController.php b/app/Http/Controllers/Admin/Backup/DownloadBackupController.php index e8dee0f8..90535154 100644 --- a/app/Http/Controllers/Admin/Backup/DownloadBackupController.php +++ b/app/Http/Controllers/Admin/Backup/DownloadBackupController.php @@ -5,6 +5,8 @@ namespace App\Http\Controllers\Admin\Backup; use App\Rules\Backup\PathToZip; +use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Request; use Spatie\Backup\BackupDestination\Backup; use Spatie\Backup\BackupDestination\BackupDestination; @@ -13,7 +15,13 @@ use Symfony\Component\HttpFoundation\StreamedResponse; class DownloadBackupController extends ApiController { - public function __invoke(Request $request) + /** + * Handle backups + * + * + * @throws AuthorizationException + */ + public function __invoke(Request $request): \Illuminate\Http\Response|StreamedResponse|ResponseFactory { $this->authorize('manage backups'); @@ -34,6 +42,9 @@ class DownloadBackupController extends ApiController return $this->respondWithBackupStream($backup); } + /** + * Respond with backup stream + */ public function respondWithBackupStream(Backup $backup): StreamedResponse { $fileName = pathinfo($backup->path(), PATHINFO_BASENAME); diff --git a/app/Http/Controllers/Admin/Modules/ApiTokenController.php b/app/Http/Controllers/Admin/Modules/ApiTokenController.php deleted file mode 100644 index 7d0122be..00000000 --- a/app/Http/Controllers/Admin/Modules/ApiTokenController.php +++ /dev/null @@ -1,25 +0,0 @@ -authorize('manage modules'); - - $response = ModuleInstaller::checkToken($request->api_token); - - return $response; - } -} diff --git a/app/Http/Controllers/Admin/Modules/CompleteModuleInstallationController.php b/app/Http/Controllers/Admin/Modules/CompleteModuleInstallationController.php deleted file mode 100644 index ddcc6bf7..00000000 --- a/app/Http/Controllers/Admin/Modules/CompleteModuleInstallationController.php +++ /dev/null @@ -1,27 +0,0 @@ -authorize('manage modules'); - - $response = ModuleInstaller::complete($request->module, $request->version); - - return response()->json([ - 'success' => $response, - ]); - } -} diff --git a/app/Http/Controllers/Admin/Modules/CopyModuleController.php b/app/Http/Controllers/Admin/Modules/CopyModuleController.php deleted file mode 100644 index 32498beb..00000000 --- a/app/Http/Controllers/Admin/Modules/CopyModuleController.php +++ /dev/null @@ -1,27 +0,0 @@ -authorize('manage modules'); - - $response = ModuleInstaller::copyFiles($request->module, $request->path); - - return response()->json([ - 'success' => $response, - ]); - } -} diff --git a/app/Http/Controllers/Admin/Modules/DisableModuleController.php b/app/Http/Controllers/Admin/Modules/DisableModuleController.php deleted file mode 100644 index 280d628b..00000000 --- a/app/Http/Controllers/Admin/Modules/DisableModuleController.php +++ /dev/null @@ -1,32 +0,0 @@ -authorize('manage modules'); - - $module = ModelsModule::where('name', $module)->first(); - $module->update(['enabled' => false]); - $installedModule = Module::find($module->name); - $installedModule->disable(); - - ModuleDisabledEvent::dispatch($module); - - return response()->json(['success' => true]); - } -} diff --git a/app/Http/Controllers/Admin/Modules/DownloadModuleController.php b/app/Http/Controllers/Admin/Modules/DownloadModuleController.php deleted file mode 100644 index f3e0e6a1..00000000 --- a/app/Http/Controllers/Admin/Modules/DownloadModuleController.php +++ /dev/null @@ -1,25 +0,0 @@ -authorize('manage modules'); - - $response = ModuleInstaller::download($request->module, $request->version); - - return response()->json($response); - } -} diff --git a/app/Http/Controllers/Admin/Modules/EnableModuleController.php b/app/Http/Controllers/Admin/Modules/EnableModuleController.php deleted file mode 100644 index 559b97e8..00000000 --- a/app/Http/Controllers/Admin/Modules/EnableModuleController.php +++ /dev/null @@ -1,32 +0,0 @@ -authorize('manage modules'); - - $module = ModelsModule::where('name', $module)->first(); - $module->update(['enabled' => true]); - $installedModule = Module::find($module->name); - $installedModule->enable(); - - ModuleEnabledEvent::dispatch($module); - - return response()->json(['success' => true]); - } -} diff --git a/app/Http/Controllers/Admin/Modules/ModuleController.php b/app/Http/Controllers/Admin/Modules/ModuleController.php deleted file mode 100644 index 4b0e529c..00000000 --- a/app/Http/Controllers/Admin/Modules/ModuleController.php +++ /dev/null @@ -1,33 +0,0 @@ -authorize('manage modules'); - - $response = ModuleInstaller::getModule($module); - - if (! $response->success) { - return response()->json($response); - } - - return (new ModuleResource($response->module)) - ->additional(['meta' => [ - 'modules' => ModuleResource::collection(collect($response->modules)), - ]]); - } -} diff --git a/app/Http/Controllers/Admin/Modules/ModuleInstallationController.php b/app/Http/Controllers/Admin/Modules/ModuleInstallationController.php new file mode 100644 index 00000000..ed8ca3ab --- /dev/null +++ b/app/Http/Controllers/Admin/Modules/ModuleInstallationController.php @@ -0,0 +1,65 @@ +authorize('manage modules'); + + $response = ModuleInstaller::download($request->module, $request->version); + + return response()->json($response); + } + + public function upload(UploadModuleRequest $request): JsonResponse + { + $this->authorize('manage modules'); + + $response = ModuleInstaller::upload($request); + + return response()->json($response); + } + + public function unzip(UnzipUpdateRequest $request): JsonResponse + { + $this->authorize('manage modules'); + + $path = ModuleInstaller::unzip($request->module, $request->path); + + return response()->json([ + 'success' => true, + 'path' => $path, + ]); + } + + public function copy(Request $request): JsonResponse + { + $this->authorize('manage modules'); + + $response = ModuleInstaller::copyFiles($request->module, $request->path); + + return response()->json([ + 'success' => $response, + ]); + } + + public function complete(Request $request): JsonResponse + { + $this->authorize('manage modules'); + + $response = ModuleInstaller::complete($request->module, $request->version); + + return response()->json([ + 'success' => $response, + ]); + } +} diff --git a/app/Http/Controllers/Admin/Modules/ModulesController.php b/app/Http/Controllers/Admin/Modules/ModulesController.php index ca4a5401..34b8b8ba 100644 --- a/app/Http/Controllers/Admin/Modules/ModulesController.php +++ b/app/Http/Controllers/Admin/Modules/ModulesController.php @@ -2,24 +2,73 @@ namespace App\Http\Controllers\Admin\Modules; +use App\Events\ModuleDisabledEvent; +use App\Events\ModuleEnabledEvent; use App\Http\Controllers\Controller; +use App\Http\Resources\ModuleResource; +use App\Models\Module as ModelsModule; use App\Services\Module\ModuleInstaller; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Http\Response; +use Nwidart\Modules\Facades\Module; class ModulesController extends Controller { - /** - * Handle the incoming request. - * - * @return Response - */ - public function __invoke(Request $request) + public function index(Request $request) { $this->authorize('manage modules'); - $response = ModuleInstaller::getModules(); + return ModuleInstaller::getModules(); + } - return $response; + public function show(Request $request, string $module) + { + $this->authorize('manage modules'); + + $response = ModuleInstaller::getModule($module); + + if (! $response->success) { + return response()->json($response); + } + + return (new ModuleResource($response->module)) + ->additional(['meta' => [ + 'modules' => ModuleResource::collection(collect($response->modules)), + ]]); + } + + public function checkToken(Request $request): JsonResponse + { + $this->authorize('manage modules'); + + return ModuleInstaller::checkToken($request->api_token); + } + + public function enable(Request $request, string $module): JsonResponse + { + $this->authorize('manage modules'); + + $module = ModelsModule::where('name', $module)->first(); + $module->update(['enabled' => true]); + $installedModule = Module::find($module->name); + $installedModule->enable(); + + ModuleEnabledEvent::dispatch($module); + + return response()->json(['success' => true]); + } + + public function disable(Request $request, string $module): JsonResponse + { + $this->authorize('manage modules'); + + $module = ModelsModule::where('name', $module)->first(); + $module->update(['enabled' => false]); + $installedModule = Module::find($module->name); + $installedModule->disable(); + + ModuleDisabledEvent::dispatch($module); + + return response()->json(['success' => true]); } } diff --git a/app/Http/Controllers/Admin/Modules/UnzipModuleController.php b/app/Http/Controllers/Admin/Modules/UnzipModuleController.php deleted file mode 100644 index 32d46ae8..00000000 --- a/app/Http/Controllers/Admin/Modules/UnzipModuleController.php +++ /dev/null @@ -1,28 +0,0 @@ -authorize('manage modules'); - - $path = ModuleInstaller::unzip($request->module, $request->path); - - return response()->json([ - 'success' => true, - 'path' => $path, - ]); - } -} diff --git a/app/Http/Controllers/Admin/Modules/UploadModuleController.php b/app/Http/Controllers/Admin/Modules/UploadModuleController.php deleted file mode 100644 index fcf3a3d4..00000000 --- a/app/Http/Controllers/Admin/Modules/UploadModuleController.php +++ /dev/null @@ -1,25 +0,0 @@ -authorize('manage modules'); - - $response = ModuleInstaller::upload($request); - - return response()->json($response); - } -} diff --git a/app/Http/Controllers/Admin/Settings/DiskController.php b/app/Http/Controllers/Admin/Settings/DiskController.php index 95033655..d533b565 100644 --- a/app/Http/Controllers/Admin/Settings/DiskController.php +++ b/app/Http/Controllers/Admin/Settings/DiskController.php @@ -7,9 +7,10 @@ use App\Http\Requests\DiskEnvironmentRequest; use App\Http\Resources\FileDiskResource; use App\Models\FileDisk; use App\Services\FileDiskService; +use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Http\Response; +use Illuminate\Http\Resources\Json\AnonymousResourceCollection; class DiskController extends Controller { @@ -18,9 +19,10 @@ class DiskController extends Controller ) {} /** - * @return JsonResponse + * @throws AuthorizationException + * @throws AuthorizationException */ - public function index(Request $request) + public function index(Request $request): AnonymousResourceCollection { $this->authorize('manage file disk'); @@ -34,8 +36,11 @@ class DiskController extends Controller /** * @return JsonResponse + * + * @throws AuthorizationException + * @throws AuthorizationException */ - public function store(DiskEnvironmentRequest $request) + public function store(DiskEnvironmentRequest $request): JsonResponse|FileDiskResource { $this->authorize('manage file disk'); @@ -49,10 +54,9 @@ class DiskController extends Controller } /** - * @param FileDisk $file_disk - * @return JsonResponse + * @throws AuthorizationException */ - public function update(FileDisk $disk, Request $request) + public function update(FileDisk $disk, Request $request): JsonResponse|FileDiskResource { $this->authorize('manage file disk'); @@ -74,10 +78,13 @@ class DiskController extends Controller /** * @param Request $request - * @return JsonResponse + * + * @throws AuthorizationException + * @throws AuthorizationException */ - public function show($disk) + public function show($disk): JsonResponse { + $this->authorize('manage file disk'); $diskData = []; @@ -143,9 +150,11 @@ class DiskController extends Controller * Remove the specified resource from storage. * * @param FileDisk $taxType - * @return Response + * + * @throws AuthorizationException + * @throws AuthorizationException */ - public function destroy(FileDisk $disk) + public function destroy(FileDisk $disk): JsonResponse { $this->authorize('manage file disk'); @@ -161,9 +170,10 @@ class DiskController extends Controller } /** - * @return JsonResponse + * @throws AuthorizationException + * @throws AuthorizationException */ - public function getDiskDrivers() + public function getDiskDrivers(): JsonResponse { $this->authorize('manage file disk'); diff --git a/app/Http/Controllers/Admin/Settings/GetSettingsController.php b/app/Http/Controllers/Admin/Settings/GetSettingsController.php index 3555b467..829983c4 100644 --- a/app/Http/Controllers/Admin/Settings/GetSettingsController.php +++ b/app/Http/Controllers/Admin/Settings/GetSettingsController.php @@ -5,18 +5,18 @@ namespace App\Http\Controllers\Admin\Settings; use App\Http\Controllers\Controller; use App\Http\Requests\GetSettingRequest; use App\Models\Setting; -use Illuminate\Http\Request; -use Illuminate\Http\Response; +use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Http\JsonResponse; class GetSettingsController extends Controller { /** * Handle the incoming request. * - * @param Request $request - * @return Response + * + * @throws AuthorizationException */ - public function __invoke(GetSettingRequest $request) + public function __invoke(GetSettingRequest $request): JsonResponse { $this->authorize('manage settings'); diff --git a/app/Http/Controllers/Admin/Settings/MailConfigurationController.php b/app/Http/Controllers/Admin/Settings/MailConfigurationController.php index f474255a..47cbf2a4 100755 --- a/app/Http/Controllers/Admin/Settings/MailConfigurationController.php +++ b/app/Http/Controllers/Admin/Settings/MailConfigurationController.php @@ -33,11 +33,11 @@ class MailConfigurationController extends Controller /** * Save the mail environment variables * - * @return JsonResponse + * * * @throws AuthorizationException */ - public function saveMailEnvironment(MailEnvironmentRequest $request) + public function saveMailEnvironment(MailEnvironmentRequest $request): JsonResponse { $this->authorize('manage email config'); @@ -60,10 +60,8 @@ class MailConfigurationController extends Controller /** * Prepare mail settings for database storage - * - * @return array */ - private function prepareMailSettingsForDatabase(MailEnvironmentRequest $request) + private function prepareMailSettingsForDatabase(MailEnvironmentRequest $request): array { $driver = $request->get('mail_driver'); @@ -120,11 +118,10 @@ class MailConfigurationController extends Controller /** * Return the mail environment variables * - * @return JsonResponse * * @throws AuthorizationException */ - public function getMailEnvironment() + public function getMailEnvironment(): JsonResponse { $this->authorize('manage email config'); @@ -211,11 +208,10 @@ class MailConfigurationController extends Controller /** * Return the available mail drivers * - * @return JsonResponse * * @throws AuthorizationException */ - public function getMailDrivers() + public function getMailDrivers(): JsonResponse { $this->authorize('manage email config'); @@ -233,12 +229,12 @@ class MailConfigurationController extends Controller /** * Test the email configuration * - * @return JsonResponse + * * * @throws AuthorizationException * @throws ValidationException */ - public function testEmailConfig(Request $request) + public function testEmailConfig(Request $request): JsonResponse { $this->authorize('manage email config'); diff --git a/app/Http/Controllers/Admin/Settings/PDFConfigurationController.php b/app/Http/Controllers/Admin/Settings/PDFConfigurationController.php index 115c2413..078f2b96 100644 --- a/app/Http/Controllers/Admin/Settings/PDFConfigurationController.php +++ b/app/Http/Controllers/Admin/Settings/PDFConfigurationController.php @@ -6,20 +6,27 @@ use App\Http\Controllers\Controller; use App\Http\Requests\PDFConfigurationRequest; use App\Models\Setting; use App\Services\Setup\EnvironmentManager; +use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Http\JsonResponse; class PDFConfigurationController extends Controller { - /** - * @var EnvironmentManager - */ - protected $environmentManager; + protected EnvironmentManager $environmentManager; + /** + * Constructor + */ public function __construct(EnvironmentManager $environmentManager) { $this->environmentManager = $environmentManager; } - public function getDrivers() + /** + * Returns the available drivers + * + * @throws AuthorizationException + */ + public function getDrivers(): JsonResponse { $this->authorize('manage pdf config'); @@ -31,7 +38,12 @@ class PDFConfigurationController extends Controller return response()->json($drivers); } - public function getEnvironment() + /** + * Return the PDF settings + * + * @throws AuthorizationException + */ + public function getEnvironment(): JsonResponse { $this->authorize('manage pdf config'); @@ -53,7 +65,12 @@ class PDFConfigurationController extends Controller return response()->json($config); } - public function saveEnvironment(PDFConfigurationRequest $request) + /** + * Saves the settings + * + * @throws AuthorizationException + */ + public function saveEnvironment(PDFConfigurationRequest $request): JsonResponse { $this->authorize('manage pdf config'); @@ -70,10 +87,8 @@ class PDFConfigurationController extends Controller /** * Prepare PDF settings for database storage - * - * @return array */ - private function preparePDFSettingsForDatabase(PDFConfigurationRequest $request) + private function preparePDFSettingsForDatabase(PDFConfigurationRequest $request): array { $driver = $request->get('pdf_driver'); diff --git a/app/Http/Controllers/Admin/Settings/UpdateSettingsController.php b/app/Http/Controllers/Admin/Settings/UpdateSettingsController.php index 47c4bd09..6468228f 100644 --- a/app/Http/Controllers/Admin/Settings/UpdateSettingsController.php +++ b/app/Http/Controllers/Admin/Settings/UpdateSettingsController.php @@ -5,18 +5,18 @@ namespace App\Http\Controllers\Admin\Settings; use App\Http\Controllers\Controller; use App\Http\Requests\SettingRequest; use App\Models\Setting; -use Illuminate\Http\Request; -use Illuminate\Http\Response; +use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Http\JsonResponse; class UpdateSettingsController extends Controller { /** * Handle the incoming request. * - * @param Request $request - * @return Response + * + * @throws AuthorizationException */ - public function __invoke(SettingRequest $request) + public function __invoke(SettingRequest $request): JsonResponse { $this->authorize('manage settings'); diff --git a/app/Http/Controllers/Company/Dashboard/DashboardController.php b/app/Http/Controllers/Company/Dashboard/DashboardController.php index 72cf790d..805f1ba6 100644 --- a/app/Http/Controllers/Company/Dashboard/DashboardController.php +++ b/app/Http/Controllers/Company/Dashboard/DashboardController.php @@ -60,39 +60,27 @@ class DashboardController extends Controller } while ($monthCounter < 12) { - array_push( - $invoice_totals, - Invoice::whereBetween( - 'invoice_date', - [$start->format('Y-m-d'), $end->format('Y-m-d')] - ) - ->whereCompany() - ->sum('base_total') - ); - array_push( - $expense_totals, - Expense::whereBetween( - 'expense_date', - [$start->format('Y-m-d'), $end->format('Y-m-d')] - ) - ->whereCompany() - ->sum('base_amount') - ); - array_push( - $receipt_totals, - Payment::whereBetween( - 'payment_date', - [$start->format('Y-m-d'), $end->format('Y-m-d')] - ) - ->whereCompany() - ->sum('base_amount') - ); - array_push( - $net_income_totals, - ($receipt_totals[$i] - $expense_totals[$i]) - ); + $invoice_totals[] = Invoice::whereBetween( + 'invoice_date', + [$start->format('Y-m-d'), $end->format('Y-m-d')] + ) + ->whereCompany() + ->sum('base_total'); + $expense_totals[] = Expense::whereBetween( + 'expense_date', + [$start->format('Y-m-d'), $end->format('Y-m-d')] + ) + ->whereCompany() + ->sum('base_amount'); + $receipt_totals[] = Payment::whereBetween( + 'payment_date', + [$start->format('Y-m-d'), $end->format('Y-m-d')] + ) + ->whereCompany() + ->sum('base_amount'); + $net_income_totals[] = ($receipt_totals[$i] - $expense_totals[$i]); $i++; - array_push($months, $start->translatedFormat('M')); + $months[] = $start->translatedFormat('M'); $monthCounter++; $end->startOfMonth(); $start->addMonth()->startOfMonth(); diff --git a/routes/api.php b/routes/api.php index 124f4c22..0ed9e550 100644 --- a/routes/api.php +++ b/routes/api.php @@ -4,16 +4,8 @@ use App\Http\Controllers\Admin\Backup\BackupsController; use App\Http\Controllers\Admin\Backup\DownloadBackupController; use App\Http\Controllers\Admin\CountriesController; use App\Http\Controllers\Admin\CurrenciesController; -use App\Http\Controllers\Admin\Modules\ApiTokenController; -use App\Http\Controllers\Admin\Modules\CompleteModuleInstallationController; -use App\Http\Controllers\Admin\Modules\CopyModuleController; -use App\Http\Controllers\Admin\Modules\DisableModuleController; -use App\Http\Controllers\Admin\Modules\DownloadModuleController; -use App\Http\Controllers\Admin\Modules\EnableModuleController; -use App\Http\Controllers\Admin\Modules\ModuleController; +use App\Http\Controllers\Admin\Modules\ModuleInstallationController; use App\Http\Controllers\Admin\Modules\ModulesController; -use App\Http\Controllers\Admin\Modules\UnzipModuleController; -use App\Http\Controllers\Admin\Modules\UploadModuleController; use App\Http\Controllers\Admin\Settings\DiskController; use App\Http\Controllers\Admin\Settings\GetSettingsController; use App\Http\Controllers\Admin\Settings\MailConfigurationController; @@ -459,25 +451,17 @@ Route::prefix('/v1')->group(function () { // ---------------------------------- Route::prefix('/modules')->group(function () { - Route::get('/', ModulesController::class); + Route::get('/', [ModulesController::class, 'index']); + Route::get('/check', [ModulesController::class, 'checkToken']); + Route::get('/{module}', [ModulesController::class, 'show']); + Route::post('/{module}/enable', [ModulesController::class, 'enable']); + Route::post('/{module}/disable', [ModulesController::class, 'disable']); - Route::get('/check', ApiTokenController::class); - - Route::get('/{module}', ModuleController::class); - - Route::post('/{module}/enable', EnableModuleController::class); - - Route::post('/{module}/disable', DisableModuleController::class); - - Route::post('/download', DownloadModuleController::class); - - Route::post('/upload', UploadModuleController::class); - - Route::post('/unzip', UnzipModuleController::class); - - Route::post('/copy', CopyModuleController::class); - - Route::post('/complete', CompleteModuleInstallationController::class); + Route::post('/download', [ModuleInstallationController::class, 'download']); + Route::post('/upload', [ModuleInstallationController::class, 'upload']); + Route::post('/unzip', [ModuleInstallationController::class, 'unzip']); + Route::post('/copy', [ModuleInstallationController::class, 'copy']); + Route::post('/complete', [ModuleInstallationController::class, 'complete']); }); });