Add days, plansDays, days tables

This is for the purpose of adding the following relationships:
- Plans <-> Sets
- Plans <-> Days

Related to #102
This commit is contained in:
Brandon Presley 2022-10-29 16:38:13 +13:00
parent 4aa62dace8
commit 88c1c629d5
3 changed files with 70 additions and 4 deletions

54
db.ts
View File

@ -3,10 +3,12 @@ import {
openDatabase,
SQLiteDatabase,
} from 'react-native-sqlite-storage';
import {addPlanDays, addPlanSets, getPlans} from './plan.service';
import {DAYS} from './time';
enablePromise(true);
const migrations = [
const migrations: (string | Function)[] = [
`
CREATE TABLE IF NOT EXISTS sets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@ -123,12 +125,56 @@ const migrations = [
`
ALTER TABLE settings ADD COLUMN noSound BOOLEAN DEFAULT false
`,
`
CREATE TABLE days(
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
)
`,
`
INSERT INTO days(name, id) VALUES
('Sunday', 0),
('Monday', 1),
('Tuesday', 2),
('Wednesday', 3),
('Thursday', 4),
('Friday', 5),
('Saturday', 6)
`,
`
CREATE TABLE plansDays(
planId INTEGER,
dayId INTEGER,
FOREIGN KEY(planId) REFERENCES plans(id)
FOREIGN KEY(dayId) REFERENCES days(id)
)
`,
`
CREATE TABLE plansSets(
setName TEXT,
planId INTEGER,
FOREIGN KEY(planId) REFERENCES plans(id)
FOREIGN KEY(setName) REFERENCES sets(name)
)
`,
async () => {
const plans = await getPlans('');
for (const plan of plans) {
const dayIds = plan.days.split(',').map(day => DAYS.indexOf(day));
await addPlanDays(plan.id, dayIds);
const setNames = plan.workouts.split(',');
await addPlanSets(plan.id, setNames);
}
},
];
export let db: SQLiteDatabase;
export const runMigrations = async () => {
db = await openDatabase({name: 'massive.db'});
await db.executeSql('DROP TABLE migrations');
await db.executeSql('DROP TABLE plansSets');
await db.executeSql('DROP TABLE plansDays');
await db.executeSql(`
CREATE TABLE IF NOT EXISTS migrations(
id INTEGER PRIMARY KEY AUTOINCREMENT,
@ -138,11 +184,13 @@ export const runMigrations = async () => {
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);
if (typeof command === 'string')
await db.executeSql(command).catch(console.error);
else await command(db);
const insert = `
INSERT INTO migrations (command)
VALUES (?)
`;
await db.executeSql(insert, [command]);
await db.executeSql(insert, [command.toString()]);
}
};

View File

@ -2,6 +2,24 @@ import {db} from './db';
import {Plan} from './plan';
import {DAYS} from './time';
export const addPlanSets = async (planId: number, setNames: string[]) => {
const values = setNames.map(setName => `(${planId}, '${setName}')`).join(',');
const insert = `
INSERT INTO plansSets(planId, setName)
VALUES ${values}
`;
return db.executeSql(insert);
};
export const addPlanDays = async (planId: number, dayIds: number[]) => {
const values = dayIds.map(dayId => `(${planId}, ${dayId})`).join(',');
const insert = `
INSERT INTO plansDays(planId, dayId)
VALUES ${values}
`;
return db.executeSql(insert);
};
export const getPlans = async (search: string): Promise<Plan[]> => {
const select = `
SELECT * from plans

View File

@ -1,5 +1,5 @@
export interface Plan {
id?: number;
id: number;
days: string;
workouts: string;
}