Skip to content

Commit

Permalink
refactor: continue refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
limwa committed Aug 21, 2024
1 parent 16b5acc commit 9008091
Show file tree
Hide file tree
Showing 71 changed files with 591 additions and 458 deletions.
2 changes: 1 addition & 1 deletion uni/lib/controller/background_workers/notifications.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import 'package:tuple/tuple.dart';
import 'package:uni/controller/background_workers/notifications/tuition_notification.dart';
import 'package:uni/controller/local_storage/notification_timeout_storage.dart';
import 'package:uni/controller/local_storage/preferences_controller.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:workmanager/workmanager.dart';

///
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:uni/controller/background_workers/notifications.dart';
import 'package:uni/controller/fetchers/fees_fetcher.dart';
import 'package:uni/controller/local_storage/preferences_controller.dart';
import 'package:uni/controller/parsers/parser_fees.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/utils/duration_string_formatter.dart';

class TuitionNotification extends Notification {
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/fetchers/calendar_fetcher_html.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:uni/controller/fetchers/session_dependant_fetcher.dart';
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/parsers/parser_calendar.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/calendar_event.dart';

/// Fetch the school calendar from HTML
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/parsers/parser_course_units.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/course.dart';
import 'package:uni/model/entities/course_units/course_unit.dart';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:html/parser.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';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.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';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'dart:convert';

import 'package:uni/controller/fetchers/session_dependant_fetcher.dart';
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/course_units/course_unit.dart';

class CurrentCourseUnitsFetcher implements SessionDependantFetcher {
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/fetchers/courses_fetcher.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
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/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/course_units/course_unit.dart';

/// Returns the user's current list of [CourseUnit].
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/fetchers/exam_fetcher.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:uni/controller/fetchers/session_dependant_fetcher.dart';
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/parsers/parser_exams.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/course.dart';
import 'package:uni/model/entities/course_units/course_unit.dart';
import 'package:uni/model/entities/exam.dart';
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/fetchers/faculties_fetcher.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:html/parser.dart';
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';

Future<List<String>> getStudentFaculties(Session session) async {
final response = await NetworkRouter.getWithCookies(
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/fetchers/fees_fetcher.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
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/session/session.dart';
import 'package:uni/session/session.dart';

class FeesFetcher implements SessionDependantFetcher {
@override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:uni/controller/fetchers/session_dependant_fetcher.dart';
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/parsers/parser_library_occupation.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/library_occupation.dart';

/// Fetch the library occupation from Google Sheets
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/fetchers/print_fetcher.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:http/http.dart' as http;
import 'package:uni/controller/fetchers/session_dependant_fetcher.dart';
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';

class PrintFetcher implements SessionDependantFetcher {
@override
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/fetchers/profile_fetcher.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:uni/controller/fetchers/courses_fetcher.dart';
import 'package:uni/controller/fetchers/session_dependant_fetcher.dart';
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/parsers/parser_courses.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/profile.dart';

class ProfileFetcher implements SessionDependantFetcher {
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/fetchers/reference_fetcher.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
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/session/session.dart';
import 'package:uni/session/session.dart';

class ReferenceFetcher implements SessionDependantFetcher {
@override
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/fetchers/restaurant_fetcher.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/parsers/parser_restaurants.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/restaurant.dart';

/// Class for fetching the menu
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:uni/controller/fetchers/session_dependant_fetcher.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/lecture.dart';
import 'package:uni/model/entities/profile.dart';
import 'package:uni/model/utils/time/week.dart';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:http/http.dart' as http;
import 'package:uni/controller/fetchers/schedule_fetcher/schedule_fetcher.dart';
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/parsers/parser_schedule.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/lecture.dart';
import 'package:uni/model/entities/profile.dart';
import 'package:uni/model/utils/time/week.dart';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:tuple/tuple.dart';
import 'package:uni/controller/fetchers/schedule_fetcher/schedule_fetcher.dart';
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/parsers/parser_schedule_html.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/lecture.dart';
import 'package:uni/model/entities/profile.dart';
import 'package:uni/model/utils/time/week.dart';
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/fetchers/session_dependant_fetcher.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';

abstract class SessionDependantFetcher {
List<String> getEndpoints(Session session);
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/local_storage/file_offline_storage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:http/http.dart' as http;
import 'package:logger/logger.dart';
import 'package:path_provider/path_provider.dart';
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';

/// The offline image storage location on the device.
Future<String> get _localPath async {
Expand Down
10 changes: 8 additions & 2 deletions uni/lib/controller/local_storage/preferences_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/app_locale.dart';
import 'package:uni/model/entities/exam.dart';
import 'package:uni/utils/favorite_widget_type.dart';
Expand Down Expand Up @@ -71,7 +71,9 @@ class PreferencesController {
Session session,
) async {
await _secureStorage.write(
key: _userSession, value: jsonEncode(session.toJson()));
key: _userSession,
value: jsonEncode(session.toJson()),
);
}

static Future<Session?> getSavedSession() async {
Expand All @@ -84,6 +86,10 @@ class PreferencesController {
return Session.fromJson(json);
}

static Future<bool> isSessionPersistent() async {
return _secureStorage.containsKey(key: _userSession);
}

/// Sets whether or not the Terms and Conditions have been accepted.
static Future<void> setTermsAndConditionsAcceptance({
required bool areAccepted,
Expand Down
138 changes: 2 additions & 136 deletions uni/lib/controller/networking/network_router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import 'package:http/http.dart' as http;
import 'package:http/http.dart';
import 'package:logger/logger.dart';
import 'package:synchronized/synchronized.dart';
import 'package:uni/controller/session/credentials/session.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/credentials/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/utils/constants.dart';
import 'package:uni/view/navigation_service.dart';

Expand All @@ -26,17 +26,6 @@ class NetworkRouter {
/// The timeout for Sigarra login requests.
static const Duration _requestTimeout = Duration(seconds: 30);

/// The mutual exclusion primitive for login requests.
static final Lock _loginLock = Lock();

/// The last time the user was logged in.
/// Used to avoid repeated concurrent login requests.
static DateTime? _lastLoginTime;

/// Cached session for the current user.
/// Returned on repeated concurrent login requests.
static Session? _cachedSession;

/// Re-authenticates the user via the Sigarra API
/// using data stored in [session],
/// returning an updated Session if successful.
Expand Down Expand Up @@ -99,114 +88,6 @@ class NetworkRouter {
return response.body;
}

/// Extracts the cookies present in [response].
static List<Cookie> extractCookies(http.Response response) {
final setCookieHeaders =
response.headersSplitValues[HttpHeaders.setCookieHeader];
if (setCookieHeaders == null) {
return [];
}

final cookies = <Cookie>[];
for (final value in setCookieHeaders) {
cookies.add(Cookie.fromSetCookieValue(value));
}

return cookies;
}

/// Makes an authenticated GET request with the given [session] to the
/// resource located at [baseUrl] with the given [query] parameters.
/// If the request fails with a 403 status code, the user is re-authenticated
/// and the session is updated.
static Future<http.Response> getWithCookies(
String baseUrl,
Map<String, String> query,
Session session, {
Duration timeout = _requestTimeout,
}) async {
var url = baseUrl;
if (!url.contains('?')) {
url += '?';
}
query.forEach((key, value) {
url += '$key=$value&';
});
if (query.isNotEmpty) {
url = url.substring(0, url.length - 1);
}

final headers = <String, String>{};
headers['cookie'] = session.cookies.join('; ');

final response = await (httpClient != null
? httpClient!.get(url.toUri(), headers: headers).timeout(timeout)
: http.get(url.toUri(), headers: headers))
.timeout(timeout);

if (response.statusCode == 200) {
return response;
}

final forbidden = response.statusCode == 403;
if (forbidden) {
final userIsLoggedIn =
_cachedSession != null && await userLoggedIn(session);
if (!userIsLoggedIn) {
Logger()
.d('User is not logged in; performing re-login from saved data');

final newSession = await reLoginFromSession(session);

if (newSession == null) {
NavigationService.logoutAndPopHistory();
return Future.error(
'Re-login failed; user might have changed password',
);
}

session
..username = newSession.username // (thePeras): Why is this necessary?
..cookies =
newSession.cookies; // TODO(limwa): because it is very bad code xD

headers['cookie'] = session.cookies.join('; ');
return http.get(url.toUri(), headers: headers).timeout(timeout);
} else {
// If the user is logged in but still got a 403, they are
// forbidden to access the resource or the login was invalid
// at the time of the request,
// but other thread re-authenticated.
// Since we do not know which one is the case, we try again.
headers['cookie'] = session.cookies.join('; ');
final response =
await http.get(url.toUri(), headers: headers).timeout(timeout);
return response.statusCode == 200
? Future.value(response)
: Future.error('HTTP Error: ${response.statusCode}');
}
}

return Future.error('HTTP Error: ${response.statusCode}');
}

/// Check if the user is still logged in,
/// performing a health check on the user's personal page.
static Future<bool> userLoggedIn(Session session) async {
Logger().d('Checking if user is still logged in');

final url = '${getBaseUrl(session.faculties[0])}'
'fest_geral.cursos_list?pv_num_unico=${session.username}';
final headers = <String, String>{};
headers['cookie'] = session.cookies.join('; ');

final response = await (httpClient != null
? httpClient!.get(url.toUri(), headers: headers)
: http.get(url.toUri(), headers: headers));

return response.statusCode == 200;
}

/// Returns the base url of the user's faculties.
static List<String> getBaseUrls(List<String> faculties) {
return faculties.map(getBaseUrl).toList();
Expand All @@ -221,19 +102,4 @@ class NetworkRouter {
static List<String> getBaseUrlsFromSession(Session session) {
return NetworkRouter.getBaseUrls(session.faculties);
}

/// Makes an HTTP request to terminate the session in Sigarra.
static Future<Response> killSigarraAuthentication(
List<String> faculties) async {
final url = '${NetworkRouter.getBaseUrl(faculties[0])}vld_validacao.sair';
final response = await http.get(url.toUri()).timeout(_requestTimeout);

if (response.statusCode == 200) {
Logger().i('Logout Successful');
} else {
Logger().i('Logout Failed');
}

return response;
}
}
2 changes: 1 addition & 1 deletion uni/lib/controller/parsers/parser_course_unit_info.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'dart:convert';
import 'package:html/parser.dart';
import 'package:http/http.dart' as http;
import 'package:uni/controller/fetchers/course_units_fetcher/course_units_info_fetcher.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.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_file.dart';
Expand Down
2 changes: 1 addition & 1 deletion uni/lib/controller/parsers/parser_schedule_html.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:html/dom.dart';
import 'package:html/parser.dart' show parse;
import 'package:http/http.dart' as http;
import 'package:uni/controller/networking/network_router.dart';
import 'package:uni/controller/session/session.dart';
import 'package:uni/session/session.dart';
import 'package:uni/model/entities/lecture.dart';
import 'package:uni/model/utils/time/week.dart';
import 'package:uni/model/utils/time/weekday_mapper.dart';
Expand Down
Loading

0 comments on commit 9008091

Please sign in to comment.