Split out database logic into service files
This commit is contained in:
parent
76e0ea49b4
commit
e3b3c6ca09
|
@ -6,8 +6,8 @@ import {
|
||||||
import React, {useCallback, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {FlatList, StyleSheet, View} from 'react-native';
|
import {FlatList, StyleSheet, View} from 'react-native';
|
||||||
import {List, Searchbar} from 'react-native-paper';
|
import {List, Searchbar} from 'react-native-paper';
|
||||||
|
import {getBestReps, getBestWeights} from './best.service';
|
||||||
import {BestPageParams} from './BestPage';
|
import {BestPageParams} from './BestPage';
|
||||||
import {getBestReps, getBestWeights} from './db';
|
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
|
|
||||||
export default function BestList() {
|
export default function BestList() {
|
||||||
|
|
|
@ -5,15 +5,9 @@ import {FileSystem} from 'react-native-file-access';
|
||||||
import {Divider, IconButton, Menu} from 'react-native-paper';
|
import {Divider, IconButton, Menu} from 'react-native-paper';
|
||||||
import {DrawerParamList, SnackbarContext} from './App';
|
import {DrawerParamList, SnackbarContext} from './App';
|
||||||
import ConfirmDialog from './ConfirmDialog';
|
import ConfirmDialog from './ConfirmDialog';
|
||||||
import {
|
|
||||||
addPlans,
|
|
||||||
addSets,
|
|
||||||
deletePlans,
|
|
||||||
deleteSets,
|
|
||||||
getAllPlans,
|
|
||||||
getAllSets,
|
|
||||||
} from './db';
|
|
||||||
import {Plan} from './plan';
|
import {Plan} from './plan';
|
||||||
|
import {addPlans, deletePlans, getAllPlans} from './plan.service';
|
||||||
|
import {addSets, deleteSets, getAllSets} from './set.service';
|
||||||
import {write} from './write';
|
import {write} from './write';
|
||||||
|
|
||||||
const setFields = 'id,name,reps,weight,created,unit,hidden';
|
const setFields = 'id,name,reps,weight,created,unit,hidden';
|
||||||
|
|
|
@ -9,9 +9,10 @@ import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {ScrollView, StyleSheet, Text, View} from 'react-native';
|
import {ScrollView, StyleSheet, Text, View} from 'react-native';
|
||||||
import {Button, IconButton} from 'react-native-paper';
|
import {Button, IconButton} from 'react-native-paper';
|
||||||
import {DrawerParamList} from './App';
|
import {DrawerParamList} from './App';
|
||||||
import {addPlan, getNames, setPlan} from './db';
|
|
||||||
import MassiveSwitch from './MassiveSwitch';
|
import MassiveSwitch from './MassiveSwitch';
|
||||||
|
import {addPlan, setPlan} from './plan.service';
|
||||||
import {PlanPageParams} from './PlanPage';
|
import {PlanPageParams} from './PlanPage';
|
||||||
|
import {getNames} from './set.service';
|
||||||
import {DAYS} from './time';
|
import {DAYS} from './time';
|
||||||
|
|
||||||
export default function EditPlan() {
|
export default function EditPlan() {
|
||||||
|
|
|
@ -8,10 +8,11 @@ import React, {useCallback, useContext} from 'react';
|
||||||
import {NativeModules, View} from 'react-native';
|
import {NativeModules, View} from 'react-native';
|
||||||
import {IconButton} from 'react-native-paper';
|
import {IconButton} from 'react-native-paper';
|
||||||
import {SnackbarContext} from './App';
|
import {SnackbarContext} from './App';
|
||||||
import {addSet, getSettings, setSet} from './db';
|
|
||||||
import {HomePageParams} from './HomePage';
|
import {HomePageParams} from './HomePage';
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
|
import {addSet, setSet} from './set.service';
|
||||||
import SetForm from './SetForm';
|
import SetForm from './SetForm';
|
||||||
|
import {getSettings} from './settings.service';
|
||||||
|
|
||||||
export default function EditSet() {
|
export default function EditSet() {
|
||||||
const {params} = useRoute<RouteProp<HomePageParams, 'EditSet'>>();
|
const {params} = useRoute<RouteProp<HomePageParams, 'EditSet'>>();
|
||||||
|
|
|
@ -9,9 +9,10 @@ import {Image, ScrollView, View} from 'react-native';
|
||||||
import DocumentPicker from 'react-native-document-picker';
|
import DocumentPicker from 'react-native-document-picker';
|
||||||
import {Button, IconButton} from 'react-native-paper';
|
import {Button, IconButton} from 'react-native-paper';
|
||||||
import {set} from 'react-native-reanimated';
|
import {set} from 'react-native-reanimated';
|
||||||
import {addSet, getSets, setSetImage, setSetName, setWorkouts} from './db';
|
|
||||||
import MassiveInput from './MassiveInput';
|
import MassiveInput from './MassiveInput';
|
||||||
|
import {setWorkouts} from './plan.service';
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
|
import {addSet, getSets, setSetImage, setSetName} from './set.service';
|
||||||
import {WorkoutsPageParams} from './WorkoutsPage';
|
import {WorkoutsPageParams} from './WorkoutsPage';
|
||||||
|
|
||||||
export default function EditWorkout() {
|
export default function EditWorkout() {
|
||||||
|
|
|
@ -2,8 +2,8 @@ import {NavigationProp, useNavigation} from '@react-navigation/native';
|
||||||
import React, {useCallback, useState} from 'react';
|
import React, {useCallback, useState} from 'react';
|
||||||
import {GestureResponderEvent} from 'react-native';
|
import {GestureResponderEvent} from 'react-native';
|
||||||
import {List, Menu} from 'react-native-paper';
|
import {List, Menu} from 'react-native-paper';
|
||||||
import {deletePlan} from './db';
|
|
||||||
import {Plan} from './plan';
|
import {Plan} from './plan';
|
||||||
|
import {deletePlan} from './plan.service';
|
||||||
import {PlanPageParams} from './PlanPage';
|
import {PlanPageParams} from './PlanPage';
|
||||||
|
|
||||||
export default function PlanItem({
|
export default function PlanItem({
|
||||||
|
|
|
@ -6,10 +6,10 @@ import {
|
||||||
import React, {useCallback, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {FlatList, StyleSheet, View} from 'react-native';
|
import {FlatList, StyleSheet, View} from 'react-native';
|
||||||
import {List, Searchbar} from 'react-native-paper';
|
import {List, Searchbar} from 'react-native-paper';
|
||||||
import {getPlans} from './db';
|
|
||||||
import DrawerMenu from './DrawerMenu';
|
import DrawerMenu from './DrawerMenu';
|
||||||
import MassiveFab from './MassiveFab';
|
import MassiveFab from './MassiveFab';
|
||||||
import {Plan} from './plan';
|
import {Plan} from './plan';
|
||||||
|
import {getPlans} from './plan.service';
|
||||||
import PlanItem from './PlanItem';
|
import PlanItem from './PlanItem';
|
||||||
import {PlanPageParams} from './PlanPage';
|
import {PlanPageParams} from './PlanPage';
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import React, {useEffect, useRef, useState} from 'react';
|
import React, {useEffect, useRef, useState} from 'react';
|
||||||
import {ScrollView} from 'react-native';
|
import {ScrollView} from 'react-native';
|
||||||
import {Button, Text} from 'react-native-paper';
|
import {Button, Text} from 'react-native-paper';
|
||||||
import {getSets} from './db';
|
|
||||||
import MassiveInput from './MassiveInput';
|
import MassiveInput from './MassiveInput';
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
|
import {getSets} from './set.service';
|
||||||
|
|
||||||
export default function SetForm({
|
export default function SetForm({
|
||||||
save,
|
save,
|
||||||
|
|
|
@ -2,9 +2,9 @@ import {NavigationProp, useNavigation} from '@react-navigation/native';
|
||||||
import React, {useCallback, useState} from 'react';
|
import React, {useCallback, useState} from 'react';
|
||||||
import {GestureResponderEvent, Image} from 'react-native';
|
import {GestureResponderEvent, Image} from 'react-native';
|
||||||
import {Divider, List, Menu, Text} from 'react-native-paper';
|
import {Divider, List, Menu, Text} from 'react-native-paper';
|
||||||
import {deleteSet} from './db';
|
|
||||||
import {HomePageParams} from './HomePage';
|
import {HomePageParams} from './HomePage';
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
|
import {deleteSet} from './set.service';
|
||||||
|
|
||||||
export default function SetItem({
|
export default function SetItem({
|
||||||
item,
|
item,
|
||||||
|
|
14
SetList.tsx
14
SetList.tsx
|
@ -6,19 +6,15 @@ import {
|
||||||
import React, {useCallback, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {FlatList, StyleSheet, View} from 'react-native';
|
import {FlatList, StyleSheet, View} from 'react-native';
|
||||||
import {List, Searchbar} from 'react-native-paper';
|
import {List, Searchbar} from 'react-native-paper';
|
||||||
import {
|
import {getBestSet} from './best.service';
|
||||||
defaultSet,
|
|
||||||
getBest,
|
|
||||||
getSets,
|
|
||||||
getSettings,
|
|
||||||
getTodaysPlan,
|
|
||||||
getTodaysSets,
|
|
||||||
} from './db';
|
|
||||||
import DrawerMenu from './DrawerMenu';
|
import DrawerMenu from './DrawerMenu';
|
||||||
import {HomePageParams} from './HomePage';
|
import {HomePageParams} from './HomePage';
|
||||||
import MassiveFab from './MassiveFab';
|
import MassiveFab from './MassiveFab';
|
||||||
|
import {getTodaysPlan} from './plan.service';
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
|
import {defaultSet, getSets, getTodaysSets} from './set.service';
|
||||||
import SetItem from './SetItem';
|
import SetItem from './SetItem';
|
||||||
|
import {getSettings} from './settings.service';
|
||||||
|
|
||||||
const limit = 15;
|
const limit = 15;
|
||||||
|
|
||||||
|
@ -65,7 +61,7 @@ export default function SetList() {
|
||||||
todaysWorkouts[todaysWorkouts.indexOf(todaysSets[0].name!) + 1];
|
todaysWorkouts[todaysWorkouts.indexOf(todaysSets[0].name!) + 1];
|
||||||
}
|
}
|
||||||
console.log(`${SetList.name}.predict:`, {workout});
|
console.log(`${SetList.name}.predict:`, {workout});
|
||||||
const best = await getBest(workout);
|
const best = await getBestSet(workout);
|
||||||
console.log(`${SetList.name}.predict:`, {best});
|
console.log(`${SetList.name}.predict:`, {best});
|
||||||
setSet({...best});
|
setSet({...best});
|
||||||
setWorkouts(todaysWorkouts);
|
setWorkouts(todaysWorkouts);
|
||||||
|
|
|
@ -10,9 +10,9 @@ import DocumentPicker from 'react-native-document-picker';
|
||||||
import {Button, Searchbar, Text} from 'react-native-paper';
|
import {Button, Searchbar, Text} from 'react-native-paper';
|
||||||
import {SnackbarContext} from './App';
|
import {SnackbarContext} from './App';
|
||||||
import ConfirmDialog from './ConfirmDialog';
|
import ConfirmDialog from './ConfirmDialog';
|
||||||
import {getSettings, setSettings} from './db';
|
|
||||||
import MassiveInput from './MassiveInput';
|
import MassiveInput from './MassiveInput';
|
||||||
import MassiveSwitch from './MassiveSwitch';
|
import MassiveSwitch from './MassiveSwitch';
|
||||||
|
import {getSettings, setSettings} from './settings.service';
|
||||||
|
|
||||||
export default function SettingsPage() {
|
export default function SettingsPage() {
|
||||||
const [vibrate, setVibrate] = useState(true);
|
const [vibrate, setVibrate] = useState(true);
|
||||||
|
|
|
@ -10,9 +10,9 @@ import {IconButton} from 'react-native-paper';
|
||||||
import RNPickerSelect from 'react-native-picker-select';
|
import RNPickerSelect from 'react-native-picker-select';
|
||||||
import Share from 'react-native-share';
|
import Share from 'react-native-share';
|
||||||
import ViewShot from 'react-native-view-shot';
|
import ViewShot from 'react-native-view-shot';
|
||||||
|
import {getVolumes, getWeightsBy} from './best.service';
|
||||||
import {BestPageParams} from './BestPage';
|
import {BestPageParams} from './BestPage';
|
||||||
import Chart from './Chart';
|
import Chart from './Chart';
|
||||||
import {getVolumes, getWeights} from './db';
|
|
||||||
import {Metrics} from './metrics';
|
import {Metrics} from './metrics';
|
||||||
import {Periods} from './periods';
|
import {Periods} from './periods';
|
||||||
import Set from './set';
|
import Set from './set';
|
||||||
|
@ -59,7 +59,7 @@ export default function ViewBest() {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (metric === Metrics.Weight)
|
if (metric === Metrics.Weight)
|
||||||
getWeights(params.best.name, period).then(setWeights);
|
getWeightsBy(params.best.name, period).then(setWeights);
|
||||||
else if (metric === Metrics.Volume)
|
else if (metric === Metrics.Volume)
|
||||||
getVolumes(params.best.name, period).then(setVolumes);
|
getVolumes(params.best.name, period).then(setVolumes);
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {GestureResponderEvent, Image} from 'react-native';
|
import {GestureResponderEvent, Image} from 'react-native';
|
||||||
import {List, Menu, Text} from 'react-native-paper';
|
import {List, Menu, Text} from 'react-native-paper';
|
||||||
import ConfirmDialog from './ConfirmDialog';
|
import ConfirmDialog from './ConfirmDialog';
|
||||||
import {deleteSetsBy, getSets} from './db';
|
import {deleteSetsBy, getSets} from './set.service';
|
||||||
import Workout from './workout';
|
import Workout from './workout';
|
||||||
import {WorkoutsPageParams} from './WorkoutsPage';
|
import {WorkoutsPageParams} from './WorkoutsPage';
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@ import {
|
||||||
import React, {useCallback, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import {FlatList, StyleSheet, View} from 'react-native';
|
import {FlatList, StyleSheet, View} from 'react-native';
|
||||||
import {List, Searchbar} from 'react-native-paper';
|
import {List, Searchbar} from 'react-native-paper';
|
||||||
import {getWorkouts} from './db';
|
|
||||||
import MassiveFab from './MassiveFab';
|
import MassiveFab from './MassiveFab';
|
||||||
|
import {getWorkouts} from './set.service';
|
||||||
import SetList from './SetList';
|
import SetList from './SetList';
|
||||||
import Workout from './workout';
|
import Workout from './workout';
|
||||||
import WorkoutItem from './WorkoutItem';
|
import WorkoutItem from './WorkoutItem';
|
||||||
|
|
89
best.service.ts
Normal file
89
best.service.ts
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
import {db, defaultSet} from './db';
|
||||||
|
import {Periods} from './periods';
|
||||||
|
import Set from './set';
|
||||||
|
import Volume from './volume';
|
||||||
|
|
||||||
|
export const getBestSet = async (name: string): Promise<Set> => {
|
||||||
|
const bestWeight = `
|
||||||
|
SELECT name, reps, unit, MAX(weight) AS weight
|
||||||
|
FROM sets
|
||||||
|
WHERE name = ? AND NOT hidden
|
||||||
|
GROUP BY name;
|
||||||
|
`;
|
||||||
|
const bestReps = `
|
||||||
|
SELECT name, MAX(reps) as reps, unit, weight
|
||||||
|
FROM sets
|
||||||
|
WHERE name = ? AND weight = ? AND NOT hidden
|
||||||
|
GROUP BY name;
|
||||||
|
`;
|
||||||
|
const [weightResult] = await db.executeSql(bestWeight, [name]);
|
||||||
|
if (!weightResult.rows.length) return {...defaultSet};
|
||||||
|
const [repsResult] = await db.executeSql(bestReps, [
|
||||||
|
name,
|
||||||
|
weightResult.rows.item(0).weight,
|
||||||
|
]);
|
||||||
|
return repsResult.rows.item(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getWeightsBy = async (
|
||||||
|
name: string,
|
||||||
|
period: Periods,
|
||||||
|
): Promise<Set[]> => {
|
||||||
|
const select = `
|
||||||
|
SELECT max(weight) AS weight,
|
||||||
|
STRFTIME('%Y-%m-%d', created) as created, unit
|
||||||
|
FROM sets
|
||||||
|
WHERE name = ? AND NOT hidden
|
||||||
|
AND DATE(created) >= DATE('now', 'weekday 0', ?)
|
||||||
|
GROUP BY name, STRFTIME('%Y-%m-%d', created)
|
||||||
|
`;
|
||||||
|
let difference = '-7 days';
|
||||||
|
if (period === Periods.Monthly) difference = '-1 months';
|
||||||
|
else if (period === Periods.Yearly) difference = '-1 years';
|
||||||
|
const [result] = await db.executeSql(select, [name, difference]);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getVolumes = async (
|
||||||
|
name: string,
|
||||||
|
period: Periods,
|
||||||
|
): Promise<Volume[]> => {
|
||||||
|
const select = `
|
||||||
|
SELECT sum(weight * reps) AS value,
|
||||||
|
STRFTIME('%Y-%m-%d', created) as created, unit
|
||||||
|
FROM sets
|
||||||
|
WHERE name = ? AND NOT hidden
|
||||||
|
AND DATE(created) >= DATE('now', 'weekday 0', ?)
|
||||||
|
GROUP BY name, STRFTIME('%Y-%m-%d', created)
|
||||||
|
`;
|
||||||
|
let difference = '-7 days';
|
||||||
|
if (period === Periods.Monthly) difference = '-1 months';
|
||||||
|
else if (period === Periods.Yearly) difference = '-1 years';
|
||||||
|
const [result] = await db.executeSql(select, [name, difference]);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getBestWeights = async (search: string): Promise<Set[]> => {
|
||||||
|
const select = `
|
||||||
|
SELECT name, reps, unit, MAX(weight) AS weight
|
||||||
|
FROM sets
|
||||||
|
WHERE name LIKE ? AND NOT hidden
|
||||||
|
GROUP BY name;
|
||||||
|
`;
|
||||||
|
const [result] = await db.executeSql(select, [`%${search}%`]);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getBestReps = async (
|
||||||
|
name: string,
|
||||||
|
weight: number,
|
||||||
|
): Promise<Set[]> => {
|
||||||
|
const select = `
|
||||||
|
SELECT name, MAX(reps) as reps, unit, weight
|
||||||
|
FROM sets
|
||||||
|
WHERE name = ? AND weight = ? AND NOT hidden
|
||||||
|
GROUP BY name;
|
||||||
|
`;
|
||||||
|
const [result] = await db.executeSql(select, [name, weight]);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
279
db.ts
279
db.ts
|
@ -3,13 +3,6 @@ import {
|
||||||
openDatabase,
|
openDatabase,
|
||||||
SQLiteDatabase,
|
SQLiteDatabase,
|
||||||
} from 'react-native-sqlite-storage';
|
} from 'react-native-sqlite-storage';
|
||||||
import {Periods} from './periods';
|
|
||||||
import {Plan} from './plan';
|
|
||||||
import Set from './set';
|
|
||||||
import Settings from './settings';
|
|
||||||
import {DAYS} from './time';
|
|
||||||
import Volume from './volume';
|
|
||||||
import Workout from './workout';
|
|
||||||
|
|
||||||
enablePromise(true);
|
enablePromise(true);
|
||||||
|
|
||||||
|
@ -95,159 +88,12 @@ export const migrations = async () => {
|
||||||
if (result.rows.length === 0) await db.executeSql(insertSettings);
|
if (result.rows.length === 0) await db.executeSql(insertSettings);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getSettings = async () => {
|
|
||||||
const [result] = await db.executeSql(`SELECT * FROM settings LIMIT 1`);
|
|
||||||
const settings: Settings = result.rows.item(0);
|
|
||||||
return settings;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setSettings = async (value: Settings) => {
|
|
||||||
const update = `
|
|
||||||
UPDATE settings
|
|
||||||
SET vibrate=?,minutes=?,sets=?,seconds=?,alarm=?,
|
|
||||||
predict=?,sound=?,notify=?,images=?
|
|
||||||
`;
|
|
||||||
return db.executeSql(update, [
|
|
||||||
value.vibrate,
|
|
||||||
value.minutes,
|
|
||||||
value.sets,
|
|
||||||
value.seconds,
|
|
||||||
value.alarm,
|
|
||||||
value.predict,
|
|
||||||
value.sound,
|
|
||||||
value.notify,
|
|
||||||
value.images,
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setSet = async (value: Set) => {
|
|
||||||
const update = `
|
|
||||||
UPDATE sets
|
|
||||||
SET name = ?, reps = ?, weight = ?, unit = ?
|
|
||||||
WHERE id = ?
|
|
||||||
`;
|
|
||||||
return db.executeSql(update, [
|
|
||||||
value.name,
|
|
||||||
value.reps,
|
|
||||||
value.weight,
|
|
||||||
value.unit,
|
|
||||||
value.id,
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const addSets = async (values: string) => {
|
|
||||||
const insert = `
|
|
||||||
INSERT INTO sets(name,reps,weight,created,unit,hidden)
|
|
||||||
VALUES ${values}
|
|
||||||
`;
|
|
||||||
return db.executeSql(insert);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const addSet = async (value: Set) => {
|
|
||||||
const insert = `
|
|
||||||
INSERT INTO sets(name, reps, weight, created, unit, image)
|
|
||||||
VALUES (?,?,?,strftime('%Y-%m-%dT%H:%M:%S', 'now', 'localtime'),?, ?)
|
|
||||||
`;
|
|
||||||
const {name, reps, weight, unit, image} = value;
|
|
||||||
return db.executeSql(insert, [name, reps, weight, unit, image]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setWorkouts = async (oldName: string, newName: string) => {
|
|
||||||
const update = `
|
|
||||||
UPDATE plans SET workouts = REPLACE(workouts, ?, ?)
|
|
||||||
WHERE workouts LIKE ?
|
|
||||||
`;
|
|
||||||
return db.executeSql(update, [oldName, newName, `%${oldName}%`]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setPlan = async (value: Plan) => {
|
|
||||||
const update = `UPDATE plans SET days = ?, workouts = ? WHERE id = ?`;
|
|
||||||
return db.executeSql(update, [value.days, value.workouts, value.id]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const addPlan = async (value: Plan) => {
|
|
||||||
const insert = `INSERT INTO plans(days, workouts) VALUES (?, ?)`;
|
|
||||||
return db.executeSql(insert, [value.days, value.workouts]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const addPlans = async (values: string) => {
|
|
||||||
const insert = `
|
|
||||||
INSERT INTO plans(days,workouts) VALUES ${values}
|
|
||||||
`;
|
|
||||||
return db.executeSql(insert);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const deletePlans = async () => {
|
|
||||||
return db.executeSql(`DELETE FROM plans`);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const deleteSets = async () => {
|
|
||||||
return db.executeSql(`DELETE FROM sets`);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const deletePlan = async (id: number) => {
|
|
||||||
return db.executeSql(`DELETE FROM plans WHERE id = ?`, [id]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const deleteSet = async (id: number) => {
|
|
||||||
return db.executeSql(`DELETE FROM sets WHERE id = ?`, [id]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const deleteSetsBy = async (name: string) => {
|
|
||||||
return db.executeSql(`DELETE FROM sets WHERE name = ?`, [name]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getAllPlans = async (): Promise<Plan[]> => {
|
|
||||||
const select = `SELECT * from plans`;
|
|
||||||
const [result] = await db.executeSql(select);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getAllSets = async (): Promise<Set[]> => {
|
|
||||||
const select = `SELECT * from sets`;
|
|
||||||
const [result] = await db.executeSql(select);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export interface PageParams {
|
export interface PageParams {
|
||||||
search: string;
|
search: string;
|
||||||
limit: number;
|
limit: number;
|
||||||
offset: number;
|
offset: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getSets = async ({
|
|
||||||
search,
|
|
||||||
limit,
|
|
||||||
offset,
|
|
||||||
}: PageParams): Promise<Set[]> => {
|
|
||||||
const select = `
|
|
||||||
SELECT * from sets
|
|
||||||
WHERE name LIKE ? AND NOT hidden
|
|
||||||
ORDER BY created DESC
|
|
||||||
LIMIT ? OFFSET ?
|
|
||||||
`;
|
|
||||||
const [result] = await db.executeSql(select, [`%${search}%`, limit, offset]);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getTodaysPlan = async (): Promise<Plan[]> => {
|
|
||||||
const today = DAYS[new Date().getDay()];
|
|
||||||
const [result] = await db.executeSql(
|
|
||||||
`SELECT * FROM plans WHERE days LIKE ? LIMIT 1`,
|
|
||||||
[`%${today}%`],
|
|
||||||
);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getTodaysSets = async (): Promise<Set[]> => {
|
|
||||||
const today = new Date().toISOString().split('T')[0];
|
|
||||||
const [result] = await db.executeSql(
|
|
||||||
`SELECT * FROM sets WHERE created LIKE ? ORDER BY created DESC`,
|
|
||||||
[`${today}%`],
|
|
||||||
);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const defaultSet = {
|
export const defaultSet = {
|
||||||
name: '',
|
name: '',
|
||||||
id: 0,
|
id: 0,
|
||||||
|
@ -255,128 +101,3 @@ export const defaultSet = {
|
||||||
weight: 20,
|
weight: 20,
|
||||||
unit: 'kg',
|
unit: 'kg',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getBest = async (query: string): Promise<Set> => {
|
|
||||||
const bestWeight = `
|
|
||||||
SELECT name, reps, unit, MAX(weight) AS weight
|
|
||||||
FROM sets
|
|
||||||
WHERE name = ? AND NOT hidden
|
|
||||||
GROUP BY name;
|
|
||||||
`;
|
|
||||||
const bestReps = `
|
|
||||||
SELECT name, MAX(reps) as reps, unit, weight
|
|
||||||
FROM sets
|
|
||||||
WHERE name = ? AND weight = ? AND NOT hidden
|
|
||||||
GROUP BY name;
|
|
||||||
`;
|
|
||||||
const [weightResult] = await db.executeSql(bestWeight, [query]);
|
|
||||||
if (!weightResult.rows.length) return {...defaultSet};
|
|
||||||
const [repsResult] = await db.executeSql(bestReps, [
|
|
||||||
query,
|
|
||||||
weightResult.rows.item(0).weight,
|
|
||||||
]);
|
|
||||||
return repsResult.rows.item(0);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setSetName = async (oldName: string, newName: string) => {
|
|
||||||
const update = `UPDATE sets SET name = ? WHERE name = ?`;
|
|
||||||
return db.executeSql(update, [newName, oldName]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setSetImage = async (name: string, image: string) => {
|
|
||||||
const update = `UPDATE sets SET image = ? WHERE name = ?`;
|
|
||||||
return db.executeSql(update, [name, image]);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getWeights = async (
|
|
||||||
name: string,
|
|
||||||
period: Periods,
|
|
||||||
): Promise<Set[]> => {
|
|
||||||
const select = `
|
|
||||||
SELECT max(weight) AS weight,
|
|
||||||
STRFTIME('%Y-%m-%d', created) as created, unit
|
|
||||||
FROM sets
|
|
||||||
WHERE name = ? AND NOT hidden
|
|
||||||
AND DATE(created) >= DATE('now', 'weekday 0', ?)
|
|
||||||
GROUP BY name, STRFTIME('%Y-%m-%d', created)
|
|
||||||
`;
|
|
||||||
let difference = '-7 days';
|
|
||||||
if (period === Periods.Monthly) difference = '-1 months';
|
|
||||||
else if (period === Periods.Yearly) difference = '-1 years';
|
|
||||||
const [result] = await db.executeSql(select, [name, difference]);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getVolumes = async (
|
|
||||||
name: string,
|
|
||||||
period: Periods,
|
|
||||||
): Promise<Volume[]> => {
|
|
||||||
const select = `
|
|
||||||
SELECT sum(weight * reps) AS value,
|
|
||||||
STRFTIME('%Y-%m-%d', created) as created, unit
|
|
||||||
FROM sets
|
|
||||||
WHERE name = ? AND NOT hidden
|
|
||||||
AND DATE(created) >= DATE('now', 'weekday 0', ?)
|
|
||||||
GROUP BY name, STRFTIME('%Y-%m-%d', created)
|
|
||||||
`;
|
|
||||||
let difference = '-7 days';
|
|
||||||
if (period === Periods.Monthly) difference = '-1 months';
|
|
||||||
else if (period === Periods.Yearly) difference = '-1 years';
|
|
||||||
const [result] = await db.executeSql(select, [name, difference]);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getNames = async (): Promise<string[]> => {
|
|
||||||
const [result] = await db.executeSql('SELECT DISTINCT name FROM sets');
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getBestWeights = async (search: string): Promise<Set[]> => {
|
|
||||||
const select = `
|
|
||||||
SELECT name, reps, unit, MAX(weight) AS weight
|
|
||||||
FROM sets
|
|
||||||
WHERE name LIKE ? AND NOT hidden
|
|
||||||
GROUP BY name;
|
|
||||||
`;
|
|
||||||
const [result] = await db.executeSql(select, [`%${search}%`]);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getBestReps = async (
|
|
||||||
name: string,
|
|
||||||
weight: number,
|
|
||||||
): Promise<Set[]> => {
|
|
||||||
const select = `
|
|
||||||
SELECT name, MAX(reps) as reps, unit, weight
|
|
||||||
FROM sets
|
|
||||||
WHERE name = ? AND weight = ? AND NOT hidden
|
|
||||||
GROUP BY name;
|
|
||||||
`;
|
|
||||||
const [result] = await db.executeSql(select, [name, weight]);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getPlans = async (search: string): Promise<Plan[]> => {
|
|
||||||
const select = `
|
|
||||||
SELECT * from plans
|
|
||||||
WHERE days LIKE ? OR workouts LIKE ?
|
|
||||||
`;
|
|
||||||
const [result] = await db.executeSql(select, [`%${search}%`, `%${search}%`]);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getWorkouts = async ({
|
|
||||||
search,
|
|
||||||
limit,
|
|
||||||
offset,
|
|
||||||
}: PageParams): Promise<Workout[]> => {
|
|
||||||
const select = `
|
|
||||||
SELECT DISTINCT sets.name
|
|
||||||
FROM sets
|
|
||||||
WHERE sets.name LIKE ?
|
|
||||||
ORDER BY sets.name
|
|
||||||
LIMIT ? OFFSET ?
|
|
||||||
`;
|
|
||||||
const [result] = await db.executeSql(select, [search, limit, offset]);
|
|
||||||
return result.rows.raw();
|
|
||||||
};
|
|
||||||
|
|
60
plan.service.ts
Normal file
60
plan.service.ts
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
import {db} from './db';
|
||||||
|
import {Plan} from './plan';
|
||||||
|
import {DAYS} from './time';
|
||||||
|
|
||||||
|
export const getPlans = async (search: string): Promise<Plan[]> => {
|
||||||
|
const select = `
|
||||||
|
SELECT * from plans
|
||||||
|
WHERE days LIKE ? OR workouts LIKE ?
|
||||||
|
`;
|
||||||
|
const [result] = await db.executeSql(select, [`%${search}%`, `%${search}%`]);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getTodaysPlan = async (): Promise<Plan[]> => {
|
||||||
|
const today = DAYS[new Date().getDay()];
|
||||||
|
const [result] = await db.executeSql(
|
||||||
|
`SELECT * FROM plans WHERE days LIKE ? LIMIT 1`,
|
||||||
|
[`%${today}%`],
|
||||||
|
);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setWorkouts = async (oldName: string, newName: string) => {
|
||||||
|
const update = `
|
||||||
|
UPDATE plans SET workouts = REPLACE(workouts, ?, ?)
|
||||||
|
WHERE workouts LIKE ?
|
||||||
|
`;
|
||||||
|
return db.executeSql(update, [oldName, newName, `%${oldName}%`]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setPlan = async (value: Plan) => {
|
||||||
|
const update = `UPDATE plans SET days = ?, workouts = ? WHERE id = ?`;
|
||||||
|
return db.executeSql(update, [value.days, value.workouts, value.id]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const addPlan = async (value: Plan) => {
|
||||||
|
const insert = `INSERT INTO plans(days, workouts) VALUES (?, ?)`;
|
||||||
|
return db.executeSql(insert, [value.days, value.workouts]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const addPlans = async (values: string) => {
|
||||||
|
const insert = `
|
||||||
|
INSERT INTO plans(days,workouts) VALUES ${values}
|
||||||
|
`;
|
||||||
|
return db.executeSql(insert);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const deletePlans = async () => {
|
||||||
|
return db.executeSql(`DELETE FROM plans`);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const deletePlan = async (id: number) => {
|
||||||
|
return db.executeSql(`DELETE FROM plans WHERE id = ?`, [id]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getAllPlans = async (): Promise<Plan[]> => {
|
||||||
|
const select = `SELECT * from plans`;
|
||||||
|
const [result] = await db.executeSql(select);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
122
set.service.ts
Normal file
122
set.service.ts
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
import {db} from './db';
|
||||||
|
import Set from './set';
|
||||||
|
import Workout from './workout';
|
||||||
|
|
||||||
|
export const setSet = async (value: Set) => {
|
||||||
|
const update = `
|
||||||
|
UPDATE sets
|
||||||
|
SET name = ?, reps = ?, weight = ?, unit = ?
|
||||||
|
WHERE id = ?
|
||||||
|
`;
|
||||||
|
return db.executeSql(update, [
|
||||||
|
value.name,
|
||||||
|
value.reps,
|
||||||
|
value.weight,
|
||||||
|
value.unit,
|
||||||
|
value.id,
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const addSets = async (values: string) => {
|
||||||
|
const insert = `
|
||||||
|
INSERT INTO sets(name,reps,weight,created,unit,hidden)
|
||||||
|
VALUES ${values}
|
||||||
|
`;
|
||||||
|
return db.executeSql(insert);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const addSet = async (value: Set) => {
|
||||||
|
const insert = `
|
||||||
|
INSERT INTO sets(name, reps, weight, created, unit, image)
|
||||||
|
VALUES (?,?,?,strftime('%Y-%m-%dT%H:%M:%S', 'now', 'localtime'),?, ?)
|
||||||
|
`;
|
||||||
|
const {name, reps, weight, unit, image} = value;
|
||||||
|
return db.executeSql(insert, [name, reps, weight, unit, image]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const deleteSets = async () => {
|
||||||
|
return db.executeSql(`DELETE FROM sets`);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const deleteSet = async (id: number) => {
|
||||||
|
return db.executeSql(`DELETE FROM sets WHERE id = ?`, [id]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const deleteSetsBy = async (name: string) => {
|
||||||
|
return db.executeSql(`DELETE FROM sets WHERE name = ?`, [name]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getAllSets = async (): Promise<Set[]> => {
|
||||||
|
const select = `SELECT * from sets`;
|
||||||
|
const [result] = await db.executeSql(select);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
||||||
|
|
||||||
|
export interface PageParams {
|
||||||
|
search: string;
|
||||||
|
limit: number;
|
||||||
|
offset: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getSets = async ({
|
||||||
|
search,
|
||||||
|
limit,
|
||||||
|
offset,
|
||||||
|
}: PageParams): Promise<Set[]> => {
|
||||||
|
const select = `
|
||||||
|
SELECT * from sets
|
||||||
|
WHERE name LIKE ? AND NOT hidden
|
||||||
|
ORDER BY created DESC
|
||||||
|
LIMIT ? OFFSET ?
|
||||||
|
`;
|
||||||
|
const [result] = await db.executeSql(select, [`%${search}%`, limit, offset]);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getTodaysSets = async (): Promise<Set[]> => {
|
||||||
|
const today = new Date().toISOString().split('T')[0];
|
||||||
|
const [result] = await db.executeSql(
|
||||||
|
`SELECT * FROM sets WHERE created LIKE ? ORDER BY created DESC`,
|
||||||
|
[`${today}%`],
|
||||||
|
);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
||||||
|
|
||||||
|
export const defaultSet = {
|
||||||
|
name: '',
|
||||||
|
id: 0,
|
||||||
|
reps: 10,
|
||||||
|
weight: 20,
|
||||||
|
unit: 'kg',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setSetName = async (oldName: string, newName: string) => {
|
||||||
|
const update = `UPDATE sets SET name = ? WHERE name = ?`;
|
||||||
|
return db.executeSql(update, [newName, oldName]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setSetImage = async (name: string, image: string) => {
|
||||||
|
const update = `UPDATE sets SET image = ? WHERE name = ?`;
|
||||||
|
return db.executeSql(update, [name, image]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getNames = async (): Promise<string[]> => {
|
||||||
|
const [result] = await db.executeSql('SELECT DISTINCT name FROM sets');
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getWorkouts = async ({
|
||||||
|
search,
|
||||||
|
limit,
|
||||||
|
offset,
|
||||||
|
}: PageParams): Promise<Workout[]> => {
|
||||||
|
const select = `
|
||||||
|
SELECT DISTINCT sets.name
|
||||||
|
FROM sets
|
||||||
|
WHERE sets.name LIKE ?
|
||||||
|
ORDER BY sets.name
|
||||||
|
LIMIT ? OFFSET ?
|
||||||
|
`;
|
||||||
|
const [result] = await db.executeSql(select, [search, limit, offset]);
|
||||||
|
return result.rows.raw();
|
||||||
|
};
|
27
settings.service.ts
Normal file
27
settings.service.ts
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import {db} from './db';
|
||||||
|
import Settings from './settings';
|
||||||
|
|
||||||
|
export const getSettings = async () => {
|
||||||
|
const [result] = await db.executeSql(`SELECT * FROM settings LIMIT 1`);
|
||||||
|
const settings: Settings = result.rows.item(0);
|
||||||
|
return settings;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setSettings = async (value: Settings) => {
|
||||||
|
const update = `
|
||||||
|
UPDATE settings
|
||||||
|
SET vibrate=?,minutes=?,sets=?,seconds=?,alarm=?,
|
||||||
|
predict=?,sound=?,notify=?,images=?
|
||||||
|
`;
|
||||||
|
return db.executeSql(update, [
|
||||||
|
value.vibrate,
|
||||||
|
value.minutes,
|
||||||
|
value.sets,
|
||||||
|
value.seconds,
|
||||||
|
value.alarm,
|
||||||
|
value.predict,
|
||||||
|
value.sound,
|
||||||
|
value.notify,
|
||||||
|
value.images,
|
||||||
|
]);
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user