SendTrain/lib/database/seed.dart
2025-04-15 15:29:55 -04:00

296 lines
14 KiB
Dart

import 'dart:convert';
import 'dart:math';
import 'package:dart_casing/dart_casing.dart';
import 'package:flutter/services.dart' as root_bundle;
import 'package:drift/drift.dart';
import 'package:sendtrain/database/database.dart';
Future<void> seedDb(AppDatabase database) async {
// seed data setup
final List<List> sessionValues = [
[
'Projecting',
'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
'Climbers Rock Inc.'
],
[
'Moonboard',
'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
'Beta Bloc'
],
[
'Off-Wall Training',
'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
'Climbers Rock Inc.'
],
[
'Climbing Outdoors',
'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
'Gravity Hamilton'
],
[
'Volume Session',
'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
'Up the Bloc'
],
];
final List<List> mediaItems = [
[
'https://www.climbing.com/wp-content/uploads/2022/06/campus-board-e1655470701154.jpeg',
MediaType.image
],
['BgheYcxhrsw', MediaType.youtube]
];
// final List<String> actionTypes = [
// "[[{\"actionID\": 0, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 1, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 2, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 3, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 4, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 5, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}]]",
// "[[{\"actionID\": 0, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 1, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 2, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 3, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 4, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 5, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 6, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 7, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 8, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 9, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 10, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 11, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 12, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 13, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 14, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 15, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 16, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 17, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 18, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 19, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}]]"
// ];
final int totalSessions = 15;
final int totalActivities = 6;
// final int totalActions = 5;
final int totalMedia = 5;
final random = Random();
final whitespaceRE = RegExp(r"(?! )\s+| \s+");
// we gotta build all the activities!
final jsondata =
await root_bundle.rootBundle.loadString('assets/exercises.json');
final exercises = json.decode(jsondata);
List<int> activityIds = [];
for (int i = 0; i < exercises.length; i++) {
var exercise = exercises[i];
var images = [];
if (exercise['images'] != null) {
for (int j = 0; j < exercise['images'].length; j++) {
var image = exercise['images'][j];
images.add(image);
}
}
Map<Symbol, Value> payload = {
Symbol('title'): Value<String>(
exercise['name'].toString().trim().replaceAll(whitespaceRE, " ")),
Symbol('description'):
Value<String>(json.encode(exercise['instructions'])),
Symbol('force'): Value<String>(exercise['force'] ?? "")
};
// well this fucking sucks
if (exercise['category'] != null) {
payload[Symbol('type')] = Value<ActivityType>(ActivityType.values
.firstWhere((e) =>
e.toString() ==
"ActivityType.${Casing.camelCase(exercise['category'])}"));
}
if (exercise['level'] != null) {
payload[Symbol('level')] = Value<ActivityLevel>(ActivityLevel.values
.firstWhere((e) =>
e.toString() ==
"ActivityLevel.${Casing.camelCase(exercise['level'])}"));
}
if (exercise['mechanic'] != null) {
payload[Symbol('mechanic')] = Value<ActivityMechanic>(
ActivityMechanic.values.firstWhere((e) =>
e.toString() ==
"ActivityMechanic.${Casing.camelCase(exercise['mechanic'])}"));
}
if (exercise['equipment'] != null) {
payload[Symbol('equipment')] = Value<ActivityEquipment>(
ActivityEquipment.values.firstWhere((e) =>
e.toString() ==
"ActivityEquipment.${Casing.camelCase(exercise['equipment'])}"));
}
if (exercise['primaryMuscles'].isNotEmpty) {
payload[Symbol('primaryMuscles')] = Value<ActivityMuscle>(
ActivityMuscle.values.firstWhere((e) =>
e.toString() ==
"ActivityMuscle.${Casing.camelCase(exercise['primaryMuscles'].first)}"));
}
if (exercise['secondaryMuscles'].isNotEmpty) {
payload[Symbol('secondaryMuscles')] = Value<ActivityMuscle>(
ActivityMuscle.values.firstWhere((e) =>
e.toString() ==
"ActivityMuscle.${Casing.camelCase(exercise['secondaryMuscles'].first)}"));
}
activityIds.add(await database
.into(database.activities)
.insert(Function.apply(ActivitiesCompanion.new, [], payload))
.then((activityId) async {
for (int m = 0; m < images.length; m++) {
final mediaItem = images[m];
await database
.into(database.mediaItems)
.insert(MediaItemsCompanion.insert(
title: exercise['name'],
description: exercise['name'],
reference: mediaItem,
type: MediaType.image))
.then((mediaId) async {
await database.into(database.objectMediaItems).insert(
ObjectMediaItemsCompanion.insert(
objectId: activityId,
mediaId: mediaId,
objectType: ObjectType.activities));
});
}
return activityId;
}));
}
// seed loop
for (int i = 0; i < totalSessions; i++) {
// session things
var status = SessionStatus.completed;
if (i == 0) status = SessionStatus.started;
if (i == 1) status = SessionStatus.pending;
final sessionValue = sessionValues[random.nextInt(sessionValues.length)];
await database
.into(database.sessions)
.insert(SessionsCompanion.insert(
title: sessionValue[0],
content: sessionValue[1],
status: status,
address: Value(sessionValue[2]),
achievements: Value(
"[\"achievement 1\", \"achievement 2\", \"achievement 3\"]"),
date: Value(DateTime.now())))
.then((sessionId) async {
//session actions
int activityId = random.nextInt(activityIds.length);
for (int i = 0; i < 5; i += 1) {
int restBefore = 0;
int restAfter = 300000;
if (i == 0) {
restBefore = 30000;
}
await database.into(database.actionSets).insert(
ActionSetsCompanion.insert(
name: 'test set',
reps: 5,
activityId: activityId,
repType: RepType.time,
isAlternating: Value(true),
restBeforeSet: Value(restBefore),
restAfterSet: Value(restAfter),
restBetweenReps: Value(10000),
repLength: Value(10000),
setWeights: Value('[100]'),
tempo: Value('[3000,2000,1000]'),
sessionId: sessionId,
position: i));
}
// SessionSetsCompanion.insert()
// activities things
// for (int j = 0; j <= random.nextInt(totalActivities); j++) {
// int activityId = random.nextInt(activityIds.length);
// activityIds.removeAt(activityId);
// await database
// .into(database.sessionActivities)
// .insert(SessionActivitiesCompanion.insert(
// sessionId: sessionId,
// activityId: activityId,
// position: j,
// results: Value("results json, will need to test"),
// ));
// // actions
// // await database
// // .into(database.actions)
// // .insert(ActionsCompanion.insert(
// // title: 'Test action',
// // description:
// // 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
// // totalSets: 5,
// // totalReps: "[1]",
// // restBeforeSets: Value(30000),
// // restBetweenSets: Value(300000),
// // restBetweenReps: Value(15000),
// // restAfterSets: Value(300000),
// // repType: RepType.time,
// // repLength: Value(10000),
// // repWeights: Value("[110]"),
// // setWeights: Value("[1]"),
// // isAlternating: Value(true),
// // set: actionTypes[random.nextInt(actionTypes.length)]))
// // .then((actionId) async {
// // // add activity action association
// // await database.into(database.activityActions).insert(
// // ActivityActionsCompanion.insert(
// // activityId: activityId, actionId: actionId, sessionId: sessionId, position: 0));
// // });
// // for (int k = 0; k <= random.nextInt(totalActions); k++) {
// // await database
// // .into(database.actions)
// // .insert(ActionsCompanion.insert(
// // title: 'Test action $k',
// // description:
// // '$k Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
// // totalSets: 5,
// // totalReps: "[1]",
// // restBeforeSets: Value(30000),
// // restBetweenSets: Value(300000),
// // restBetweenReps: Value(15000),
// // restAfterSets: Value(300000),
// // repType: RepType.time,
// // repLength: Value(10000),
// // repWeights: Value("[110]"),
// // setWeights: Value("[1]"),
// // isAlternating: Value(true),
// // set: actionTypes[random.nextInt(actionTypes.length)]))
// // .then((actionId) async {
// // // add activity action association
// // await database.into(database.activityActions).insert(
// // ActivityActionsCompanion.insert(
// // activityId: activityId, actionId: actionId, position: k));
// // });
// // }
// }
for (int n = 0; n <= random.nextInt(totalMedia); n++) {
final mediaItem = mediaItems[random.nextInt(mediaItems.length)];
await database
.into(database.mediaItems)
.insert(MediaItemsCompanion.insert(
title: 'Media title $n',
description:
'Media description $n Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
reference: mediaItem[0],
type: mediaItem[1]))
.then((mediaId) async {
await database.into(database.objectMediaItems).insert(
ObjectMediaItemsCompanion.insert(
objectId: sessionId,
mediaId: mediaId,
objectType: ObjectType.sessions));
});
}
await database
.into(database.mediaItems)
.insert(MediaItemsCompanion.insert(
title: 'Locations details',
description:
'5155 Harvester Rd #1, Burlington, ON L7L 6V2, Canada',
reference:
'https://lh3.googleusercontent.com/places/ANXAkqHwtb5oRMGG3haJkaHeTxdTI1lQ17RgvkCXwzA1dGV53BXPbHrdXIs1mLC_-4exyRW8dbYhMOeiOCHJqGeVBx-dNtABZAl9tQA=s4800-w800',
type: MediaType.location))
.then((mediaId) async {
await database.into(database.objectMediaItems).insert(
ObjectMediaItemsCompanion.insert(
objectId: sessionId,
mediaId: mediaId,
objectType: ObjectType.sessions));
});
});
}
}