dnsweeper
Version:
Advanced CLI tool for DNS record risk analysis and cleanup. Features CSV import for Cloudflare/Route53, automated risk assessment, and parallel DNS validation.
111 lines (97 loc) • 2.7 kB
text/typescript
/**
* File Upload Routes
*/
import { Router } from 'express';
import multer from 'multer';
import path from 'path';
import { v4 as uuidv4 } from 'uuid';
import { logger } from '../utils/logger.js';
import { validateFile } from '../middleware/file-validation.js';
const router = Router();
// Multer設定
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/');
},
filename: (req, file, cb) => {
const fileId = uuidv4();
const ext = path.extname(file.originalname);
cb(null, `${fileId}${ext}`);
}
});
const upload = multer({
storage,
limits: {
fileSize: 100 * 1024 * 1024, // 100MB
files: 1
},
fileFilter: (req, file, cb) => {
if (file.mimetype === 'text/csv' ||
file.originalname.endsWith('.csv') ||
file.mimetype === 'application/vnd.ms-excel') {
cb(null, true);
} else {
cb(new Error('Only CSV files are allowed'));
}
}
});
/**
* POST /api/v1/upload
* CSVファイルのアップロード
*/
router.post('/', upload.single('file'), validateFile, async (req, res) => {
try {
if (!req.file) {
return res.status(400).json({
error: 'No file uploaded',
message: 'Please select a CSV file to upload'
});
}
const fileInfo = {
id: path.parse(req.file.filename).name,
originalName: req.file.originalname,
filename: req.file.filename,
path: req.file.path,
size: req.file.size,
mimetype: req.file.mimetype,
uploadedAt: new Date().toISOString()
};
logger.info(`File uploaded successfully: ${fileInfo.originalName} (${fileInfo.size} bytes)`);
res.json({
success: true,
file: fileInfo,
message: 'File uploaded successfully'
});
} catch (error) {
logger.error('File upload error:', error);
res.status(500).json({
error: 'Upload failed',
message: error instanceof Error ? error.message : 'Unknown error'
});
}
});
/**
* GET /api/v1/upload/:id
* アップロードファイル情報の取得
*/
router.get('/:id', async (req, res) => {
try {
const { id } = req.params;
// ファイル情報を取得(実際の実装では、データベースから取得)
// 現在は簡単な例として、ファイルシステムを確認
res.json({
success: true,
file: {
id,
status: 'uploaded'
}
});
} catch (error) {
logger.error('File info retrieval error:', error);
res.status(500).json({
error: 'Failed to retrieve file info',
message: error instanceof Error ? error.message : 'Unknown error'
});
}
});
export { router as uploadRouter };