61 lines
1.7 KiB
JavaScript
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 };
|