From 45e4c5426a9090407dc1d210361c22ca83d8aa65 Mon Sep 17 00:00:00 2001 From: davidpkj Date: Sun, 5 Mar 2023 12:19:12 +0100 Subject: Update database, bump to version 1.6.1 --- lib/constants.dart | 2 +- lib/models/data/recipe_data_class.dart | 11 +- lib/models/data/shoplist_data_class.dart | 1 - lib/models/recipe_class.dart | 23 +- lib/models/recipe_class.g.dart | 991 +++++++++++++++++++++++++++++++ lib/util/isar_handler.dart | 41 ++ lib/util/storage_handler.dart | 2 +- 7 files changed, 1049 insertions(+), 22 deletions(-) create mode 100644 lib/models/recipe_class.g.dart create mode 100644 lib/util/isar_handler.dart diff --git a/lib/constants.dart b/lib/constants.dart index 4e570fd..e7816cf 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -const cVersion = "1.4.0"; +const cVersion = "1.6.1"; // Colors const cIconColor = Colors.white; diff --git a/lib/models/data/recipe_data_class.dart b/lib/models/data/recipe_data_class.dart index 3f707bc..3984ac6 100644 --- a/lib/models/data/recipe_data_class.dart +++ b/lib/models/data/recipe_data_class.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:kulinar_app/models/recipe_class.dart'; +import 'package:kulinar_app/util/isar_handler.dart'; import 'package:kulinar_app/util/storage_handler.dart'; class RecipeData { @@ -8,11 +9,17 @@ class RecipeData { static List recipeList = []; static Future save() async { - await StorageHandler.store("recipes", encode()); + recipeList.forEach((recipe) { + IsarHandler().save(recipe); + }); } static Future load() async { - decode(await StorageHandler.fetch("recipes") ?? "[]"); + List list = await IsarHandler().load(); + + list.forEach((recipe) { + recipeList.add(recipe!); + }); } static String encode() { diff --git a/lib/models/data/shoplist_data_class.dart b/lib/models/data/shoplist_data_class.dart index 3956282..c8516c3 100644 --- a/lib/models/data/shoplist_data_class.dart +++ b/lib/models/data/shoplist_data_class.dart @@ -7,7 +7,6 @@ class ShoplistData { static List removed = []; static Future save() async { - print("asd"); await StorageHandler.store("shoplist", encode()); } diff --git a/lib/models/recipe_class.dart b/lib/models/recipe_class.dart index 6873a1f..e02ed87 100644 --- a/lib/models/recipe_class.dart +++ b/lib/models/recipe_class.dart @@ -1,8 +1,13 @@ -import 'dart:convert'; +import "package:isar/isar.dart"; import 'package:kulinar_app/models/data/recipe_data_class.dart'; +part "recipe_class.g.dart"; + +@collection class Recipe { + Id id = Isar.autoIncrement; + String? title; String? image; String? description; @@ -33,22 +38,6 @@ class Recipe { return true; } - static Recipe fromJson(String string) { - final json = jsonDecode(string); - - return Recipe(title: json["title"], image: json["image"], description: json["description"]); - } - - String toJsonString() { - Map map = { - "title": this.title ?? "", - "image": this.image ?? "", - "description": this.description ?? "", - }; - - return jsonEncode(map); - } - void toggleFavorite() { this.favorite = !this.favorite; } diff --git a/lib/models/recipe_class.g.dart b/lib/models/recipe_class.g.dart new file mode 100644 index 0000000..35c133d --- /dev/null +++ b/lib/models/recipe_class.g.dart @@ -0,0 +1,991 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'recipe_class.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters + +extension GetRecipeCollection on Isar { + IsarCollection get recipes => this.collection(); +} + +const RecipeSchema = CollectionSchema( + name: r'Recipe', + id: 8054415271972849591, + properties: { + r'description': PropertySchema( + id: 0, + name: r'description', + type: IsarType.string, + ), + r'favorite': PropertySchema( + id: 1, + name: r'favorite', + type: IsarType.bool, + ), + r'image': PropertySchema( + id: 2, + name: r'image', + type: IsarType.string, + ), + r'rating': PropertySchema( + id: 3, + name: r'rating', + type: IsarType.long, + ), + r'title': PropertySchema( + id: 4, + name: r'title', + type: IsarType.string, + ) + }, + estimateSize: _recipeEstimateSize, + serialize: _recipeSerialize, + deserialize: _recipeDeserialize, + deserializeProp: _recipeDeserializeProp, + idName: r'id', + indexes: {}, + links: {}, + embeddedSchemas: {}, + getId: _recipeGetId, + getLinks: _recipeGetLinks, + attach: _recipeAttach, + version: '3.0.5', +); + +int _recipeEstimateSize( + Recipe object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.description; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.image; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.title; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + return bytesCount; +} + +void _recipeSerialize( + Recipe object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.description); + writer.writeBool(offsets[1], object.favorite); + writer.writeString(offsets[2], object.image); + writer.writeLong(offsets[3], object.rating); + writer.writeString(offsets[4], object.title); +} + +Recipe _recipeDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = Recipe( + description: reader.readStringOrNull(offsets[0]), + favorite: reader.readBoolOrNull(offsets[1]) ?? false, + image: reader.readStringOrNull(offsets[2]), + rating: reader.readLongOrNull(offsets[3]) ?? 0, + title: reader.readStringOrNull(offsets[4]), + ); + object.id = id; + return object; +} + +P _recipeDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readStringOrNull(offset)) as P; + case 1: + return (reader.readBoolOrNull(offset) ?? false) as P; + case 2: + return (reader.readStringOrNull(offset)) as P; + case 3: + return (reader.readLongOrNull(offset) ?? 0) as P; + case 4: + return (reader.readStringOrNull(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _recipeGetId(Recipe object) { + return object.id; +} + +List> _recipeGetLinks(Recipe object) { + return []; +} + +void _recipeAttach(IsarCollection col, Id id, Recipe object) { + object.id = id; +} + +extension RecipeQueryWhereSort on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension RecipeQueryWhere on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } +} + +extension RecipeQueryFilter on QueryBuilder { + QueryBuilder descriptionIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'description', + )); + }); + } + + QueryBuilder descriptionIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'description', + )); + }); + } + + QueryBuilder descriptionEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'description', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'description', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder descriptionIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'description', + value: '', + )); + }); + } + + QueryBuilder descriptionIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'description', + value: '', + )); + }); + } + + QueryBuilder favoriteEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'favorite', + value: value, + )); + }); + } + + QueryBuilder idEqualTo(Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder imageIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'image', + )); + }); + } + + QueryBuilder imageIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'image', + )); + }); + } + + QueryBuilder imageEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'image', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder imageGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'image', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder imageLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'image', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder imageBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'image', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder imageStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'image', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder imageEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'image', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder imageContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'image', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder imageMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'image', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder imageIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'image', + value: '', + )); + }); + } + + QueryBuilder imageIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'image', + value: '', + )); + }); + } + + QueryBuilder ratingEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'rating', + value: value, + )); + }); + } + + QueryBuilder ratingGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'rating', + value: value, + )); + }); + } + + QueryBuilder ratingLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'rating', + value: value, + )); + }); + } + + QueryBuilder ratingBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'rating', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder titleIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'title', + )); + }); + } + + QueryBuilder titleIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'title', + )); + }); + } + + QueryBuilder titleEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder titleIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'title', + value: '', + )); + }); + } +} + +extension RecipeQueryObject on QueryBuilder {} + +extension RecipeQueryLinks on QueryBuilder {} + +extension RecipeQuerySortBy on QueryBuilder { + QueryBuilder sortByDescription() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.asc); + }); + } + + QueryBuilder sortByDescriptionDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.desc); + }); + } + + QueryBuilder sortByFavorite() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'favorite', Sort.asc); + }); + } + + QueryBuilder sortByFavoriteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'favorite', Sort.desc); + }); + } + + QueryBuilder sortByImage() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'image', Sort.asc); + }); + } + + QueryBuilder sortByImageDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'image', Sort.desc); + }); + } + + QueryBuilder sortByRating() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'rating', Sort.asc); + }); + } + + QueryBuilder sortByRatingDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'rating', Sort.desc); + }); + } + + QueryBuilder sortByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder sortByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } +} + +extension RecipeQuerySortThenBy on QueryBuilder { + QueryBuilder thenByDescription() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.asc); + }); + } + + QueryBuilder thenByDescriptionDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.desc); + }); + } + + QueryBuilder thenByFavorite() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'favorite', Sort.asc); + }); + } + + QueryBuilder thenByFavoriteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'favorite', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByImage() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'image', Sort.asc); + }); + } + + QueryBuilder thenByImageDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'image', Sort.desc); + }); + } + + QueryBuilder thenByRating() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'rating', Sort.asc); + }); + } + + QueryBuilder thenByRatingDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'rating', Sort.desc); + }); + } + + QueryBuilder thenByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder thenByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } +} + +extension RecipeQueryWhereDistinct on QueryBuilder { + QueryBuilder distinctByDescription( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'description', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByFavorite() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'favorite'); + }); + } + + QueryBuilder distinctByImage( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'image', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByRating() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'rating'); + }); + } + + QueryBuilder distinctByTitle( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'title', caseSensitive: caseSensitive); + }); + } +} + +extension RecipeQueryProperty on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder descriptionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'description'); + }); + } + + QueryBuilder favoriteProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'favorite'); + }); + } + + QueryBuilder imageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'image'); + }); + } + + QueryBuilder ratingProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'rating'); + }); + } + + QueryBuilder titleProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'title'); + }); + } +} diff --git a/lib/util/isar_handler.dart b/lib/util/isar_handler.dart new file mode 100644 index 0000000..8e26fc9 --- /dev/null +++ b/lib/util/isar_handler.dart @@ -0,0 +1,41 @@ +import 'package:isar/isar.dart'; + +import 'package:kulinar_app/models/recipe_class.dart'; + +/// Handles user data persistence related app storage +class IsarHandler { + late Future db; + + IsarHandler() { + db = _openDB(); + } + + /// Stores the given `data` as a string with the `key`. + Future save(Recipe recipe) async { + final isar = await db; + return await isar.writeTxn(() => isar.recipes.put(recipe)); + } + + /// Fetches all recipes + Future> load() async { + final isar = await db; + return await isar.recipes.where().findAll(); + } + + /// Fetches the Recipe related to the given `title`. + Future fetch(String title) async { + final isar = await db; + return await isar.recipes.filter().titleEqualTo(title).findFirst(); + } + + Future _openDB() async { + if (Isar.instanceNames.isEmpty) { + return await Isar.open( + [RecipeSchema], + inspector: true, + ); + } + + return Future.value(Isar.getInstance()); + } +} diff --git a/lib/util/storage_handler.dart b/lib/util/storage_handler.dart index 1e12ed7..fe27b93 100644 --- a/lib/util/storage_handler.dart +++ b/lib/util/storage_handler.dart @@ -1,6 +1,6 @@ import 'package:shared_preferences/shared_preferences.dart'; -/// Handles all persistance related app storage +/// Handles app data persistence related app storage class StorageHandler { /// Stores the given `data` as a string with the `key`. static Future store(String key, String data) async { -- cgit v1.2.3