From 9c51891828090db91a53c6021910dfc33b86d115 Mon Sep 17 00:00:00 2001 From: Rutra Date: Mon, 4 May 2026 15:16:07 +0200 Subject: [PATCH] add delete feature --- app/controllers/media_controller.js | 14 +++++++++++++- app/controllers/media_controller.js.map | 2 +- resources/views/dashboard.edge | 21 +++++++++++++++++++++ start/routes.js | 1 + start/routes.js.map | 2 +- zddzdz/Nouveau Document texte.txt | 1 - 6 files changed, 37 insertions(+), 4 deletions(-) delete mode 100644 zddzdz/Nouveau Document texte.txt diff --git a/app/controllers/media_controller.js b/app/controllers/media_controller.js index 053d20f..1a56670 100644 --- a/app/controllers/media_controller.js +++ b/app/controllers/media_controller.js @@ -1,5 +1,5 @@ import app from '@adonisjs/core/services/app'; -import { readdirSync, existsSync, statSync } from 'node:fs'; +import { readdirSync, existsSync, statSync, unlinkSync } from 'node:fs'; import { extname, join } from 'node:path'; const IMAGE_EXTENSIONS = new Set(['.jpg', '.jpeg', '.png', '.gif', '.webp']); const VIDEO_EXTENSIONS = new Set(['.mp4', '.mov', '.avi', '.webm']); @@ -46,5 +46,17 @@ export default class MediaController { } return response.download(filePath); } + async destroy({ params, response }) { + const { filename } = params; + if (!/^[\w\-. ]+$/.test(filename)) { + return response.status(400).json({ success: false, message: 'Invalid filename.' }); + } + const filePath = join(app.publicPath('uploads'), filename); + if (!existsSync(filePath)) { + return response.status(404).json({ success: false, message: 'File not found.' }); + } + unlinkSync(filePath); + return response.ok({ success: true }); + } } //# sourceMappingURL=media_controller.js.map \ No newline at end of file diff --git a/app/controllers/media_controller.js.map b/app/controllers/media_controller.js.map index 47e7eb3..8a21176 100644 --- a/app/controllers/media_controller.js.map +++ b/app/controllers/media_controller.js.map @@ -1 +1 @@ -{"version":3,"file":"media_controller.js","sourceRoot":"","sources":["../../../app/controllers/media_controller.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"media_controller.js","sourceRoot":"","sources":["../../../app/controllers/media_controller.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/resources/views/dashboard.edge b/resources/views/dashboard.edge index 81e5e8d..6d600f9 100644 --- a/resources/views/dashboard.edge +++ b/resources/views/dashboard.edge @@ -159,6 +159,11 @@ text-xs rounded-lg transition"> Open + @@ -322,6 +327,22 @@ xhr.send(formData) } + // ── Delete file ────────────────────────────────────────────────── + async function deleteFile(filename, btn) { + if (!confirm(`Delete "${filename}"?`)) return + btn.disabled = true + const res = await fetch(`/media/${encodeURIComponent(filename)}`, { + method: 'DELETE', + headers: { 'X-CSRF-TOKEN': CSRF_TOKEN }, + }) + if (res.ok) { + btn.closest('.bg-gray-900').remove() + } else { + alert('Could not delete the file.') + btn.disabled = false + } + } + // ── Copy URL to clipboard ───────────────────────────────────────── function copyUrl(url) { const fullUrl = window.location.origin + url diff --git a/start/routes.js b/start/routes.js index afe1218..37675ea 100644 --- a/start/routes.js +++ b/start/routes.js @@ -13,6 +13,7 @@ router .group(() => { router.get('/', [MediaController, 'index']); router.post('/upload', [UploadController, 'store']); + router.delete('/media/:filename', [MediaController, 'destroy']); router.get('/logout', [AuthController, 'logout']); }) .use(middleware.auth()); diff --git a/start/routes.js.map b/start/routes.js.map index fc38dc9..68870cf 100644 --- a/start/routes.js.map +++ b/start/routes.js.map @@ -1 +1 @@ -{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../start/routes.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,MAAM,MAAM,gCAAgC,CAAA;AACnD,OAAO,GAAG,MAAM,6BAA6B,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG1C,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAGzD,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAA;AACnE,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAA;AACvE,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAA;AAIrE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAA;AACnD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAA;AAGhD,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAA;AAI9D,MAAM;KACH,KAAK,CAAC,GAAG,EAAE;IACV,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAA;IACnD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAA;AACnD,CAAC,CAAC;KACD,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAA"} \ No newline at end of file +{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../start/routes.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,MAAM,MAAM,gCAAgC,CAAA;AACnD,OAAO,GAAG,MAAM,6BAA6B,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG1C,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAGzD,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAA;AACnE,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAA;AACvE,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAA;AAIrE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAA;AACnD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAA;AAGhD,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAA;AAI9D,MAAM;KACH,KAAK,CAAC,GAAG,EAAE;IACV,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAA;IACnD,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAA;IAC/D,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAA;AACnD,CAAC,CAAC;KACD,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAA"} \ No newline at end of file diff --git a/zddzdz/Nouveau Document texte.txt b/zddzdz/Nouveau Document texte.txt deleted file mode 100644 index 1ae6748..0000000 --- a/zddzdz/Nouveau Document texte.txt +++ /dev/null @@ -1 +0,0 @@ -feeffe \ No newline at end of file