Quick_Payment/db.js

61 lines
1.7 KiB
JavaScript

const path = require('path');
const Database = require('better-sqlite3');
// npm run reset-db
const db = new Database(path.join(__dirname, 'data', 'payments.db'));
db.pragma('journal_mode = WAL');
db.exec(`
CREATE TABLE IF NOT EXISTS payments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_name TEXT NOT NULL,
email TEXT,
phone TEXT,
address TEXT,
items_json TEXT NOT NULL,
total REAL NOT NULL DEFAULT 0,
currency TEXT NOT NULL DEFAULT 'AUD',
payment_link TEXT,
status TEXT NOT NULL DEFAULT 'created',
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
`);
// Migrate existing databases that predate the currency column.
const hasCurrency = db
.prepare(`PRAGMA table_info(payments)`)
.all()
.some((col) => col.name === 'currency');
if (!hasCurrency) {
db.exec(`ALTER TABLE payments ADD COLUMN currency TEXT NOT NULL DEFAULT 'AUD'`);
}
const insertStmt = db.prepare(`
INSERT INTO payments
(customer_name, email, phone, address, items_json, total, currency, payment_link, status)
VALUES
(@customer_name, @email, @phone, @address, @items_json, @total, @currency, @payment_link, @status)
`);
function savePayment(record) {
const info = insertStmt.run(record);
return getPayment(info.lastInsertRowid);
}
function getPayment(id) {
return db.prepare('SELECT * FROM payments WHERE id = ?').get(id);
}
function listPayments(limit = 100) {
return db
.prepare('SELECT * FROM payments ORDER BY id DESC LIMIT ?')
.all(limit);
}
function countPayments() {
return db.prepare('SELECT COUNT(*) AS n FROM payments').get().n;
}
module.exports = { savePayment, getPayment, listPayments, countPayments };