feat: add functionality to toggle inbox document source between personal and public scopes
Build and Push Multi-Platform Images / build-and-push (push) Successful in 34s

This commit is contained in:
2026-05-04 10:17:17 +02:00
parent 8189ca54d8
commit a9c1e5fd20
4 changed files with 66 additions and 0 deletions
@@ -142,4 +142,15 @@ export class InboxController {
res.setHeader('Cache-Control', 'private, max-age=3600');
return new StreamableFile(createReadStream(filePath));
}
@Post(':id/source')
@HttpCode(204)
async updateSource(
@Param('id') id: string,
@Body() body: { source: any },
@Request() req: any,
): Promise<void> {
const preferredUsername: string | null = req.user?.preferredUsername ?? null;
await this.inboxService.updateSource(id, body.source, preferredUsername);
}
}
@@ -1,4 +1,5 @@
import {
BadRequestException,
ConflictException,
Injectable,
Logger,
@@ -190,4 +191,25 @@ export class InboxService {
}
return filePath;
}
async updateSource(
id: string,
source: InboxSource,
preferredUsername: string | null,
): Promise<void> {
const { doc } = await this.resolveDocument(id, preferredUsername);
if (source === 'all') {
doc.Source = 'all';
doc.OwnerUsername = null;
} else {
if (!preferredUsername) {
throw new BadRequestException('Benutzername erforderlich für persönlichen Scan');
}
doc.Source = 'user';
doc.OwnerUsername = preferredUsername;
}
await this.documentRepo.save(doc);
}
}
+4
View File
@@ -89,6 +89,10 @@ export const inboxApi = {
opts ?? {},
)
.then((r) => r.data),
updateSource: (id: string, source: InboxSource) =>
api
.post(`/api/inbox/${encodeURIComponent(id)}/source`, { source })
.then((r) => r.data),
};
export interface PostprocessActionResult {
@@ -22,6 +22,7 @@ import {
ReloadOutlined,
ScanOutlined,
SearchOutlined,
TeamOutlined,
UserOutlined,
} from '@ant-design/icons';
import type { ColumnsType } from 'antd/es/table';
@@ -168,6 +169,19 @@ export default function InboxPage() {
}
};
const handleUpdateSource = async (id: string, current: InboxFile['source']) => {
const next = current === 'all' ? 'user' : 'all';
try {
await inboxApi.updateSource(id, next);
message.success(
next === 'all' ? 'Zu Öffentlich verschoben' : 'Zu Persönlich verschoben',
);
await load();
} catch {
message.error('Verschieben fehlgeschlagen');
}
};
const filtered = files.filter((f) =>
search ? f.name.toLowerCase().includes(search.toLowerCase()) : true,
);
@@ -255,6 +269,21 @@ export default function InboxPage() {
Löschen
</Button>
</Popconfirm>
<Tooltip
title={
record.source === 'all'
? 'In meinen persönlichen Scan-Ordner verschieben'
: 'In den gemeinsamen Ordner (Öffentlich) verschieben'
}
>
<Button
type="link"
icon={record.source === 'all' ? <UserOutlined /> : <TeamOutlined />}
onClick={() => handleUpdateSource(record.id, record.source)}
>
{record.source === 'all' ? 'Zu Persönlich' : 'Zu Öffentlich'}
</Button>
</Tooltip>
</div>
),
},