Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UserController para manejar roles #45

Open
wants to merge 13 commits into
base: dev
Choose a base branch
from
Open
21 changes: 8 additions & 13 deletions lib/config/router.dart → lib/config/routes/router.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import 'package:flutter/material.dart';
import 'package:get/route_manager.dart';
import 'package:mi_utem/config/routes.dart';
import 'package:mi_utem/screens/asignatura_detalle_screen.dart';
import 'package:mi_utem/screens/asignaturas_lista_screen.dart';
import 'package:mi_utem/config/routes/routes.dart';
import 'package:mi_utem/controllers/asignaturas_controller.dart';
import 'package:mi_utem/controllers/qr_passes_controller.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/screens/asignatura/asignatura_detalle_screen.dart';
import 'package:mi_utem/screens/asignatura/asignaturas_lista_screen.dart';
import 'package:mi_utem/screens/calculadora_notas_screen.dart';
import 'package:mi_utem/screens/credencial_screen.dart';
import 'package:mi_utem/screens/horario/horario_screen.dart';
import 'package:mi_utem/screens/login_screen/login_screen.dart';
import 'package:mi_utem/screens/main_screen.dart';
import 'package:mi_utem/screens/main/main_screen.dart';
import 'package:mi_utem/screens/permiso_covid_screen.dart';
import 'package:mi_utem/screens/splash_screen.dart';
import 'package:mi_utem/screens/usuario_screen.dart';
import 'package:mi_utem/services/auth_service.dart';
import 'package:mi_utem/services/perfil_service.dart';
import 'package:mi_utem/widgets/acerca_screen.dart';

final _loginPage = GetPage(
Expand All @@ -26,11 +25,7 @@ final _loginPage = GetPage(
final _homePage = GetPage(
name: Routes.home,
bindings: [QrPassesBinding()],
page: () {
final usuario = PerfilService.getLocalUsuario();

return MainScreen(usuario: usuario);
},
page: () => MainScreen(),
middlewares: [OnlyAuthMiddleware()],
);

Expand Down Expand Up @@ -86,7 +81,7 @@ final pages = <GetPage>[
class OnlyAuthMiddleware extends GetMiddleware {
@override
RouteSettings? redirect(String? page) {
final isLoggedIn = AuthService.isLoggedIn();
final isLoggedIn = UserController.to.isLoggedIn;
if (!isLoggedIn) {
return const RouteSettings(name: Routes.login);
}
Expand All @@ -97,7 +92,7 @@ class OnlyAuthMiddleware extends GetMiddleware {
class OnlyNoAuthMiddleware extends GetMiddleware {
@override
RouteSettings? redirect(String? page) {
final isLoggedIn = AuthService.isLoggedIn();
final isLoggedIn = UserController.to.isLoggedIn;
if (isLoggedIn) {
return const RouteSettings(name: Routes.home);
}
Expand Down
File renamed without changes.
8 changes: 4 additions & 4 deletions lib/controllers/asignatura_controller.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:mi_utem/controllers/carreras_controller.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/models/asignatura.dart';
import 'package:mi_utem/models/carrera.dart';
import 'package:mi_utem/models/grades.dart';
Expand All @@ -19,13 +19,13 @@ class AsignaturaController extends GetxController with StateMixin<Asignatura> {

@override
void onInit() {
_selectedCarrera = Get.find<CarrerasController>().selectedCarrera.value;
_selectedCarrera = Get.find<UserController>().selectedCarrera.value;
if (_selectedCarrera != null) {
getAsignaturaDetail(Get.find<CarrerasController>().selectedCarrera.value);
getAsignaturaDetail(Get.find<UserController>().selectedCarrera.value);
}

ever<Carrera?>(
Get.find<CarrerasController>().selectedCarrera,
Get.find<UserController>().selectedCarrera,
(carrera) {
_selectedCarrera = carrera;
getAsignaturaDetail(carrera, forceRefresh: true);
Expand Down
10 changes: 5 additions & 5 deletions lib/controllers/asignaturas_controller.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:get/get.dart';
import 'package:mi_utem/controllers/asignatura_controller.dart';
import 'package:mi_utem/controllers/carreras_controller.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/models/asignatura.dart';
import 'package:mi_utem/models/carrera.dart';
import 'package:mi_utem/services/asignaturas_service.dart';
Expand All @@ -11,12 +11,12 @@ class AsignaturasController extends GetxController
void onInit() {
change(null, status: RxStatus.loading());

if (Get.find<CarrerasController>().selectedCarrera.value != null) {
getAsignaturas(Get.find<CarrerasController>().selectedCarrera.value);
if (Get.find<UserController>().selectedCarrera.value != null) {
getAsignaturas(Get.find<UserController>().selectedCarrera.value);
}

ever<Carrera?>(
Get.find<CarrerasController>().selectedCarrera,
Get.find<UserController>().selectedCarrera,
(carrera) => getAsignaturas(carrera, forceRefresh: true),
);
super.onInit();
Expand Down Expand Up @@ -54,7 +54,7 @@ class AsignaturasController extends GetxController
}

void refreshAsignaturas() {
final carrera = Get.find<CarrerasController>().selectedCarrera.value;
final carrera = Get.find<UserController>().selectedCarrera.value;
getAsignaturas(carrera, forceRefresh: true);
}
}
Expand Down
18 changes: 12 additions & 6 deletions lib/controllers/carreras_controller.dart
Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
import 'package:get/get.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/models/carrera.dart';
import 'package:mi_utem/models/usuario.dart';
import 'package:mi_utem/services/analytics_service.dart';
import 'package:mi_utem/services/carreras_service.dart';

class CarrerasController extends GetxController {
final carreras = <Carrera>[].obs;
final selectedCarrera = Rxn<Carrera>();

class CarrerasController extends GetxController with StateMixin<List<Carrera>> {
static CarrerasController get to => Get.find();

@override
void onInit() {
getCarreras();

ever<Usuario?>(
Get.find<UserController>().user,
(carrera) => getCarreras(),
);

super.onInit();
}

void getCarreras() async {
change(null, status: RxStatus.loading());

final carreras = await CarreraService.getCarreras(forceRefresh: true);

this.carreras.value = carreras;
change(carreras, status: RxStatus.success());
_autoSelectCarreraActiva(carreras);
}

Expand All @@ -43,6 +49,6 @@ class CarrerasController extends GetxController {
}

void changeSelectedCarrera(Carrera carrera) {
selectedCarrera.value = carrera;
UserController.to.selectCarrera(carrera);
}
}
7 changes: 3 additions & 4 deletions lib/controllers/grades_changes_controller.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import 'dart:developer';

import 'package:get_storage/get_storage.dart';
import 'package:mi_utem/controllers/carreras_controller.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/models/asignatura.dart';
import 'package:mi_utem/models/grades.dart';
import 'package:mi_utem/services/asignaturas_service.dart';
import 'package:mi_utem/services/auth_service.dart';
import 'package:mi_utem/services/grades_service.dart';
import 'package:mi_utem/services/notification_service.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
Expand Down Expand Up @@ -141,10 +140,10 @@ class GradesChangesController {
}

static Future<Map<String, GradeChangeType>> checkIfGradesHasChange() async {
final isLogged = AuthService.isLoggedIn();
final isLogged = UserController.to.isLoggedIn;

if (isLogged) {
final carrera = CarrerasController.to.selectedCarrera.value;
final carrera = UserController.to.selectedCarrera.value;
final carreraId = carrera?.id;

if (carreraId != null) {
Expand Down
8 changes: 4 additions & 4 deletions lib/controllers/horario_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:mi_utem/controllers/carreras_controller.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/models/asignatura.dart';
import 'package:mi_utem/models/carrera.dart';
import 'package:mi_utem/models/horario.dart';
Expand Down Expand Up @@ -85,12 +85,12 @@ class HorarioController extends GetxController {

@override
onInit() {
if (Get.find<CarrerasController>().selectedCarrera.value != null) {
getHorarioData(Get.find<CarrerasController>().selectedCarrera.value);
if (Get.find<UserController>().selectedCarrera.value != null) {
getHorarioData(Get.find<UserController>().selectedCarrera.value);
}

ever<Carrera?>(
Get.find<CarrerasController>().selectedCarrera,
Get.find<UserController>().selectedCarrera,
(carrera) => getHorarioData(carrera),
);
_init();
Expand Down
2 changes: 1 addition & 1 deletion lib/controllers/notification_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:awesome_notifications_fcm/awesome_notifications_fcm.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:mi_utem/config/routes.dart';
import 'package:mi_utem/config/routes/routes.dart';
import 'package:mi_utem/models/asignatura.dart';
import 'package:mi_utem/services/analytics_service.dart';

Expand Down
154 changes: 154 additions & 0 deletions lib/controllers/user_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import 'dart:convert';

import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:mi_utem/controllers/carreras_controller.dart';
import 'package:mi_utem/models/carrera.dart';
import 'package:mi_utem/models/usuario.dart';
import 'package:mi_utem/services/analytics_service.dart';
import 'package:mi_utem/services/auth_service.dart';
import 'package:mi_utem/services/perfil_service.dart';

class UserController extends GetxController {
static const _storageTokenKey = 'token';
static const _storageUserKey = 'user';
static const _storageFirstTimeKey = 'esAntiguo';
static const _storagePasswordKey = 'contrasenia';

static final GetStorage _box = GetStorage();
static final FlutterSecureStorage _secureStorage = FlutterSecureStorage();

static UserController get to => Get.find();

final user = Rxn<Usuario>(null);
final selectedCarrera = Rxn<Carrera>();

List<Role> get roles {
final roles = <Role>[];

if (user.value != null) {
final carreras = CarrerasController.to.state;
if (carreras != null && carreras.length > 0) {
roles.add(Role.hasCareers);
final hasActive = carreras.firstWhereOrNull((c) => c.isActive) != null;

if (hasActive) {
roles.add(Role.hasActiveCareer);
}
}
}
return roles;
}

@override
void onInit() {
super.onInit();

final user = _getStoredUser();
if (user != null) {
this.user.value = user;
}

ever(this.user, (Usuario? user) {
if (UserController.to.isLoggedIn && user != null) {
AnalyticsService.setUser(user);
} else {
AnalyticsService.removeUser();
}
});
}

Future<Usuario> login(String correo, String contrasenia) async {
try {
final user = await AuthService.login(correo, contrasenia);

_box.write(_storageFirstTimeKey, true);

_storeCredentials(user, contrasenia);
_storeUser(user);

return user;
} catch (e) {
throw e;
}
}

bool get isFirstTime {
return _box.read(_storageFirstTimeKey).toString() == 'true';
}

bool get isLoggedIn {
return user.value != null;
}

Future<void> logOut() async {
try {
invalidateToken();
_box.remove(_storageUserKey);
await _secureStorage.deleteAll();
try {
await PerfilService.deleteFcmToken();
} catch (e) {}
user.value = null;
} catch (e) {
print(e.toString());
throw e;
}
}

Future<String> refreshToken() async {
try {
final email = user.value?.correoUtem;
final password = await _secureStorage.read(key: _storagePasswordKey);

if (email != null && password != null) {
final token = await AuthService.refreshToken(email, password);
_storeToken(token);

return token;
}
throw Exception("No se pudo refrescar el token");
} catch (e) {
print(e.toString());
rethrow;
}
}

void _storeUser(Usuario userToStore) async {
user.value = userToStore;

_box.write(_storageUserKey, jsonEncode(userToStore.toJson()));
}

static void _storeCredentials(Usuario user, String contrasenia) async {
_box.write(_storageTokenKey, user.token);
await _secureStorage.write(key: _storagePasswordKey, value: contrasenia);
}

Usuario? _getStoredUser() {
final user = _box.read(_storageUserKey);
if (user == null) return null;

return Usuario.fromJson(jsonDecode(user));
}

static void _storeToken(String token) async {
_box.write(_storageTokenKey, token);
}

String getToken() {
final token = _box.read(_storageTokenKey);
if (token == null) throw Exception("No se ha encontrado el token");

return token;
}

void invalidateToken() async {
_box.remove(_storageTokenKey);
}

void selectCarrera(Carrera carrera) {
selectedCarrera.value = carrera;
}
}
Loading