You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.9 KiB
JavaScript
149 lines
3.9 KiB
JavaScript
const sqlite3 = require('sqlite3');
|
|
const util = require('util');
|
|
|
|
const migrations = [
|
|
{
|
|
key: 1,
|
|
name: 'create table users',
|
|
sql: [`create table users (
|
|
id integer primary key autoincrement,
|
|
email text not null,
|
|
salt text not null,
|
|
password_hash text not null
|
|
)`]
|
|
},
|
|
{
|
|
key: 3,
|
|
name: 'create table sessions',
|
|
sql: [`create table sessions (
|
|
id integer primary key autoincrement,
|
|
user_id integer not null,
|
|
session_id text not null,
|
|
expires integer not null,
|
|
foreign key (user_id) references users (id)
|
|
)`]
|
|
},
|
|
{
|
|
key: 4,
|
|
name: 'create table episodes',
|
|
sql: [`create table episodes (
|
|
id integer primary key autoincrement,
|
|
number integer,
|
|
content text,
|
|
summary text,
|
|
slug text,
|
|
season integer,
|
|
episode integer,
|
|
duration integer,
|
|
filename text,
|
|
title text,
|
|
episode_type text,
|
|
buzzsprout_id text,
|
|
buzzsprout_url text,
|
|
pub_date text,
|
|
youtube_url text,
|
|
transcript_filename text
|
|
)`]
|
|
},
|
|
{
|
|
key: 5,
|
|
name: 'create table feed',
|
|
sql: [`create table feed (
|
|
id integer primary key autoincrement,
|
|
last_build_date text
|
|
)`]
|
|
},
|
|
{
|
|
key: 6,
|
|
name: 'create table subscriptions',
|
|
sql: [`create table subscriptions (
|
|
id integer primary key autoincrement,
|
|
user_id integer not null,
|
|
uuid text not null,
|
|
started_date text,
|
|
foreign key (user_id) references users (id)
|
|
)`]
|
|
},
|
|
{
|
|
key: 7,
|
|
name: 'set initial last_build_date',
|
|
sql: [`insert into feed (last_build_date) values ('Fri, 07 Apr 2000 14:00:00 GMT')`]
|
|
},
|
|
{
|
|
key: 8,
|
|
name: 'add audio url column',
|
|
sql: [`alter table episodes add column audio_url text;`]
|
|
}
|
|
];
|
|
|
|
const checkForMigrationsSql = `select key from migrations where run='True' order by key`;
|
|
|
|
async function runMigrations(db) {
|
|
console.log('turn on foreign keys');
|
|
await db.exec('PRAGMA foreign_keys = ON;');
|
|
console.log('running migrations');
|
|
const rows = await db.all(checkForMigrationsSql)
|
|
const runMigrations = rows.map(({ key }) => key);
|
|
console.log(runMigrations);
|
|
let toRun = [];
|
|
migrations.forEach(({ key, name, sql }) => {
|
|
if (!runMigrations.includes(key)) {
|
|
toRun.push({ key, name, sql });
|
|
}
|
|
});
|
|
console.log('Migrations to run:', toRun.map(({ name }) => name));
|
|
await db.exec(toRun.reduce((prev, { sql, key }) => `${prev} ${sql.join(';')} ; insert into migrations (key, run) values (${key}, 'True') ;`, ''));
|
|
console.log('migrations run');
|
|
/* db.all(checkForMigrationsSql, (err, rows) => {
|
|
* console.log('xx')
|
|
* const runMigrations = rows.map(({ key }) => key);
|
|
* console.log(runMigrations);
|
|
* let toRun = [];
|
|
* migrations.forEach(({ key, name, sql }) => {
|
|
* if (!runMigrations.includes(key)) {
|
|
* toRun.push({ key, name, sql });
|
|
* }
|
|
* });
|
|
* console.log('Migrations to run:', toRun.map(({ name }) => name));
|
|
* db.exec(toRun.reduce((prev, { sql, key }) => `${prev} ${sql.join(';')} ; insert into migrations (key, run) values (${key}, 'True') ;`, ''), () => {
|
|
* console.log('migrations run');
|
|
* });
|
|
* }); */
|
|
};
|
|
|
|
const createMigrationTable = `create table migrations (
|
|
id integer primary key autoincrement,
|
|
key integer not null,
|
|
run boolean not null
|
|
)`;
|
|
|
|
let db = new sqlite3.Database('/db/db.sqlite3', sqlite3.OPEN_READWRITE, async (err) => {
|
|
if (err && err.code == "SQLITE_CANTOPEN") {
|
|
db = new sqlite3.Database('./db.sqlite3', async (err) => {
|
|
if (err) {
|
|
console.log("Getting error " + err);
|
|
}
|
|
console.log('database created');
|
|
console.log('creating migration table')
|
|
db.exec(createMigrationTable, async () => {
|
|
await runMigrations(db);
|
|
});
|
|
});
|
|
if (err) {
|
|
console.error(err.message);
|
|
}
|
|
} else if (err) {
|
|
console.error(err.message);
|
|
} else {
|
|
console.log('Connected to the database.');
|
|
await runMigrations(db);
|
|
}
|
|
});
|
|
|
|
db.run = util.promisify(db.run);
|
|
db.get = util.promisify(db.get);
|
|
db.all = util.promisify(db.all);
|
|
db.exec = util.promisify(db.exec);
|
|
|
|
export default db;
|