Surface/lib/database/drift_db.dart

82 lines
2.4 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:island/database/message.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
part 'drift_db.g.dart';
// Define the database
@DriftDatabase(tables: [ChatMessages])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
@override
int get schemaVersion => 1;
// Methods for chat messages
Future<List<ChatMessage>> getMessagesForRoom(
int roomId, {
int offset = 0,
int limit = 20,
}) {
return (select(chatMessages)
..where((m) => m.roomId.equals(roomId))
..orderBy([(m) => OrderingTerm.desc(m.createdAt)])
..limit(limit, offset: offset))
.get();
}
Future<int> saveMessage(ChatMessagesCompanion message) {
return into(chatMessages).insert(message, mode: InsertMode.insertOrReplace);
}
Future<int> updateMessageStatus(String id, MessageStatus status) {
return (update(chatMessages)..where(
(m) => m.id.equals(id),
)).write(ChatMessagesCompanion(status: Value(status)));
}
Future<int> deleteMessage(String id) {
return (delete(chatMessages)..where((m) => m.id.equals(id))).go();
}
// Convert between Drift and model objects
ChatMessagesCompanion messageToCompanion(LocalChatMessage message) {
return ChatMessagesCompanion(
id: Value(message.id),
roomId: Value(message.roomId),
senderId: Value(message.senderId),
content: Value(message.toRemoteMessage().content),
nonce: Value(message.nonce),
data: Value(jsonEncode(message.data)),
createdAt: Value(message.createdAt),
status: Value(message.status),
);
}
LocalChatMessage companionToMessage(ChatMessage dbMessage) {
final data = jsonDecode(dbMessage.data);
return LocalChatMessage(
id: dbMessage.id,
roomId: dbMessage.roomId,
senderId: dbMessage.senderId,
data: data,
createdAt: dbMessage.createdAt,
status: dbMessage.status,
nonce: dbMessage.nonce,
);
}
}
// Helper to open the database connection
LazyDatabase _openConnection() {
return LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'solar_network_data.sqlite'));
return NativeDatabase(file);
});
}