Hive, requestlog, etc

This commit is contained in:
2024-05-25 18:09:39 +02:00
parent 227d7871c2
commit 7e347a70c2
23 changed files with 1149 additions and 355 deletions

View File

@@ -1 +1,29 @@
import 'package:hive_flutter/hive_flutter.dart';
part 'application_log.g.dart';
class ApplicationLog {}
enum SCNLogLevel { debug, info, warning, error, fatal }
@HiveType(typeId: 101)
class SCNLog extends HiveObject {
@HiveField(0)
final DateTime timestamp;
@HiveField(1)
final SCNLogLevel level;
@HiveField(2)
final String message;
@HiveField(3)
final String additional;
@HiveField(4)
final String trace;
SCNLog(
this.timestamp,
this.level,
this.message,
this.additional,
this.trace,
);
}

View File

@@ -0,0 +1,53 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'application_log.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class SCNLogAdapter extends TypeAdapter<SCNLog> {
@override
final int typeId = 101;
@override
SCNLog read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return SCNLog(
fields[0] as DateTime,
fields[1] as SCNLogLevel,
fields[2] as String,
fields[3] as String,
fields[4] as String,
);
}
@override
void write(BinaryWriter writer, SCNLog obj) {
writer
..writeByte(5)
..writeByte(0)
..write(obj.timestamp)
..writeByte(1)
..write(obj.level)
..writeByte(2)
..write(obj.message)
..writeByte(3)
..write(obj.additional)
..writeByte(4)
..write(obj.trace);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is SCNLogAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -1,46 +0,0 @@
import 'package:path_provider/path_provider.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'dart:io';
import 'package:path/path.dart' as path;
class SCNDatabase {
static SCNDatabase? instance = null;
final Database _db;
SCNDatabase._(this._db) {}
static create() async {
var docPath = await getApplicationDocumentsDirectory();
var dbpath = path.join(docPath.absolute.path, 'scn.db');
if (Platform.isWindows || Platform.isLinux) {
sqfliteFfiInit();
}
var db = await databaseFactoryFfi.openDatabase(dbpath,
options: OpenDatabaseOptions(
version: 1,
onCreate: (db, version) async {
initDatabase(db);
},
onUpgrade: (db, oldVersion, newVersion) async {
upgradeDatabase(db, oldVersion, newVersion);
},
));
return instance = SCNDatabase._(db);
}
static void initDatabase(Database db) async {
await db.execute('CREATE TABLE requests (id INTEGER PRIMARY KEY, timestamp DATETIME, name TEXT, url TEXT, response_code INTEGER, response TEXT, status TEXT)');
await db.execute('CREATE TABLE logs (id INTEGER PRIMARY KEY, timestamp DATETIME, level TEXT, text TEXT, additional TEXT)');
await db.execute('CREATE TABLE messages (message_id INTEGER PRIMARY KEY, receive_timestamp DATETIME, channel_id TEXT, timestamp TEXT, data JSON)');
}
static void upgradeDatabase(Database db, int oldVersion, int newVersion) {
// ...
}
}

View File

@@ -0,0 +1,31 @@
import 'dart:io';
import 'package:package_info_plus/package_info_plus.dart';
class Globals {
static final Globals _singleton = Globals._internal();
factory Globals() {
return _singleton;
}
Globals._internal();
String appName = '';
String packageName = '';
String version = '';
String buildNumber = '';
String platform = '';
String hostname = '';
init() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
this.appName = packageInfo.appName;
this.packageName = packageInfo.packageName;
this.version = packageInfo.version;
this.buildNumber = packageInfo.buildNumber;
this.platform = Platform.operatingSystem;
this.hostname = Platform.localHostname;
}
}

View File

@@ -1 +1,144 @@
import 'package:hive/hive.dart';
import 'package:simplecloudnotifier/models/api_error.dart';
part 'request_log.g.dart';
class RequestLog {
static void addRequestException(String name, DateTime tStart, String method, Uri uri, String reqbody, Map<String, String> reqheaders, dynamic e, StackTrace trace) {
Hive.box<SCNRequest>('scn-requests').add(SCNRequest(
timestampStart: tStart,
timestampEnd: DateTime.now(),
name: name,
method: method,
url: uri.toString(),
requestHeaders: reqheaders,
requestBody: reqbody,
responseStatusCode: 0,
responseHeaders: {},
responseBody: '',
type: 'EXCEPTION',
error: (e is Exception) ? e.toString() : '$e',
stackTrace: trace.toString(),
));
}
static void addRequestAPIError(String name, DateTime t0, String method, Uri uri, String reqbody, Map<String, String> reqheaders, int responseStatusCode, String responseBody, Map<String, String> responseHeaders, APIError apierr) {
Hive.box<SCNRequest>('scn-requests').add(SCNRequest(
timestampStart: t0,
timestampEnd: DateTime.now(),
name: name,
method: method,
url: uri.toString(),
requestHeaders: reqheaders,
requestBody: reqbody,
responseStatusCode: responseStatusCode,
responseHeaders: responseHeaders,
responseBody: responseBody,
type: 'API_ERROR',
error: apierr.message,
stackTrace: '',
));
}
static void addRequestErrorStatuscode(String name, DateTime t0, String method, Uri uri, String reqbody, Map<String, String> reqheaders, int responseStatusCode, String responseBody, Map<String, String> responseHeaders) {
Hive.box<SCNRequest>('scn-requests').add(SCNRequest(
timestampStart: t0,
timestampEnd: DateTime.now(),
name: name,
method: method,
url: uri.toString(),
requestHeaders: reqheaders,
requestBody: reqbody,
responseStatusCode: responseStatusCode,
responseHeaders: responseHeaders,
responseBody: responseBody,
type: 'ERROR_STATUSCODE',
error: 'API request failed with status code $responseStatusCode',
stackTrace: '',
));
}
static void addRequestSuccess(String name, DateTime t0, String method, Uri uri, String reqbody, Map<String, String> reqheaders, int responseStatusCode, String responseBody, Map<String, String> responseHeaders) {
Hive.box<SCNRequest>('scn-requests').add(SCNRequest(
timestampStart: t0,
timestampEnd: DateTime.now(),
name: name,
method: method,
url: uri.toString(),
requestHeaders: reqheaders,
requestBody: reqbody,
responseStatusCode: responseStatusCode,
responseHeaders: responseHeaders,
responseBody: responseBody,
type: 'SUCCESS',
error: '',
stackTrace: '',
));
}
static void addRequestDecodeError(String name, DateTime t0, String method, Uri uri, String reqbody, Map<String, String> reqheaders, int responseStatusCode, String responseBody, Map<String, String> responseHeaders, Object exc, StackTrace trace) {
Hive.box<SCNRequest>('scn-requests').add(SCNRequest(
timestampStart: t0,
timestampEnd: DateTime.now(),
name: name,
method: method,
url: uri.toString(),
requestHeaders: reqheaders,
requestBody: reqbody,
responseStatusCode: responseStatusCode,
responseHeaders: responseHeaders,
responseBody: responseBody,
type: 'DECODE_ERROR',
error: (exc is Exception) ? exc.toString() : '$exc',
stackTrace: trace.toString(),
));
}
}
@HiveType(typeId: 100)
class SCNRequest extends HiveObject {
@HiveField(0)
final DateTime timestampStart;
@HiveField(1)
final DateTime timestampEnd;
@HiveField(2)
final String name;
@HiveField(3)
final String type;
@HiveField(4)
final String error;
@HiveField(5)
final String stackTrace;
@HiveField(6)
final String method;
@HiveField(7)
final String url;
@HiveField(8)
final Map<String, String> requestHeaders;
@HiveField(12)
final String requestBody;
@HiveField(9)
final int responseStatusCode;
@HiveField(10)
final Map<String, String> responseHeaders;
@HiveField(11)
final String responseBody;
SCNRequest({
required this.timestampStart,
required this.timestampEnd,
required this.name,
required this.method,
required this.url,
required this.requestHeaders,
required this.requestBody,
required this.responseStatusCode,
required this.responseHeaders,
required this.responseBody,
required this.type,
required this.error,
required this.stackTrace,
});
}

View File

@@ -0,0 +1,77 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'request_log.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class SCNRequestAdapter extends TypeAdapter<SCNRequest> {
@override
final int typeId = 100;
@override
SCNRequest read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return SCNRequest(
timestampStart: fields[0] as DateTime,
timestampEnd: fields[1] as DateTime,
name: fields[2] as String,
method: fields[6] as String,
url: fields[7] as String,
requestHeaders: (fields[8] as Map).cast<String, String>(),
requestBody: fields[12] as String,
responseStatusCode: fields[9] as int,
responseHeaders: (fields[10] as Map).cast<String, String>(),
responseBody: fields[11] as String,
type: fields[3] as String,
error: fields[4] as String,
stackTrace: fields[5] as String,
);
}
@override
void write(BinaryWriter writer, SCNRequest obj) {
writer
..writeByte(13)
..writeByte(0)
..write(obj.timestampStart)
..writeByte(1)
..write(obj.timestampEnd)
..writeByte(2)
..write(obj.name)
..writeByte(3)
..write(obj.type)
..writeByte(4)
..write(obj.error)
..writeByte(5)
..write(obj.stackTrace)
..writeByte(6)
..write(obj.method)
..writeByte(7)
..write(obj.url)
..writeByte(8)
..write(obj.requestHeaders)
..writeByte(12)
..write(obj.requestBody)
..writeByte(9)
..write(obj.responseStatusCode)
..writeByte(10)
..write(obj.responseHeaders)
..writeByte(11)
..write(obj.responseBody);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is SCNRequestAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -71,7 +71,7 @@ class UserAccount extends ChangeNotifier {
throw Exception('Not authenticated');
}
final user = await APIClient.getUser(_auth!.userId, _auth!.token);
final user = await APIClient.getUser(_auth!, _auth!.userId);
setUser(user);