import 'dart:developer';
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/models.dart';
import 'package:notes_tasks/appwrite/account.dart';
import 'client.dart';
final Database database = Database(client);
class Database extends Databases {
static const databaseId = '6566589714f646a1b072';
static const notesCollectionId = '656658c1d82904d25cde';
static Database? _instance;
Database._private(Client client) : super(client);
factory Database(Client client) {
_instance ??= Database._private(client);
return _instance!;
}
Future<T> wrap<T>(Future<T> Function() closure) async {
try {
return await closure();
} catch (e) {
inspect(e);
try {
var jwt = await account.createJWT();
client.setJWT(jwt.jwt);
return await closure();
} catch (e) {
inspect(e);
// TODO: Rather check error type string.
if (e is AppwriteException && e.code == 401) {
// TODO: Create and send a Bloc event, listen to it in view and redirect to login screen.
rethrow;
}
throw Exception('Unexpected error while refreshing JWT.'
'Check the database configuration.');
}
}
}
@override
Future<DocumentList> listDocuments({
String databaseId = databaseId,
required String collectionId,
List<String>? queries,
}) async {
return wrap(() => super.listDocuments(
databaseId: databaseId,
collectionId: collectionId,
queries: queries,
));
}
@override
Future<Document> getDocument({
String databaseId = databaseId,
required String collectionId,
required String documentId,
List<String>? queries,
}) {
return wrap(() => super.getDocument(
databaseId: databaseId,
collectionId: collectionId,
documentId: documentId,
queries: queries,
));
}
}