Add optional KYC flow and service-backed account limits

This commit is contained in:
Stephan D committed 2026-09-12 09:28:24 +02:00
1 parent 61ccfc1844
commit 3397f04ab7
38 files changed
+3443 -36

No files matched your search

@@ -2,11 +2,22 @@ import 'dart:async';
import 'dart:collection';
import 'dart:math';
enum JourneyKind { login, signup, verification }
enum JourneyKind { login, signup, verification, kyc }
enum JourneyStep { login, signup, emailDelivery, emailConfirmation }
enum JourneyStep {
login,
signup,
emailDelivery,
emailConfirmation,
kycPreparation,
kycPassport,
kycSelfie,
kycSubmission,
kycStatus,
}
enum JourneySignal {
cancelled,
started,
requested,
succeeded,
@@ -16,6 +27,7 @@ enum JourneySignal {
}
enum JourneyFailure {
document,
invalidCredentials,
emailInUse,
unavailable,
@@ -66,8 +78,13 @@ class AnalyticsEvent {
final bool terminal;
final bool simulated;
final DateTime occurredAt;
String get name =>
'auth_${step == null ? 'journey' : _snake(step!.name)}_${signal.name}';
String get name {
final area = kind == JourneyKind.kyc ? 'kyc' : 'auth';
var stage = step == null ? 'journey' : _snake(step!.name);
if (kind == JourneyKind.kyc) stage = stage.replaceFirst('kyc_', '');
return '${area}_${stage}_${signal.name}';
}
Map<String, Object> get properties => Map.unmodifiable({
'schema_version': 1,
'event_id': eventId,
@@ -165,16 +182,19 @@ class JourneyRecorder {
bool simulated = false,
JourneyFailure? failure,
bool terminal = false,
bool cancelled = false,
}) {
final journey = operation._journey;
if (_disposed || operation._finished || journey.closed) return;
operation._finished = true;
journey.pending--;
journey.simulated |= simulated;
final complete = failure == null && terminal;
final complete = failure == null && !cancelled && terminal;
_emit(
journey,
failure != null
cancelled
? JourneySignal.cancelled
: failure != null
? JourneySignal.failed
: (simulated || (complete && journey.simulated))
? JourneySignal.simulated