diff --git a/app/Http/Controllers/Qr/QrCodeController.php b/app/Http/Controllers/Qr/QrCodeController.php index 706a3f3..ecdcdac 100644 --- a/app/Http/Controllers/Qr/QrCodeController.php +++ b/app/Http/Controllers/Qr/QrCodeController.php @@ -279,6 +279,20 @@ class QrCodeController extends Controller return back()->with('success', 'QR code updated.'); } + public function destroy(Request $request, QrCode $qrCode): RedirectResponse + { + $this->authorize('delete', $qrCode); + + // Remove the code and its scan history. Deletion is gated behind a + // type-to-confirm dialog in the UI — this is intentionally permanent. + $qrCode->scans()->delete(); + $qrCode->delete(); + + return redirect() + ->route('user.qr-codes.index') + ->with('success', 'QR code deleted.'); + } + public function stylePreview(Request $request): Response { $validated = $request->validate(array_merge($this->styleRules(), [ diff --git a/resources/views/qr-codes/show.blade.php b/resources/views/qr-codes/show.blade.php index 4a0ad03..6ce791d 100644 --- a/resources/views/qr-codes/show.blade.php +++ b/resources/views/qr-codes/show.blade.php @@ -339,5 +339,52 @@ + {{-- Danger zone: delete this QR code (type-to-confirm, not a one-click delete) --}} +
+
+
+

Delete this QR code

+

The printed code stops working permanently and its scan history is removed. This can't be undone.

+
+ +
+ +
+
+
+

Delete “{{ $qrCode->label }}”?

+

+ This permanently deletes the code and its scan history. Anyone who scans the printed code will get an error. + This cannot be undone. +

+ + +
+ +
+ @csrf + @method('DELETE') + +
+
+
+
+
+ diff --git a/routes/web.php b/routes/web.php index 81c1634..24062be 100644 --- a/routes/web.php +++ b/routes/web.php @@ -48,6 +48,7 @@ Route::middleware(['auth'])->group(function () { Route::post('/qr-codes/style-preview', [QrCodeController::class, 'stylePreview'])->name('user.qr-codes.style-preview'); Route::get('/qr-codes/{qrCode}', [QrCodeController::class, 'show'])->name('user.qr-codes.show'); Route::patch('/qr-codes/{qrCode}', [QrCodeController::class, 'update'])->name('user.qr-codes.update'); + Route::delete('/qr-codes/{qrCode}', [QrCodeController::class, 'destroy'])->name('user.qr-codes.destroy'); Route::post('/qr-codes/{qrCode}/canonical-image', [QrCodeController::class, 'storeCanonicalImage'])->name('user.qr-codes.canonical-image'); Route::get('/qr-codes/{qrCode}/preview.png', [QrCodeController::class, 'preview'])->name('user.qr-codes.preview'); Route::get('/qr-codes/{qrCode}/download/{format}', [QrCodeController::class, 'download'])->name('user.qr-codes.download')->whereIn('format', ['png', 'svg', 'pdf']);