implemented auth repository and service in dart (JWT)
This commit is contained in:
@@ -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';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user