mad-lawsuit/backend/dist/routes/documents.js

231 lines
No EOL
7.8 KiB
JavaScript

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const index_1 = require("../index");
const errorHandler_1 = require("../middleware/errorHandler");
const auth_1 = require("../middleware/auth");
const multer_1 = __importDefault(require("multer"));
const uuid_1 = require("uuid");
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const joi_1 = __importDefault(require("joi"));
const router = (0, express_1.Router)();
const storage = multer_1.default.diskStorage({
destination: (req, file, cb) => {
const uploadDir = process.env['UPLOAD_DIR'] || './uploads';
if (!fs_1.default.existsSync(uploadDir)) {
fs_1.default.mkdirSync(uploadDir, { recursive: true });
}
cb(null, uploadDir);
},
filename: (req, file, cb) => {
const uuid = (0, uuid_1.v4)();
const extension = path_1.default.extname(file.originalname);
cb(null, `${uuid}${extension}`);
},
});
const upload = (0, multer_1.default)({
storage,
limits: {
fileSize: parseInt(process.env['MAX_FILE_SIZE'] || '262144000'),
},
fileFilter: (req, file, cb) => {
const allowedMimeTypes = [
'application/pdf',
'application/x-pdf',
'application/acrobat',
'applications/vnd.pdf',
'text/pdf',
'text/x-pdf'
];
const isValidPDF = allowedMimeTypes.includes(file.mimetype) ||
file.originalname.toLowerCase().endsWith('.pdf');
console.log('Upload attempt:', {
mimetype: file.mimetype,
filename: file.originalname,
isValid: isValidPDF
});
if (isValidPDF) {
cb(null, true);
}
else {
cb(new Error(`Only PDF files are allowed. Received: ${file.mimetype} for file: ${file.originalname}`));
}
},
});
const createDocumentSchema = joi_1.default.object({
docketEntryId: joi_1.default.number().integer().required(),
title: joi_1.default.string().required().max(500),
summary: joi_1.default.string().optional().allow(''),
notes: joi_1.default.string().optional().allow(''),
displayOrder: joi_1.default.number().integer().min(0).optional(),
});
const updateDocumentSchema = joi_1.default.object({
title: joi_1.default.string().optional().max(500),
summary: joi_1.default.string().optional().allow(''),
notes: joi_1.default.string().optional().allow(''),
displayOrder: joi_1.default.number().integer().min(0).optional(),
});
router.get('/:id/download', (0, errorHandler_1.asyncHandler)(async (req, res) => {
const documentId = parseInt(req.params['id'] || '');
if (isNaN(documentId)) {
return res.status(400).json({
success: false,
message: 'Invalid document ID',
});
}
const document = await index_1.prisma.document.findUnique({
where: { id: documentId },
});
if (!document) {
return res.status(404).json({
success: false,
message: 'Document not found',
});
}
const filePath = document.filePath;
if (!fs_1.default.existsSync(filePath)) {
return res.status(404).json({
success: false,
message: 'File not found on server',
});
}
res.setHeader('Content-Type', document.mimeType);
res.setHeader('Content-Disposition', `inline; filename="${document.originalFilename}"`);
const fileStream = fs_1.default.createReadStream(filePath);
fileStream.pipe(res);
}));
router.post('/upload', auth_1.authenticateToken, upload.single('file'), (0, errorHandler_1.asyncHandler)(async (req, res) => {
if (!req.file) {
return res.status(400).json({
success: false,
message: 'No file uploaded',
});
}
const { error, value } = createDocumentSchema.validate(req.body);
if (error) {
fs_1.default.unlinkSync(req.file.path);
return res.status(400).json({
success: false,
message: error.details[0].message,
});
}
const { docketEntryId, title, summary, notes, displayOrder } = value;
const docketEntry = await index_1.prisma.docketEntry.findUnique({
where: { id: docketEntryId },
});
if (!docketEntry) {
fs_1.default.unlinkSync(req.file.path);
return res.status(404).json({
success: false,
message: 'Docket entry not found',
});
}
let finalDisplayOrder = displayOrder;
if (finalDisplayOrder === undefined) {
const lastDocument = await index_1.prisma.document.findFirst({
where: { docketEntryId },
orderBy: { displayOrder: 'desc' },
});
finalDisplayOrder = lastDocument ? lastDocument.displayOrder + 1 : 0;
}
const document = await index_1.prisma.document.create({
data: {
docketEntryId,
title,
originalFilename: req.file.originalname,
storedFilename: req.file.filename,
filePath: req.file.path,
fileSize: req.file.size,
mimeType: req.file.mimetype,
summary: summary || '',
notes: notes || '',
displayOrder: finalDisplayOrder,
},
});
res.status(201).json({
success: true,
message: 'Document uploaded successfully',
document,
});
}));
router.put('/:id', auth_1.authenticateToken, (0, errorHandler_1.asyncHandler)(async (req, res) => {
const documentId = parseInt(req.params['id'] || '');
if (isNaN(documentId)) {
return res.status(400).json({
success: false,
message: 'Invalid document ID',
});
}
const { error, value } = updateDocumentSchema.validate(req.body);
if (error) {
return res.status(400).json({
success: false,
message: error.details[0].message,
});
}
try {
const document = await index_1.prisma.document.update({
where: { id: documentId },
data: value,
});
res.json({
success: true,
message: 'Document updated successfully',
document,
});
}
catch (error) {
if (error.code === 'P2025') {
return res.status(404).json({
success: false,
message: 'Document not found',
});
}
throw error;
}
}));
router.delete('/:id', auth_1.authenticateToken, (0, errorHandler_1.asyncHandler)(async (req, res) => {
const documentId = parseInt(req.params['id'] || '');
if (isNaN(documentId)) {
return res.status(400).json({
success: false,
message: 'Invalid document ID',
});
}
try {
const document = await index_1.prisma.document.findUnique({
where: { id: documentId },
});
if (!document) {
return res.status(404).json({
success: false,
message: 'Document not found',
});
}
if (fs_1.default.existsSync(document.filePath)) {
fs_1.default.unlinkSync(document.filePath);
}
await index_1.prisma.document.delete({
where: { id: documentId },
});
res.json({
success: true,
message: 'Document deleted successfully',
});
}
catch (error) {
if (error.code === 'P2025') {
return res.status(404).json({
success: false,
message: 'Document not found',
});
}
throw error;
}
}));
exports.default = router;
//# sourceMappingURL=documents.js.map