From b25980996099d0cba6b82a279e8aba3e7a7fc5ec Mon Sep 17 00:00:00 2001 From: F4ilji Date: Sun, 5 Jul 2026 02:50:41 +0500 Subject: [PATCH] feat(vikon): add updatePart endpoint with request validation --- .../Providers/VikonServiceProvider.php | 17 ++++++++++++++ .../UI/WEB/Controllers/VikonController.php | 23 +++++++++++++++++++ .../UI/WEB/Requests/UpdatePartRequest.php | 21 +++++++++++++++++ .../VikonIntegration/UI/WEB/Routes/web.php | 1 + 4 files changed, 62 insertions(+) create mode 100644 app/Containers/VikonIntegration/UI/WEB/Requests/UpdatePartRequest.php diff --git a/app/Containers/VikonIntegration/Providers/VikonServiceProvider.php b/app/Containers/VikonIntegration/Providers/VikonServiceProvider.php index 35ddddc..23c900d 100644 --- a/app/Containers/VikonIntegration/Providers/VikonServiceProvider.php +++ b/app/Containers/VikonIntegration/Providers/VikonServiceProvider.php @@ -7,7 +7,9 @@ use App\Containers\VikonIntegration\Actions\CheckAccessAction; use App\Containers\VikonIntegration\Actions\CheckVersionAction; use App\Containers\VikonIntegration\Actions\SyncFilesAction; use App\Containers\VikonIntegration\Actions\UpdateCoreAction; +use App\Containers\VikonIntegration\Actions\UpdatePartAction; use App\Containers\VikonIntegration\Tasks\FilesystemTask; +use App\Containers\VikonIntegration\Tasks\PollPartStatusTask; use App\Containers\VikonIntegration\Tasks\HttpTask; use App\Containers\VikonIntegration\Tasks\RefreshTokenTask; use App\Containers\VikonIntegration\Tasks\ValidateTokenTask; @@ -40,6 +42,21 @@ class VikonServiceProvider extends ServiceProvider $this->app->singleton(FilesystemTask::class, fn () => new FilesystemTask); + $this->app->singleton(PollPartStatusTask::class, fn ($app) => new PollPartStatusTask( + http: $app->make(HttpTask::class), + interval: config('vikon.poll_interval', 3), + maxAttempts: config('vikon.poll_max_attempts', 50), + )); + + $this->app->singleton(UpdatePartAction::class, fn ($app) => new UpdatePartAction( + http: $app->make(HttpTask::class), + fs: $app->make(FilesystemTask::class), + pollStatus: $app->make(PollPartStatusTask::class), + storagePath: config('vikon.storage_path'), + basePath: public_path(), + modulesConfig: config('vikon.modules'), + )); + $this->app->singleton(AuthenticateAction::class, fn ($app) => new AuthenticateAction( http: $app->make(HttpTask::class), clientId: config('vikon.client_id'), diff --git a/app/Containers/VikonIntegration/UI/WEB/Controllers/VikonController.php b/app/Containers/VikonIntegration/UI/WEB/Controllers/VikonController.php index 700c0cf..ed23a50 100644 --- a/app/Containers/VikonIntegration/UI/WEB/Controllers/VikonController.php +++ b/app/Containers/VikonIntegration/UI/WEB/Controllers/VikonController.php @@ -7,10 +7,12 @@ use App\Containers\VikonIntegration\Actions\CheckAccessAction; use App\Containers\VikonIntegration\Actions\CheckVersionAction; use App\Containers\VikonIntegration\Actions\SyncFilesAction; use App\Containers\VikonIntegration\Actions\UpdateCoreAction; +use App\Containers\VikonIntegration\Actions\UpdatePartAction; use App\Containers\VikonIntegration\Tasks\RefreshTokenTask; use App\Containers\VikonIntegration\Tasks\ValidateTokenTask; use App\Containers\VikonIntegration\UI\WEB\Requests\AuthenticateRequest; use App\Containers\VikonIntegration\UI\WEB\Requests\UpdateModuleRequest; +use App\Containers\VikonIntegration\UI\WEB\Requests\UpdatePartRequest; use App\Http\Controllers\Controller; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -25,6 +27,7 @@ class VikonController extends Controller private readonly CheckVersionAction $checkVersion, private readonly UpdateCoreAction $updateCore, private readonly SyncFilesAction $syncFiles, + private readonly UpdatePartAction $updatePart, private readonly RefreshTokenTask $refreshToken, private readonly ValidateTokenTask $validateToken, ) {} @@ -163,6 +166,26 @@ class VikonController extends Controller } } + public function updatePart(UpdatePartRequest $request): JsonResponse + { + $token = Session::get('vikon_access_token'); + if (!$token) { + return response()->json(['success' => false, 'requires_auth' => true], 401); + } + + try { + $result = $this->updatePart->run( + $request->validated('module_id'), + $request->validated('part'), + $token + ); + return response()->json($result); + } catch (\Throwable $e) { + Log::error('Vikon part update failed', ['error' => $e->getMessage()]); + return response()->json(['success' => false, 'message' => $e->getMessage()], 500); + } + } + public function logout(): JsonResponse { Session::forget(['vikon_access_token', 'vikon_refresh_token']); diff --git a/app/Containers/VikonIntegration/UI/WEB/Requests/UpdatePartRequest.php b/app/Containers/VikonIntegration/UI/WEB/Requests/UpdatePartRequest.php new file mode 100644 index 0000000..6f54c1a --- /dev/null +++ b/app/Containers/VikonIntegration/UI/WEB/Requests/UpdatePartRequest.php @@ -0,0 +1,21 @@ + ['required', 'integer', 'in:1,2,6'], + 'part' => ['required', 'string', 'max:50'], + ]; + } +} diff --git a/app/Containers/VikonIntegration/UI/WEB/Routes/web.php b/app/Containers/VikonIntegration/UI/WEB/Routes/web.php index fcb2c1c..802cdbe 100644 --- a/app/Containers/VikonIntegration/UI/WEB/Routes/web.php +++ b/app/Containers/VikonIntegration/UI/WEB/Routes/web.php @@ -16,5 +16,6 @@ Route::prefix('/dashboard/vikon-updates') Route::post('/check-version', [VikonController::class, 'checkVersion'])->name('check-version'); Route::post('/update-module', [VikonController::class, 'updateModule'])->name('update-module'); Route::post('/sync-files', [VikonController::class, 'syncFiles'])->name('sync-files'); + Route::post('/update-part', [VikonController::class, 'updatePart'])->name('update-part'); Route::post('/logout', [VikonController::class, 'logout'])->name('logout'); });