Gitlab@Informatics

Skip to content
Snippets Groups Projects
Select Git revision
  • 93f9da3ae2bf60b9c2b3758fab2d5729722d5729
  • main default protected
2 results

index.js

Blame
  • index.js 4.42 KiB
    require('dotenv').config();
    const express = require('express');
    const mysql = require('mysql2/promise');
    const fs = require('fs');
    const path = require('path');
    const qr = require('qr-image');
    const promptpay = require('promptpay-qr');
    
    const app = express();
    app.use(express.json());
    app.use(express.urlencoded({ extended: true }));
    
    
    // Database configuration
    const pool = mysql.createPool({
      host: process.env.DB_HOST || "10.104.21.247" ,
      port: process.env.DB_PORT || "3306",
      user: process.env.DB_USER || "root",
      password: process.env.DB_PASSWORD || "XXHtsd83115" ,
      database: process.env.DB_NAME || "qr_code",
      waitForConnections: true,
      connectionLimit: 10,
      queueLimit: 0
    });
    
    // Check database connection
    async function testConnection() {
      try {
        const connection = await pool.getConnection();
        await connection.ping();
        console.log('Database connection succeeded.');
        connection.release();
      } catch (err) {
        console.error('Database connection failed:', err);
        process.exit(1); // Terminate the app if the database connection fails
      }
    }
    testConnection();
    
    // Initialize database (create table if not exists)
    async function initDB() {
      const createTableQuery = `
        CREATE TABLE IF NOT EXISTS qr_code (
          id INT AUTO_INCREMENT PRIMARY KEY,
          promptpay_id VARCHAR(50) NOT NULL,
          amount DECIMAL(10, 2) NOT NULL,
          image_path TEXT NOT NULL
        )`;
      try {
        await pool.query(createTableQuery);
      } catch (err) {
        console.error('Failed to create table:', err);
      }
    }
    initDB().catch(console.error);
    
    // Serve static QR images from ./data
    const imageDir = path.join(__dirname, 'data');
    if (!fs.existsSync(imageDir)) fs.mkdirSync(imageDir);
    app.use('/qr-images', express.static(imageDir));
    
    // Main page route (QR generation form)
    app.get('/', (req, res) => {
      res.send(`
        <h1>Generate PromptPay QR Code</h1>
        <form method="POST" action="/generate">
          <label>PromptPay ID:</label><br/>
          <input type="text" name="promptpayId" required /><br/><br/>
          <label>Amount:</label><br/>
          <input type="number" name="amount" step="0.01" required /><br/><br/>
          <button type="submit">Generate QR</button>
        </form>
        <br/>
        <a href="/list">View QR List</a>
      `);
    });
    
    // Route to generate QR code
    app.post('/generate', async (req, res) => {
      const { promptpayId, amount } = req.body;
      if (!promptpayId || !amount) {
        return res.status(400).send('Missing promptpayId or amount');
      }
    
      try {
        console.log(promptpay);
        const qrData = promptpay(promptpayId, parseFloat(amount));
        const qrPng = qr.imageSync(qrData, { type: 'png' });
    
        const fileName = `qr_${Date.now()}.png`;
        const savePath = path.join(imageDir, fileName);
    
        fs.writeFileSync(savePath, qrPng);
    
        const insertQuery = `
          INSERT INTO qr_code (promptpay_id, amount, image_path)
          VALUES (?, ?, ?)`;
        const [result] = await pool.execute(insertQuery, [promptpayId, amount, fileName]);
    
        res.send(`
          <h2>QR Generated Successfully</h2>
          <p>ID: ${result.insertId}</p>
          <p>PromptPay ID: ${promptpayId}</p>
          <p>Amount: ${amount}</p>
          <p>Image: <a href="/qr-images/${fileName}" target="_blank">View QR Code</a></p>
          <br/>
          <a href="/">Go Back</a> | <a href="/list">View All QR Codes</a>
        `);
      } catch (err) {
        console.error('Error during QR generation:', err);
        res.status(500).send('Internal Server Error');
      }
    });
    
    // Route to list generated QR codes
    app.get('/list', async (req, res) => {
      try {
        const [rows] = await pool.query('SELECT * FROM qr_code ORDER BY id DESC');
        let html = `<h1>List of Generated QR Codes</h1>`;
        html += `<table border="1" cellpadding="5" cellspacing="0">
                  <tr>
                    <th>ID</th>
                    <th>PromptPay ID</th>
                    <th>Amount</th>
                    <th>QR Code Image</th>
                  </tr>`;
    
        rows.forEach(row => {
          html += `<tr>
                    <td>${row.id}</td>
                    <td>${row.promptpay_id}</td>
                    <td>${row.amount}</td>
                    <td><a href="/qr-images/${row.image_path}" target="_blank">View Image</a></td>
                  </tr>`;
        });
    
        html += `</table><br/><a href="/">Go Back</a>`;
        res.send(html);
      } catch (err) {
        console.error('Error fetching QR list:', err);
        res.status(500).send('Internal Server Error');
      }
    });
    
    // Start the server
    const port = process.env.PORT || 3000;
    app.listen(port, () => {
      console.log(`Server started on port ${port}`);
    });