send2streamer/db.js

60 lines
1.8 KiB
JavaScript
Raw Normal View History

const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const { DatabaseSync } = require('node:sqlite');
const DB_PATH = process.env.DB_PATH || path.join(__dirname, 'data', 'app.db');
fs.mkdirSync(path.dirname(DB_PATH), { recursive: true });
const db = new DatabaseSync(DB_PATH);
db.exec(`
CREATE TABLE IF NOT EXISTS streamers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
google_id TEXT UNIQUE NOT NULL,
email TEXT NOT NULL,
name TEXT NOT NULL,
picture TEXT,
overlay_token TEXT UNIQUE NOT NULL,
sender_token TEXT UNIQUE NOT NULL,
tts_voice TEXT NOT NULL DEFAULT 'ru-RU-DmitryNeural',
created_at INTEGER NOT NULL
);
`);
function generateToken() {
return crypto.randomBytes(16).toString('hex');
}
function findStreamerByGoogleId(googleId) {
return db.prepare('SELECT * FROM streamers WHERE google_id = ?').get(googleId);
}
function findStreamerByOverlayToken(token) {
return db.prepare('SELECT * FROM streamers WHERE overlay_token = ?').get(token);
}
function findStreamerBySenderToken(token) {
return db.prepare('SELECT * FROM streamers WHERE sender_token = ?').get(token);
}
function createStreamer({ googleId, email, name, picture }) {
const overlayToken = generateToken();
const senderToken = generateToken();
db.prepare(
`INSERT INTO streamers (google_id, email, name, picture, overlay_token, sender_token, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)`
).run(googleId, email, name, picture || null, overlayToken, senderToken, Date.now());
return findStreamerByGoogleId(googleId);
}
function getOrCreateStreamerByGoogle({ googleId, email, name, picture }) {
return findStreamerByGoogleId(googleId) || createStreamer({ googleId, email, name, picture });
}
module.exports = {
findStreamerByOverlayToken,
findStreamerBySenderToken,
getOrCreateStreamerByGoogle,
};