الملفات
backup_tool/pages/api/test-connection.ts

91 أسطر
3.3 KiB
TypeScript

import type { NextApiRequest, NextApiResponse } from 'next';
import { Client as PgClient } from 'pg';
import mysql from 'mysql2/promise';
import { MongoClient } from 'mongodb';
/**
* Handles testing the connection to a database.
* This version uses native Node.js drivers for reliability and security.
*/
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== 'POST') {
return res.status(405).json({ message: 'Method Not Allowed' });
}
const {
dbType,
dbHost,
dbPort,
dbUser,
dbPassword,
dbName,
dbRequireSsl
} = req.body;
if (!dbType || !dbHost || !dbPort || !dbUser) {
return res.status(400).json({ error: 'Missing required database credentials for testing.' });
}
switch (dbType) {
case 'postgresql':
const pgClient = new PgClient({
host: dbHost,
port: Number(dbPort),
user: dbUser,
password: dbPassword,
database: dbName,
ssl: dbRequireSsl ? { rejectUnauthorized: false } : false,
// ✅ **التعديل: زيادة مهلة الاتصال إلى 30 ثانية**
connectionTimeoutMillis: 30000,
});
try {
await pgClient.connect();
await pgClient.end();
return res.status(200).json({ message: 'PostgreSQL connection successful!' });
} catch (error: any) {
return res.status(500).json({ error: error.message });
}
case 'mysql':
let mysqlConnection;
try {
mysqlConnection = await mysql.createConnection({
host: dbHost,
port: Number(dbPort),
user: dbUser,
password: dbPassword,
database: dbName,
ssl: dbRequireSsl ? { rejectUnauthorized: false } : undefined,
connectTimeout: 30000, // 30 second timeout
});
await mysqlConnection.end();
return res.status(200).json({ message: 'MySQL connection successful!' });
} catch (error: any) {
// Ensure connection is closed even if it fails
if (mysqlConnection) await mysqlConnection.end();
return res.status(500).json({ error: error.message });
}
case 'mongodb':
const mongoURI = `mongodb://${dbUser}:${encodeURIComponent(dbPassword || '')}@${dbHost}:${dbPort}/${dbName || ''}?authSource=admin`;
const mongoClient = new MongoClient(mongoURI, {
ssl: dbRequireSsl,
serverSelectionTimeoutMS: 30000, // 30 second timeout
});
try {
await mongoClient.connect();
await mongoClient.db("admin").command({ ping: 1 });
await mongoClient.close();
return res.status(200).json({ message: 'MongoDB connection successful!' });
} catch (error: any) {
await mongoClient.close();
return res.status(500).json({ error: error.message });
}
default:
return res.status(400).json({ error: 'Unsupported database type' });
}
}