Skip to content

Commit

Permalink
objectbox userRelayList impl
Browse files Browse the repository at this point in the history
  • Loading branch information
leo-lox committed Dec 8, 2024
1 parent 790933f commit acedfb5
Show file tree
Hide file tree
Showing 4 changed files with 233 additions and 13 deletions.
40 changes: 31 additions & 9 deletions lib/data_layer/db/object_box_ndk/db_object_box.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'schema/db_contact_list.dart';
import 'schema/db_metadata.dart';
import 'schema/db_nip_01_event.dart';
import 'schema/db_nip_05.dart';
import 'schema/db_user_relay_list.dart';

class DbObjectBox implements CacheManager {
final Completer _initCompleter = Completer();
Expand Down Expand Up @@ -256,9 +257,18 @@ class DbObjectBox implements CacheManager {
}

@override
Future<UserRelayList?> loadUserRelayList(String pubKey) {
// TODO: implement loadUserRelayList
throw UnimplementedError();
Future<UserRelayList?> loadUserRelayList(String pubKey) async {
await _dbRdy;
final userRelayListBox = _objectBox.store.box<DbUserRelayList>();
final existingUserRelayList = userRelayListBox
.query(DbUserRelayList_.pubKey.equals(pubKey))
.order(DbUserRelayList_.createdAt, flags: Order.descending)
.build()
.findFirst();
if (existingUserRelayList == null) {
return null;
}
return existingUserRelayList.toNdk();
}

@override
Expand Down Expand Up @@ -345,15 +355,27 @@ class DbObjectBox implements CacheManager {
}

@override
Future<void> saveUserRelayList(UserRelayList userRelayList) {
// TODO: implement saveUserRelayList
throw UnimplementedError();
Future<void> saveUserRelayList(UserRelayList userRelayList) async {
await _dbRdy;
final userRelayListBox = _objectBox.store.box<DbUserRelayList>();
final existingUserRelayList = userRelayListBox
.query(DbUserRelayList_.pubKey.equals(userRelayList.pubKey))
.order(DbUserRelayList_.createdAt, flags: Order.descending)
.build()
.findFirst();
if (existingUserRelayList != null) {
userRelayListBox.remove(existingUserRelayList.dbId);
}
userRelayListBox.put(DbUserRelayList.fromNdk(userRelayList));
}

@override
Future<void> saveUserRelayLists(List<UserRelayList> userRelayLists) {
// TODO: implement saveUserRelayLists
throw UnimplementedError();
Future<void> saveUserRelayLists(List<UserRelayList> userRelayLists) async {
final wait = <Future>[];
for (final userRelayList in userRelayLists) {
wait.add(saveUserRelayList(userRelayList));
}
await Future.wait(wait);
}

@override
Expand Down
63 changes: 63 additions & 0 deletions lib/data_layer/db/object_box_ndk/schema/db_user_relay_list.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import 'dart:convert';

import 'package:ndk/entities.dart';
import 'package:objectbox/objectbox.dart';
import 'package:ndk/entities.dart' as ndk_entities;

@Entity()
class DbUserRelayList {
@Id()
int dbId = 0;

@Property()
String pubKey;

@Property()
int createdAt;

@Property()
int refreshedTimestamp;

@Property()
String relaysJson;

DbUserRelayList({
required this.pubKey,
required this.relaysJson,
required this.createdAt,
required this.refreshedTimestamp,
});

// Convert from UserRelayList to DbUserRelayList
static DbUserRelayList fromNdk(ndk_entities.UserRelayList userRelayList) {
return DbUserRelayList(
pubKey: userRelayList.pubKey,
relaysJson: _encodeRelays(userRelayList.relays),
createdAt: userRelayList.createdAt,
refreshedTimestamp: userRelayList.refreshedTimestamp,
);
}

// Convert to NDK model
ndk_entities.UserRelayList toNdk() {
return UserRelayList(
pubKey: pubKey,
relays: _decodeRelays(relaysJson),
createdAt: createdAt,
refreshedTimestamp: refreshedTimestamp,
);
}

// Helper method to encode relays map to JSON string
static String _encodeRelays(Map<String, ReadWriteMarker> relays) {
return json
.encode(relays.map((key, value) => MapEntry(key, value.toString())));
}

// Helper method to decode JSON string to relays map
static Map<String, ReadWriteMarker> _decodeRelays(String relaysJson) {
Map<String, dynamic> decodedMap = json.decode(relaysJson);
return decodedMap.map((key, value) => MapEntry(
key, ReadWriteMarker.values.firstWhere((e) => e.toString() == value)));
}
}
40 changes: 38 additions & 2 deletions lib/objectbox-model.json
Original file line number Diff line number Diff line change
Expand Up @@ -293,17 +293,53 @@
}
],
"relations": []
},
{
"id": "7:7121738077069950407",
"lastPropertyId": "6:3769539562209329664",
"name": "DbUserRelayList",
"properties": [
{
"id": "2:1626955690315208675",
"name": "pubKey",
"type": 9
},
{
"id": "3:2279200721602944096",
"name": "createdAt",
"type": 6
},
{
"id": "4:7429007344040003737",
"name": "refreshedTimestamp",
"type": 6
},
{
"id": "5:1857705759697671386",
"name": "relaysJson",
"type": 9
},
{
"id": "6:3769539562209329664",
"name": "dbId",
"type": 6,
"flags": 1
}
],
"relations": []
}
],
"lastEntityId": "6:5273186663970464575",
"lastEntityId": "7:7121738077069950407",
"lastIndexId": "1:6758634951668169698",
"lastRelationId": "0:0",
"lastSequenceId": "0:0",
"modelVersion": 5,
"modelVersionParserMinimum": 5,
"retiredEntityUids": [],
"retiredIndexUids": [],
"retiredPropertyUids": [],
"retiredPropertyUids": [
4498920375281389613
],
"retiredRelationUids": [],
"version": 1
}
103 changes: 101 additions & 2 deletions lib/objectbox.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit acedfb5

Please sign in to comment.