60 lines
1.8 KiB
JavaScript
60 lines
1.8 KiB
JavaScript
|
|
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,
|
||
|
|
};
|