diff --git a/lib/entities/PizzaDatabase.dart b/lib/entities/PizzaDatabase.dart index 9355400..98bc0e7 100644 --- a/lib/entities/PizzaDatabase.dart +++ b/lib/entities/PizzaDatabase.dart @@ -1,4 +1,3 @@ -import 'package:floor/floor.dart'; import 'package:pizzaplanner/entities/PizzaEvent.dart'; import 'package:pizzaplanner/entities/PizzaRecipe/Ingredient.dart'; import 'package:pizzaplanner/entities/PizzaRecipe/PizzaRecipe.dart'; @@ -10,6 +9,9 @@ import 'package:pizzaplanner/entities/dao/PizzaRecipeDao.dart'; import 'package:pizzaplanner/entities/dao/RecipeStepDao.dart'; import 'package:pizzaplanner/entities/dao/RecipeSubStepDao.dart'; +import 'dart:async'; +import 'package:floor/floor.dart'; +import 'package:sqflite/sqflite.dart' as sqflite; part 'PizzaDatabase.g.dart'; @TypeConverters([DateTimeConverter]) diff --git a/lib/entities/PizzaEvent.dart b/lib/entities/PizzaEvent.dart index 84a3bd0..7ce81cc 100644 --- a/lib/entities/PizzaEvent.dart +++ b/lib/entities/PizzaEvent.dart @@ -3,21 +3,25 @@ import 'package:pizzaplanner/entities/PizzaRecipe/PizzaRecipe.dart'; import 'package:floor/floor.dart'; -@entity +@Entity( + tableName: "PizzaEvent", + foreignKeys: [ + ForeignKey(childColumns: ["recipeId"], parentColumns: ["id"], entity: PizzaRecipe) + ] +) class PizzaEvent { @PrimaryKey(autoGenerate: true) final int? id; final String name; - @ignore - final PizzaRecipe recipe; + final int recipeId; // foreign key to recipe for this event final int pizzaCount; final int doughBallSize; final DateTime dateTime; PizzaEvent( + this.recipeId, this.name, - this.recipe, this.pizzaCount, this.doughBallSize, this.dateTime, diff --git a/lib/entities/PizzaRecipe/Ingredient.dart b/lib/entities/PizzaRecipe/Ingredient.dart index 51336ec..f8d987d 100644 --- a/lib/entities/PizzaRecipe/Ingredient.dart +++ b/lib/entities/PizzaRecipe/Ingredient.dart @@ -1,19 +1,32 @@ import 'package:flutter/material.dart'; import 'package:floor/floor.dart'; +import 'package:pizzaplanner/entities/PizzaRecipe/PizzaRecipe.dart'; import 'package:pizzaplanner/util.dart'; -@entity +@Entity( + tableName: "Ingredient", + foreignKeys: [ + ForeignKey(childColumns: ["pizzaRecipeId"], parentColumns: ["id"], entity: PizzaRecipe) + ] +) class Ingredient { @PrimaryKey(autoGenerate: true) final int? id; + final int pizzaRecipeId; final String name; final String unit; final double value; - Ingredient(this.name, this.unit, this.value, {this.id}); + Ingredient(this.pizzaRecipeId, this.name, this.unit, this.value, {this.id}); + + Future insert() async { + final database = await getDatabase(); + final ingredientDao = database.ingredientDao; + await ingredientDao.insertIngredient(this); + } TableRow getIngredientTableRow(int pizzaCount, int doughBallSize){ return TableRow( diff --git a/lib/entities/PizzaRecipe/PizzaRecipe.dart b/lib/entities/PizzaRecipe/PizzaRecipe.dart index 65e9af2..3dc8b98 100644 --- a/lib/entities/PizzaRecipe/PizzaRecipe.dart +++ b/lib/entities/PizzaRecipe/PizzaRecipe.dart @@ -16,15 +16,28 @@ class PizzaRecipe { final String name; final String description; - @ignore - final List ingredients; + //final List ingredients; - @ignore - final List recipeSteps; + //final List recipeSteps; - PizzaRecipe(this.name, this.description, this.ingredients, this.recipeSteps, {this.id}); + PizzaRecipe(this.name, this.description, {this.id}); + + Future insert() async { + final database = await getDatabase(); + final pizzaRecipeDao = database.pizzaRecipeDao; + await pizzaRecipeDao.insertPizzaRecipe(this); + } - Table getIngredientsTable(int pizzaCount, int doughBallSize) { + Future> getRecipeSteps() async { + final database = await getDatabase(); + final recipeStepDao = database.recipeStepDao; + return await recipeStepDao.getPizzaRecipeSteps(this.id!); + } + + Future getIngredientsTable(int pizzaCount, int doughBallSize) async { + final database = await getDatabase(); + final ingredientDao = database.ingredientDao; + final ingredients = await ingredientDao.getPizzaRecipeSteps(this.id!); return Table( border: TableBorder.all(), columnWidths: const { @@ -56,13 +69,18 @@ class PizzaRecipe { String name = recipe["name"]; String description = recipe["description"]; - YamlList ingredients = recipe["ingredients"];; + PizzaRecipe pizzaRecipe = PizzaRecipe(name, description); + pizzaRecipe.insert(); - List newIngredients = ingredients.map((ingredient) => Ingredient(ingredient["name"], ingredient["unit"], ingredient["value"])).toList(); + YamlList ingredients = recipe["ingredients"]; + + for (var ingredientYaml in ingredients){ + Ingredient ingredient = Ingredient(pizzaRecipe.id!, ingredientYaml["name"], ingredientYaml["unit"], ingredientYaml["value"]); + ingredient.insert(); + } YamlList steps = recipe["steps"]; - var newRecipeSteps = List.generate(steps.length, (i) { - YamlMap step = steps[i]; + for (var step in steps){ String stepName = step["name"]; String stepDescription = step["description"]; @@ -80,57 +98,45 @@ class PizzaRecipe { waitMax = waitMap["max"]; } - YamlList subSteps = step.containsKey("substeps") ? step["substeps"] : YamlList(); - var newSubSteps = List.generate(subSteps.length, (j) { - var subStep = subSteps[j]; - return RecipeSubStep(subStep["name"], subStep["description"]); - }); - return RecipeStep( + RecipeStep recipeStep = RecipeStep( + pizzaRecipe.id!, stepName, stepDescription, waitDescription, waitUnit, waitMin, - waitMax, - newSubSteps + waitMax ); - }); + recipeStep.insert(); - final database = await $FloorPizzaDatabase.databaseBuilder("app.db").build(); - - final recipeDao = database.pizzaRecipeDao; - await recipeDao.insertPizzaRecipe(PizzaRecipe( - name, - description, - newIngredients, - newRecipeSteps - )); - - - return PizzaRecipe( - name, - description, - newIngredients, - newRecipeSteps - ); + YamlList subSteps = step.containsKey("substeps") ? step["substeps"] : YamlList(); + for (var subStep in subSteps ) { + RecipeSubStep recipeSubStep = RecipeSubStep(recipeStep.id!, subStep["name"], subStep["description"]); + recipeSubStep.insert(); + } + } + return pizzaRecipe; } - Duration getMinDuration(){ + Future getMinDuration() async { + List recipeSteps = await this.getRecipeSteps(); return Duration(seconds: recipeSteps.map((recipeStep) => recipeStep.getWaitMinInSeconds()).reduce((a, b) => a+b)); } - Duration getCurrentDuration(){ + Future getCurrentDuration() async { + List recipeSteps = await this.getRecipeSteps(); return Duration(seconds: recipeSteps.map((recipeStep) => recipeStep.getCurrentWaitInSeconds()).reduce((a, b) => a+b)); } String toString() { - return "PizzaRecipe(${this.name}, ${this.ingredients.length}, ${this.recipeSteps.length})"; + return "PizzaRecipe(${this.name})"; } - Table getStepTimeTable(DateTime startTime) { + Future
getStepTimeTable(DateTime startTime) async { List stepRows = []; DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(startTime.millisecondsSinceEpoch); - for (var recipeStep in this.recipeSteps.reversed) { + List recipeSteps = await this.getRecipeSteps(); + for (var recipeStep in recipeSteps.reversed) { Duration stepWaitDuration = Duration(seconds: recipeStep.getCurrentWaitInSeconds()); stepRows.add( TableRow( diff --git a/lib/entities/PizzaRecipe/RecipeStep.dart b/lib/entities/PizzaRecipe/RecipeStep.dart index 9842659..5249918 100644 --- a/lib/entities/PizzaRecipe/RecipeStep.dart +++ b/lib/entities/PizzaRecipe/RecipeStep.dart @@ -1,10 +1,18 @@ import 'package:floor/floor.dart'; +import 'package:pizzaplanner/entities/PizzaRecipe/PizzaRecipe.dart'; import 'package:pizzaplanner/entities/PizzaRecipe/RecipeSubStep.dart'; +import 'package:pizzaplanner/util.dart'; -@entity +@Entity( + tableName: "RecipeStep", + foreignKeys: [ + ForeignKey(childColumns: ["pizzaRecipeId"], parentColumns: ["id"], entity: PizzaRecipe) + ] +) class RecipeStep { @PrimaryKey(autoGenerate: true) final int? id; + final int pizzaRecipeId; final String name; final String waitDescription; final String waitUnit; @@ -13,13 +21,18 @@ class RecipeStep { late int waitValue; final String description; - @ignore - final List subSteps; + // final List subSteps; - RecipeStep(this.name, this.description, this.waitDescription, this.waitUnit, this.waitMin, this.waitMax, this.subSteps, {this.id}) { + RecipeStep(this.pizzaRecipeId, this.name, this.description, this.waitDescription, this.waitUnit, this.waitMin, this.waitMax, {this.id}) { waitValue = waitMin; } + Future insert() async { + final database = await getDatabase(); + final recipeStepDao = database.recipeStepDao; + await recipeStepDao.insertRecipeStep(this); + } + int convertToSeconds(int value){ switch (waitUnit){ case "minutes": { diff --git a/lib/entities/PizzaRecipe/RecipeSubStep.dart b/lib/entities/PizzaRecipe/RecipeSubStep.dart index 6b54b23..6f735cb 100644 --- a/lib/entities/PizzaRecipe/RecipeSubStep.dart +++ b/lib/entities/PizzaRecipe/RecipeSubStep.dart @@ -1,12 +1,26 @@ import 'package:floor/floor.dart'; +import 'package:pizzaplanner/entities/PizzaRecipe/RecipeStep.dart'; +import 'package:pizzaplanner/util.dart'; -@entity +@Entity( + tableName: "RecipeSubStep", + foreignKeys: [ + ForeignKey(childColumns: ["recipeStepId"], parentColumns: ["id"], entity: RecipeStep) + ] +) class RecipeSubStep { @PrimaryKey(autoGenerate: true) final int? id; + final int recipeStepId; final String name; final String description; - RecipeSubStep(this.name, this.description, {this.id}); + RecipeSubStep(this.recipeStepId, this.name, this.description, {this.id}); + + Future insert() async { + final database = await getDatabase(); + final recipeSubStepDao = database.recipeSubStepDao; + await recipeSubStepDao.insertRecipeSubStep(this); + } } \ No newline at end of file diff --git a/lib/entities/dao/IngridientDao.dart b/lib/entities/dao/IngridientDao.dart index b525976..a33e907 100644 --- a/lib/entities/dao/IngridientDao.dart +++ b/lib/entities/dao/IngridientDao.dart @@ -10,6 +10,9 @@ abstract class IngredientDao { @Query("SELECT * FROM Ingredient WHERE id = :id") Stream findIngredientById(int id); + @Query("SELECT * FROM Ingredient WHERE pizzaRecipeId = :pizzaRecipeId") + Future> getPizzaRecipeSteps(int pizzaRecipeId); + @insert Future insertIngredient(Ingredient ingredient); } \ No newline at end of file diff --git a/lib/entities/dao/RecipeStepDao.dart b/lib/entities/dao/RecipeStepDao.dart index b4c0b1c..1fc543f 100644 --- a/lib/entities/dao/RecipeStepDao.dart +++ b/lib/entities/dao/RecipeStepDao.dart @@ -9,6 +9,9 @@ abstract class RecipeStepDao { @Query("SELECT * FROM RecipeStep WHERE id = :id") Stream findRecipeStepById(int id); + @Query("SELECT * FROM RecipeStep WHERE pizzaRecipeId = :pizzaRecipeId") + Future> getPizzaRecipeSteps(int pizzaRecipeId); + @insert Future insertRecipeStep(RecipeStep recipeStep); } \ No newline at end of file diff --git a/lib/entities/dao/RecipeSubStepDao.dart b/lib/entities/dao/RecipeSubStepDao.dart index 7f932e3..15f4668 100644 --- a/lib/entities/dao/RecipeSubStepDao.dart +++ b/lib/entities/dao/RecipeSubStepDao.dart @@ -9,6 +9,9 @@ abstract class RecipeSubStepDao { @Query("SELECT * FROM RecipeSubStep WHERE id = :id") Stream findRecipeSubStepById(int id); + @Query("SELECT * FROM RecipeStep WHERE recipeStepId = :recipeStepId") + Future> getRecipeStepSubSteps(int recipeStepId); + @insert Future insertRecipeSubStep(RecipeSubStep recipeSubStep); } \ No newline at end of file diff --git a/lib/util.dart b/lib/util.dart index fe0a32b..98f0fe5 100644 --- a/lib/util.dart +++ b/lib/util.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:flutter/services.dart' show rootBundle; import 'package:intl/intl.dart'; +import 'package:pizzaplanner/entities/PizzaDatabase.dart'; import 'package:pizzaplanner/entities/PizzaRecipe/PizzaRecipe.dart'; Future> getRecipes() async { @@ -30,4 +31,8 @@ extension StringExtensions on String { DateFormat getDateFormat(){ return DateFormat("yyyy-MM-dd H:mm"); +} + +Future getDatabase() async { + return await $FloorPizzaDatabase.databaseBuilder("pizza.db").build(); } \ No newline at end of file