✨ Basic messages & loading
This commit is contained in:
81
lib/database/drift_db.dart
Normal file
81
lib/database/drift_db.dart
Normal file
@ -0,0 +1,81 @@
|
||||
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, 'island_chat.sqlite'));
|
||||
return NativeDatabase(file);
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user