Skip to content

Commit c4e70ef

Browse files
committed
feat: add file filter chat files checkbox(use for remove unused chat files)
1 parent 3cea16e commit c4e70ef

File tree

7 files changed

+89
-12
lines changed

7 files changed

+89
-12
lines changed

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/admin/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"react": "^18.2.0",
3030
"react-dom": "^18.2.0",
3131
"tailchat-server-sdk": "workspace:^",
32-
"tushan": "^0.3.4",
32+
"tushan": "^0.3.9",
3333
"vite-express": "0.8.0"
3434
},
3535
"devDependencies": {

server/admin/src/client/fields.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ export const fileFields = [
159159
createFileSizeField('size', {
160160
list: {
161161
width: 120,
162+
sort: true,
162163
},
163164
}),
164165
createTextField('metaData.content-type'),
@@ -170,7 +171,11 @@ export const fileFields = [
170171
width: 80,
171172
},
172173
}),
173-
createDateTimeField('createdAt'),
174+
createDateTimeField('createdAt', {
175+
list: {
176+
sort: true,
177+
},
178+
}),
174179
];
175180

176181
export const mailFields = [

server/admin/src/client/resources/file.tsx

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
import filesize from 'filesize';
2-
import React from 'react';
2+
import React, { useState } from 'react';
33
import {
44
createTextField,
55
ListTable,
66
useAsync,
77
useTranslation,
88
Typography,
9+
styled,
10+
Checkbox,
911
} from 'tushan';
1012
import { fileFields } from '../fields';
1113
import { request } from '../request';
1214

15+
const Row = styled.div`
16+
display: flex;
17+
gap: 20px;
18+
justify-content: end;
19+
`;
20+
1321
export const FileList: React.FC = React.memo(() => {
1422
const { t } = useTranslation();
23+
const [isOnlyChatFiles, setIsOnlyChatFiles] = useState(false);
1524
const { value: totalSize = 0 } = useAsync(async () => {
1625
const { data } = await request.get('/file/filesizeSum');
1726

@@ -20,9 +29,19 @@ export const FileList: React.FC = React.memo(() => {
2029

2130
return (
2231
<>
23-
<Typography.Paragraph style={{ textAlign: 'right' }}>
24-
{t('custom.file.fileTotalSize')}: {filesize(totalSize)}
25-
</Typography.Paragraph>
32+
<Row>
33+
<Checkbox
34+
checked={isOnlyChatFiles}
35+
onClick={() => {
36+
setIsOnlyChatFiles(!isOnlyChatFiles);
37+
}}
38+
>
39+
Only show chat files
40+
</Checkbox>
41+
<Typography.Paragraph>
42+
{t('custom.file.fileTotalSize')}: {filesize(totalSize)}
43+
</Typography.Paragraph>
44+
</Row>
2645
<ListTable
2746
filter={[
2847
createTextField('q', {
@@ -33,6 +52,7 @@ export const FileList: React.FC = React.memo(() => {
3352
action={{ detail: true, delete: true }}
3453
batchAction={{ delete: true }}
3554
showSizeChanger={true}
55+
meta={isOnlyChatFiles ? 'onlyChat' : undefined}
3656
/>
3757
</>
3858
);

server/admin/src/server/router/api.ts

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ import userModel from '../../../../models/user/user';
1010
import messageModel from '../../../../models/chat/message';
1111
import fileModel from '../../../../models/file';
1212
import groupModel from '../../../../models/group/group';
13-
import { raExpressMongoose } from '../middleware/express-mongoose-ra-json-server';
13+
import {
14+
raExpressMongoose,
15+
virtualId,
16+
} from '../middleware/express-mongoose-ra-json-server';
1417
import { cacheRouter } from './cache';
1518
import discoverModel from '../../../../plugins/com.msgbyte.discover/models/discover';
1619
import { analyticsRouter } from './analytics';
20+
import _ from 'lodash';
1721

1822
const router = Router();
1923

@@ -292,6 +296,51 @@ router.delete('/file/:id', auth(), async (req, res) => {
292296
router.use(
293297
'/file',
294298
auth(),
299+
async (req, res, next) => {
300+
const onlyChatFile = req.query.meta === 'onlyChat';
301+
302+
if (!onlyChatFile) {
303+
return next();
304+
}
305+
306+
// only return chatted file rather than all file
307+
const result = await fileModel
308+
.aggregate()
309+
.lookup({
310+
from: 'users',
311+
localField: 'url',
312+
foreignField: 'avatar',
313+
as: 'avatarMatchedUser',
314+
})
315+
.match({
316+
'avatarMatchedUser.0': { $exists: false },
317+
})
318+
.project({
319+
avatarMatchedUser: 0,
320+
})
321+
.facet({
322+
metadata: [{ $count: 'total' }],
323+
data: [
324+
{
325+
$sort: {
326+
[typeof req.query._sort === 'string'
327+
? req.query._sort === 'id'
328+
? '_id'
329+
: req.query._sort
330+
: '_id']: req.query._order === 'ASC' ? 1 : -1,
331+
},
332+
},
333+
{ $skip: Number(req.query._start) },
334+
{ $limit: Number(req.query._end) - Number(req.query._start) },
335+
],
336+
})
337+
.exec();
338+
339+
const list = _.get(result, '0.data');
340+
const total = _.get(result, '0.metadata.0.total');
341+
342+
return res.set('X-Total-Count', total).json(virtualId(list)).end();
343+
},
295344
raExpressMongoose(fileModel, {
296345
q: ['objectName'],
297346
allowedRegexFields: ['objectName'],

server/models/file.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { User } from './user/user';
2020
},
2121
})
2222
@index({ bucketName: 1, objectName: 1 })
23+
@index({ url: 1 })
2324
export class File extends TimeStamps implements Base {
2425
_id: Types.ObjectId;
2526
id: string;

server/models/user/user.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
ReturnModelType,
66
modelOptions,
77
Severity,
8+
index,
89
} from '@typegoose/typegoose';
910
import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';
1011
import type { Types } from 'mongoose';
@@ -32,6 +33,7 @@ export interface UserLoginRes extends User {
3233
allowMixed: Severity.ALLOW,
3334
},
3435
})
36+
@index({ avatar: 1 })
3537
export class User extends TimeStamps implements Base {
3638
_id: Types.ObjectId;
3739
id: string;

0 commit comments

Comments
 (0)