Skip to content

Commit

Permalink
Merge branch 'dev' into feat#63/tela_conteudo
Browse files Browse the repository at this point in the history
  • Loading branch information
GabrielCostaDeOliveira committed Jan 30, 2025
2 parents cc2adf8 + bccf254 commit dc5a227
Show file tree
Hide file tree
Showing 43 changed files with 1,117 additions and 589 deletions.
15 changes: 6 additions & 9 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 All @@ -16,7 +15,7 @@ class StorageValue {

factory StorageValue.getInstance() => _singleton ??= StorageValue._internal();

Future<void> _setValue(String key, String value) async {
Future<void> _setValue(String key, String? value) async {
try {
await storage.write(key: key, value: value);
} catch (e) {
Expand All @@ -33,15 +32,13 @@ 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> setAuthToken(String? token) => _setValue(_authToken, token);
Future<void> setRefreshToken(String? token) => _setValue(_refreshToken, token);
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
4 changes: 4 additions & 0 deletions lib/core/di/locator.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import 'package:aranduapp/ui/content/di/di_content.dart';
import 'package:aranduapp/core/network/token_manager/di/di_auth.dart';
import 'package:aranduapp/ui/edit_delete_user/di/di_edit_delete_user.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 @@ -25,4 +27,6 @@ void setupLocator() {
setupSubjectDI();
setupProfileDI();
setupContentDI();
setupAuthDI();
setupEditDeleteUser();
}
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
22 changes: 16 additions & 6 deletions lib/core/network/base_api.dart → lib/core/network/auth_api.dart
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 Expand Up @@ -70,4 +70,14 @@ class BaseApi {
rethrow;
}
}


Future<Response> delete({required String path, Object? data}) async {
try {
return await _dio.delete(path, data: data);
} catch (e) {
Log.e(e);
rethrow;
}
}
}
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());
}
44 changes: 44 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,44 @@
import 'dart:convert';

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

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

UserModel.fromMap(Map<String, dynamic> json)
: id = json['userId']! as String,
name = json['name']! as String,
userName = json['username']! 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,
userName: json['username']! as String,
email: json['email']! as String,
role: json['role']! as String,
);
}

String toJson() {
return jsonEncode({
'userId': id,
'name': name,
'email': email,
'role': role,
});
}
}
27 changes: 27 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,27 @@
import 'package:aranduapp/core/data/local/storage_value.dart';
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(e);
}
}
}

Future<void> clearUser() async {
_userCache = null;
StorageValue.getInstance().setJsonUser(null);
}
}
57 changes: 57 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,57 @@
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());

if (json['userPayload'] == null) Log.e('user payload is null');

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

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

return user;
}
}
}
8 changes: 8 additions & 0 deletions lib/ui/edit_delete_user/di/di_edit_delete_user.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:aranduapp/ui/edit_delete_user/service/edit_delete_user_service.dart';
import 'package:aranduapp/ui/edit_delete_user/viewmode/edit_delte_user_viewmodel.dart';
import 'package:get_it/get_it.dart';

void setupEditDeleteUser() {
GetIt.I.registerLazySingleton(() => EditDeleteUserService());
GetIt.I.registerLazySingleton(() => EditDelteUserViewmodel());
}
8 changes: 8 additions & 0 deletions lib/ui/edit_delete_user/service/edit_delete_user_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:aranduapp/core/network/auth_api.dart';

class EditDeleteUserService {
Future<void> deleteUser(String idUser) {
AuthApi.getInstance(auth: true).delete(path: '/users/$idUser');
return Future.value(null);
}
}
67 changes: 67 additions & 0 deletions lib/ui/edit_delete_user/view/edit_delete_user_view.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import 'package:aranduapp/core/log/log.dart';
import 'package:aranduapp/ui/edit_delete_user/viewmode/edit_delte_user_viewmodel.dart';
import 'package:aranduapp/ui/login/view/login_view.dart';
import 'package:aranduapp/ui/shared/command_button.dart';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:provider/provider.dart';

class EditDeleteUser extends StatelessWidget {
const EditDeleteUser({super.key});

@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<EditDelteUserViewmodel>.value(
value: GetIt.instance<EditDelteUserViewmodel>(),
child: const EditDeleteUserScreen(),
);
}
}

class EditDeleteUserScreen extends StatelessWidget {
const EditDeleteUserScreen({super.key});

@override
Widget build(BuildContext context) {
EditDelteUserViewmodel viewModel =
Provider.of<EditDelteUserViewmodel>(context);

return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
'Tem certeza de que deseja excluir sua conta? Essa ação não pode ser desfeita.',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
),
const SizedBox(height: 20),
CommandButton(
tap: viewModel.deleteUserCommand.execute,
command: viewModel.deleteUserCommand,
nameButton: "Deletar",
onSuccessCallback: () {
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => const Login(),
),
);
},
onErrorCallback: (e) {
Log.e(e);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Não foi possível apagar a conta')),
);
},
),
],
),
),
);
}
}
Loading

0 comments on commit dc5a227

Please sign in to comment.