implemented auth repository and service in dart (JWT)

This commit is contained in:
2025-01-03 22:28:25 +00:00
parent 6cf055db22
commit 05fdefc3e2
45 changed files with 868 additions and 46 deletions
@@ -0,0 +1,81 @@
import 'package:backend_dart/domain/errors/app_error.dart';
import 'package:backend_dart/domain/errors/error.dart';
import 'package:backend_dart/domain/repository/auth_repository.dart';
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:fpdart/fpdart.dart';
class InMemoryAuthRepositoryImpl implements AuthRepository {
final String secretKey;
final Map<String, String> sessionCache = {};
final Duration tokenExpiry;
InMemoryAuthRepositoryImpl({
required this.secretKey,
this.tokenExpiry = const Duration(hours: 24),
});
@override
TaskEither<IError, String> generateToken(String userId) {
return TaskEither.tryCatch(
() async {
final jwt = JWT({
'userId': userId,
'exp': DateTime.now().add(tokenExpiry).millisecondsSinceEpoch,
});
final token = jwt.sign(SecretKey(secretKey));
// Add to cache
sessionCache[token] = userId;
return token;
},
(error, _) =>
AppError.authenticationError(message: 'Failed to generate token'),
);
}
@override
TaskEither<IError, String> validateToken(String token) {
return TaskEither.tryCatch(
() async {
final jwt = JWT.verify(token, SecretKey(secretKey));
// Extract userId
final userId = jwt.payload['userId'] as String?;
if (userId == null) {
throw AppError.authenticationError(
message: 'Invalid token payload: userId not found');
}
// Check if the token exists in the cache
if (!sessionCache.containsKey(token)) {
throw AppError.authenticationError(
message: 'Token not found in cache');
}
return userId;
},
(error, _) => error is AppError
? error
: AppError.authenticationError(message: 'Failed to validate token'),
);
}
@override
TaskEither<IError, void> revokeToken(String token) {
return TaskEither.tryCatch(
() async {
if (sessionCache.containsKey(token)) {
sessionCache.remove(token);
return;
} else {
throw AppError.authenticationError(message: 'Token not found');
}
},
(error, _) => error is AppError
? error
: AppError.authenticationError(message: 'Failed to revoke token'),
);
}
}
@@ -1,6 +1,6 @@
import 'package:backend_dart/domain/data/database.dart';
import 'package:backend_dart/domain/entities/project.dart';
import 'package:backend_dart/domain/interface/error.dart';
import 'package:backend_dart/domain/errors/error.dart';
import 'package:backend_dart/domain/repository/project_repository.dart';
import 'package:fpdart/fpdart.dart';
@@ -1,6 +1,6 @@
import 'package:backend_dart/domain/data/database.dart';
import 'package:backend_dart/domain/entities/project_task.dart';
import 'package:backend_dart/domain/interface/error.dart';
import 'package:backend_dart/domain/errors/error.dart';
import 'package:backend_dart/domain/repository/project_task_repository.dart';
import 'package:fpdart/fpdart.dart';
@@ -1,7 +1,9 @@
import 'package:backend_dart/application/repository/in_memory_auth_repository_impl.dart';
import 'package:backend_dart/application/repository/project_repository_impl.dart';
import 'package:backend_dart/application/repository/project_task_repository_impl.dart';
import 'package:backend_dart/application/repository/time_entry_repository_impl.dart';
import 'package:backend_dart/application/repository/user_repository_impl.dart';
import 'package:backend_dart/domain/repository/auth_repository.dart';
import 'package:backend_dart/domain/repository/project_repository.dart';
import 'package:backend_dart/domain/repository/project_task_repository.dart';
import 'package:backend_dart/domain/repository/time_entry_repository.dart';
@@ -28,3 +30,7 @@ final timeEntryProvider = Provider<TimeEntryRepository>((ref) {
final database = ref.read(databaseProvider);
return TimeEntryRepositoryImpl(database);
});
final authProvider = Provider<AuthRepository>((ref) {
return InMemoryAuthRepositoryImpl(secretKey: "Secret");
});
@@ -1,6 +1,6 @@
import 'package:backend_dart/domain/data/database.dart';
import 'package:backend_dart/domain/entities/time_entry.dart';
import 'package:backend_dart/domain/interface/error.dart';
import 'package:backend_dart/domain/errors/error.dart';
import 'package:backend_dart/domain/repository/time_entry_repository.dart';
import 'package:fpdart/fpdart.dart';
@@ -1,6 +1,6 @@
import 'package:backend_dart/domain/entities/user.dart';
import 'package:backend_dart/domain/data/database.dart';
import 'package:backend_dart/domain/interface/error.dart';
import 'package:backend_dart/domain/errors/error.dart';
import 'package:backend_dart/domain/repository/user_repository.dart';
import 'package:fpdart/fpdart.dart';