From a8008ae3a15b1e8cc0beb433fce586ac0b8a99a1 Mon Sep 17 00:00:00 2001 From: Felix Kirchner Date: Sat, 3 May 2025 17:22:18 +0200 Subject: [PATCH] Updated prints and json schema --- assets/schema.json | 45 ++++++++++++++--------- lib/services/local_storage_service.dart | 48 ++++++++++++++----------- pubspec.yaml | 4 ++- 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/assets/schema.json b/assets/schema.json index 429c926..17d7faa 100644 --- a/assets/schema.json +++ b/assets/schema.json @@ -1,15 +1,15 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Schema for cabo game data", + "title": "Generated schema for cabo game data", "type": "array", "items": { "type": "object", "properties": { - "gameTitle": { + "createdAt": { "type": "string" }, - "gameHasPointLimit": { - "type": "boolean" + "gameTitle": { + "type": "string" }, "players": { "type": "array", @@ -17,21 +17,30 @@ "type": "string" } }, - "playerScores": { - "type": "array", - "items": { - "type": "number" - } - }, - "roundNumber": { + "pointLimit": { "type": "number" }, + "caboPenalty": { + "type": "number" + }, + "isPointsLimitEnabled": { + "type": "boolean" + }, "isGameFinished": { "type": "boolean" }, "winner": { "type": "string" }, + "roundNumber": { + "type": "number" + }, + "playerScores": { + "type": "array", + "items": { + "type": "number" + } + }, "roundList": { "type": "array", "items": { @@ -43,7 +52,9 @@ "caboPlayerIndex": { "type": "number" }, - "kamikazePlayerIndex": {}, + "kamikazePlayerIndex": { + "type": ["number", "null"] + }, "scores": { "type": "array", "items": { @@ -60,7 +71,6 @@ "required": [ "roundNum", "caboPlayerIndex", - "kamikazePlayerIndex", "scores", "scoreUpdates" ] @@ -68,13 +78,16 @@ } }, "required": [ + "createdAt", "gameTitle", - "gameHasPointLimit", "players", - "playerScores", - "roundNumber", + "pointLimit", + "caboPenalty", + "isPointsLimitEnabled", "isGameFinished", "winner", + "roundNumber", + "playerScores", "roundList" ] } diff --git a/lib/services/local_storage_service.dart b/lib/services/local_storage_service.dart index f88e8e0..5f4b90a 100644 --- a/lib/services/local_storage_service.dart +++ b/lib/services/local_storage_service.dart @@ -7,10 +7,14 @@ import 'package:file_picker/file_picker.dart'; import 'package:file_saver/file_saver.dart'; import 'package:flutter/services.dart'; import 'package:json_schema/json_schema.dart'; +import 'package:logger/logger.dart'; import 'package:path_provider/path_provider.dart'; class LocalStorageService { static const String _fileName = 'game_data.json'; + static var logger = Logger( + printer: PrettyPrinter(), + ); /// Writes the game session list to a JSON file and returns it as string. static String getJsonFile() { @@ -32,38 +36,38 @@ class LocalStorageService { final file = await _getFilePath(); final jsonFile = getJsonFile(); await file.writeAsString(jsonFile); - print('Daten gespeichert'); + logger.i('Die Spieldaten wurden zwischengespeichert.'); } catch (e) { - print('Fehler beim Speichern: $e'); + logger.w('Fehler beim Speichern der Spieldaten. Exception: $e'); } } /// Loads the game data from a local JSON file. static Future loadGameSessions() async { - print('Versuche, Daten zu laden...'); + logger.d('Versuche, Daten zu laden...'); try { final file = await _getFilePath(); if (!await file.exists()) { - print('Es existiert noch keine Datei mit Spieldaten'); + logger.w('Es existiert noch keine Datei mit Spieldaten'); return false; } - print('Es existiert bereits eine Datei mit Spieldaten'); + logger.d('Es existiert bereits eine Datei mit Spieldaten'); final jsonString = await file.readAsString(); if (jsonString.isEmpty) { - print('Die gefundene Datei ist leer'); + logger.w('Die gefundene Datei ist leer'); return false; } if (!await validateJsonSchema(jsonString)) { - print('Die Datei konnte nicht validiert werden'); + logger.w('Die Datei konnte nicht validiert werden'); Globals.gameList = []; return false; } - - print('Die gefundene Datei ist nicht leer und validiert'); + logger.d('Die gefundene Datei hat Inhalt'); + logger.d('Die gefundene Datei wurde erfolgreich validiert'); final jsonList = json.decode(jsonString) as List; Globals.gameList = jsonList @@ -71,10 +75,11 @@ class LocalStorageService { GameSession.fromJson(jsonItem as Map)) .toList(); - print('Die Daten wurden erfolgreich geladen und verarbeitet'); + logger.i('Die Spieldaten wurden erfolgreich geladen und verarbeitet'); return true; } catch (e) { - print('Fehler beim Laden der Spieldaten:\n$e'); + logger.e('Fehler beim Laden der Spieldaten:\n$e', + error: 'JSON nicht geladen'); Globals.gameList = []; return false; } @@ -91,10 +96,11 @@ class LocalStorageService { ext: 'json', mimeType: MimeType.json, ); - print('Datei gespeichert: $result'); + logger.i('Die Spieldaten wurden exportiert. Dateipfad: $result'); return true; } catch (e) { - print('Fehler beim Speichern: $e'); + logger.w('Fehler beim Exportieren der Spieldaten. Exception: $e', + error: 'JSON nicht exportiert'); return false; } } @@ -108,7 +114,7 @@ class LocalStorageService { ); if (result == null) { - print('Der Dialog wurde abgebrochen'); + logger.d('Der Filepicker-Dialog wurde abgebrochen'); return false; } @@ -119,17 +125,18 @@ class LocalStorageService { return false; } final jsonData = json.decode(jsonString) as List; - print('JSON Inhalt: $jsonData'); Globals.gameList = jsonData .map((jsonItem) => GameSession.fromJson(jsonItem as Map)) .toList(); + logger.i('Die Datei wurde erfolgreich Importiertn'); return true; } on FormatException catch (e) { - print('Ungültiges JSON-Format: $e'); + logger.e('Ungültiges JSON-Format. Exception: $e', error: 'Formatfehler'); return false; } on Exception catch (e) { - print('Fehler beim Dateizugriff: $e'); + logger.e('Fehler beim Dateizugriff. Exception: $e', + error: 'Dateizugriffsfehler'); return false; } } @@ -151,13 +158,14 @@ class LocalStorageService { final result = schema.validate(jsonData); if (result.isValid) { - print('JSON ist erfolgreich validiert.'); + logger.d('JSON ist erfolgreich validiert.'); return true; } - print('JSON ist nicht gültig: ${result.errors}'); + logger.w('JSON ist nicht gültig.\nFehler: ${result.errors}'); return false; } catch (e) { - print('Fehler beim Validieren des JSON-Schemas: $e'); + logger.e('Fehler beim Validieren des JSON-Schemas: $e', + error: 'Validierung fehlgeschlagen'); return false; } } diff --git a/pubspec.yaml b/pubspec.yaml index 2941c3d..1a829fa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: cabo_counter description: "Mobile app for the card game Cabo" publish_to: 'none' -version: 0.1.6-alpha+138 +version: 0.1.6-alpha+145 environment: sdk: ^3.5.4 @@ -21,6 +21,7 @@ dependencies: url_launcher: any json_schema: ^5.2.1 shared_preferences: ^2.5.3 + logger: ^2.5.0 dev_dependencies: flutter_test: @@ -33,3 +34,4 @@ flutter: uses-material-design: false assets: - assets/cabo-counter-logo_rounded.png + - assets/schema.json