Skip to content

Commit 89b4b3a

Browse files
fix 502 errors, add ClientHelper.api call missing in services & other fixes
1 parent 2b2b615 commit 89b4b3a

9 files changed

Lines changed: 193 additions & 179 deletions

File tree

school_data_hub_flutter/lib/core/client/client_helper.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class ClientHelper {
2424
} on ServerpodClientException catch (e) {
2525
_notificationService.apiRunning(false);
2626
_notificationService.showInformationDialog(
27-
'Client error calling $call: $e',
27+
'API Fehler: ${errorMessage ?? "Unbekannt"}: $e',
2828
);
2929

3030
if (e.toString().contains('Not authorized') ||

school_data_hub_flutter/lib/features/_pupil/presentation/pupil_profile_page/widgets/pupil_profile_page_content/communication_content/pupil_profile_communication_content.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_it/flutter_it.dart';
23
import 'package:gap/gap.dart';
34
import 'package:school_data_hub_client/school_data_hub_client.dart';
4-
import 'package:school_data_hub_flutter/core/models/datetime_extensions.dart';
55
import 'package:school_data_hub_flutter/common/theme/app_colors.dart';
66
import 'package:school_data_hub_flutter/common/widgets/dialogs/confirmation_dialog.dart';
77
import 'package:school_data_hub_flutter/common/widgets/dialogs/information_dialog.dart';
8+
import 'package:school_data_hub_flutter/core/models/datetime_extensions.dart';
89
import 'package:school_data_hub_flutter/core/session/hub_session_manager.dart';
910
import 'package:school_data_hub_flutter/features/_pupil/domain/models/enums.dart';
1011
import 'package:school_data_hub_flutter/features/_pupil/domain/models/pupil_proxy.dart';
1112
import 'package:school_data_hub_flutter/features/_pupil/domain/pupil_mutator.dart';
1213
import 'package:school_data_hub_flutter/features/_pupil/presentation/pupil_profile_page/widgets/pupil_profile_page_content/communication_content/communication_values.dart';
1314
import 'package:school_data_hub_flutter/features/_pupil/presentation/pupil_profile_page/widgets/pupil_profile_page_content/communication_content/dialogs/language_dialog.dart';
1415
import 'package:school_data_hub_flutter/features/_pupil/presentation/pupil_profile_page/widgets/pupil_profile_page_content/widgets/pupil_profile_content_widgets.dart';
15-
import 'package:flutter_it/flutter_it.dart';
1616

1717
class PupilProfileCommunicationContent extends WatchingWidget {
1818
final PupilProxy pupil;
@@ -45,6 +45,18 @@ class PupilProfileCommunicationContent extends WatchingWidget {
4545
value: pupil.language,
4646
),
4747
const Gap(8),
48+
PupilProfileContentRow(
49+
icon: Icons.person_outline,
50+
label: 'Migrationshintergrund',
51+
value: pupil.migrationBackground ? 'Ja' : 'Nein',
52+
),
53+
const Gap(8),
54+
PupilProfileContentRow(
55+
icon: Icons.person_outline,
56+
label: 'Staatsangehörigkeit',
57+
value: pupil.nationality ?? 'Kein Eintrag',
58+
),
59+
const Gap(8),
4860
PupilProfileContentRow(
4961
icon: Icons.support_outlined,
5062
label: 'Erstförderung',

school_data_hub_flutter/lib/features/_pupil/presentation/pupil_profile_page/widgets/pupil_profile_page_content/language_content/pupil_language_card.dart

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,6 @@ class PupilLanguageCard extends StatelessWidget {
5757
],
5858
),
5959
const Gap(5),
60-
Row(
61-
children: [
62-
const Text('Staatsangehörigkeit:'),
63-
const Gap(5),
64-
Text(
65-
pupil.nationality ?? 'Kein Eintrag',
66-
style: const TextStyle(fontWeight: FontWeight.bold),
67-
),
68-
],
69-
),
7060
],
7161
),
7262
),
Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter_it/flutter_it.dart';
22
import 'package:school_data_hub_client/school_data_hub_client.dart';
3+
import 'package:school_data_hub_flutter/core/client/client_helper.dart';
34

45
/// API service for competence CRUD operations.
56
///
@@ -8,39 +9,54 @@ class CompetenceApiService {
89
Client get _client => di<Client>();
910

1011
/// Fetch all competences from the server.
11-
Future<List<Competence>> getAllCompetences() async {
12-
return _client.competence.getAllCompetences();
12+
Future<List<Competence>?> getAllCompetences() async {
13+
return ClientHelper.apiCall(
14+
call: () => _client.competence.getAllCompetences(),
15+
errorMessage: 'Kompetenzen',
16+
);
1317
}
1418

1519
/// Create a new competence.
16-
Future<Competence> postCompetence({
20+
Future<Competence?> postCompetence({
1721
int? parentCompetence,
1822
required String name,
1923
required List<String> level,
2024
required List<String> indicators,
2125
}) async {
22-
return _client.competence.postCompetence(
23-
parentCompetence: parentCompetence,
24-
name: name,
25-
level: level,
26-
indicators: indicators,
26+
return ClientHelper.apiCall(
27+
call: () => _client.competence.postCompetence(
28+
parentCompetence: parentCompetence,
29+
name: name,
30+
level: level,
31+
indicators: indicators,
32+
),
33+
errorMessage: 'Kompetenz erstellen',
2734
);
2835
}
2936

3037
/// Update an existing competence.
31-
Future<Competence> updateCompetence(Competence competence) async {
32-
return _client.competence.updateCompetence(competence);
38+
Future<Competence?> updateCompetence(Competence competence) async {
39+
return ClientHelper.apiCall(
40+
call: () => _client.competence.updateCompetence(competence),
41+
errorMessage: 'Kompetenz aktualisieren',
42+
);
3343
}
3444

3545
/// Delete a competence by its public ID. Returns `true` on success.
36-
Future<bool> deleteCompetence(int publicId) async {
37-
return _client.competence.deleteCompetence(publicId);
46+
Future<bool?> deleteCompetence(int publicId) async {
47+
return ClientHelper.apiCall(
48+
call: () => _client.competence.deleteCompetence(publicId),
49+
errorMessage: 'Kompetenz löschen',
50+
);
3851
}
3952

4053
/// Import competences from a previously-uploaded JSON file.
41-
Future<List<Competence>> importCompetencesFromJsonFile(
54+
Future<List<Competence>?> importCompetencesFromJsonFile(
4255
String filePath,
4356
) async {
44-
return _client.adminCategories.importCompetencesFromJsonFile(filePath);
57+
return ClientHelper.apiCall(
58+
call: () => _client.adminCategories.importCompetencesFromJsonFile(filePath),
59+
errorMessage: 'Kompetenzen importieren',
60+
);
4561
}
4662
}

school_data_hub_flutter/lib/features/learning/_competence/domain/competence_manager.dart

Lines changed: 52 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -129,49 +129,34 @@ class CompetenceManager {
129129
//- the CompetenceFilterManager is not registered in the di yet
130130

131131
Future<void> firstFetchCompetences() async {
132-
final List<Competence> competences = await _competenceApiService
133-
.getAllCompetences();
134-
if (competences.isNotEmpty) {
132+
final competences = await _competenceApiService.getAllCompetences();
133+
if (competences != null && competences.isNotEmpty) {
135134
_competences.value = competences;
136-
137135
_envManager.setPopulatedEnvServerData(competences: true);
138-
139136
_rootCompetencesMap.clear();
140-
141-
_rootCompetencesMap = CompetenceHelper.generateRootCompetencesMap(
142-
competences,
137+
_rootCompetencesMap =
138+
CompetenceHelper.generateRootCompetencesMap(competences);
139+
_notificationService.showSnackBar(
140+
NotificationType.success,
141+
'Kompetenzen aktualisiert!',
143142
);
144143
}
145-
146-
_notificationService.showSnackBar(
147-
NotificationType.success,
148-
'Kompetenzen aktualisiert!',
149-
);
150-
151-
return;
152144
}
153145

154146
Future<void> fetchCompetences() async {
155-
final List<Competence> competences = await _competenceApiService
156-
.getAllCompetences();
157-
158-
final sortedCompetences = CompetenceHelper.sortCompetences(competences);
159-
_competences.value = sortedCompetences;
160-
161-
_rootCompetencesMap.clear();
162-
163-
_rootCompetencesMap = CompetenceHelper.generateRootCompetencesMap(
164-
competences,
165-
);
166-
167-
di<CompetenceFilterManager>().refreshFilteredCompetences(competences);
168-
169-
_notificationService.showSnackBar(
170-
NotificationType.success,
171-
'Kompetenzen aktualisiert!',
172-
);
173-
174-
return;
147+
final competences = await _competenceApiService.getAllCompetences();
148+
if (competences != null) {
149+
final sortedCompetences = CompetenceHelper.sortCompetences(competences);
150+
_competences.value = sortedCompetences;
151+
_rootCompetencesMap.clear();
152+
_rootCompetencesMap =
153+
CompetenceHelper.generateRootCompetencesMap(competences);
154+
di<CompetenceFilterManager>().refreshFilteredCompetences(competences);
155+
_notificationService.showSnackBar(
156+
NotificationType.success,
157+
'Kompetenzen aktualisiert!',
158+
);
159+
}
175160
}
176161

177162
Future<void> postNewCompetence({
@@ -186,8 +171,9 @@ class CompetenceManager {
186171
level: competenceLevel,
187172
indicators: indicators,
188173
);
189-
190-
upsertFromStream(newCompetence);
174+
if (newCompetence != null) {
175+
upsertFromStream(newCompetence);
176+
}
191177
//- The competence is coming back from the stream, we don't need to do this
192178
// _competences.value = CompetenceHelper.sortCompetences([
193179
// ..._competences.value,
@@ -216,27 +202,23 @@ class CompetenceManager {
216202
);
217203
return;
218204
}
219-
final List<Competence> importedCompetences = await _competenceApiService
205+
final importedCompetences = await _competenceApiService
220206
.importCompetencesFromJsonFile(fileResponse.path!);
221-
222-
final sortedCompetences = CompetenceHelper.sortCompetences(
223-
importedCompetences,
224-
);
225-
_competences.value = sortedCompetences;
226-
227-
_rootCompetencesMap.clear();
228-
229-
_rootCompetencesMap = CompetenceHelper.generateRootCompetencesMap(
230-
sortedCompetences,
231-
);
232-
233-
di<CompetenceFilterManager>().refreshFilteredCompetences(sortedCompetences);
234-
_envManager.setPopulatedEnvServerData(competences: true);
235-
236-
_notificationService.showSnackBar(
237-
NotificationType.success,
238-
'Kompetenzen importiert',
239-
);
207+
if (importedCompetences != null) {
208+
final sortedCompetences =
209+
CompetenceHelper.sortCompetences(importedCompetences);
210+
_competences.value = sortedCompetences;
211+
_rootCompetencesMap.clear();
212+
_rootCompetencesMap =
213+
CompetenceHelper.generateRootCompetencesMap(sortedCompetences);
214+
di<CompetenceFilterManager>()
215+
.refreshFilteredCompetences(sortedCompetences);
216+
_envManager.setPopulatedEnvServerData(competences: true);
217+
_notificationService.showSnackBar(
218+
NotificationType.success,
219+
'Kompetenzen importiert',
220+
);
221+
}
240222
}
241223

242224
Future<void> updateCompetenceOrder({
@@ -251,11 +233,9 @@ class CompetenceManager {
251233
final verifiedUpdated = await _competenceApiService.updateCompetence(
252234
updatedCompetence,
253235
);
254-
// Update in-place without notifying listeners.
255-
// The sortable widgets manage their own visual order via local state.
256-
// Call sortAndNotifyCompetences() when done (e.g. on page dispose)
257-
// to commit the sorted order for other widgets.
258-
_competences.value[index] = verifiedUpdated;
236+
if (verifiedUpdated != null) {
237+
_competences.value[index] = verifiedUpdated;
238+
}
259239
}
260240

261241
/// Sorts the competences list by order and notifies listeners.
@@ -298,22 +278,14 @@ class CompetenceManager {
298278
);
299279
final verifiedUpdatedCompetence = await _competenceApiService
300280
.updateCompetence(updatedCompetence);
301-
281+
if (verifiedUpdatedCompetence == null) {
282+
return;
283+
}
302284
final List<Competence> competences = List.from(_competences.value);
303-
304285
competences[competenceListIndex] = verifiedUpdatedCompetence;
305-
306286
_competences.value = competences;
307-
308-
di<CompetenceFilterManager>().refreshFilteredCompetences(
309-
_competences.value,
310-
);
311-
312-
_notificationService.showSnackBar(
313-
NotificationType.success,
314-
'Kompetenz aktualisiert',
315-
);
316-
287+
di<CompetenceFilterManager>()
288+
.refreshFilteredCompetences(_competences.value);
317289
return;
318290
}
319291

@@ -325,24 +297,19 @@ class CompetenceManager {
325297
);
326298
return;
327299
}
328-
final bool success = await _competenceApiService.deleteCompetence(publicId);
300+
final success = await _competenceApiService.deleteCompetence(publicId);
329301

330-
if (success) {
302+
if (success == true) {
331303
final List<Competence> competences = List.from(_competences.value);
332-
333304
competences.removeWhere((element) => element.publicId == publicId);
334-
335305
_competences.value = competences;
336-
337-
di<CompetenceFilterManager>().refreshFilteredCompetences(
338-
_competences.value,
339-
);
340-
306+
di<CompetenceFilterManager>()
307+
.refreshFilteredCompetences(_competences.value);
341308
_notificationService.showSnackBar(
342309
NotificationType.success,
343310
'Kompetenz gelöscht',
344311
);
345-
} else {
312+
} else if (success == false) {
346313
_notificationService.showSnackBar(
347314
NotificationType.error,
348315
'Fehler beim Löschen der Kompetenz',

0 commit comments

Comments
 (0)