diff options
author | davidpkj <davidpenkow1@gmail.com> | 2023-03-05 12:19:12 +0100 |
---|---|---|
committer | davidpkj <davidpenkow1@gmail.com> | 2023-03-05 12:19:12 +0100 |
commit | 45e4c5426a9090407dc1d210361c22ca83d8aa65 (patch) | |
tree | 6c024bd5f3ab61d0f6f4fecf06d180e5c660623f | |
parent | b654999240fbfc4e6c19badb93c7ec54ff4afab6 (diff) |
Update database, bump to version 1.6.1
-rw-r--r-- | lib/constants.dart | 2 | ||||
-rw-r--r-- | lib/models/data/recipe_data_class.dart | 11 | ||||
-rw-r--r-- | lib/models/data/shoplist_data_class.dart | 1 | ||||
-rw-r--r-- | lib/models/recipe_class.dart | 23 | ||||
-rw-r--r-- | lib/models/recipe_class.g.dart | 991 | ||||
-rw-r--r-- | lib/util/isar_handler.dart | 41 | ||||
-rw-r--r-- | lib/util/storage_handler.dart | 2 |
7 files changed, 1049 insertions, 22 deletions
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<Recipe> recipeList = []; static Future<void> save() async { - await StorageHandler.store("recipes", encode()); + recipeList.forEach((recipe) { + IsarHandler().save(recipe); + }); } static Future<void> load() async { - decode(await StorageHandler.fetch("recipes") ?? "[]"); + List<Recipe?> 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<String> removed = []; static Future<void> 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<String, String> 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<Recipe> 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<int> offsets, + Map<Type, List<int>> 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<int> offsets, + Map<Type, List<int>> 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<int> offsets, + Map<Type, List<int>> 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<P>( + IsarReader reader, + int propertyId, + int offset, + Map<Type, List<int>> 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<IsarLinkBase<dynamic>> _recipeGetLinks(Recipe object) { + return []; +} + +void _recipeAttach(IsarCollection<dynamic> col, Id id, Recipe object) { + object.id = id; +} + +extension RecipeQueryWhereSort on QueryBuilder<Recipe, Recipe, QWhere> { + QueryBuilder<Recipe, Recipe, QAfterWhere> anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension RecipeQueryWhere on QueryBuilder<Recipe, Recipe, QWhereClause> { + QueryBuilder<Recipe, Recipe, QAfterWhereClause> idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterWhereClause> 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<Recipe, Recipe, QAfterWhereClause> idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterWhereClause> idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterWhereClause> 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<Recipe, Recipe, QFilterCondition> { + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> descriptionIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'description', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> descriptionIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'description', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> descriptionEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> descriptionStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> descriptionEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> descriptionContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'description', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> descriptionMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'description', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> descriptionIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'description', + value: '', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> descriptionIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'description', + value: '', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> favoriteEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'favorite', + value: value, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> idEqualTo(Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> imageIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'image', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> imageIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'image', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> imageEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'image', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> imageStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'image', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> imageEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'image', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> imageContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'image', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> imageMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'image', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> imageIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'image', + value: '', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> imageIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'image', + value: '', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> ratingEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'rating', + value: value, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> ratingGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'rating', + value: value, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> ratingLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'rating', + value: value, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> titleIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'title', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> titleIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'title', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> titleEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> 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<Recipe, Recipe, QAfterFilterCondition> titleStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> titleEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> titleContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> titleMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> titleIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterFilterCondition> titleIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'title', + value: '', + )); + }); + } +} + +extension RecipeQueryObject on QueryBuilder<Recipe, Recipe, QFilterCondition> {} + +extension RecipeQueryLinks on QueryBuilder<Recipe, Recipe, QFilterCondition> {} + +extension RecipeQuerySortBy on QueryBuilder<Recipe, Recipe, QSortBy> { + QueryBuilder<Recipe, Recipe, QAfterSortBy> sortByDescription() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> sortByDescriptionDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.desc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> sortByFavorite() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'favorite', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> sortByFavoriteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'favorite', Sort.desc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> sortByImage() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'image', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> sortByImageDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'image', Sort.desc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> sortByRating() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'rating', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> sortByRatingDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'rating', Sort.desc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> sortByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> sortByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } +} + +extension RecipeQuerySortThenBy on QueryBuilder<Recipe, Recipe, QSortThenBy> { + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByDescription() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByDescriptionDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'description', Sort.desc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByFavorite() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'favorite', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByFavoriteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'favorite', Sort.desc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByImage() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'image', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByImageDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'image', Sort.desc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByRating() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'rating', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByRatingDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'rating', Sort.desc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder<Recipe, Recipe, QAfterSortBy> thenByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } +} + +extension RecipeQueryWhereDistinct on QueryBuilder<Recipe, Recipe, QDistinct> { + QueryBuilder<Recipe, Recipe, QDistinct> distinctByDescription( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'description', caseSensitive: caseSensitive); + }); + } + + QueryBuilder<Recipe, Recipe, QDistinct> distinctByFavorite() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'favorite'); + }); + } + + QueryBuilder<Recipe, Recipe, QDistinct> distinctByImage( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'image', caseSensitive: caseSensitive); + }); + } + + QueryBuilder<Recipe, Recipe, QDistinct> distinctByRating() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'rating'); + }); + } + + QueryBuilder<Recipe, Recipe, QDistinct> distinctByTitle( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'title', caseSensitive: caseSensitive); + }); + } +} + +extension RecipeQueryProperty on QueryBuilder<Recipe, Recipe, QQueryProperty> { + QueryBuilder<Recipe, int, QQueryOperations> idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder<Recipe, String?, QQueryOperations> descriptionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'description'); + }); + } + + QueryBuilder<Recipe, bool, QQueryOperations> favoriteProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'favorite'); + }); + } + + QueryBuilder<Recipe, String?, QQueryOperations> imageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'image'); + }); + } + + QueryBuilder<Recipe, int, QQueryOperations> ratingProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'rating'); + }); + } + + QueryBuilder<Recipe, String?, QQueryOperations> 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<Isar> db; + + IsarHandler() { + db = _openDB(); + } + + /// Stores the given `data` as a string with the `key`. + Future<int> save(Recipe recipe) async { + final isar = await db; + return await isar.writeTxn<int>(() => isar.recipes.put(recipe)); + } + + /// Fetches all recipes + Future<List<Recipe>> load() async { + final isar = await db; + return await isar.recipes.where().findAll(); + } + + /// Fetches the Recipe related to the given `title`. + Future<Recipe?> fetch(String title) async { + final isar = await db; + return await isar.recipes.filter().titleEqualTo(title).findFirst(); + } + + Future<Isar> _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<String> store(String key, String data) async { |