From 1d9e2cff0a7c6febfc27fe11f3dda259aa4c39f6 Mon Sep 17 00:00:00 2001 From: Yisroel Baum Date: Tue, 2 Jun 2026 16:33:18 +0300 Subject: [PATCH] use element update route --- backend/app/Controllers/ElementController.php | 18 ++++++++++++++++-- backend/routes/api.php | 2 +- .../Unit/Controllers/ElementControllerTest.php | 4 ++-- frontend/rabbi_gerzi/src/stores/elements.ts | 17 +++++++---------- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/backend/app/Controllers/ElementController.php b/backend/app/Controllers/ElementController.php index 5fdc162..5897a51 100644 --- a/backend/app/Controllers/ElementController.php +++ b/backend/app/Controllers/ElementController.php @@ -55,7 +55,7 @@ class ElementController ], 200); } - public function update(?int $id, Request $request): JsonResponse + public function update(Request $request): JsonResponse { $iconImage = $this->uploadedFileInput($request, 'iconImage'); $pdf = $this->uploadedFileInput($request, 'pdf'); @@ -63,7 +63,7 @@ class ElementController try { $element = $this->updateElement->execute( new UpdateElementRequest( - id: $id, + id: $this->intInput($request, 'elementId'), title: $this->stringInput($request, 'title'), description: $this->stringInput($request, 'description'), iconImageUrl: $this->stringInput( @@ -98,6 +98,20 @@ class ElementController ], 200); } + private function intInput(Request $request, string $key): ?int + { + $value = $request->input($key); + if (is_int($value)) { + return $value; + } + + if (is_string($value) && ctype_digit($value)) { + return (int) $value; + } + + return null; + } + private function stringInput(Request $request, string $key): ?string { $value = $request->input($key); diff --git a/backend/routes/api.php b/backend/routes/api.php index b3a4a7d..d3e0c43 100644 --- a/backend/routes/api.php +++ b/backend/routes/api.php @@ -12,5 +12,5 @@ Route::get('/me', [AuthController::class, 'me']) ->middleware(AuthMiddleware::class); Route::get('/sets', [SetController::class, 'index']); Route::get('/elements/{id}', [ElementController::class, 'show']); -Route::post('/elements/{id}', [ElementController::class, 'update']) +Route::post('/element/update', [ElementController::class, 'update']) ->middleware(AuthMiddleware::class); diff --git a/backend/tests/Unit/Controllers/ElementControllerTest.php b/backend/tests/Unit/Controllers/ElementControllerTest.php index cdf1b4f..ea5eed4 100644 --- a/backend/tests/Unit/Controllers/ElementControllerTest.php +++ b/backend/tests/Unit/Controllers/ElementControllerTest.php @@ -179,7 +179,7 @@ class ElementControllerTest extends TestCase null, true, ), - ]); + ], ['REQUEST_METHOD' => 'POST']); $response = $this->controller->update($request); @@ -220,7 +220,7 @@ class ElementControllerTest extends TestCase null, true, ), - ]); + ], ['REQUEST_METHOD' => 'POST']); $response = $this->controller->update($request); diff --git a/frontend/rabbi_gerzi/src/stores/elements.ts b/frontend/rabbi_gerzi/src/stores/elements.ts index 5a886d5..3155637 100644 --- a/frontend/rabbi_gerzi/src/stores/elements.ts +++ b/frontend/rabbi_gerzi/src/stores/elements.ts @@ -44,6 +44,7 @@ interface ErrorResponse { } const API_BASE_URL = import.meta.env.VITE_API_BASE_URL as string +const ELEMENT_UPDATE_URL = `${API_BASE_URL}/api/element/update` export const useElementsStore = defineStore('elements', () => { const element = ref(null) @@ -109,13 +110,11 @@ export const useElementsStore = defineStore('elements', () => { isSaving.value = true try { - const encodedElementId = encodeURIComponent(elementId) - const elementUrl = `${API_BASE_URL}/api/elements/${encodedElementId}` - const response = await fetch(elementUrl, { + const response = await fetch(ELEMENT_UPDATE_URL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', - body: JSON.stringify(input), + body: JSON.stringify({ elementId, ...input }), }) return await handleElementResponse(response, failureMessage) @@ -132,11 +131,10 @@ export const useElementsStore = defineStore('elements', () => { isUploadingIconImage.value = true try { - const encodedElementId = encodeURIComponent(elementId) - const elementUrl = `${API_BASE_URL}/api/elements/${encodedElementId}` const formData = new FormData() + formData.append('elementId', elementId) formData.append('iconImage', file) - const response = await fetch(elementUrl, { + const response = await fetch(ELEMENT_UPDATE_URL, { method: 'POST', headers: { Accept: 'application/json' }, credentials: 'include', @@ -157,11 +155,10 @@ export const useElementsStore = defineStore('elements', () => { isUploadingPdf.value = true try { - const encodedElementId = encodeURIComponent(elementId) - const elementUrl = `${API_BASE_URL}/api/elements/${encodedElementId}` const formData = new FormData() + formData.append('elementId', elementId) formData.append('pdf', file) - const response = await fetch(elementUrl, { + const response = await fetch(ELEMENT_UPDATE_URL, { method: 'POST', headers: { Accept: 'application/json' }, credentials: 'include',