paper-burner/local-proxy/routes/references.js

186 lines
3.8 KiB
JavaScript

/**
* 文献引用路由
* 用于管理文档的参考文献
*/
import express from 'express';
import { prisma } from '../db/client.js';
const router = express.Router();
// 获取文档的所有引用
router.get('/:documentId', async (req, res, next) => {
try {
const { documentId } = req.params;
// 验证文档所有权
const document = await prisma.document.findFirst({
where: {
id: documentId,
userId: req.user.id
}
});
if (!document) {
return res.status(404).json({ error: 'Document not found' });
}
const references = await prisma.reference.findMany({
where: {
documentId,
userId: req.user.id
},
orderBy: { createdAt: 'desc' }
});
res.json(references);
} catch (error) {
next(error);
}
});
// 添加引用
router.post('/:documentId', async (req, res, next) => {
try {
const { documentId } = req.params;
const { title, authors, doi, url, source, year, notes, metadata } = req.body;
// 验证文档所有权
const document = await prisma.document.findFirst({
where: {
id: documentId,
userId: req.user.id
}
});
if (!document) {
return res.status(404).json({ error: 'Document not found' });
}
const reference = await prisma.reference.create({
data: {
documentId,
userId: req.user.id,
title,
authors,
doi,
url,
source,
year,
notes,
metadata
}
});
res.status(201).json(reference);
} catch (error) {
next(error);
}
});
// 批量添加引用
router.post('/:documentId/batch', async (req, res, next) => {
try {
const { documentId } = req.params;
const { references } = req.body;
if (!Array.isArray(references)) {
return res.status(400).json({ error: 'references must be an array' });
}
// 验证文档所有权
const document = await prisma.document.findFirst({
where: {
id: documentId,
userId: req.user.id
}
});
if (!document) {
return res.status(404).json({ error: 'Document not found' });
}
// 批量创建
const createdReferences = await prisma.reference.createMany({
data: references.map(ref => ({
documentId,
userId: req.user.id,
title: ref.title,
authors: ref.authors,
doi: ref.doi,
url: ref.url,
source: ref.source,
year: ref.year,
notes: ref.notes,
metadata: ref.metadata
})),
skipDuplicates: true
});
res.status(201).json({
success: true,
count: createdReferences.count
});
} catch (error) {
next(error);
}
});
// 更新引用
router.put('/:documentId/:referenceId', async (req, res, next) => {
try {
const { documentId, referenceId } = req.params;
await prisma.reference.updateMany({
where: {
id: referenceId,
documentId,
userId: req.user.id
},
data: req.body
});
res.json({ success: true });
} catch (error) {
next(error);
}
});
// 删除引用
router.delete('/:documentId/:referenceId', async (req, res, next) => {
try {
const { documentId, referenceId } = req.params;
await prisma.reference.deleteMany({
where: {
id: referenceId,
documentId,
userId: req.user.id
}
});
res.json({ success: true });
} catch (error) {
next(error);
}
});
// 清空文档的所有引用
router.delete('/:documentId', async (req, res, next) => {
try {
const { documentId } = req.params;
await prisma.reference.deleteMany({
where: {
documentId,
userId: req.user.id
}
});
res.json({ success: true });
} catch (error) {
next(error);
}
});
export default router;