Skip to content

Commit

Permalink
feat(#58): retira stefani
Browse files Browse the repository at this point in the history
  • Loading branch information
GabrielCostaDeOliveira committed Jan 25, 2025
1 parent 5437e55 commit 7e1378e
Show file tree
Hide file tree
Showing 26 changed files with 405 additions and 292 deletions.
9 changes: 3 additions & 6 deletions lib/core/data/local/storage_value.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import 'package:aranduapp/core/log/log.dart';
class StorageValue {
static const String _authToken = "auth_token";
static const String _refreshToken = "refresh_token";
static const String _email = "email";
static const String _name = "name";
static const String _jsonUser = "json_user";

static StorageValue? _singleton;
final FlutterSecureStorage storage;
Expand Down Expand Up @@ -35,13 +34,11 @@ class StorageValue {

Future<void> setAuthToken(String token) => _setValue(_authToken, token);
Future<void> setRefreshToken(String token) => _setValue(_refreshToken, token);
Future<void> setEmail(String email) => _setValue(_email, email);
Future<void> setName(String name) => _setValue(_name, name);
Future<void> setJsonUser(String email) => _setValue(_jsonUser, email);

Future<String?> getAuthToken() => _getValue(_authToken);
Future<String?> getRefreshToken() => _getValue(_refreshToken);
Future<String?> getEmail() => _getValue(_email);
Future<String?> getName() => _getValue(_name);
Future<String?> getJsonUser() => _getValue(_jsonUser);

Future<void> clear() async {
try {
Expand Down
2 changes: 2 additions & 0 deletions lib/core/di/locator.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:aranduapp/core/network/token_manager/di/di_auth.dart';
import 'package:aranduapp/ui/edit_password/di/di_edit_password.dart';
import 'package:aranduapp/ui/edit_profile/di/di_edit_profile.dart';
import 'package:aranduapp/ui/journey/di/di.dart';
Expand All @@ -23,4 +24,5 @@ void setupLocator() {
setupJourneyDI();
setupSubjectDI();
setupProfileDI();
setupAuthDI();
}
14 changes: 12 additions & 2 deletions lib/core/network/app_interceptors.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:aranduapp/core/data/local/storage_value.dart';
import 'package:aranduapp/core/log/log.dart';
import 'package:aranduapp/core/network/token_manager/auth_service.dart';
import 'package:aranduapp/core/network/token_manager/model/refresh_token_response.dart';
import 'package:aranduapp/core/network/token_manager/service/auth_service.dart';
import 'package:dio/dio.dart';

class AppInterceptors extends Interceptor {
Expand Down Expand Up @@ -33,7 +33,17 @@ class AppInterceptors extends Interceptor {

requestOptions.headers['Authorization'] = 'Bearer ${tokens.authToken}';

final response = await Dio().request(
Dio dio = Dio();

dio.interceptors.add(LogInterceptor(
requestBody: true,
responseBody: true,
requestHeader: true,
error: true,
responseHeader: true,
request: true));

final response = await dio.request(
requestOptions.path,
options: Options(
method: requestOptions.method,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ import 'package:aranduapp/core/network/app_interceptors.dart';

import 'package:dio/dio.dart';

class BaseApi {
class AuthApi {
final Dio _dio;

static BaseApi? _authInstance, _nonAuthInstance;
static AuthApi? _authInstance, _nonAuthInstance;

final String url = 'https://arandu-user-service.onrender.com';

BaseApi._internal(bool auth) : _dio = Dio() {
AuthApi._internal(bool auth) : _dio = Dio() {
_dio.options.baseUrl = url;
_dio.options.connectTimeout = const Duration(seconds: 5);
_dio.options.receiveTimeout = const Duration(seconds: 5);
Expand All @@ -26,11 +26,11 @@ class BaseApi {
request: true));
}

static BaseApi getInstance({required bool auth}) {
static AuthApi getInstance({required bool auth}) {
if (auth) {
return _authInstance ??= BaseApi._internal(auth);
return _authInstance ??= AuthApi._internal(auth);
} else {
return _nonAuthInstance ??= BaseApi._internal(auth);
return _nonAuthInstance ??= AuthApi._internal(auth);
}
}

Expand Down
31 changes: 0 additions & 31 deletions lib/core/network/token_manager/auth_service.dart

This file was deleted.

8 changes: 8 additions & 0 deletions lib/core/network/token_manager/di/di_auth.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:aranduapp/core/network/token_manager/repository/auth_repository.dart';
import 'package:aranduapp/core/network/token_manager/service/auth_service.dart';
import 'package:get_it/get_it.dart';

void setupAuthDI() {
GetIt.I.registerLazySingleton(() => AuthRepository());
GetIt.I.registerFactory(() => AuthService());
}
41 changes: 41 additions & 0 deletions lib/core/network/token_manager/model/user_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import 'dart:convert';

class UserModel {
final String id;
final String name;
final String email;
final String role;

UserModel({
required this.id,
required this.name,
required this.email,
required this.role,
});

UserModel.fromMap(Map<String, dynamic> json)
: id = json['userId']! as String,
name = json['name']! as String,
email = json['email']! as String,
role = json['role']! as String;

factory UserModel.fromJsonString(String jsonString) {
Map<String, dynamic> json = jsonDecode(jsonString);
return UserModel(
id: json['userId']! as String,
name: json['name']! as String,
email: json['email']! as String,
role: json['role']! as String,
);
}

String toJson() {
return jsonEncode({
'userId': id,
'name': name,
'email': email,
'role': role,
});
}
}

25 changes: 25 additions & 0 deletions lib/core/network/token_manager/repository/auth_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import 'package:aranduapp/core/network/token_manager/model/user_model.dart';
import 'package:aranduapp/core/network/token_manager/service/auth_service.dart';
import 'package:get_it/get_it.dart';

class AuthRepository {
UserModel? _userCache;

Future<UserModel> getUser() async {
if (_userCache != null) {
return _userCache!;
} else {
try {
UserModel user = await GetIt.instance<AuthService>().getUser();
_userCache = user;
return user;
} catch (e) {
throw Exception('Erro ao obter o usuário');
}
}
}

Future<void> clearUser() async {
_userCache = null;
}
}
55 changes: 55 additions & 0 deletions lib/core/network/token_manager/service/auth_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import 'dart:convert';

import 'package:aranduapp/core/data/local/storage_value.dart';
import 'package:aranduapp/core/log/log.dart';
import 'package:aranduapp/core/network/auth_api.dart';
import 'package:aranduapp/core/network/token_manager/model/refresh_token_response.dart';
import 'package:aranduapp/core/network/token_manager/model/user_model.dart';
import 'package:dio/dio.dart';

class AuthService {
Future<RefreshTokenResponse> refreshToken() async {
String? refresh = await StorageValue.getInstance().getRefreshToken();

assert(refresh != null);

Response response = await AuthApi.getInstance(auth: false).post(
path: '/auth/refresh',
data: <String, dynamic>{'refreshToken': refresh});

RefreshTokenResponse tokens =
RefreshTokenResponse.fromJsonString(response.toString());

await StorageValue.getInstance().setAuthToken(tokens.authToken!);
await StorageValue.getInstance().setRefreshToken(tokens.refreshToken!);

Log.i("Tokens atualizados com sucesso.");

return tokens;
}

Future<Response> validateToken() async {
return await AuthApi.getInstance(auth: true)
.get(path: '/auth/validate-token');
}

Future<UserModel> getUser() async {
String? json = await StorageValue.getInstance().getJsonUser();

if (json != null) {
return UserModel.fromJsonString(json);
} else {
final response = await validateToken();

Log.f(response);

Map<String, dynamic> json = jsonDecode(response.toString());

UserModel user = UserModel.fromMap(json['userPayload']!);

await StorageValue.getInstance().setJsonUser(user.toJson());

return user;
}
}
}
4 changes: 2 additions & 2 deletions lib/ui/edit_password/service/edit_password_service.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import 'package:aranduapp/core/network/base_api.dart';
import 'package:aranduapp/core/network/auth_api.dart';
import 'package:aranduapp/ui/edit_password/model/edit_password_request.dart';

class EditPasswordService {
Future<void> edit(EditPasswordRequest editPasswordRequest) async {
await BaseApi.getInstance(auth: true)
await AuthApi.getInstance(auth: true)
.put(path: '/auth/change-password', data: editPasswordRequest.toJson());
}
}
4 changes: 2 additions & 2 deletions lib/ui/edit_profile/service/edit_profile_service.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import 'package:aranduapp/core/network/base_api.dart';
import 'package:aranduapp/core/network/auth_api.dart';
import 'package:aranduapp/ui/edit_profile/model/edit_profile_request.dart';

class EditProfileService {
Future<void> edit(EditProfileRequest editProfileRequest) async {
await BaseApi.getInstance(auth: true)
await AuthApi.getInstance(auth: true)
.patch(path: '/users', data: editProfileRequest.toJson());
}
}
2 changes: 2 additions & 0 deletions lib/ui/edit_profile/view/edit_profile_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ class EditProfileScreen extends StatelessWidget {
key: const Key("nameController"),
controller: nameController,
padding: const EdgeInsets.symmetric(vertical: 0),
initialText: viewModel.user?.name ?? "",
),
const SizedBox(height: 20),
TextName(
Expand All @@ -86,6 +87,7 @@ class EditProfileScreen extends StatelessWidget {
key: const Key("emailNameController"),
padding: const EdgeInsets.symmetric(vertical: 0),
controller: emailController,
initialText: viewModel.user?.email ?? "",
),
const SizedBox(height: 100),
_saveButton(context, viewModel),
Expand Down
20 changes: 20 additions & 0 deletions lib/ui/edit_profile/viewmodel/edit_profile_viewmodel.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'package:aranduapp/core/network/token_manager/model/user_model.dart';
import 'package:aranduapp/core/network/token_manager/repository/auth_repository.dart';
import 'package:aranduapp/core/state/command.dart';
import 'package:aranduapp/ui/edit_profile/model/edit_profile_request.dart';
import 'package:aranduapp/ui/edit_profile/service/edit_profile_service.dart';
Expand All @@ -7,13 +9,31 @@ import 'package:get_it/get_it.dart';

class EditProfileViewModel extends ChangeNotifier {
late Command1<void, EditProfileRequest> editCommand;
late Command0<void> getUserCommand;

UserModel? user;

EditProfileViewModel() {
editCommand = Command1<void, EditProfileRequest>(editProfile);
getUserCommand = Command0<void>(getUser);

getUserCommand.execute();
}

Future<Result<void>> editProfile(EditProfileRequest request) async {
await GetIt.instance<EditProfileService>().edit(request);
return Result.value(null);
}

Future<Result<UserModel>> getUser() async {
UserModel user = await GetIt.instance<AuthRepository>().getUser();
_setUser(user);
return Result.value(user);
}

void _setUser(UserModel user) {
this.user = user;
notifyListeners();
}
}

6 changes: 3 additions & 3 deletions lib/ui/login/service/login_service.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:aranduapp/core/data/local/storage_value.dart';
import 'package:aranduapp/core/log/log.dart';
import 'package:aranduapp/core/network/base_api.dart';
import 'package:aranduapp/core/network/token_manager/auth_service.dart';
import 'package:aranduapp/core/network/auth_api.dart';
import 'package:aranduapp/core/network/token_manager/service/auth_service.dart';
import 'package:aranduapp/ui/login/model/login_request.dart';
import 'package:aranduapp/ui/login/model/login_response.dart';
import 'package:dio/dio.dart';
Expand All @@ -10,7 +10,7 @@ class LoginService {
Future<void> login(LoginRequest loginRequest) async {
Log.d('${loginRequest.email} ${loginRequest.password}');

Response response = await BaseApi.getInstance(auth: false).post(
Response response = await AuthApi.getInstance(auth: false).post(
path: '/auth/login',
data: <String, dynamic>{
'email': loginRequest.email,
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/profile/di/di_profile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ import 'package:aranduapp/ui/profile/viewmodel/profile_viewmodel.dart';
import 'package:get_it/get_it.dart';

void setupProfileDI() {
GetIt.I.registerFactory(() => ProfileViewModel());
GetIt.I.registerLazySingleton(() => ProfileViewModel());
}
10 changes: 6 additions & 4 deletions lib/ui/profile/view/profile_view.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:aranduapp/ui/edit_password/view/edit_password_view.dart';
import 'package:aranduapp/ui/login/view/login_view.dart';
import 'package:aranduapp/ui/shared/error_popup.dart';
import 'package:provider/provider.dart';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
Expand Down Expand Up @@ -68,12 +69,14 @@ class Profile extends StatelessWidget {

/// Cabeçalho do Perfil
Widget _buildProfileHeader(BuildContext context) {
ProfileViewModel viewModel = Provider.of<ProfileViewModel>(context);

return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const ProfileHeader(
name: "Stefani",
role: "Estudante",
ProfileHeader(
name: viewModel.user == null ?"..." : viewModel.user!.name ,
role: viewModel.user == null ?"..." : viewModel.user!.role ,
),
Padding(
padding: const EdgeInsets.only(right: 16.0),
Expand Down Expand Up @@ -143,7 +146,6 @@ class Profile extends StatelessWidget {

return ListTile(
key: const Key('logout_button'),

leading: Icon(
Icons.logout_sharp,
color: Theme.of(context).colorScheme.error,
Expand Down
Loading

0 comments on commit 7e1378e

Please sign in to comment.