ssn-database/src/init.ts

41 lines
1.7 KiB
TypeScript

import * as mysql from 'mysql';
import { Product } from 'ssn';
import createStatement from './database/createStatement';
import * as database from './database/database';
import products from './exports/productList';
import IDatabaseRow from './interfaces/IDatabaseRow';
import IDatabaseSettings from './interfaces/IDatabaseSettings';
import IProductData from './interfaces/IProductData';
import writeLog from './logger/writeLog';
export default async function init(dbSettings: IDatabaseSettings): Promise<{ [key in Product]?: IProductData }> {
const output: { [key in Product]?: IProductData } = {};
await database.init(dbSettings);
//Only create table if it does not exist yet
const createIfNotExists = createStatement.replace(/^CREATE TABLE/, 'CREATE TABLE IF NOT EXISTS');
await database.query(createIfNotExists);
const { results: existingRows }: { results: IDatabaseRow[]} = await database.query('SELECT * FROM ssn_versions');
existingRows.forEach(function(row: IDatabaseRow) {
if (!products.includes(row.product)) {
writeLog(`Product ${row.product} in database table is invalid.`);
return;
}
output[row.product] = { http: row.http, manifest: row.manifest };
});
//If row does not exist, INSERT into table
const missingProducts = products.filter((product) => output[product] === undefined);
await Promise.all(missingProducts.map(function(product) {
output[product] = { http: -1, manifest: -1 };
const queryTemplate = `INSERT INTO \`ssn_versions\` (\`product\`, \`manifest\`, \`http\`) VALUES (?, '-1', '-1');`;
const query = mysql.format(queryTemplate, [String(product)]);
return database.query(query);
}));
return output;
}