Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
af1040c
refacto auth
guillaumetavernier Jun 14, 2025
21a053b
refacto repository/token expire wrapper + demo refacto type
guillaumetavernier Jun 14, 2025
0cf4489
refacto routing
guillaumetavernier Jun 14, 2025
af8dbd2
fix auto load
guillaumetavernier Jun 14, 2025
8e86bc5
refacto renaming + suppression token expire wrapper + refacto repo + …
guillaumetavernier Jun 14, 2025
0033416
fix(auth): add centralized lock to prevent race conditions
guillaumetavernier Jun 14, 2025
e600706
fix(loading): wait until the user is fetched when logged in
guillaumetavernier Jun 14, 2025
79868e1
fix(auth): fix multiple listen on SSO windows creating race condition
guillaumetavernier Jun 14, 2025
cdbf165
fix(quit-dialog): fix dialog staying open on sign out
guillaumetavernier Jun 14, 2025
1372c65
fix(redirect-service): fix page calling the service on the forward an…
guillaumetavernier Jun 14, 2025
38c7bbf
revamp(token-expire-wrapper): modify the function to prevent 403 from…
guillaumetavernier Jun 16, 2025
249b78d
refresh token on AuthNotifier init
guillaumetavernier Jun 16, 2025
6253419
refacto(repo) remove setToken
guillaumetavernier Jun 16, 2025
10da573
fix:(loan): fix a crash when there are no loaner
guillaumetavernier Jun 16, 2025
d57beea
fix(logo-repo): set token on init
guillaumetavernier Jun 16, 2025
f7111d1
fix(logo-repo): use token expire wrapper on this repo
guillaumetavernier Jun 16, 2025
9cff434
fix(notifier): prevent load method to modify disposed state
guillaumetavernier Jun 17, 2025
2b08a14
fix(loading): add module root to the app loading
guillaumetavernier Jun 17, 2025
fd75a54
fix(repo) manage 204
guillaumetavernier Jun 17, 2025
5517b24
fix(repo) declare repo for each provider
guillaumetavernier Jun 18, 2025
ab0a941
fix(repo): clean imports
guillaumetavernier Jun 20, 2025
5d9a74c
FIX:(token-refresh): use internal notifier state to avoid race condit…
guillaumetavernier Jun 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 1 addition & 5 deletions lib/admin/providers/account_types_list_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ import 'package:myecl/admin/class/account_type.dart';
import 'package:myecl/admin/repositories/account_type_repository.dart';
import 'package:myecl/tools/providers/list_notifier.dart';

import 'package:myecl/tools/token_expire_wrapper.dart';

class AccountTypesNotifier extends ListNotifier<AccountType> {
final AccountTypeRepository accountTypeRepository;
AccountTypesNotifier({required this.accountTypeRepository})
Expand All @@ -23,8 +21,6 @@ final allAccountTypesListProvider =
AccountTypesNotifier provider = AccountTypesNotifier(
accountTypeRepository: accountTypeRepository,
);
tokenExpireWrapperAuth(ref, () async {
await provider.loadAccountTypes();
});
provider.loadAccountTypes();
return provider;
});
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/association_membership_simple.dart';
import 'package:myecl/admin/repositories/association_membership_repository.dart';
import 'package:myecl/tools/providers/list_notifier.dart';
import 'package:myecl/tools/token_expire_wrapper.dart';

class AssociationMembershipListNotifier
extends ListNotifier<AssociationMembership> {
Expand Down Expand Up @@ -67,8 +66,6 @@ final allAssociationMembershipListProvider =
AssociationMembershipListNotifier(
associationMembershipRepository: associationMembershipRepository,
);
tokenExpireWrapperAuth(ref, () async {
await provider.loadAssociationMemberships();
});
provider.loadAssociationMemberships();
return provider;
});
9 changes: 2 additions & 7 deletions lib/admin/providers/group_list_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/simple_group.dart';
import 'package:myecl/admin/repositories/group_repository.dart';
import 'package:myecl/tools/providers/list_notifier.dart';
import 'package:myecl/tools/token_expire_wrapper.dart';
import 'package:myecl/user/class/user.dart';
import 'package:myecl/user/providers/user_provider.dart';

Expand Down Expand Up @@ -59,9 +58,7 @@ final allGroupListProvider =
GroupListNotifier provider = GroupListNotifier(
groupRepository: groupRepository,
);
tokenExpireWrapperAuth(ref, () async {
await provider.loadGroups();
});
provider.loadGroups();
return provider;
});

Expand All @@ -73,8 +70,6 @@ final userGroupListNotifier =
GroupListNotifier provider = GroupListNotifier(
groupRepository: groupRepository,
);
tokenExpireWrapperAuth(ref, () async {
await provider.loadGroupsFromUser(ref.watch(userProvider));
});
provider.loadGroupsFromUser(ref.watch(userProvider));
return provider;
});
2 changes: 1 addition & 1 deletion lib/admin/providers/group_logo_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,6 @@ class GroupLogoNotifier extends SingleNotifier<Image> {

final groupLogoProvider =
StateNotifierProvider<GroupLogoNotifier, AsyncValue<Image>>((ref) {
final groupLogoRepository = GroupLogoRepository();
final groupLogoRepository = GroupLogoRepository(ref);
return GroupLogoNotifier(groupLogoRepository: groupLogoRepository);
});
18 changes: 6 additions & 12 deletions lib/admin/providers/module_root_list_provider.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/repositories/module_visibility_repository.dart';
import 'package:myecl/auth/providers/openid_provider.dart';
import 'package:myecl/tools/providers/list_notifier.dart';
import 'package:myecl/tools/token_expire_wrapper.dart';
import 'package:myecl/user/providers/user_provider.dart';

class ModuleListNotifier extends ListNotifier<String> {
ModuleVisibilityRepository repository = ModuleVisibilityRepository();
ModuleListNotifier({required String token})
: super(const AsyncValue.loading()) {
repository.setToken(token);
}
ModuleVisibilityRepository repository;
ModuleListNotifier({required this.repository})
: super(const AsyncValue.loading());

Future<AsyncValue<List<String>>> loadMyModuleRoots() async {
return await loadList(repository.getAccessibleModule);
Expand All @@ -19,13 +15,11 @@ class ModuleListNotifier extends ListNotifier<String> {

final moduleRootListProvider =
StateNotifierProvider<ModuleListNotifier, AsyncValue<List<String>>>((ref) {
final token = ref.watch(tokenProvider);
final repository = ref.watch(moduleVisibilityRepositoryProvider);
final userProvider = ref.watch(asyncUserProvider);
ModuleListNotifier notifier = ModuleListNotifier(token: token);
ModuleListNotifier notifier = ModuleListNotifier(repository: repository);
userProvider.maybeWhen(
data: (data) => tokenExpireWrapperAuth(ref, () async {
await notifier.loadMyModuleRoots();
}),
data: (data) => notifier.loadMyModuleRoots(),
orElse: () {},
);
return notifier;
Expand Down
18 changes: 6 additions & 12 deletions lib/admin/providers/module_visibility_list_provider.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/module_visibility.dart';
import 'package:myecl/admin/repositories/module_visibility_repository.dart';
import 'package:myecl/auth/providers/openid_provider.dart';
import 'package:myecl/tools/providers/list_notifier.dart';
import 'package:myecl/tools/token_expire_wrapper.dart';

class ModuleVisibilityListNotifier extends ListNotifier<ModuleVisibility> {
ModuleVisibilityRepository repository = ModuleVisibilityRepository();
ModuleVisibilityListNotifier({required String token})
: super(const AsyncValue.loading()) {
repository.setToken(token);
}
ModuleVisibilityRepository repository;
ModuleVisibilityListNotifier({required this.repository})
: super(const AsyncValue.loading());

Future<AsyncValue<List<ModuleVisibility>>> loadModuleVisibility() async {
return await loadList(repository.getModuleVisibilityList);
Expand Down Expand Up @@ -88,12 +84,10 @@ final moduleVisibilityListProvider =
ModuleVisibilityListNotifier,
AsyncValue<List<ModuleVisibility>>
>((ref) {
final token = ref.watch(tokenProvider);
final repository = ref.watch(moduleVisibilityRepositoryProvider);
ModuleVisibilityListNotifier notifier = ModuleVisibilityListNotifier(
token: token,
repository: repository,
);
tokenExpireWrapperAuth(ref, () async {
await notifier.loadModuleVisibility();
});
notifier.loadModuleVisibility();
return notifier;
});
5 changes: 1 addition & 4 deletions lib/admin/providers/school_list_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/school.dart';
import 'package:myecl/admin/repositories/school_repository.dart';
import 'package:myecl/tools/providers/list_notifier.dart';
import 'package:myecl/tools/token_expire_wrapper.dart';

class SchoolListNotifier extends ListNotifier<School> {
final SchoolRepository schoolRepository;
Expand Down Expand Up @@ -51,8 +50,6 @@ final allSchoolListProvider =
SchoolListNotifier provider = SchoolListNotifier(
schoolRepository: schoolRepository,
);
tokenExpireWrapperAuth(ref, () async {
await provider.loadSchools();
});
provider.loadSchools();
return provider;
});
9 changes: 3 additions & 6 deletions lib/admin/providers/simple_groups_groups_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/group.dart';
import 'package:myecl/admin/providers/group_list_provider.dart';
import 'package:myecl/tools/providers/map_provider.dart';
import 'package:myecl/tools/token_expire_wrapper.dart';

class SimpleGroupsGroupsNotifier extends MapNotifier<String, Group> {
SimpleGroupsGroupsNotifier();
Expand All @@ -15,11 +14,9 @@ final simpleGroupsGroupsProvider =
>((ref) {
SimpleGroupsGroupsNotifier simpleGroupsGroupsNotifier =
SimpleGroupsGroupsNotifier();
tokenExpireWrapperAuth(ref, () async {
final simpleGroups = ref.watch(allGroupListProvider);
simpleGroups.whenData((value) {
simpleGroupsGroupsNotifier.loadTList(value.map((e) => e.id).toList());
});
final simpleGroups = ref.watch(allGroupListProvider);
simpleGroups.whenData((value) {
simpleGroupsGroupsNotifier.loadTList(value.map((e) => e.id).toList());
});
return simpleGroupsGroupsNotifier;
});
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:myecl/admin/class/user_association_membership.dart';
import 'package:myecl/admin/repositories/association_membership_user_repository.dart';
import 'package:myecl/tools/providers/list_notifier.dart';
import 'package:myecl/tools/token_expire_wrapper.dart';

class UserMembershiplistNotifier
extends ListNotifier<UserAssociationMembership> {
Expand Down Expand Up @@ -54,8 +53,6 @@ final myMembershipListProvider =
associationMembershipUserRepository:
associationMembershipUserRepository,
);
tokenExpireWrapperAuth(ref, () async {
await provider.loadPersonalAssociationMembershipsList();
});
provider.loadPersonalAssociationMembershipsList();
return provider;
});
6 changes: 3 additions & 3 deletions lib/admin/repositories/account_type_repository.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/account_type.dart';
import 'package:myecl/auth/providers/openid_provider.dart';
import 'package:myecl/tools/repository/repository.dart';

class AccountTypeRepository extends Repository {
@override
// ignore: overridden_fields
final ext = "users/account-types/";

AccountTypeRepository(super.ref);

Future<List<AccountType>> getAccountTypeList() async {
return List<AccountType>.from(
(await getList()).map((x) => AccountType.fromJson(x)),
Expand All @@ -16,6 +17,5 @@ class AccountTypeRepository extends Repository {
}

final accountTypeRepositoryProvider = Provider((ref) {
final token = ref.watch(tokenProvider);
return AccountTypeRepository()..setToken(token);
return AccountTypeRepository(ref);
});
6 changes: 3 additions & 3 deletions lib/admin/repositories/association_membership_repository.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/association_membership_simple.dart';
import 'package:myecl/admin/class/user_association_membership.dart';
import 'package:myecl/auth/providers/openid_provider.dart';
import 'package:myecl/tools/functions.dart';
import 'package:myecl/tools/repository/repository.dart';

Expand All @@ -10,6 +9,8 @@ class AssociationMembershipRepository extends Repository {
// ignore: overridden_fields
final ext = "memberships/";

AssociationMembershipRepository(super.ref);

Future<List<AssociationMembership>> getAssociationMembershipList() async {
return List<AssociationMembership>.from(
(await getList()).map((x) => AssociationMembership.fromJson(x)),
Expand Down Expand Up @@ -75,6 +76,5 @@ class AssociationMembershipRepository extends Repository {
}

final associationMembershipRepositoryProvider = Provider((ref) {
final token = ref.watch(tokenProvider);
return AssociationMembershipRepository()..setToken(token);
return AssociationMembershipRepository(ref);
});
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/user_association_membership.dart';
import 'package:myecl/admin/class/user_association_membership_base.dart';
import 'package:myecl/auth/providers/openid_provider.dart';
import 'package:myecl/tools/repository/repository.dart';

class AssociationMembershipUserRepository extends Repository {
@override
// ignore: overridden_fields
final ext = "memberships/users/";

AssociationMembershipUserRepository(super.ref);

Future<List<UserAssociationMembership>>
getPersonalAssociationMembershipList() async {
return List<UserAssociationMembership>.from(
Expand Down Expand Up @@ -54,6 +55,5 @@ class AssociationMembershipUserRepository extends Repository {
}

final associationMembershipUserRepositoryProvider = Provider((ref) {
final token = ref.watch(tokenProvider);
return AssociationMembershipUserRepository()..setToken(token);
return AssociationMembershipUserRepository(ref);
});
6 changes: 3 additions & 3 deletions lib/admin/repositories/group_logo_repository.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/auth/providers/openid_provider.dart';
import 'package:myecl/tools/repository/logo_repository.dart';

class GroupLogoRepository extends LogoRepository {
@override
// ignore: overridden_fields
final ext = 'campaign/';

GroupLogoRepository(super.ref);
}

final groupLogoProvider = Provider((ref) {
final token = ref.watch(tokenProvider);
return GroupLogoRepository()..setToken(token);
return GroupLogoRepository(ref);
});
6 changes: 3 additions & 3 deletions lib/admin/repositories/group_repository.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/group.dart';
import 'package:myecl/admin/class/simple_group.dart';
import 'package:myecl/auth/providers/openid_provider.dart';
import 'package:myecl/tools/repository/repository.dart';
import 'package:myecl/user/class/simple_users.dart';
import 'dart:convert';
Expand All @@ -13,6 +12,8 @@ class GroupRepository extends Repository {
// ignore: overridden_fields
final ext = "groups/";

GroupRepository(super.ref);

Future<List<SimpleGroup>> getGroupList() async {
return List<SimpleGroup>.from(
(await getList()).map((x) => SimpleGroup.fromJson(x)),
Expand Down Expand Up @@ -60,6 +61,5 @@ class GroupRepository extends Repository {
}

final groupRepositoryProvider = Provider((ref) {
final token = ref.watch(tokenProvider);
return GroupRepository()..setToken(token);
return GroupRepository(ref);
});
7 changes: 7 additions & 0 deletions lib/admin/repositories/module_visibility_repository.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/module_visibility.dart';
import 'package:myecl/tools/repository/repository.dart';

Expand All @@ -6,6 +7,8 @@ class ModuleVisibilityRepository extends Repository {
// ignore: overridden_fields
final ext = "module-visibility/";

ModuleVisibilityRepository(super.ref);

Future<List<ModuleVisibility>> getModuleVisibilityList() async {
return List<ModuleVisibility>.from(
(await getList()).map((x) => ModuleVisibility.fromJson(x)),
Expand Down Expand Up @@ -43,3 +46,7 @@ class ModuleVisibilityRepository extends Repository {
return await delete("$root/account-types/$allowedAccounTypes");
}
}

final moduleVisibilityRepositoryProvider = Provider((ref) {
return ModuleVisibilityRepository(ref);
});
6 changes: 3 additions & 3 deletions lib/admin/repositories/school_repository.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/school.dart';
import 'package:myecl/auth/providers/openid_provider.dart';
import 'package:myecl/tools/repository/repository.dart';

class SchoolRepository extends Repository {
@override
// ignore: overridden_fields
final ext = "schools/";

SchoolRepository(super.ref);

Future<List<School>> getSchoolList() async {
return List<School>.from((await getList()).map((x) => School.fromJson(x)));
}
Expand All @@ -30,6 +31,5 @@ class SchoolRepository extends Repository {
}

final schoolRepositoryProvider = Provider((ref) {
final token = ref.watch(tokenProvider);
return SchoolRepository()..setToken(token);
return SchoolRepository(ref);
});
6 changes: 3 additions & 3 deletions lib/admin/router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ import 'package:myecl/admin/ui/pages/add_edit_structure_page/add_edit_structure_
deferred as add_edit_structure_page;
import 'package:myecl/admin/ui/pages/main_page/main_page.dart'
deferred as main_page;
import 'package:myecl/tools/middlewares/admin_middleware.dart';
import 'package:myecl/tools/middlewares/authenticated_middleware.dart';
import 'package:myecl/tools/middlewares/deferred_middleware.dart';
import 'package:myecl/routing/middlewares/admin_middleware.dart';
import 'package:myecl/routing/middlewares/authenticated_middleware.dart';
import 'package:myecl/routing/middlewares/deferred_middleware.dart';
import 'package:qlevar_router/qlevar_router.dart';

class AdminRouter {
Expand Down
Loading
Loading