mirror of
https://github.com/wger-project/flutter.git
synced 2026-02-18 00:17:48 +01:00
Refactor the django powersync connector
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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"]}',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user