import { enablePromise, openDatabase, SQLiteDatabase, } from 'react-native-sqlite-storage'; import {DataSource} from 'typeorm'; import GymSet from './gym-set'; import {Plan} from './plan'; import Settings from './settings'; enablePromise(true); const migrations = [ ` CREATE TABLE IF NOT EXISTS sets ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, reps INTEGER NOT NULL, weight INTEGER NOT NULL, created TEXT NOT NULL, unit TEXT DEFAULT 'kg' ) `, ` CREATE TABLE IF NOT EXISTS plans ( id INTEGER PRIMARY KEY AUTOINCREMENT, days TEXT NOT NULL, workouts TEXT NOT NULL ) `, ` CREATE TABLE IF NOT EXISTS settings ( minutes INTEGER NOT NULL DEFAULT 3, seconds INTEGER NOT NULL DEFAULT 30, alarm BOOLEAN NOT NULL DEFAULT 0, vibrate BOOLEAN NOT NULL DEFAULT 1, sets INTEGER NOT NULL DEFAULT 3 ) `, `ALTER TABLE settings ADD COLUMN sound TEXT NULL`, ` CREATE TABLE IF NOT EXISTS workouts( name TEXT PRIMARY KEY, sets INTEGER DEFAULT 3 ) `, ` ALTER TABLE sets ADD COLUMN hidden DEFAULT false `, ` ALTER TABLE settings ADD COLUMN notify DEFAULT false `, ` ALTER TABLE sets ADD COLUMN image TEXT NULL `, ` ALTER TABLE settings ADD COLUMN images BOOLEAN DEFAULT true `, ` SELECT * FROM settings LIMIT 1 `, ` INSERT INTO settings(minutes) VALUES(3) `, ` ALTER TABLE workouts ADD COLUMN steps TEXT NULL `, ` INSERT OR IGNORE INTO workouts (name) SELECT DISTINCT name FROM sets `, ` ALTER TABLE sets ADD COLUMN sets INTEGER NOT NULL DEFAULT 3 `, ` ALTER TABLE sets ADD COLUMN minutes INTEGER NOT NULL DEFAULT 3 `, ` ALTER TABLE sets ADD COLUMN seconds INTEGER NOT NULL DEFAULT 30 `, ` ALTER TABLE settings ADD COLUMN showUnit BOOLEAN DEFAULT true `, ` ALTER TABLE sets ADD COLUMN steps TEXT NULL `, ` UPDATE sets SET steps = ( SELECT workouts.steps FROM workouts WHERE workouts.name = sets.name ) `, ` DROP TABLE workouts `, ` ALTER TABLE settings ADD COLUMN color TEXT NULL `, ` UPDATE settings SET showUnit = 1 `, ` ALTER TABLE settings ADD COLUMN workouts BOOLEAN DEFAULT true `, ` ALTER TABLE settings ADD COLUMN steps BOOLEAN DEFAULT true `, ` ALTER TABLE settings ADD COLUMN nextAlarm TEXT NULL `, ` ALTER TABLE settings ADD COLUMN newSet TEXT NULL `, ` ALTER TABLE settings ADD COLUMN date TEXT NULL `, ` ALTER TABLE settings ADD COLUMN showDate BOOLEAN DEFAULT false `, ` ALTER TABLE settings ADD COLUMN theme TEXT `, ` ALTER TABLE settings ADD COLUMN showSets BOOLEAN DEFAULT true `, ` CREATE INDEX sets_created ON sets(created) `, ` ALTER TABLE settings ADD COLUMN noSound BOOLEAN DEFAULT false `, ]; export let db: SQLiteDatabase; export const AppDataSource = new DataSource({ type: 'react-native', database: 'massive.db', location: 'default', entities: [GymSet, Plan, Settings], }); export const setRepo = AppDataSource.manager.getRepository(GymSet); export const planRepo = AppDataSource.manager.getRepository(Plan); export const settingsRepo = AppDataSource.manager.getRepository(Settings); export const getNow = (): Promise<{now: string}[]> => { return AppDataSource.manager.query( "SELECT STRFTIME('%Y-%m-%dT%H:%M:%S','now','localtime') AS now", ); }; export const runMigrations = async () => { await AppDataSource.initialize(); db = await openDatabase({name: 'massive.db'}); await db.executeSql(` CREATE TABLE IF NOT EXISTS migrations( id INTEGER PRIMARY KEY AUTOINCREMENT, command TEXT NOT NULL ) `); const [result] = await db.executeSql(`SELECT * FROM migrations`); const missing = migrations.slice(result.rows.length); for (const command of missing) { await db.executeSql(command).catch(console.error); const insert = ` INSERT INTO migrations (command) VALUES (?) `; await db.executeSql(insert, [command]); } };