Skip to content

Commit 9d9df1f

Browse files
committed
feat: #8 Soft deletion of files
1 parent fd0536f commit 9d9df1f

File tree

3 files changed

+116
-32
lines changed

3 files changed

+116
-32
lines changed

index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// app.js
22
const Koa = require('koa');
3-
const { koaBody } = require('koa-body');
3+
const {koaBody} = require('koa-body');
44
const path = require('path');
55
const fs = require('fs');
66
const sequelize = require('./utils/dbInstance'); // 确保路径正确
@@ -10,6 +10,7 @@ require('dotenv').config({ path: '.env.local' });
1010

1111
const app = new Koa();
1212

13+
1314
app.use(require('koa-static')(path.join(__dirname, 'public')));
1415

1516
const createDirectories = () => {
@@ -29,13 +30,16 @@ createDirectories();
2930
app.use(
3031
koaBody({
3132
multipart: true,
33+
// 解决 DELETE 没法获取ids的问题
34+
parsedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'],
3235
formidable: {
3336
uploadDir: path.join(__dirname, 'provisional'), // 临时上传目录
3437
keepExtensions: true // 保留文件扩展名
3538
}
3639
})
3740
);
3841

42+
3943
// 挂载文件路由
4044
app.use(filesRouter.routes()).use(filesRouter.allowedMethods());
4145

routers/files.js

Lines changed: 85 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ router.post("/files", async (ctx) => {
118118
await fsp.unlink(file.filepath);
119119
}
120120
}
121-
ctx.status(201);
121+
ctx.status = 201;
122122
ctx.body = fileList.length > 1 ? responses : responses[0];
123123
} catch (error) {
124124
ctx.status = 500;
@@ -309,6 +309,86 @@ router.put('/files/:id', async (ctx) => {
309309
}
310310
});
311311

312+
// 文件删除接口
313+
router.delete('/files/:id', async (ctx) => {
314+
const { id } = ctx.params;
315+
316+
try {
317+
// 查找文件
318+
const file = await Files.findOne({
319+
where: {
320+
id,
321+
is_delete: false,
322+
}
323+
});
324+
325+
if (!file) {
326+
ctx.status = 404;
327+
ctx.body = { message: 'File not found' };
328+
return;
329+
}
330+
331+
// 执行软删除,将 is_delete 字段设置为 true
332+
await file.update({
333+
is_delete: true,
334+
updated_at: new Date(), // 更新更新时间
335+
updated_by: ctx.query.updated_by || 'anonymous' // 可以通过查询参数传递更新者
336+
});
337+
338+
// 返回删除成功的信息
339+
ctx.status = 204;
340+
} catch (error) {
341+
ctx.status = 500;
342+
ctx.body = { message: 'Error deleting file', error: error.message };
343+
console.error('Delete file error:', error);
344+
}
345+
});
346+
347+
// 文件批量删除接口
348+
router.delete('/files', async (ctx) => {
349+
const { ids } = ctx.request.body; // 获取要删除的文件 ID 列表
350+
const updated_by = ctx.query.updated_by || 'anonymous'; // 获取更新者,默认为匿名
351+
console.log(ctx.request.body);
352+
console.log(JSON.stringify(ctx.request.body));
353+
354+
if (!ids || !Array.isArray(ids) || ids.length === 0) {
355+
ctx.status = 400;
356+
ctx.body = { message: 'No file ids provided for deletion' };
357+
return;
358+
}
359+
360+
try {
361+
// 查找并更新指定的文件
362+
const [numberOfAffectedRows] = await Files.update(
363+
{
364+
is_delete: true,
365+
updated_by: updated_by,
366+
updated_at: new Date(),
367+
},
368+
{
369+
where: {
370+
id: {
371+
[Op.in]: ids,
372+
},
373+
is_delete: false,
374+
},
375+
}
376+
);
377+
378+
if (numberOfAffectedRows === 0) {
379+
ctx.status = 404;
380+
ctx.body = { message: 'No files found to delete' };
381+
return;
382+
}
383+
384+
// 返回删除成功的信息
385+
ctx.status = 204;
386+
} catch (error) {
387+
ctx.status = 500;
388+
ctx.body = { message: 'Error deleting files', error: error.message };
389+
console.error('Delete files error:', error);
390+
}
391+
});
312392

313393
// 文件预览
314394
router.get("/files/:id/preview", async (ctx) => {
@@ -426,10 +506,10 @@ router.get("/files/:id/export", async (ctx) => {
426506
});
427507

428508
// 批量下载
429-
router.get("/files/export", async (ctx) => {
430-
const fileIds = ctx.query.ids ? ctx.query.ids.split(",") : [];
509+
router.get("/files/export/batch", async (ctx) => {
510+
const ids = ctx.query.ids ? ctx.query.ids.split(",") : [];
431511

432-
if (fileIds.length === 0) {
512+
if (ids.length === 0) {
433513
ctx.status = 400;
434514
ctx.body = { message: "No file ids provided for download" };
435515
return;
@@ -438,7 +518,7 @@ router.get("/files/export", async (ctx) => {
438518
try {
439519
const files = await Files.findAll({
440520
where: {
441-
id: { [Op.in]: fileIds },
521+
id: { [Op.in]: ids },
442522
is_delete: false,
443523
[Op.or]: [
444524
{ public_expiration: null },

yarn.lock

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
"@hapi/bourne@^3.0.0":
66
version "3.0.0"
7-
resolved "https://registry.npmmirror.com/@hapi/bourne/-/bourne-3.0.0.tgz"
7+
resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-3.0.0.tgz#f11fdf7dda62fe8e336fa7c6642d9041f30356d7"
88
integrity sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==
99

1010
"@koa/cors@^5.0.0":
@@ -77,42 +77,42 @@
7777

7878
"@types/accepts@*":
7979
version "1.3.7"
80-
resolved "https://registry.npmmirror.com/@types/accepts/-/accepts-1.3.7.tgz"
80+
resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.7.tgz#3b98b1889d2b2386604c2bbbe62e4fb51e95b265"
8181
integrity sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==
8282
dependencies:
8383
"@types/node" "*"
8484

8585
"@types/body-parser@*":
8686
version "1.19.5"
87-
resolved "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.5.tgz"
87+
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4"
8888
integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==
8989
dependencies:
9090
"@types/connect" "*"
9191
"@types/node" "*"
9292

9393
"@types/co-body@^6.1.0":
9494
version "6.1.3"
95-
resolved "https://registry.npmmirror.com/@types/co-body/-/co-body-6.1.3.tgz"
95+
resolved "https://registry.yarnpkg.com/@types/co-body/-/co-body-6.1.3.tgz#201796c6389066b400cfcb4e1ec5c3db798265a2"
9696
integrity sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==
9797
dependencies:
9898
"@types/node" "*"
9999
"@types/qs" "*"
100100

101101
"@types/connect@*":
102102
version "3.4.38"
103-
resolved "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz"
103+
resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858"
104104
integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==
105105
dependencies:
106106
"@types/node" "*"
107107

108108
"@types/content-disposition@*":
109109
version "0.5.8"
110-
resolved "https://registry.npmmirror.com/@types/content-disposition/-/content-disposition-0.5.8.tgz"
110+
resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.8.tgz#6742a5971f490dc41e59d277eee71361fea0b537"
111111
integrity sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==
112112

113113
"@types/cookies@*":
114114
version "0.9.0"
115-
resolved "https://registry.npmmirror.com/@types/cookies/-/cookies-0.9.0.tgz"
115+
resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.9.0.tgz#a2290cfb325f75f0f28720939bee854d4142aee2"
116116
integrity sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==
117117
dependencies:
118118
"@types/connect" "*"
@@ -128,9 +128,9 @@
128128
"@types/ms" "*"
129129

130130
"@types/express-serve-static-core@^4.17.33":
131-
version "4.19.3"
132-
resolved "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz"
133-
integrity sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==
131+
version "4.19.5"
132+
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6"
133+
integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==
134134
dependencies:
135135
"@types/node" "*"
136136
"@types/qs" "*"
@@ -139,7 +139,7 @@
139139

140140
"@types/express@*":
141141
version "4.17.21"
142-
resolved "https://registry.npmmirror.com/@types/express/-/express-4.17.21.tgz"
142+
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d"
143143
integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==
144144
dependencies:
145145
"@types/body-parser" "*"
@@ -149,36 +149,36 @@
149149

150150
"@types/formidable@^2.0.5":
151151
version "2.0.6"
152-
resolved "https://registry.npmmirror.com/@types/formidable/-/formidable-2.0.6.tgz"
152+
resolved "https://registry.yarnpkg.com/@types/formidable/-/formidable-2.0.6.tgz#811ed3cd8a8a7675e02420b3f861c317e055376a"
153153
integrity sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==
154154
dependencies:
155155
"@types/node" "*"
156156

157157
"@types/http-assert@*":
158158
version "1.5.5"
159-
resolved "https://registry.npmmirror.com/@types/http-assert/-/http-assert-1.5.5.tgz"
159+
resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.5.tgz#dfb1063eb7c240ee3d3fe213dac5671cfb6a8dbf"
160160
integrity sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==
161161

162162
"@types/http-errors@*":
163163
version "2.0.4"
164-
resolved "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.4.tgz"
164+
resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f"
165165
integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==
166166

167167
"@types/keygrip@*":
168168
version "1.0.6"
169-
resolved "https://registry.npmmirror.com/@types/keygrip/-/keygrip-1.0.6.tgz"
169+
resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.6.tgz#1749535181a2a9b02ac04a797550a8787345b740"
170170
integrity sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==
171171

172172
"@types/koa-compose@*":
173173
version "3.2.8"
174-
resolved "https://registry.npmmirror.com/@types/koa-compose/-/koa-compose-3.2.8.tgz"
174+
resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.8.tgz#dec48de1f6b3d87f87320097686a915f1e954b57"
175175
integrity sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==
176176
dependencies:
177177
"@types/koa" "*"
178178

179179
"@types/koa@*", "@types/koa@^2.13.5":
180180
version "2.15.0"
181-
resolved "https://registry.npmmirror.com/@types/koa/-/koa-2.15.0.tgz"
181+
resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.15.0.tgz#eca43d76f527c803b491731f95df575636e7b6f2"
182182
integrity sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==
183183
dependencies:
184184
"@types/accepts" "*"
@@ -192,7 +192,7 @@
192192

193193
"@types/mime@^1":
194194
version "1.3.5"
195-
resolved "https://registry.npmmirror.com/@types/mime/-/mime-1.3.5.tgz"
195+
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690"
196196
integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==
197197

198198
"@types/ms@*":
@@ -209,25 +209,25 @@
209209

210210
"@types/qs@*":
211211
version "6.9.15"
212-
resolved "https://registry.npmmirror.com/@types/qs/-/qs-6.9.15.tgz"
212+
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce"
213213
integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==
214214

215215
"@types/range-parser@*":
216216
version "1.2.7"
217-
resolved "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.7.tgz"
217+
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb"
218218
integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==
219219

220220
"@types/send@*":
221221
version "0.17.4"
222-
resolved "https://registry.npmmirror.com/@types/send/-/send-0.17.4.tgz"
222+
resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a"
223223
integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==
224224
dependencies:
225225
"@types/mime" "^1"
226226
"@types/node" "*"
227227

228228
"@types/serve-static@*":
229229
version "1.15.7"
230-
resolved "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.7.tgz"
230+
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714"
231231
integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==
232232
dependencies:
233233
"@types/http-errors" "*"
@@ -462,7 +462,7 @@ cli-tableau@^2.0.0:
462462

463463
co-body@^6.1.0:
464464
version "6.2.0"
465-
resolved "https://registry.npmmirror.com/co-body/-/co-body-6.2.0.tgz"
465+
resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.2.0.tgz#afd776d60e5659f4eee862df83499698eb1aea1b"
466466
integrity sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==
467467
dependencies:
468468
"@hapi/bourne" "^3.0.0"
@@ -1185,7 +1185,7 @@ keygrip@~1.1.0:
11851185

11861186
koa-body@^6.0.1:
11871187
version "6.0.1"
1188-
resolved "https://registry.npmmirror.com/koa-body/-/koa-body-6.0.1.tgz"
1188+
resolved "https://registry.yarnpkg.com/koa-body/-/koa-body-6.0.1.tgz#46c490033cceebb2874c53cfbb04c45562cf3c84"
11891189
integrity sha512-M8ZvMD8r+kPHy28aWP9VxL7kY8oPWA+C7ZgCljrCMeaU7uX6wsIQgDHskyrAr9sw+jqnIXyv4Mlxri5R4InIJg==
11901190
dependencies:
11911191
"@types/co-body" "^6.1.0"
@@ -1742,7 +1742,7 @@ qs@^6.11.0, qs@^6.5.2:
17421742

17431743
raw-body@^2.3.3:
17441744
version "2.5.2"
1745-
resolved "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz"
1745+
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
17461746
integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
17471747
dependencies:
17481748
bytes "3.1.2"
@@ -2293,5 +2293,5 @@ ylru@^1.2.0:
22932293

22942294
zod@^3.19.1:
22952295
version "3.23.8"
2296-
resolved "https://registry.npmmirror.com/zod/-/zod-3.23.8.tgz"
2296+
resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d"
22972297
integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==

0 commit comments

Comments
 (0)