From 14d71fec8b80dfbd41281500263ac2f3bbd3a41a Mon Sep 17 00:00:00 2001 From: Brandon Presley Date: Fri, 23 Sep 2022 13:52:33 +1200 Subject: [PATCH] Remove workouts table in favor of storing steps on sets --- EditWorkout.tsx | 24 +---- Routes.tsx | 7 +- WorkoutItem.tsx | 2 - db.ts | 229 +++++++++++++++++++------------------------- set.service.ts | 20 +++- set.ts | 1 + settings.service.ts | 1 + workout.service.ts | 42 -------- 8 files changed, 126 insertions(+), 200 deletions(-) delete mode 100644 workout.service.ts diff --git a/EditWorkout.tsx b/EditWorkout.tsx index 760f1ab..9276103 100644 --- a/EditWorkout.tsx +++ b/EditWorkout.tsx @@ -12,15 +12,7 @@ import ConfirmDialog from './ConfirmDialog'; import {MARGIN, PADDING} from './constants'; import MassiveInput from './MassiveInput'; import {updatePlanWorkouts} from './plan.service'; -import Set from './set'; import {addSet, getSets, updateManySet, updateSetImage} from './set.service'; -import Workout from './workout'; -import { - addWorkout, - getWorkout, - updateName, - updateSteps, -} from './workout.service'; import {WorkoutsPageParams} from './WorkoutsPage'; export default function EditWorkout() { @@ -52,31 +44,23 @@ export default function EditWorkout() { setMinutes(set.minutes?.toString() ?? '3'); setSeconds(set.seconds?.toString() ?? '30'); setSets(set.sets?.toString() ?? '3'); + setSteps(set.steps ?? ''); }, ); - console.log(`${EditWorkout.name}.focus`, {params}); - getWorkout(params.value.name).then(workout => setSteps(workout.steps)); }, [navigation, params]), ); const update = async () => { - console.log(`${EditWorkout.name}.update`, { - params: params.value.name, - name, - uri, - steps, - }); await updateManySet({ oldName: params.value.name, newName: name || params.value.name, sets, seconds, minutes, + steps, }); await updatePlanWorkouts(params.value.name, name || params.value.name); - await updateName(params.value.name, name); if (uri || removeImage) await updateSetImage(params.value.name, uri || ''); - if (steps) await updateSteps(params.value.name, steps); navigation.goBack(); }; @@ -90,8 +74,8 @@ export default function EditWorkout() { minutes: +minutes, seconds: +seconds, sets: +sets, - } as Set); - addWorkout({name, steps} as Workout); + steps, + }); navigation.goBack(); }; diff --git a/Routes.tsx b/Routes.tsx index 0b58ec6..23fab86 100644 --- a/Routes.tsx +++ b/Routes.tsx @@ -3,9 +3,10 @@ import {useColorScheme} from 'react-native'; import {IconButton} from 'react-native-paper'; import {Drawer, DrawerParamList} from './App'; import BestPage from './BestPage'; -import {migrations} from './db'; +import {runMigrations} from './db'; import HomePage from './HomePage'; import PlanPage from './PlanPage'; +import {getSettings} from './settings.service'; import SettingsPage from './SettingsPage'; import WorkoutsPage from './WorkoutsPage'; @@ -20,7 +21,9 @@ export default function Routes() { const dark = useColorScheme() === 'dark'; useEffect(() => { - migrations().then(() => setMigrated(true)); + runMigrations() + .then(getSettings) + .then(() => setMigrated(true)); }, []); if (!migrated) return null; diff --git a/WorkoutItem.tsx b/WorkoutItem.tsx index e1eedf3..48c73a9 100644 --- a/WorkoutItem.tsx +++ b/WorkoutItem.tsx @@ -5,7 +5,6 @@ import {List, Menu, Text} from 'react-native-paper'; import ConfirmDialog from './ConfirmDialog'; import {deleteSetsBy} from './set.service'; import Workout from './workout'; -import {removeWorkout} from './workout.service'; import {WorkoutsPageParams} from './WorkoutsPage'; export default function WorkoutItem({ @@ -22,7 +21,6 @@ export default function WorkoutItem({ const remove = useCallback(async () => { await deleteSetsBy(item.name); - await removeWorkout(item.name); setShowMenu(false); onRemoved(); }, [setShowMenu, onRemoved, item.name]); diff --git a/db.ts b/db.ts index d86a9a4..2892238 100644 --- a/db.ts +++ b/db.ts @@ -3,140 +3,111 @@ import { openDatabase, SQLiteDatabase, } from 'react-native-sqlite-storage'; -import {getSettings} from './settings.service'; enablePromise(true); -const createSets = ` - 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' - ); -`; - -const createPlans = ` - CREATE TABLE IF NOT EXISTS plans ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - days TEXT NOT NULL, - workouts TEXT NOT NULL - ); -`; - -const createSettings = ` - CREATE TABLE IF NOT EXISTS settings ( - minutes INTEGER NOT NULL DEFAULT 3, - seconds INTEGER NOT NULL DEFAULT 30, - alarm BOOLEAN NOT NULL DEFAULT false, - vibrate BOOLEAN NOT NULL DEFAULT true, - predict BOOLEAN NOT NULL DEFAULT true, - sets INTEGER NOT NULL DEFAULT 3 - ); -`; - -const addSound = ` - ALTER TABLE settings ADD COLUMN sound TEXT NULL; -`; - -const createWorkouts = ` - CREATE TABLE IF NOT EXISTS workouts( - name TEXT PRIMARY KEY, - sets INTEGER DEFAULT 3 - ); -`; - -const addHidden = ` - ALTER TABLE sets ADD COLUMN hidden DEFAULT false; -`; - -const addNotify = ` - ALTER TABLE settings ADD COLUMN notify DEFAULT false; -`; - -const addImage = ` - ALTER TABLE sets ADD COLUMN image TEXT NULL; -`; - -const addImages = ` - ALTER TABLE settings ADD COLUMN images BOOLEAN DEFAULT false; -`; - -const selectSettings = ` - SELECT * FROM settings LIMIT 1 -`; - -const insertSettings = ` - INSERT INTO settings(minutes) VALUES(3); -`; - -const addSteps = ` - ALTER TABLE workouts ADD COLUMN steps TEXT NULL; -`; - -const insertWorkouts = ` - INSERT OR IGNORE INTO workouts (name) SELECT DISTINCT name FROM sets; -`; - -const removeSeconds = ` - ALTER TABLE settings DROP COLUMN seconds -`; - -const removeMinutes = ` - ALTER TABLE settings DROP COLUMN minutes -`; - -const removeSets = ` - ALTER TABLE settings DROP COLUMN sets -`; - -const addSets = ` - ALTER TABLE sets ADD COLUMN sets INTEGER NOT NULL DEFAULT 3 -`; - -const addMinutes = ` - ALTER TABLE sets ADD COLUMN minutes INTEGER NOT NULL DEFAULT 3 -`; - -const addSeconds = ` - ALTER TABLE sets ADD COLUMN seconds INTEGER NOT NULL DEFAULT 30 -`; - -const addShowUnit = ` - ALTER TABLE settings ADD COLUMN showUnit BOOLEAN DEFAULT 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 false, + vibrate BOOLEAN NOT NULL DEFAULT true, + predict BOOLEAN NOT NULL DEFAULT true, + 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 false + `, + ` + 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 + `, +]; export let db: SQLiteDatabase; -export const migrations = async () => { +export const runMigrations = async () => { db = await openDatabase({name: 'massive.db'}); - await db.executeSql(createPlans); - await db.executeSql(createSets); - await db.executeSql(createSettings); - await db.executeSql(createWorkouts); - await db.executeSql(addSound).catch(() => null); - await db.executeSql(addHidden).catch(() => null); - await db.executeSql(addNotify).catch(() => null); - await db.executeSql(addImage).catch(() => null); - await db.executeSql(addImages).catch(() => null); - await db.executeSql(addSteps).catch(() => null); - await db.executeSql(insertWorkouts).catch(() => null); - await db.executeSql(removeSeconds).catch(() => null); - await db.executeSql(removeMinutes).catch(() => null); - await db.executeSql(removeSets).catch(() => null); - await db.executeSql(addSets).catch(() => null); - await db.executeSql(addMinutes).catch(() => null); - await db.executeSql(addSeconds).catch(() => null); - await db.executeSql(addShowUnit).catch(() => null); - const [result] = await db.executeSql(selectSettings); - if (result.rows.length === 0) await db.executeSql(insertSettings); - await getSettings(); + 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]); + } }; - -export interface PageParams { - search: string; - limit: number; - offset: number; -} diff --git a/set.service.ts b/set.service.ts index 24a51cf..33fecb4 100644 --- a/set.service.ts +++ b/set.service.ts @@ -17,9 +17,10 @@ export const updateSet = async (value: Set) => { ]); }; -export const addSets = async (values: string) => { +export const addSets = async (columns: string, values: string) => { + console.log({columns, values}); const insert = ` - INSERT INTO sets(name,reps,weight,created,unit,hidden) + INSERT INTO sets(${columns}) VALUES ${values} `; return db.executeSql(insert); @@ -54,7 +55,7 @@ export const getAllSets = async (): Promise => { return result.rows.raw(); }; -export interface PageParams { +interface PageParams { search: string; limit: number; offset: number; @@ -97,18 +98,27 @@ export const updateManySet = async ({ minutes, seconds, sets, + steps, }: { oldName: string; newName: string; minutes: string; seconds: string; sets: string; + steps: string; }) => { const update = ` - UPDATE sets SET name = ?, minutes = ?, seconds = ?, sets = ? + UPDATE sets SET name = ?, minutes = ?, seconds = ?, sets = ?, steps = ? WHERE name = ? `; - return db.executeSql(update, [newName, minutes, seconds, sets, oldName]); + return db.executeSql(update, [ + newName, + minutes, + seconds, + sets, + steps, + oldName, + ]); }; export const updateSetImage = async (name: string, image: string) => { diff --git a/set.ts b/set.ts index 2b25b0d..4d7be6d 100644 --- a/set.ts +++ b/set.ts @@ -10,4 +10,5 @@ export default interface Set { unit?: string; hidden?: boolean; image?: string; + steps?: string; } diff --git a/settings.service.ts b/settings.service.ts index 4c67c90..70a8c0e 100644 --- a/settings.service.ts +++ b/settings.service.ts @@ -6,6 +6,7 @@ export let settings: Settings; export const getSettings = async () => { const [result] = await db.executeSql(`SELECT * FROM settings LIMIT 1`); settings = result.rows.item(0); + return settings; }; export const updateSettings = async (value: Settings) => { diff --git a/workout.service.ts b/workout.service.ts deleted file mode 100644 index 0743ad7..0000000 --- a/workout.service.ts +++ /dev/null @@ -1,42 +0,0 @@ -import {db} from './db'; -import Workout from './workout'; - -export const getWorkout = async (name: string): Promise => { - const select = ` - SELECT * FROM workouts - WHERE workouts.name = ? - LIMIT 1 - `; - const [result] = await db.executeSql(select, [name]); - return result.rows.raw()[0]; -}; - -export const updateName = (oldName: string, newName: string) => { - const update = ` - UPDATE workouts SET name = ? WHERE name = ? - `; - return db.executeSql(update, [newName, oldName]); -}; - -export const updateSteps = (name: string, steps: string): Promise => { - const update = ` - UPDATE workouts SET steps = ? WHERE name = ? - `; - return db.executeSql(update, [steps, name]); -}; - -export const addWorkout = (value: Workout) => { - const insert = ` - INSERT INTO workouts(name, steps) - VALUES (?, ?) - `; - return db.executeSql(insert, [value.name, value.steps]); -}; - -export const removeWorkout = (name: string) => { - const remove = ` - DELETE FROM workouts - WHERE name = ? - `; - return db.executeSql(remove, [name]); -};