Refactor the django powersync connector

This commit is contained in:
Roland Geider
2025-11-05 16:51:43 +01:00
parent dd3f993d11
commit e975eee9f2
4 changed files with 14 additions and 33 deletions

View File

@@ -7,6 +7,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:stream_transform/stream_transform.dart';
import 'package:wger/powersync/connector.dart';
import 'package:wger/powersync/schema.dart';
import 'package:wger/providers/wger_base_riverpod.dart';
part 'powersync.g.dart';
@@ -19,8 +20,9 @@ Future<PowerSyncDatabase> powerSyncInstance(Ref ref) async {
);
await db.initialize();
DjangoConnector? currentConnector;
currentConnector = DjangoConnector();
final baseProvider = ref.read(wgerBaseProvider);
final currentConnector = DjangoConnector(baseUrl: baseProvider.auth.serverUrl!);
db.connect(connector: currentConnector);
// if (ref.read(sessionProvider).value != null) {

View File

@@ -26,13 +26,13 @@ import 'package:wger/helpers/shared_preferences.dart';
import '../helpers/consts.dart';
class ApiClient {
final _logger = Logger('powersync-ApiClient');
late final uri = Uri.parse('$baseUrl/api/v2/upload-powersync-data');
final _logger = Logger('Powersync ApiClient');
late final uri = Uri.parse('$serverUrl/api/v2/upload-powersync-data');
final String baseUrl;
final String serverUrl;
String token = '';
ApiClient(this.baseUrl);
ApiClient(this.serverUrl);
Map<String, String> getHeaders() {
return {
@@ -54,7 +54,7 @@ class ApiClient {
token = apiData['token'];
final response = await http.get(
Uri.parse('$baseUrl/api/v2/powersync-token'),
Uri.parse('$serverUrl/api/v2/powersync-token'),
headers: {
HttpHeaders.contentTypeHeader: 'application/json',
HttpHeaders.authorizationHeader: 'Token ${apiData["token"]}',

View File

@@ -28,22 +28,20 @@ final List<RegExp> fatalResponseCodes = [
// Class 22 — Data Exception
// Examples include data type mismatch.
RegExp(r'^22...$'),
// Class 23 — Integrity Constraint Violation.
// Examples include NOT NULL, FOREIGN KEY and UNIQUE violations.
RegExp(r'^23...$'),
// INSUFFICIENT PRIVILEGE - typically a row-level security violation
RegExp(r'^42501$'),
];
class DjangoConnector extends PowerSyncBackendConnector {
late String baseUrl;
late ApiClient apiClient;
final String baseUrl;
final ApiClient apiClient;
DjangoConnector({String? baseUrl}) {
this.baseUrl = baseUrl ?? 'http://localhost:8000';
apiClient = ApiClient(this.baseUrl);
}
DjangoConnector({required this.baseUrl}) : apiClient = ApiClient(baseUrl);
/// Get a token to authenticate against the PowerSync instance.
@override

View File

@@ -23,7 +23,6 @@ import 'package:logging/logging.dart';
import 'package:provider/provider.dart';
import 'package:rive/rive.dart';
import 'package:wger/l10n/generated/app_localizations.dart';
import 'package:wger/powersync/connector.dart';
import 'package:wger/providers/auth.dart';
import 'package:wger/providers/body_weight.dart';
import 'package:wger/providers/exercise_state_notifier.dart';
@@ -59,9 +58,6 @@ class _HomeTabsScreenState extends riverpod.ConsumerState<HomeTabsScreen>
void initState() {
super.initState();
// do we need to await this? or if it's async, how do we handle failures?
_setupPowersync();
// Loading data here, since the build method can be called more than once
_initialData = _loadEntries();
}
@@ -72,21 +68,6 @@ class _HomeTabsScreenState extends riverpod.ConsumerState<HomeTabsScreen>
});
}
Future<void> _setupPowersync() async {
final authProvider = context.read<AuthProvider>();
final baseUrl = authProvider.serverUrl!;
final connector = DjangoConnector(baseUrl: baseUrl);
// try {
// TODO: should we cache these credentials? that's what their demo does?
// we could maybe get the initial token from the /api/v2/login call
final credentials = await connector.fetchCredentials();
widget._logger.fine('fetched credentials: $credentials');
// } catch (e) {
// widget._logger.warning('failed to fetchCredentials: $e');
// }/
}
final _screenList = [
const DashboardScreen(),
const RoutineListScreen(),