370 lines
12 KiB
JavaScript
370 lines
12 KiB
JavaScript
// const express = require("express");
|
|
// const multer = require("multer");
|
|
// const axios = require("axios");
|
|
// const cors = require("cors");
|
|
// const mysql = require("mysql2/promise");
|
|
// const FormData = require("form-data");
|
|
|
|
// const app = express();
|
|
// const PORT = 5002;
|
|
|
|
// app.use(express.json());
|
|
// app.use(cors());
|
|
|
|
// // Use multer memory storage for file uploads
|
|
// const upload = multer({ storage: multer.memoryStorage() });
|
|
|
|
// // MySQL connection config — keys must be lowercase for mysql2
|
|
// const dbConfig = {
|
|
// host: "122.166.69.162",
|
|
// user: "rootuser",
|
|
// password: "1234",
|
|
// database: "vvvet",
|
|
// port: 5002, // default MySQL port; change if needed
|
|
// };
|
|
|
|
// let db;
|
|
// (async () => {
|
|
// try {
|
|
// db = await mysql.createPool(dbConfig);
|
|
// console.log("Connected to MySQL DB");
|
|
// } catch (err) {
|
|
// console.error("MySQL connection error:", err);
|
|
// }
|
|
// })();
|
|
|
|
// // PAN verification API
|
|
// app.post("/api/verify-pan", upload.single("panImage"), async (req, res) => {
|
|
// try {
|
|
// const { pan } = req.body;
|
|
// const panImage = req.file;
|
|
|
|
// if (!pan || !panImage) {
|
|
// return res.status(400).json({ verified: false, message: "PAN and image are required" });
|
|
// }
|
|
|
|
// // Validate PAN format
|
|
// const panFormatRegex = /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/;
|
|
// if (!panFormatRegex.test(pan)) {
|
|
// return res.status(200).json({ verified: false, message: "Invalid PAN format" });
|
|
// }
|
|
|
|
// // Prepare form data to send image buffer to Python OCR server
|
|
// const formData = new FormData();
|
|
// formData.append("image", panImage.buffer, panImage.originalname);
|
|
|
|
// // Send POST request to Python OCR server
|
|
// const ocrResponse = await axios.post(
|
|
// "https://api.vvet.in/extract-text",
|
|
// formData,
|
|
// {
|
|
// headers: formData.getHeaders(),
|
|
// }
|
|
// );
|
|
|
|
// const extractedText = ocrResponse.data.text || "";
|
|
// console.log("Extracted Text from OCR:", extractedText);
|
|
|
|
// if (!extractedText.toUpperCase().includes(pan.toUpperCase())) {
|
|
// return res.status(200).json({ verified: false, message: "PAN not found in image" });
|
|
// }
|
|
|
|
// return res.status(200).json({ verified: true, message: "PAN verified successfully" });
|
|
// } catch (error) {
|
|
// console.error("Error in /api/verify-pan:", error);
|
|
// return res.status(500).json({ verified: false, message: "Internal server error" });
|
|
// }
|
|
// });
|
|
|
|
// // Fundraising submission API (example)
|
|
// app.post("/api/fundraising/submit", upload.fields([
|
|
// { name: "feeDoc", maxCount: 1 },
|
|
// { name: "medicalPhoto", maxCount: 1 },
|
|
// { name: "medicalDoc", maxCount: 1 },
|
|
// { name: "document", maxCount: 1 },
|
|
// ]), async (req, res) => {
|
|
// try {
|
|
// const formData = req.body;
|
|
// const files = req.files;
|
|
|
|
// console.log("Received form data:", formData);
|
|
// console.log("Received files:", files ? Object.keys(files) : "No files uploaded");
|
|
|
|
// if (!db) {
|
|
// return res.status(500).json({ message: "DB connection not available" });
|
|
// }
|
|
|
|
// const sql = `INSERT INTO fundraising
|
|
// (name, email, phone, category, feeDoc_name, medicalPhoto_name, medicalDoc_name, document_name)
|
|
// VALUES (?, ?, ?, ?, ?, ?, ?, ?)`;
|
|
|
|
// const values = [
|
|
// formData.name || null,
|
|
// formData.email || null,
|
|
// formData.phone || null,
|
|
// formData.category || null,
|
|
// files?.feeDoc?.[0]?.originalname || null,
|
|
// files?.medicalPhoto?.[0]?.originalname || null,
|
|
// files?.medicalDoc?.[0]?.originalname || null,
|
|
// files?.document?.[0]?.originalname || null,
|
|
// ];
|
|
|
|
// await db.query(sql, values);
|
|
|
|
// return res.status(200).json({ message: "Fundraising form submitted successfully" });
|
|
// } catch (error) {
|
|
// console.error("Error in /api/fundraising/submit:", error);
|
|
// return res.status(500).json({ message: "Internal server error" });
|
|
// }
|
|
// });
|
|
|
|
// // Start the server
|
|
// app.listen(PORT, () => {
|
|
// console.log(`Server running on http://localhost:${PORT}`);
|
|
// });
|
|
const express = require("express");
|
|
const multer = require("multer");
|
|
const axios = require("axios");
|
|
const cors = require("cors");
|
|
const mysql = require("mysql2/promise");
|
|
const FormData = require("form-data");
|
|
const extractDocumentRoute = require("./routes/extractDocument");
|
|
|
|
|
|
const app = express();
|
|
const PORT = 5002;
|
|
|
|
app.use(express.json());
|
|
app.use(cors());
|
|
app.use("/api", extractDocumentRoute);
|
|
|
|
|
|
// Use multer memory storage for file uploads
|
|
const upload = multer({ storage: multer.memoryStorage() });
|
|
|
|
// MySQL connection config — keys must be lowercase for mysql2
|
|
const dbConfig = {
|
|
host: "122.166.69.162",
|
|
user: "rootuser",
|
|
password: "1234",
|
|
database: "vvvet",
|
|
port: 3306, // Default MySQL port; change if needed
|
|
};
|
|
|
|
let db;
|
|
(async () => {
|
|
try {
|
|
db = await mysql.createPool(dbConfig);
|
|
console.log("Connected to MySQL DB");
|
|
} catch (err) {
|
|
console.error("MySQL connection error:", err);
|
|
}
|
|
})();
|
|
|
|
// PAN verification API
|
|
app.post("/api/verify-pan", upload.single("panImage"), async (req, res) => {
|
|
try {
|
|
const { pan } = req.body;
|
|
const panImage = req.file;
|
|
|
|
if (!pan || !panImage) {
|
|
return res.status(400).json({ verified: false, message: "PAN and image are required" });
|
|
}
|
|
|
|
// Validate PAN format
|
|
const panFormatRegex = /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/;
|
|
if (!panFormatRegex.test(pan)) {
|
|
return res.status(200).json({ verified: false, message: "Invalid PAN format" });
|
|
}
|
|
|
|
// Prepare form data to send image buffer to Python OCR server
|
|
const formData = new FormData();
|
|
formData.append("image", panImage.buffer, panImage.originalname);
|
|
|
|
// Send POST request to Python OCR server
|
|
const ocrResponse = await axios.post(
|
|
"https://api.vvet.in/extract-text",
|
|
formData,
|
|
{
|
|
headers: formData.getHeaders(),
|
|
}
|
|
);
|
|
|
|
const extractedText = ocrResponse.data.text || "";
|
|
console.log("Extracted Text from OCR:", extractedText);
|
|
|
|
if (!extractedText.toUpperCase().includes(pan.toUpperCase())) {
|
|
return res.status(200).json({ verified: false, message: "PAN not found in image" });
|
|
}
|
|
|
|
return res.status(200).json({ verified: true, message: "PAN verified successfully" });
|
|
} catch (error) {
|
|
console.error("Error in /api/verify-pan:", error);
|
|
return res.status(500).json({ verified: false, message: "Internal server error" });
|
|
}
|
|
});
|
|
|
|
// Fundraising submission API
|
|
// app.post(
|
|
// "/api/fundraising/submit",
|
|
// upload.fields([
|
|
// { name: "feeDoc", maxCount: 1 },
|
|
// { name: "medicalPhoto", maxCount: 1 },
|
|
// { name: "medicalDoc", maxCount: 1 },
|
|
// { name: "document", maxCount: 1 },
|
|
// { name: "panImage", maxCount: 1 },
|
|
// ]),
|
|
// async (req, res) => {
|
|
// try {
|
|
// const formData = req.body;
|
|
// const files = req.files;
|
|
|
|
// console.log("Received form data:", formData);
|
|
// console.log("Received files:", files ? Object.keys(files) : "No files uploaded");
|
|
|
|
// if (!db) {
|
|
// return res.status(500).json({ message: "DB connection not available" });
|
|
// }
|
|
|
|
// const sql = `INSERT INTO fundraisings
|
|
// (name, email, phone, category, feeDoc_name, medicalPhoto_name, medicalDoc_name, document_name)
|
|
// VALUES (?, ?, ?, ?, ?, ?, ?, ?)`;
|
|
|
|
// const values = [
|
|
// formData.name || null,
|
|
// formData.email || null,
|
|
// formData.phone || null,
|
|
// formData.category || null,
|
|
// files?.fee_Doc?.[0]?.originalname || null,
|
|
// files?.medical_Photo?.[0]?.originalname || null,
|
|
// files?.medical_Doc?.[0]?.originalname || null,
|
|
// files?.document?.[0]?.originalname || null,
|
|
// files?.panImage?.[0]?.originalname || null,
|
|
// ];
|
|
|
|
// await db.query(sql, values);
|
|
|
|
// return res.status(200).json({ message: "Fundraising form submitted successfully" });
|
|
// } catch (error) {
|
|
// console.error("Error in /api/fundraising/submit:", error);
|
|
// return res.status(500).json({ message: "Internal server error" });
|
|
// }
|
|
// }
|
|
// );
|
|
|
|
app.post(
|
|
"/api/fundraising/submit",
|
|
upload.fields([
|
|
{ name: "feeDoc", maxCount: 1 },
|
|
{ name: "medicalPhoto", maxCount: 1 },
|
|
{ name: "medicalDoc", maxCount: 1 },
|
|
{ name: "document", maxCount: 1 },
|
|
{ name: "panImage", maxCount: 1 },
|
|
]),
|
|
async (req, res) => {
|
|
try {
|
|
const formData = req.body;
|
|
const files = req.files;
|
|
|
|
console.log("Received form data:", formData);
|
|
console.log("Received files:", files ? Object.keys(files) : "No files uploaded");
|
|
|
|
if (!db) {
|
|
return res.status(500).json({ message: "DB connection not available" });
|
|
}
|
|
|
|
const sql = `INSERT INTO fundraisings (
|
|
name, email, phone, age, dob, category, pan_number, pan_document,
|
|
fee_document,
|
|
medical_document,
|
|
other_document,
|
|
transaction_screenshot,
|
|
fundraising_amount, bank_account_holder_name, bank_name, bank_account_number, ifsc_code
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?, ?, ?, ?, ? )`;
|
|
|
|
|
|
const values = [
|
|
formData.name || null,
|
|
formData.email || null,
|
|
formData.phone || null,
|
|
formData.age || null,
|
|
formData.dob || null,
|
|
formData.category || null,
|
|
formData.pan || null,
|
|
files?.panImage?.[0]?.originalname || null,
|
|
files?.feeDoc?.[0]?.originalname || null,
|
|
files?.medicalDoc?.[0]?.originalname || null,
|
|
files?.document?.[0]?.originalname || null,
|
|
files?.transactionScreenshot?.[0]?.originalname || null,
|
|
formData.fundAmount || null,
|
|
formData.bankHolderName || null,
|
|
formData.bankName || null,
|
|
formData.accountNumber || null,
|
|
formData.ifscCode || null
|
|
];
|
|
|
|
await db.query(sql, values);
|
|
|
|
return res.status(200).json({ message: "Fundraising form submitted successfully" });
|
|
} catch (error) {
|
|
console.error("Error in /api/fundraising/submit:", error);
|
|
return res.status(500).json({ message: "Internal server error" });
|
|
}
|
|
}
|
|
);
|
|
//donor submission API
|
|
// Donor submission API
|
|
app.post(
|
|
"/api/donor/submit",
|
|
upload.fields([
|
|
{ name: "panImage", maxCount: 1 },
|
|
{ name: "transactionScreenshot", maxCount: 1 },
|
|
]),
|
|
async (req, res) => {
|
|
try {
|
|
const formData = req.body;
|
|
const files = req.files;
|
|
|
|
if (!db) {
|
|
return res.status(500).json({ message: "DB connection not available" });
|
|
}
|
|
|
|
const sql = `INSERT INTO donors (
|
|
name, email, phone, age, dob, pan_number, pan_document,
|
|
bank_account_holder_name, bank_name, bank_account_number, ifsc_code,
|
|
donation_amount, payment, transaction_screenshot
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
|
|
|
|
const values = [
|
|
formData.name || null,
|
|
formData.email || null,
|
|
formData.phone || null,
|
|
formData.age || null,
|
|
formData.dob || null,
|
|
formData.pan || null,
|
|
files?.panImage?.[0]?.originalname || null,
|
|
formData.bankHolderName || null,
|
|
formData.bankName || null,
|
|
formData.accountNumber || null,
|
|
formData.ifscCode || null,
|
|
formData.donation_Amount || null,
|
|
formData.payment|| null,
|
|
files?.transactionScreenshot?.[0]?.originalname || null,
|
|
];
|
|
|
|
await db.query(sql, values);
|
|
|
|
return res.status(200).json({ message: "Donor form submitted successfully" });
|
|
} catch (error) {
|
|
console.error("Error in /api/donor/submit:", error);
|
|
return res.status(500).json({ message: "Internal server error" });
|
|
}
|
|
}
|
|
);
|
|
|
|
|
|
// Start the server
|
|
app.listen(PORT, () => {
|
|
console.log(`Server running on http://localhost:${PORT}`);
|
|
});
|