From 86d499905da5dc85e421b00dc438e4ffeff4b5b8 Mon Sep 17 00:00:00 2001 From: Adriano Machado Date: Sat, 28 Dec 2024 15:08:19 +0000 Subject: [PATCH 1/6] Update fetchSheet to work with multiple endpoints --- .../course_units_info_fetcher.dart | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart index 6e43e026d..9276b1c8d 100644 --- a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart +++ b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'package:html/parser.dart'; import 'package:uni/controller/fetchers/session_dependant_fetcher.dart'; import 'package:uni/controller/networking/network_router.dart'; @@ -32,15 +33,35 @@ class CourseUnitsInfoFetcher implements SessionDependantFetcher { Session session, int occurId, ) async { - final url = '${getEndpoints(session)[0]}mob_ucurr_geral.perfil'; - final response = await NetworkRouter.getWithCookies( - url, - {'pv_ocorrencia_id': occurId.toString()}, - session, + for (final endpoint in getEndpoints(session)) { + final url = '$endpoint' 'mob_ucurr_geral.perfil'; + try { + final response = await NetworkRouter.getWithCookies( + url, + {'pv_ocorrencia_id': occurId.toString()}, + session, + ); + + final json = jsonDecode(response.body) as Map; + if (response != null && json['lingua'] != null) { + return parseSheet(response); + } + } catch (_) { + continue; + } + } + + return Sheet( + professors: [], + regents: [], + content: '', + evaluation: '', + books: [], ); - return parseSheet(response); } + + Future> fetchCourseUnitFiles( Session session, int occurId, From e36700633f094559b93a6d9b73cb5ce3671402e4 Mon Sep 17 00:00:00 2001 From: Adriano Machado Date: Sun, 29 Dec 2024 13:00:29 +0000 Subject: [PATCH 2/6] Updated fetchSheet function to return the biggest response --- .../course_units_info_fetcher.dart | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart index 9276b1c8d..60b354035 100644 --- a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart +++ b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:html/parser.dart'; +import 'package:http/http.dart'; import 'package:uni/controller/fetchers/session_dependant_fetcher.dart'; import 'package:uni/controller/networking/network_router.dart'; import 'package:uni/controller/parsers/parser_course_unit_info.dart'; @@ -33,6 +34,10 @@ class CourseUnitsInfoFetcher implements SessionDependantFetcher { Session session, int occurId, ) async { + Response? bestResponse; + int bestResponseSize = -1; + + for (final endpoint in getEndpoints(session)) { final url = '$endpoint' 'mob_ucurr_geral.perfil'; try { @@ -42,15 +47,19 @@ class CourseUnitsInfoFetcher implements SessionDependantFetcher { session, ); - final json = jsonDecode(response.body) as Map; - if (response != null && json['lingua'] != null) { - return parseSheet(response); + if (response.body.length > bestResponseSize) { + bestResponseSize = response.body.length; + bestResponse = response; } } catch (_) { continue; } } + if (bestResponse != null) { + return parseSheet(bestResponse); + } + return Sheet( professors: [], regents: [], @@ -60,8 +69,6 @@ class CourseUnitsInfoFetcher implements SessionDependantFetcher { ); } - - Future> fetchCourseUnitFiles( Session session, int occurId, From 5000e3b869ab34c8406245981bb1ec8d9976b05f Mon Sep 17 00:00:00 2001 From: Adriano Machado Date: Mon, 30 Dec 2024 14:00:06 +0000 Subject: [PATCH 3/6] Removed unused function --- .../course_units_info_fetcher.dart | 40 +++++-------------- packages/uni_ui/lib/timeline/timeline.dart | 2 +- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart index 60b354035..a10c5417a 100644 --- a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart +++ b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart @@ -16,27 +16,11 @@ class CourseUnitsInfoFetcher implements SessionDependantFetcher { return NetworkRouter.getBaseUrlsFromSession(session).toList(); } - Future fetchCourseUnitSheet( - Session session, - int occurrId, - ) async { - // if course unit is not from the main faculty, Sigarra redirects - final url = '${getEndpoints(session)[0]}ucurr_geral.ficha_uc_view'; - final response = await NetworkRouter.getWithCookies( - url, - {'pv_ocorrencia_id': occurrId.toString()}, - session, - ); - return parseCourseUnitSheet(response); - } - Future fetchSheet( Session session, int occurId, ) async { Response? bestResponse; - int bestResponseSize = -1; - for (final endpoint in getEndpoints(session)) { final url = '$endpoint' 'mob_ucurr_geral.perfil'; @@ -47,8 +31,8 @@ class CourseUnitsInfoFetcher implements SessionDependantFetcher { session, ); - if (response.body.length > bestResponseSize) { - bestResponseSize = response.body.length; + if (bestResponse == null || + response.body.length > bestResponse.body.length) { bestResponse = response; } } catch (_) { @@ -56,17 +40,15 @@ class CourseUnitsInfoFetcher implements SessionDependantFetcher { } } - if (bestResponse != null) { - return parseSheet(bestResponse); - } - - return Sheet( - professors: [], - regents: [], - content: '', - evaluation: '', - books: [], - ); + return bestResponse != null + ? parseSheet(bestResponse) + : Sheet( + professors: [], + regents: [], + content: '', + evaluation: '', + books: [], + ); } Future> fetchCourseUnitFiles( diff --git a/packages/uni_ui/lib/timeline/timeline.dart b/packages/uni_ui/lib/timeline/timeline.dart index 2c4590927..8ac5b68ed 100644 --- a/packages/uni_ui/lib/timeline/timeline.dart +++ b/packages/uni_ui/lib/timeline/timeline.dart @@ -129,7 +129,7 @@ class _TimelineState extends State { child: ScrollablePositionedList.builder( itemCount: widget.content.length, itemScrollController: _itemScrollController, - itemPositionsListener: _itemPositionsListener, + itemPositionsListener: _itemPositionsListener, itemBuilder: (context, index) { return widget.content[index]; }, From a832cc4b4e24917c732a8f8cd1dc824b919af564 Mon Sep 17 00:00:00 2001 From: Adriano Machado Date: Mon, 30 Dec 2024 14:05:20 +0000 Subject: [PATCH 4/6] Removed unused imports to pass lint test --- .../course_units_fetcher/course_units_info_fetcher.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart index a10c5417a..e73b85368 100644 --- a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart +++ b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'package:html/parser.dart'; import 'package:http/http.dart'; import 'package:uni/controller/fetchers/session_dependant_fetcher.dart'; @@ -6,7 +5,6 @@ import 'package:uni/controller/networking/network_router.dart'; import 'package:uni/controller/parsers/parser_course_unit_info.dart'; import 'package:uni/model/entities/course_units/course_unit_class.dart'; import 'package:uni/model/entities/course_units/course_unit_directory.dart'; -import 'package:uni/model/entities/course_units/course_unit_sheet.dart'; import 'package:uni/model/entities/course_units/sheet.dart'; import 'package:uni/session/flows/base/session.dart'; From c73b2ce8e87332671e50fc542884a583250a6a2a Mon Sep 17 00:00:00 2001 From: Adriano Machado Date: Mon, 30 Dec 2024 18:20:02 +0000 Subject: [PATCH 5/6] Updated course units fetcher for parallel requests --- .../course_units_info_fetcher.dart | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart index e73b85368..880073d46 100644 --- a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart +++ b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart @@ -18,25 +18,23 @@ class CourseUnitsInfoFetcher implements SessionDependantFetcher { Session session, int occurId, ) async { - Response? bestResponse; - - for (final endpoint in getEndpoints(session)) { - final url = '$endpoint' 'mob_ucurr_geral.perfil'; - try { - final response = await NetworkRouter.getWithCookies( - url, - {'pv_ocorrencia_id': occurId.toString()}, - session, - ); + final responses = await Future.wait( + getEndpoints(session) + .map((endpoint) => '$endpoint' 'mob_ucurr_geral.perfil') + .map( + (url) => NetworkRouter.getWithCookies( + url, + {'pv_ocorrencia_id': occurId.toString()}, + session, + ), + ), + ); - if (bestResponse == null || - response.body.length > bestResponse.body.length) { - bestResponse = response; - } - } catch (_) { - continue; - } - } + final bestResponse = responses.fold( + null, + (best, current) => + current.body.length > (best?.body.length ?? 0) ? current : best, + ); return bestResponse != null ? parseSheet(bestResponse) From 3cd50d81e01851c9c5776815be17799e3fe3d492 Mon Sep 17 00:00:00 2001 From: Adriano Machado Date: Mon, 30 Dec 2024 22:21:37 +0000 Subject: [PATCH 6/6] Update fetchSheet to handle only 200 responses --- .../course_units_info_fetcher.dart | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart index 880073d46..be6667c9f 100644 --- a/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart +++ b/packages/uni_app/lib/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart @@ -26,15 +26,17 @@ class CourseUnitsInfoFetcher implements SessionDependantFetcher { url, {'pv_ocorrencia_id': occurId.toString()}, session, - ), + ).catchError((_) => Response('', 500)), ), ); - final bestResponse = responses.fold( - null, - (best, current) => - current.body.length > (best?.body.length ?? 0) ? current : best, - ); + final bestResponse = responses + .where((response) => response.statusCode == 200) + .fold( + null, + (best, current) => + current.body.length > (best?.body.length ?? 0) ? current : best, + ); return bestResponse != null ? parseSheet(bestResponse)