91 أسطر
3.3 KiB
TypeScript
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' });
|
|
}
|
|
}
|
|
|