Add stable share fingerprints and near-match conflict routing

This commit is contained in:
Rijad Zuzo
2026-02-19 00:52:20 +01:00
parent d8d96e53e8
commit 0347ee1c0a
6 changed files with 303 additions and 1 deletions
+17 -1
View File
@@ -335,12 +335,14 @@ class SourceProfileLink {
required this.lastSeenAt,
this.sourceUserId,
this.sourceThreadId,
this.sourceFingerprint,
});
final String id;
final String sourceApp;
final String? sourceUserId;
final String? sourceThreadId;
final String? sourceFingerprint;
final String normalizedDisplayName;
final String profileId;
final DateTime firstSeenAt;
@@ -351,6 +353,7 @@ class SourceProfileLink {
String? sourceApp,
String? sourceUserId,
String? sourceThreadId,
String? sourceFingerprint,
String? normalizedDisplayName,
String? profileId,
DateTime? firstSeenAt,
@@ -361,6 +364,7 @@ class SourceProfileLink {
sourceApp: sourceApp ?? this.sourceApp,
sourceUserId: sourceUserId ?? this.sourceUserId,
sourceThreadId: sourceThreadId ?? this.sourceThreadId,
sourceFingerprint: sourceFingerprint ?? this.sourceFingerprint,
normalizedDisplayName:
normalizedDisplayName ?? this.normalizedDisplayName,
profileId: profileId ?? this.profileId,
@@ -375,6 +379,7 @@ class SourceProfileLink {
'sourceApp': sourceApp,
'sourceUserId': sourceUserId,
'sourceThreadId': sourceThreadId,
'sourceFingerprint': sourceFingerprint,
'normalizedDisplayName': normalizedDisplayName,
'profileId': profileId,
'firstSeenAt': firstSeenAt.toUtc().toIso8601String(),
@@ -388,6 +393,7 @@ class SourceProfileLink {
sourceApp: json['sourceApp'] as String,
sourceUserId: json['sourceUserId'] as String?,
sourceThreadId: json['sourceThreadId'] as String?,
sourceFingerprint: json['sourceFingerprint'] as String?,
normalizedDisplayName: json['normalizedDisplayName'] as String? ?? '',
profileId: json['profileId'] as String,
firstSeenAt: DateTime.parse(json['firstSeenAt'] as String).toLocal(),
@@ -480,7 +486,11 @@ class SharedMessageEntry {
}
}
enum SharedInboxReason { ambiguousProfileMatch, missingIdentity }
enum SharedInboxReason {
ambiguousProfileMatch,
nearProfileConflict,
missingIdentity,
}
@immutable
class SharedInboxEntry {
@@ -493,6 +503,7 @@ class SharedInboxEntry {
required this.reason,
required this.candidateProfileIds,
required this.normalizedDisplayName,
this.sourceFingerprint,
this.sourceDisplayName,
this.sourceUserId,
this.sourceThreadId,
@@ -506,6 +517,7 @@ class SharedInboxEntry {
final SharedInboxReason reason;
final List<String> candidateProfileIds;
final String normalizedDisplayName;
final String? sourceFingerprint;
final String? sourceDisplayName;
final String? sourceUserId;
final String? sourceThreadId;
@@ -519,6 +531,7 @@ class SharedInboxEntry {
SharedInboxReason? reason,
List<String>? candidateProfileIds,
String? normalizedDisplayName,
String? sourceFingerprint,
String? sourceDisplayName,
String? sourceUserId,
String? sourceThreadId,
@@ -533,6 +546,7 @@ class SharedInboxEntry {
candidateProfileIds: candidateProfileIds ?? this.candidateProfileIds,
normalizedDisplayName:
normalizedDisplayName ?? this.normalizedDisplayName,
sourceFingerprint: sourceFingerprint ?? this.sourceFingerprint,
sourceDisplayName: sourceDisplayName ?? this.sourceDisplayName,
sourceUserId: sourceUserId ?? this.sourceUserId,
sourceThreadId: sourceThreadId ?? this.sourceThreadId,
@@ -549,6 +563,7 @@ class SharedInboxEntry {
'reason': reason.name,
'candidateProfileIds': candidateProfileIds,
'normalizedDisplayName': normalizedDisplayName,
'sourceFingerprint': sourceFingerprint,
'sourceDisplayName': sourceDisplayName,
'sourceUserId': sourceUserId,
'sourceThreadId': sourceThreadId,
@@ -573,6 +588,7 @@ class SharedInboxEntry {
.map((dynamic id) => '$id')
.toList(growable: false),
normalizedDisplayName: json['normalizedDisplayName'] as String? ?? '',
sourceFingerprint: json['sourceFingerprint'] as String?,
sourceDisplayName: json['sourceDisplayName'] as String?,
sourceUserId: json['sourceUserId'] as String?,
sourceThreadId: json['sourceThreadId'] as String?,