Compare commits

...

3 Commits

Author SHA1 Message Date
Brandon Presley 6d46fe959c Pause adding intermediary tables
I am struggling to remember why I started doing this.
I can't think of any real benefit.
2022-12-09 15:06:29 +13:00
Brandon Presley e6542798ea Merge branch 'master' into intermediary-tables 2022-12-08 17:51:06 +13:00
Brandon Presley c5453484d6 Pause adding intermediary tables for now 2022-12-06 13:01:56 +13:00
10 changed files with 163 additions and 24 deletions

View File

@ -23,7 +23,6 @@ export default function PlanItem({
const [show, setShow] = useState(false)
const [anchor, setAnchor] = useState({x: 0, y: 0})
const [today, setToday] = useState<string>()
const days = useMemo(() => item.days.split(','), [item.days])
const navigation = useNavigation<NavigationProp<PlanPageParams>>()
useFocusEffect(
@ -42,7 +41,7 @@ export default function PlanItem({
const start = useCallback(async () => {
console.log(`${PlanItem.name}.start:`, {item})
setShow(false)
const workout = item.workouts.split(',')[0]
const workout = item.workouts[0].name
let first = await getBestSet(workout)
if (!first) first = {...defaultSet, name: workout}
delete first.id
@ -64,25 +63,22 @@ export default function PlanItem({
const title = useMemo(
() =>
days.map((day, index) => (
<Text key={day}>
{day === today ? (
item.days?.map((day, index) => (
<Text key={day.id}>
{day.name === today ? (
<Text style={{fontWeight: 'bold', textDecorationLine: 'underline'}}>
{day}
{day.name}
</Text>
) : (
day
day.name
)}
{index === days.length - 1 ? '' : ', '}
{index === item.days.length - 1 ? '' : ', '}
</Text>
)),
[days, today],
[item.days, today],
)
const description = useMemo(
() => item.workouts.replace(/,/g, ', '),
[item.workouts],
)
const description = useMemo(() => item.workouts?.join(', '), [item.workouts])
const copy = useCallback(() => {
const plan: Plan = {...item}

View File

@ -20,11 +20,7 @@ export default function PlanList() {
const navigation = useNavigation<NavigationProp<PlanPageParams>>()
const refresh = useCallback(async (value: string) => {
planRepo
.find({
where: [{days: Like(`%${value}%`)}, {workouts: Like(`%${value}%`)}],
})
.then(setPlans)
planRepo.find({}).then(setPlans)
}, [])
useFocusEffect(

View File

@ -1,4 +1,5 @@
import {DataSource} from 'typeorm'
import {Day} from './day'
import GymSet from './gym-set'
import {Sets1667185586014 as sets1667185586014} from './migrations/1667185586014-sets'
import {plans1667186124792} from './migrations/1667186124792-plans'
@ -24,14 +25,19 @@ import {addSetsCreated1667186451005} from './migrations/1667186451005-add-sets-c
import {addNoSound1667186456118} from './migrations/1667186456118-add-no-sound'
import {dropMigrations1667190214743} from './migrations/1667190214743-drop-migrations'
import {splitColor1669420187764} from './migrations/1669420187764-split-color'
import {addDays1670284587217} from './migrations/1670284587217-add-days'
import {addWorkouts1670477728181} from './migrations/1670477728181-add-workouts'
import {Plan} from './plan'
import {PlanDay} from './plan-day'
import {PlanWorkout} from './plan-workout'
import Settings from './settings'
import {Workout} from './workout'
export const AppDataSource = new DataSource({
type: 'react-native',
database: 'massive.db',
location: 'default',
entities: [GymSet, Plan, Settings],
entities: [GymSet, Plan, Settings, Day, Workout, PlanWorkout, PlanDay],
migrationsRun: true,
migrationsTableName: 'typeorm_migrations',
migrations: [
@ -59,5 +65,7 @@ export const AppDataSource = new DataSource({
addNoSound1667186456118,
dropMigrations1667190214743,
splitColor1669420187764,
addDays1670284587217,
addWorkouts1670477728181,
],
})

10
day.ts Normal file
View File

@ -0,0 +1,10 @@
import {Column, Entity, PrimaryColumn} from 'typeorm'
@Entity('days')
export class Day {
@PrimaryColumn('int')
id: number
@Column('text')
name: string
}

View File

@ -0,0 +1,51 @@
import {MigrationInterface, QueryRunner, Table, TableColumn} from 'typeorm'
import {AppDataSource} from '../data-source'
import {Day} from '../day'
import {planRepo} from '../db'
import {PlanWorkout} from '../plan-workout'
import {DAYS} from '../time'
export class addDays1670284587217 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(
new Table({
name: 'days',
columns: [
new TableColumn({name: 'id', type: 'int', isPrimary: true}),
new TableColumn({name: 'name', type: 'text', isNullable: false}),
],
}),
)
await queryRunner.query(`
INSERT INTO days VALUES
(1, 'Sunday'),
(2, 'Monday'),
(3, 'Tuesday'),
(4, 'Wednesday'),
(5, 'Thursday'),
(6, 'Friday'),
(7, 'Saturday')`)
await queryRunner.createTable(
new Table({
name: 'plans_days_days',
columns: [
new TableColumn({name: 'plansId', type: 'int'}),
new TableColumn({name: 'daysId', type: 'int'}),
],
}),
)
const plans = await AppDataSource.query('SELECT * FROM plans')
const planWorkoutRepo = AppDataSource.getRepository(PlanWorkout)
for (const plan of plans) {
const days: Day[] = plan.days.split(',').map((day: string) => {
const id = DAYS.indexOf(day) + 1
return {id, name: day}
})
planWorkoutRepo.save(days)
await planRepo.update(plan.id, {days})
}
await queryRunner.dropColumn('plans', 'days')
}
public async down(queryRunner: QueryRunner): Promise<void> {}
}

View File

@ -0,0 +1,44 @@
import {MigrationInterface, QueryRunner, Table, TableColumn} from 'typeorm'
import {AppDataSource} from '../data-source'
import {planRepo} from '../db'
import {PlanWorkout} from '../plan-workout'
import {Workout} from '../workout'
export class addWorkouts1670477728181 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(
new Table({
name: 'workouts',
columns: [
new TableColumn({
name: 'id',
type: 'int',
isPrimary: true,
isGenerated: true,
}),
new TableColumn({name: 'name', type: 'text', isNullable: false}),
],
}),
)
await queryRunner.createTable(
new Table({
name: 'plans_workouts_workouts',
columns: [
new TableColumn({name: 'plansId', type: 'int'}),
new TableColumn({name: 'workoutsId', type: 'int'}),
],
}),
)
const plans = await AppDataSource.query('SELECT * FROM plans')
const repo = AppDataSource.getRepository(PlanWorkout)
for (const plan of plans) {
const workouts: PlanWorkout[] = plan.workouts
.split(',')
.map((workout: string) => ({plansId: plan.id}))
repo.save()
}
await queryRunner.dropColumn('plans', 'workouts')
}
public async down(queryRunner: QueryRunner): Promise<void> {}
}

10
plan-day.ts Normal file
View File

@ -0,0 +1,10 @@
import {Column, Entity, PrimaryColumn} from 'typeorm'
@Entity('plans_days_days')
export class PlanDay {
@PrimaryColumn('int')
plansId: number
@Column('int')
daysId: number
}

10
plan-workout.ts Normal file
View File

@ -0,0 +1,10 @@
import {Column, Entity, PrimaryColumn} from 'typeorm'
@Entity('plans_workouts_workouts')
export class PlanWorkout {
@PrimaryColumn('int')
plansId: number
@Column('int')
workoutsId: number
}

14
plan.ts
View File

@ -1,13 +1,17 @@
import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm'
import {Entity, JoinTable, ManyToMany, PrimaryGeneratedColumn} from 'typeorm'
import {Day} from './day'
import {Workout} from './workout'
@Entity('plans')
export class Plan {
@PrimaryGeneratedColumn()
id?: number
@Column('text')
days: string
@ManyToMany(() => Day)
@JoinTable()
days: Day[]
@Column('text')
workouts: string
@ManyToMany(() => Workout)
@JoinTable()
workouts: Workout[]
}

10
workout.ts Normal file
View File

@ -0,0 +1,10 @@
import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm'
@Entity('workouts')
export class Workout {
@PrimaryGeneratedColumn()
id?: number
@Column('text')
name: string
}