add delete feature
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import app from '@adonisjs/core/services/app';
|
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';
|
import { extname, join } from 'node:path';
|
||||||
const IMAGE_EXTENSIONS = new Set(['.jpg', '.jpeg', '.png', '.gif', '.webp']);
|
const IMAGE_EXTENSIONS = new Set(['.jpg', '.jpeg', '.png', '.gif', '.webp']);
|
||||||
const VIDEO_EXTENSIONS = new Set(['.mp4', '.mov', '.avi', '.webm']);
|
const VIDEO_EXTENSIONS = new Set(['.mp4', '.mov', '.avi', '.webm']);
|
||||||
@@ -46,5 +46,17 @@ export default class MediaController {
|
|||||||
}
|
}
|
||||||
return response.download(filePath);
|
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
|
//# sourceMappingURL=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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"}
|
{"version":3,"file":"media_controller.js","sourceRoot":"","sources":["../../../app/controllers/media_controller.ts"],"names":[],"mappings":"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"}
|
||||||
@@ -159,6 +159,11 @@
|
|||||||
text-xs rounded-lg transition">
|
text-xs rounded-lg transition">
|
||||||
Open
|
Open
|
||||||
</a>
|
</a>
|
||||||
|
<button onclick="deleteFile('{{ file.filename }}', this)"
|
||||||
|
class="px-3 py-1.5 bg-red-900/40 hover:bg-red-900/60 text-red-400
|
||||||
|
text-xs rounded-lg transition">
|
||||||
|
Delete
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -322,6 +327,22 @@
|
|||||||
xhr.send(formData)
|
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 ─────────────────────────────────────────
|
// ── Copy URL to clipboard ─────────────────────────────────────────
|
||||||
function copyUrl(url) {
|
function copyUrl(url) {
|
||||||
const fullUrl = window.location.origin + url
|
const fullUrl = window.location.origin + url
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ router
|
|||||||
.group(() => {
|
.group(() => {
|
||||||
router.get('/', [MediaController, 'index']);
|
router.get('/', [MediaController, 'index']);
|
||||||
router.post('/upload', [UploadController, 'store']);
|
router.post('/upload', [UploadController, 'store']);
|
||||||
|
router.delete('/media/:filename', [MediaController, 'destroy']);
|
||||||
router.get('/logout', [AuthController, 'logout']);
|
router.get('/logout', [AuthController, 'logout']);
|
||||||
})
|
})
|
||||||
.use(middleware.auth());
|
.use(middleware.auth());
|
||||||
|
|||||||
@@ -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"}
|
{"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"}
|
||||||
@@ -1 +0,0 @@
|
|||||||
feeffe
|
|
||||||
Reference in New Issue
Block a user