df/frontend/app/lib/data/database.dart
itsscb dc3a28ba5f ft/adds persistence (partial complete)
TODO: Load on start. Not working atm.
2023-10-29 23:58:06 +01:00

151 lines
4.5 KiB
Dart

import 'dart:async';
import 'package:fixnum/fixnum.dart';
import 'package:app/pb/google/protobuf/timestamp.pb.dart';
import 'package:flutter/services.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
class Session {
Session({
this.sessionId,
this.accessToken,
this.accessTokenExpiresAt,
this.refreshToken,
this.refreshTokenExpiresAt,
this.accountId,
}) {
_init();
}
String? sessionId;
String? accessToken;
String? refreshToken;
Timestamp? accessTokenExpiresAt;
Timestamp? refreshTokenExpiresAt;
Int64? accountId;
late Database _database;
Future<Database> get database async => _database;
static Future<Session> get newSession async {
final Database db = await openDatabase(
join(await getDatabasesPath(), 'df_database.db'),
onCreate: (db, version) {
return db.execute(
'CREATE TABLE sessions(accountId INTEGER PRIMARY KEY, sessionId TEXT, accessToken TEXT, accessTokenExpiresAt TEXT, refreshToken TEXT, refreshTokenExpiresAt TEXT)',
);
},
version: 1,
);
Session s = Session();
s._database = db;
return s;
}
void _init() {
_initDatabase();
}
Future<Database> _initDatabase() async {
print('DB: INITIALIZING - start');
_database = await openDatabase(
join(await getDatabasesPath(), 'df_database.db'),
onCreate: (db, version) {
return db.execute(
'CREATE TABLE sessions(accountId INTEGER PRIMARY KEY, sessionId TEXT, accessToken TEXT, accessTokenExpiresAt TEXT, refreshToken TEXT, refreshTokenExpiresAt TEXT)',
);
},
version: 1,
);
print('DB: INITIALIZING - end');
return _database;
}
Map<String, dynamic> toMap() {
return {
'accountId': accountId?.toInt(),
'sessionId': sessionId,
'accessToken': accessToken,
'accessTokenExpiresAt': accessTokenExpiresAt?.toDateTime().toString(),
'refreshToken': refreshToken,
'refreshTokenExpiresAt': refreshTokenExpiresAt?.toDateTime().toString(),
};
}
@override
String toString() {
return 'Session{accountId: $accountId, sessionId: $sessionId, accessToken: $accessToken, accessTokenExpiresAt: ${accessTokenExpiresAt.toString()}, refreshToken: $refreshToken, refreshTokenExpiresAt: ${refreshTokenExpiresAt.toString()}}';
}
Future<void> insertSession(Session session) async {
print('INSERTING SESSION: ${session.sessionId}');
final db = _database;
final result = await db.insert(
'sessions',
session.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace,
);
print('INSERT RESULT: $result');
}
Future<List<Session>> getSessions() async {
final db = await database;
final List<Map<String, Object?>> maps = await db.query('sessions');
final List<Session> sessions = List.generate(
maps.length,
(i) {
print('GOT MAP: ${maps[i]}');
return Session(
sessionId: maps[i]['sessionId'] as String,
accessToken: maps[i]['accessToken'] as String,
accessTokenExpiresAt: Timestamp.fromDateTime(
DateTime.parse(maps[i]['accessTokenExpiresAt'] as String)),
refreshToken: maps[i]['refreshToken'] as String,
refreshTokenExpiresAt: Timestamp.fromDateTime(
DateTime.parse(maps[i]['refreshTokenExpiresAt'] as String)),
accountId: Int64(maps[i]['accountId'] as int),
);
},
);
return sessions;
}
static Future<Session> getSession(Int64 accountId) async {
final Database db = await openDatabase(
join(await getDatabasesPath(), 'df_database.db'),
onCreate: (db, version) {
return db.execute(
'CREATE TABLE sessions(accountId INTEGER PRIMARY KEY, sessionId TEXT, accessToken TEXT, accessTokenExpiresAt TEXT, refreshToken TEXT, refreshTokenExpiresAt TEXT)',
);
},
version: 1,
);
final List<Map<String, Object?>> maps = await db.query('sessions',
where: 'accountId = ?', whereArgs: [accountId], limit: 1);
final List<Session> sessions = List.generate(
maps.length,
(i) {
return Session(
sessionId: maps[i]['sessionId'] as String,
accessToken: maps[i]['accessToken'] as String,
accessTokenExpiresAt: maps[i]['accessTokenExpiresAt'] as Timestamp,
refreshToken: maps[i]['refreshToken'] as String,
refreshTokenExpiresAt: maps[i]['refreshTokenExpiresAt'] as Timestamp,
accountId: maps[i]['accountId'] as Int64,
);
},
);
return sessions[0];
}
}