CentralBackend/services/subscriptions/CoffeeShippingFeeService.js
2026-03-15 18:33:52 +01:00

71 lines
1.7 KiB
JavaScript

const pool = require('../../database/database');
class CoffeeShippingFeeService {
static _normalizePieceCount(value) {
const n = Number(value);
if (!Number.isInteger(n)) return null;
if (![60, 120].includes(n)) return null;
return n;
}
static _normalizePrice(value) {
const n = Number(value);
if (!Number.isFinite(n)) return null;
if (n < 0) return null;
return n;
}
static _mapRow(row) {
if (!row) return null;
return {
pieceCount: Number(row.piece_count),
price: Number(row.price),
};
}
static async list() {
const [rows] = await pool.query(
'SELECT piece_count, price FROM coffee_shipping_fees ORDER BY piece_count ASC'
);
return (rows || []).map((r) => this._mapRow(r));
}
static async get(pieceCount) {
const pc = this._normalizePieceCount(pieceCount);
if (!pc) return null;
const [rows] = await pool.query(
'SELECT piece_count, price FROM coffee_shipping_fees WHERE piece_count = ? LIMIT 1',
[pc]
);
return this._mapRow(rows?.[0]);
}
static async setPrice(pieceCount, price) {
const pc = this._normalizePieceCount(pieceCount);
if (!pc) {
const err = new Error('pieceCount must be 60 or 120');
err.status = 400;
throw err;
}
const p = this._normalizePrice(price);
if (p === null) {
const err = new Error('price must be a number >= 0');
err.status = 400;
throw err;
}
await pool.query(
`INSERT INTO coffee_shipping_fees (piece_count, price)
VALUES (?, ?)
ON DUPLICATE KEY UPDATE price = VALUES(price)`,
[pc, p]
);
return this.get(pc);
}
}
module.exports = CoffeeShippingFeeService;