implemented auth repository and service in dart (JWT)
This commit is contained in:
parent
6cf055db22
commit
05fdefc3e2
@ -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';
|
||||
|
||||
|
77
backend-dart/lib/application/service/auth_service.dart
Normal file
77
backend-dart/lib/application/service/auth_service.dart
Normal file
@ -0,0 +1,77 @@
|
||||
import 'dart:convert';
|
||||
import 'package:backend_dart/application/service/dto/auth_dto.dart';
|
||||
import 'package:backend_dart/common/request_helper.dart';
|
||||
import 'package:backend_dart/common/response_helpers.dart';
|
||||
import 'package:backend_dart/common/secure_hash.dart';
|
||||
import 'package:backend_dart/common/validation.dart';
|
||||
import 'package:backend_dart/domain/entities/user.dart';
|
||||
import 'package:backend_dart/domain/errors/app_error.dart';
|
||||
import 'package:backend_dart/domain/repository/auth_repository.dart';
|
||||
import 'package:backend_dart/domain/repository/user_repository.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
import 'package:shelf/shelf.dart';
|
||||
import 'package:shelf_router/shelf_router.dart';
|
||||
|
||||
part 'auth_service.g.dart';
|
||||
|
||||
class AuthService {
|
||||
final AuthRepository authRepository;
|
||||
final UserRepository users;
|
||||
|
||||
AuthService(this.authRepository, this.users);
|
||||
|
||||
/// Route to generate a token
|
||||
@Route.post('/login')
|
||||
Future<Response> generateToken(Request request) async {
|
||||
return requestToJson(request)
|
||||
.flatMap(validateJsonKeys(['email', 'password']))
|
||||
.flatMap((json) => decodeJson(json, LoginRequestDTO.fromJson))
|
||||
.flatMap<User>(
|
||||
(loginRequest) => users.findByEmail(loginRequest.email).flatMap(
|
||||
(user) => user.passwordHash ==
|
||||
generateSecureHash(loginRequest.password)
|
||||
? TaskEither.right(user)
|
||||
: TaskEither.left(
|
||||
AppError.authenticationError(
|
||||
message: 'Invalid email or password'),
|
||||
),
|
||||
),
|
||||
)
|
||||
.flatMap((user) => authRepository.generateToken(user.id).map((token) =>
|
||||
TokenResponseDTO(token: token, userId: user.id).toJson()))
|
||||
.map(jsonEncode)
|
||||
.toResponse()
|
||||
.run();
|
||||
}
|
||||
|
||||
/// Route to validate a token
|
||||
@Route.post('/validate')
|
||||
Future<Response> validateToken(Request request) async {
|
||||
return requestToJson(request)
|
||||
.flatMap(validateJsonKeys(['token']))
|
||||
.flatMap((json) => decodeJson(json, TokenRequestDTO.fromJson))
|
||||
.map((tokenRequest) => tokenRequest.token)
|
||||
.flatMap((token) => authRepository.validateToken(token).map((userId) =>
|
||||
TokenResponseDTO(token: token, userId: userId).toJson()))
|
||||
.map(jsonEncode)
|
||||
.toResponse()
|
||||
.run();
|
||||
}
|
||||
|
||||
/// Route to revoke a token
|
||||
@Route.post('/revoke')
|
||||
Future<Response> revokeToken(Request request) async {
|
||||
return requestToJson(request)
|
||||
.flatMap(validateJsonKeys(['token']))
|
||||
.flatMap((json) => decodeJson(json, TokenRequestDTO.fromJson))
|
||||
.map((tokenRequest) => tokenRequest.token)
|
||||
.flatMap(authRepository.revokeToken)
|
||||
.map((_) => {'message': 'Token revoked successfully'})
|
||||
.map(jsonEncode)
|
||||
.toResponse()
|
||||
.run();
|
||||
}
|
||||
|
||||
/// Router for the AuthService
|
||||
Router get router => _$AuthServiceRouter(this);
|
||||
}
|
27
backend-dart/lib/application/service/auth_service.g.dart
Normal file
27
backend-dart/lib/application/service/auth_service.g.dart
Normal file
@ -0,0 +1,27 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'auth_service.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// ShelfRouterGenerator
|
||||
// **************************************************************************
|
||||
|
||||
Router _$AuthServiceRouter(AuthService service) {
|
||||
final router = Router();
|
||||
router.add(
|
||||
'POST',
|
||||
r'/login',
|
||||
service.generateToken,
|
||||
);
|
||||
router.add(
|
||||
'POST',
|
||||
r'/validate',
|
||||
service.validateToken,
|
||||
);
|
||||
router.add(
|
||||
'POST',
|
||||
r'/revoke',
|
||||
service.revokeToken,
|
||||
);
|
||||
return router;
|
||||
}
|
42
backend-dart/lib/application/service/dto/auth_dto.dart
Normal file
42
backend-dart/lib/application/service/dto/auth_dto.dart
Normal file
@ -0,0 +1,42 @@
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
part 'auth_dto.freezed.dart';
|
||||
part 'auth_dto.g.dart';
|
||||
|
||||
/// TokenResponseDTO represents the response for a token generation or validation.
|
||||
@freezed
|
||||
class TokenResponseDTO with _$TokenResponseDTO {
|
||||
const factory TokenResponseDTO({
|
||||
required String token,
|
||||
required String userId,
|
||||
}) = _TokenResponseDTO;
|
||||
|
||||
/// JSON serialization
|
||||
factory TokenResponseDTO.fromJson(Map<String, dynamic> json) =>
|
||||
_$TokenResponseDTOFromJson(json);
|
||||
}
|
||||
|
||||
/// TokenRequestDTO represents a request for operations involving tokens.
|
||||
@freezed
|
||||
class TokenRequestDTO with _$TokenRequestDTO {
|
||||
const factory TokenRequestDTO({
|
||||
required String token,
|
||||
}) = _TokenRequestDTO;
|
||||
|
||||
/// JSON serialization
|
||||
factory TokenRequestDTO.fromJson(Map<String, dynamic> json) =>
|
||||
_$TokenRequestDTOFromJson(json);
|
||||
}
|
||||
|
||||
/// LoginRequestDTO represents the login request.
|
||||
@freezed
|
||||
class LoginRequestDTO with _$LoginRequestDTO {
|
||||
const factory LoginRequestDTO({
|
||||
required String email,
|
||||
required String password,
|
||||
}) = _LoginRequestDTO;
|
||||
|
||||
/// JSON serialization
|
||||
factory LoginRequestDTO.fromJson(Map<String, dynamic> json) =>
|
||||
_$LoginRequestDTOFromJson(json);
|
||||
}
|
503
backend-dart/lib/application/service/dto/auth_dto.freezed.dart
Normal file
503
backend-dart/lib/application/service/dto/auth_dto.freezed.dart
Normal file
@ -0,0 +1,503 @@
|
||||
// coverage:ignore-file
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||
|
||||
part of 'auth_dto.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// FreezedGenerator
|
||||
// **************************************************************************
|
||||
|
||||
T _$identity<T>(T value) => value;
|
||||
|
||||
final _privateConstructorUsedError = UnsupportedError(
|
||||
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
|
||||
|
||||
TokenResponseDTO _$TokenResponseDTOFromJson(Map<String, dynamic> json) {
|
||||
return _TokenResponseDTO.fromJson(json);
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
mixin _$TokenResponseDTO {
|
||||
String get token => throw _privateConstructorUsedError;
|
||||
String get userId => throw _privateConstructorUsedError;
|
||||
|
||||
/// Serializes this TokenResponseDTO to a JSON map.
|
||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||
|
||||
/// Create a copy of TokenResponseDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
$TokenResponseDTOCopyWith<TokenResponseDTO> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class $TokenResponseDTOCopyWith<$Res> {
|
||||
factory $TokenResponseDTOCopyWith(
|
||||
TokenResponseDTO value, $Res Function(TokenResponseDTO) then) =
|
||||
_$TokenResponseDTOCopyWithImpl<$Res, TokenResponseDTO>;
|
||||
@useResult
|
||||
$Res call({String token, String userId});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$TokenResponseDTOCopyWithImpl<$Res, $Val extends TokenResponseDTO>
|
||||
implements $TokenResponseDTOCopyWith<$Res> {
|
||||
_$TokenResponseDTOCopyWithImpl(this._value, this._then);
|
||||
|
||||
// ignore: unused_field
|
||||
final $Val _value;
|
||||
// ignore: unused_field
|
||||
final $Res Function($Val) _then;
|
||||
|
||||
/// Create a copy of TokenResponseDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? token = null,
|
||||
Object? userId = null,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
token: null == token
|
||||
? _value.token
|
||||
: token // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
userId: null == userId
|
||||
? _value.userId
|
||||
: userId // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
) as $Val);
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$TokenResponseDTOImplCopyWith<$Res>
|
||||
implements $TokenResponseDTOCopyWith<$Res> {
|
||||
factory _$$TokenResponseDTOImplCopyWith(_$TokenResponseDTOImpl value,
|
||||
$Res Function(_$TokenResponseDTOImpl) then) =
|
||||
__$$TokenResponseDTOImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call({String token, String userId});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$TokenResponseDTOImplCopyWithImpl<$Res>
|
||||
extends _$TokenResponseDTOCopyWithImpl<$Res, _$TokenResponseDTOImpl>
|
||||
implements _$$TokenResponseDTOImplCopyWith<$Res> {
|
||||
__$$TokenResponseDTOImplCopyWithImpl(_$TokenResponseDTOImpl _value,
|
||||
$Res Function(_$TokenResponseDTOImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of TokenResponseDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? token = null,
|
||||
Object? userId = null,
|
||||
}) {
|
||||
return _then(_$TokenResponseDTOImpl(
|
||||
token: null == token
|
||||
? _value.token
|
||||
: token // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
userId: null == userId
|
||||
? _value.userId
|
||||
: userId // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
@JsonSerializable()
|
||||
class _$TokenResponseDTOImpl implements _TokenResponseDTO {
|
||||
const _$TokenResponseDTOImpl({required this.token, required this.userId});
|
||||
|
||||
factory _$TokenResponseDTOImpl.fromJson(Map<String, dynamic> json) =>
|
||||
_$$TokenResponseDTOImplFromJson(json);
|
||||
|
||||
@override
|
||||
final String token;
|
||||
@override
|
||||
final String userId;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'TokenResponseDTO(token: $token, userId: $userId)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$TokenResponseDTOImpl &&
|
||||
(identical(other.token, token) || other.token == token) &&
|
||||
(identical(other.userId, userId) || other.userId == userId));
|
||||
}
|
||||
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType, token, userId);
|
||||
|
||||
/// Create a copy of TokenResponseDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$TokenResponseDTOImplCopyWith<_$TokenResponseDTOImpl> get copyWith =>
|
||||
__$$TokenResponseDTOImplCopyWithImpl<_$TokenResponseDTOImpl>(
|
||||
this, _$identity);
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson() {
|
||||
return _$$TokenResponseDTOImplToJson(
|
||||
this,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _TokenResponseDTO implements TokenResponseDTO {
|
||||
const factory _TokenResponseDTO(
|
||||
{required final String token,
|
||||
required final String userId}) = _$TokenResponseDTOImpl;
|
||||
|
||||
factory _TokenResponseDTO.fromJson(Map<String, dynamic> json) =
|
||||
_$TokenResponseDTOImpl.fromJson;
|
||||
|
||||
@override
|
||||
String get token;
|
||||
@override
|
||||
String get userId;
|
||||
|
||||
/// Create a copy of TokenResponseDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@override
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
_$$TokenResponseDTOImplCopyWith<_$TokenResponseDTOImpl> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
TokenRequestDTO _$TokenRequestDTOFromJson(Map<String, dynamic> json) {
|
||||
return _TokenRequestDTO.fromJson(json);
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
mixin _$TokenRequestDTO {
|
||||
String get token => throw _privateConstructorUsedError;
|
||||
|
||||
/// Serializes this TokenRequestDTO to a JSON map.
|
||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||
|
||||
/// Create a copy of TokenRequestDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
$TokenRequestDTOCopyWith<TokenRequestDTO> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class $TokenRequestDTOCopyWith<$Res> {
|
||||
factory $TokenRequestDTOCopyWith(
|
||||
TokenRequestDTO value, $Res Function(TokenRequestDTO) then) =
|
||||
_$TokenRequestDTOCopyWithImpl<$Res, TokenRequestDTO>;
|
||||
@useResult
|
||||
$Res call({String token});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$TokenRequestDTOCopyWithImpl<$Res, $Val extends TokenRequestDTO>
|
||||
implements $TokenRequestDTOCopyWith<$Res> {
|
||||
_$TokenRequestDTOCopyWithImpl(this._value, this._then);
|
||||
|
||||
// ignore: unused_field
|
||||
final $Val _value;
|
||||
// ignore: unused_field
|
||||
final $Res Function($Val) _then;
|
||||
|
||||
/// Create a copy of TokenRequestDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? token = null,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
token: null == token
|
||||
? _value.token
|
||||
: token // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
) as $Val);
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$TokenRequestDTOImplCopyWith<$Res>
|
||||
implements $TokenRequestDTOCopyWith<$Res> {
|
||||
factory _$$TokenRequestDTOImplCopyWith(_$TokenRequestDTOImpl value,
|
||||
$Res Function(_$TokenRequestDTOImpl) then) =
|
||||
__$$TokenRequestDTOImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call({String token});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$TokenRequestDTOImplCopyWithImpl<$Res>
|
||||
extends _$TokenRequestDTOCopyWithImpl<$Res, _$TokenRequestDTOImpl>
|
||||
implements _$$TokenRequestDTOImplCopyWith<$Res> {
|
||||
__$$TokenRequestDTOImplCopyWithImpl(
|
||||
_$TokenRequestDTOImpl _value, $Res Function(_$TokenRequestDTOImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of TokenRequestDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? token = null,
|
||||
}) {
|
||||
return _then(_$TokenRequestDTOImpl(
|
||||
token: null == token
|
||||
? _value.token
|
||||
: token // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
@JsonSerializable()
|
||||
class _$TokenRequestDTOImpl implements _TokenRequestDTO {
|
||||
const _$TokenRequestDTOImpl({required this.token});
|
||||
|
||||
factory _$TokenRequestDTOImpl.fromJson(Map<String, dynamic> json) =>
|
||||
_$$TokenRequestDTOImplFromJson(json);
|
||||
|
||||
@override
|
||||
final String token;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'TokenRequestDTO(token: $token)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$TokenRequestDTOImpl &&
|
||||
(identical(other.token, token) || other.token == token));
|
||||
}
|
||||
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType, token);
|
||||
|
||||
/// Create a copy of TokenRequestDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$TokenRequestDTOImplCopyWith<_$TokenRequestDTOImpl> get copyWith =>
|
||||
__$$TokenRequestDTOImplCopyWithImpl<_$TokenRequestDTOImpl>(
|
||||
this, _$identity);
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson() {
|
||||
return _$$TokenRequestDTOImplToJson(
|
||||
this,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _TokenRequestDTO implements TokenRequestDTO {
|
||||
const factory _TokenRequestDTO({required final String token}) =
|
||||
_$TokenRequestDTOImpl;
|
||||
|
||||
factory _TokenRequestDTO.fromJson(Map<String, dynamic> json) =
|
||||
_$TokenRequestDTOImpl.fromJson;
|
||||
|
||||
@override
|
||||
String get token;
|
||||
|
||||
/// Create a copy of TokenRequestDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@override
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
_$$TokenRequestDTOImplCopyWith<_$TokenRequestDTOImpl> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
LoginRequestDTO _$LoginRequestDTOFromJson(Map<String, dynamic> json) {
|
||||
return _LoginRequestDTO.fromJson(json);
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
mixin _$LoginRequestDTO {
|
||||
String get email => throw _privateConstructorUsedError;
|
||||
String get password => throw _privateConstructorUsedError;
|
||||
|
||||
/// Serializes this LoginRequestDTO to a JSON map.
|
||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||
|
||||
/// Create a copy of LoginRequestDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
$LoginRequestDTOCopyWith<LoginRequestDTO> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class $LoginRequestDTOCopyWith<$Res> {
|
||||
factory $LoginRequestDTOCopyWith(
|
||||
LoginRequestDTO value, $Res Function(LoginRequestDTO) then) =
|
||||
_$LoginRequestDTOCopyWithImpl<$Res, LoginRequestDTO>;
|
||||
@useResult
|
||||
$Res call({String email, String password});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$LoginRequestDTOCopyWithImpl<$Res, $Val extends LoginRequestDTO>
|
||||
implements $LoginRequestDTOCopyWith<$Res> {
|
||||
_$LoginRequestDTOCopyWithImpl(this._value, this._then);
|
||||
|
||||
// ignore: unused_field
|
||||
final $Val _value;
|
||||
// ignore: unused_field
|
||||
final $Res Function($Val) _then;
|
||||
|
||||
/// Create a copy of LoginRequestDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? email = null,
|
||||
Object? password = null,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
email: null == email
|
||||
? _value.email
|
||||
: email // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
password: null == password
|
||||
? _value.password
|
||||
: password // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
) as $Val);
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$LoginRequestDTOImplCopyWith<$Res>
|
||||
implements $LoginRequestDTOCopyWith<$Res> {
|
||||
factory _$$LoginRequestDTOImplCopyWith(_$LoginRequestDTOImpl value,
|
||||
$Res Function(_$LoginRequestDTOImpl) then) =
|
||||
__$$LoginRequestDTOImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call({String email, String password});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$LoginRequestDTOImplCopyWithImpl<$Res>
|
||||
extends _$LoginRequestDTOCopyWithImpl<$Res, _$LoginRequestDTOImpl>
|
||||
implements _$$LoginRequestDTOImplCopyWith<$Res> {
|
||||
__$$LoginRequestDTOImplCopyWithImpl(
|
||||
_$LoginRequestDTOImpl _value, $Res Function(_$LoginRequestDTOImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
/// Create a copy of LoginRequestDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? email = null,
|
||||
Object? password = null,
|
||||
}) {
|
||||
return _then(_$LoginRequestDTOImpl(
|
||||
email: null == email
|
||||
? _value.email
|
||||
: email // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
password: null == password
|
||||
? _value.password
|
||||
: password // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
@JsonSerializable()
|
||||
class _$LoginRequestDTOImpl implements _LoginRequestDTO {
|
||||
const _$LoginRequestDTOImpl({required this.email, required this.password});
|
||||
|
||||
factory _$LoginRequestDTOImpl.fromJson(Map<String, dynamic> json) =>
|
||||
_$$LoginRequestDTOImplFromJson(json);
|
||||
|
||||
@override
|
||||
final String email;
|
||||
@override
|
||||
final String password;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'LoginRequestDTO(email: $email, password: $password)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$LoginRequestDTOImpl &&
|
||||
(identical(other.email, email) || other.email == email) &&
|
||||
(identical(other.password, password) ||
|
||||
other.password == password));
|
||||
}
|
||||
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType, email, password);
|
||||
|
||||
/// Create a copy of LoginRequestDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$LoginRequestDTOImplCopyWith<_$LoginRequestDTOImpl> get copyWith =>
|
||||
__$$LoginRequestDTOImplCopyWithImpl<_$LoginRequestDTOImpl>(
|
||||
this, _$identity);
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson() {
|
||||
return _$$LoginRequestDTOImplToJson(
|
||||
this,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _LoginRequestDTO implements LoginRequestDTO {
|
||||
const factory _LoginRequestDTO(
|
||||
{required final String email,
|
||||
required final String password}) = _$LoginRequestDTOImpl;
|
||||
|
||||
factory _LoginRequestDTO.fromJson(Map<String, dynamic> json) =
|
||||
_$LoginRequestDTOImpl.fromJson;
|
||||
|
||||
@override
|
||||
String get email;
|
||||
@override
|
||||
String get password;
|
||||
|
||||
/// Create a copy of LoginRequestDTO
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@override
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
_$$LoginRequestDTOImplCopyWith<_$LoginRequestDTOImpl> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
47
backend-dart/lib/application/service/dto/auth_dto.g.dart
Normal file
47
backend-dart/lib/application/service/dto/auth_dto.g.dart
Normal file
@ -0,0 +1,47 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'auth_dto.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
_$TokenResponseDTOImpl _$$TokenResponseDTOImplFromJson(
|
||||
Map<String, dynamic> json) =>
|
||||
_$TokenResponseDTOImpl(
|
||||
token: json['token'] as String,
|
||||
userId: json['userId'] as String,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$$TokenResponseDTOImplToJson(
|
||||
_$TokenResponseDTOImpl instance) =>
|
||||
<String, dynamic>{
|
||||
'token': instance.token,
|
||||
'userId': instance.userId,
|
||||
};
|
||||
|
||||
_$TokenRequestDTOImpl _$$TokenRequestDTOImplFromJson(
|
||||
Map<String, dynamic> json) =>
|
||||
_$TokenRequestDTOImpl(
|
||||
token: json['token'] as String,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$$TokenRequestDTOImplToJson(
|
||||
_$TokenRequestDTOImpl instance) =>
|
||||
<String, dynamic>{
|
||||
'token': instance.token,
|
||||
};
|
||||
|
||||
_$LoginRequestDTOImpl _$$LoginRequestDTOImplFromJson(
|
||||
Map<String, dynamic> json) =>
|
||||
_$LoginRequestDTOImpl(
|
||||
email: json['email'] as String,
|
||||
password: json['password'] as String,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$$LoginRequestDTOImplToJson(
|
||||
_$LoginRequestDTOImpl instance) =>
|
||||
<String, dynamic>{
|
||||
'email': instance.email,
|
||||
'password': instance.password,
|
||||
};
|
@ -1,6 +1,6 @@
|
||||
import 'package:backend_dart/application/service/dto/project_dto.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:fpdart/fpdart.dart';
|
||||
|
||||
class ProjectDtoMapper {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'package:backend_dart/application/service/dto/project_task_dto.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:fpdart/fpdart.dart';
|
||||
|
||||
class ProjectTaskDtoMapper {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'package:backend_dart/application/service/dto/time_entry_dto.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:fpdart/fpdart.dart';
|
||||
|
||||
class TimeEntryDtoMapper {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'package:backend_dart/application/service/dto/user_dto.dart';
|
||||
import 'package:backend_dart/domain/entities/user.dart';
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
|
||||
class UserDtoMapper {
|
||||
|
@ -1,4 +1,5 @@
|
||||
import 'package:backend_dart/application/repository/provider.dart';
|
||||
import 'package:backend_dart/application/service/auth_service.dart';
|
||||
import 'package:backend_dart/application/service/project_service.dart';
|
||||
import 'package:backend_dart/application/service/project_task_service.dart';
|
||||
import 'package:backend_dart/application/service/time_entry_service.dart';
|
||||
@ -24,3 +25,9 @@ final timeEntryServiceProvider = Provider<TimeEntryService>((ref) {
|
||||
final database = ref.read(timeEntryProvider);
|
||||
return TimeEntryService(database);
|
||||
});
|
||||
|
||||
final authServiceProvider = Provider<AuthService>((ref) {
|
||||
final authRepository = ref.read(authProvider);
|
||||
final users = ref.read(userRepoProvider);
|
||||
return AuthService(authRepository, users);
|
||||
});
|
||||
|
@ -1,4 +1,4 @@
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
|
||||
TaskEither<IError, T> Function(T?) errorOnNull<T>(IError error) {
|
||||
|
@ -2,7 +2,7 @@ import 'dart:convert';
|
||||
import 'dart:core';
|
||||
|
||||
import 'package:backend_dart/domain/errors/app_error.dart';
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
import 'package:shelf/shelf.dart';
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'dart:convert';
|
||||
import 'package:backend_dart/domain/errors/error_code.dart';
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
import 'package:shelf/shelf.dart';
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
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:fpdart/fpdart.dart';
|
||||
|
||||
/// Interface for managing project data interactions.
|
||||
|
@ -1,5 +1,5 @@
|
||||
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:fpdart/fpdart.dart';
|
||||
|
||||
/// Interface for managing task data interactions.
|
||||
|
@ -1,5 +1,5 @@
|
||||
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:fpdart/fpdart.dart';
|
||||
|
||||
/// Interface for managing time entry data interactions.
|
||||
|
@ -1,5 +1,5 @@
|
||||
import 'package:backend_dart/domain/entities/user.dart';
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
|
||||
abstract class UserDataSource {
|
||||
|
@ -1,4 +1,4 @@
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'error_code.dart';
|
||||
|
||||
@ -48,4 +48,8 @@ class AppError with _$AppError implements IError {
|
||||
factory AppError.inputError({String? message}) {
|
||||
return AppError.fromErrorCode(ErrorCode.inputError, message: message);
|
||||
}
|
||||
|
||||
factory AppError.authenticationError({String? message}) {
|
||||
return AppError.fromErrorCode(ErrorCode.authenticationError, message: message);
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ enum ErrorCode {
|
||||
validationError, // Eingabevalidierungsfehler
|
||||
unexpectedError, // Unerwarteter Fehler
|
||||
authenticationError, // Authentifizierungsfehler
|
||||
authorizationError, // Autorisierungsfehler
|
||||
permissionDenied, // Berechtigungsfehler
|
||||
notFound, // Ressource nicht gefunden
|
||||
exception, // Ausnahme
|
||||
|
@ -1,16 +0,0 @@
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
|
||||
abstract class IMapper<U, V> {
|
||||
/// Konvertiert von Typ U (Origin) zu Typ V (Target)
|
||||
TaskEither<IError, V> to(U origin);
|
||||
|
||||
/// Konvertiert von Typ V (Target) zu Typ U (Origin)
|
||||
TaskEither<IError, U> from(V target);
|
||||
|
||||
/// Konvertiert eine Liste von Typ U (Origin) zu einer Liste von Typ V (Target)
|
||||
TaskEither<IError, List<V>> listTo(Iterable<U> origins);
|
||||
|
||||
/// Konvertiert eine Liste von Typ V (Target) zu einer Liste von Typ U (Origin)
|
||||
TaskEither<IError, List<U>> listFrom(Iterable<V> targets);
|
||||
}
|
8
backend-dart/lib/domain/repository/auth_repository.dart
Normal file
8
backend-dart/lib/domain/repository/auth_repository.dart
Normal file
@ -0,0 +1,8 @@
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
|
||||
abstract class AuthRepository {
|
||||
TaskEither<IError, String> generateToken(String userId);
|
||||
TaskEither<IError, String> validateToken(String token);
|
||||
TaskEither<IError, void> revokeToken(String token);
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
import 'package:fpdart/fpdart.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';
|
||||
|
||||
abstract class ProjectRepository {
|
||||
/// Creates a new project.
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'package:fpdart/fpdart.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';
|
||||
|
||||
abstract class ProjectTaskRepository {
|
||||
/// Creates a new project task.
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'package:fpdart/fpdart.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';
|
||||
|
||||
abstract class TimeEntryRepository {
|
||||
/// Creates a new time entry.
|
||||
|
@ -1,5 +1,5 @@
|
||||
import 'package:backend_dart/domain/entities/user.dart';
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
|
||||
abstract class UserRepository {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'package:backend_dart/common/extensions.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/infrastructure/persistence/db/model.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/prisma.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'package:backend_dart/common/extensions.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/infrastructure/persistence/db/model.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/prisma.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'package:backend_dart/common/extensions.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/infrastructure/persistence/db/model.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/prisma.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:backend_dart/common/extensions.dart';
|
||||
import 'package:backend_dart/common/secure_hash.dart';
|
||||
import 'package:backend_dart/domain/entities/user.dart';
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/model.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/prisma.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
|
@ -2,7 +2,7 @@ import 'package:backend_dart/common/error_on_null.dart';
|
||||
import 'package:backend_dart/domain/data/project_data_source.dart';
|
||||
import 'package:backend_dart/domain/entities/project.dart';
|
||||
import 'package:backend_dart/domain/errors/app_error.dart';
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/client.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/model.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/prisma.dart';
|
||||
|
@ -2,7 +2,7 @@ import 'package:backend_dart/common/error_on_null.dart';
|
||||
import 'package:backend_dart/domain/data/project_task_data_source.dart';
|
||||
import 'package:backend_dart/domain/entities/project_task.dart';
|
||||
import 'package:backend_dart/domain/errors/app_error.dart';
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/client.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/model.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/prisma.dart';
|
||||
|
@ -2,7 +2,7 @@ import 'package:backend_dart/common/error_on_null.dart';
|
||||
import 'package:backend_dart/domain/data/time_entry_data_source.dart';
|
||||
import 'package:backend_dart/domain/entities/time_entry.dart';
|
||||
import 'package:backend_dart/domain/errors/app_error.dart';
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/client.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/model.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/prisma.dart';
|
||||
|
@ -2,7 +2,7 @@ import 'package:backend_dart/common/error_on_null.dart';
|
||||
import 'package:backend_dart/domain/data/user_data_source.dart';
|
||||
import 'package:backend_dart/domain/entities/user.dart';
|
||||
import 'package:backend_dart/domain/errors/app_error.dart';
|
||||
import 'package:backend_dart/domain/interface/error.dart';
|
||||
import 'package:backend_dart/domain/errors/error.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/model.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/db/prisma.dart';
|
||||
import 'package:backend_dart/infrastructure/persistence/mapper/user_dbo_mapper.dart';
|
||||
|
@ -20,12 +20,14 @@ Router getRouter(ProviderContainer container) {
|
||||
final projectService = container.read(projectServiceProvider);
|
||||
final projectTaskService = container.read(projectTaskServiceProvider);
|
||||
final timeEntryService = container.read(timeEntryServiceProvider);
|
||||
final authService = container.read(authServiceProvider);
|
||||
|
||||
// UserService-Router
|
||||
router.mount('/api/users/', userService.router.call);
|
||||
router.mount('/api/projects/', projectService.router.call);
|
||||
router.mount('/api/project-tasks/', projectTaskService.router.call);
|
||||
router.mount('/api/time-entries/', timeEntryService.router.call);
|
||||
router.mount('/api/auth/', authService.router.call);
|
||||
|
||||
return router;
|
||||
}
|
||||
|
@ -14,6 +14,14 @@ packages:
|
||||
description: dart
|
||||
source: sdk
|
||||
version: "0.3.3"
|
||||
adaptive_number:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: adaptive_number
|
||||
sha256: "3a567544e9b5c9c803006f51140ad544aedc79604fd4f3f2c1380003f97c1d77"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -238,6 +246,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0+6.11.0"
|
||||
dart_jsonwebtoken:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: dart_jsonwebtoken
|
||||
sha256: "866787dc17afaef46a9ea7dd33eefe60c6d82084b4a36d70e8e788d091cd04ef"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.14.2"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -254,6 +270,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
ed25519_edwards:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ed25519_edwards
|
||||
sha256: "6ce0112d131327ec6d42beede1e5dfd526069b18ad45dcf654f15074ad9276cd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.1"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -478,6 +502,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.1"
|
||||
pointycastle:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pointycastle
|
||||
sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.9.1"
|
||||
pool:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -22,6 +22,7 @@ dependencies:
|
||||
freezed_annotation: ^2.4.4
|
||||
uuid: ^4.5.1
|
||||
crypto: ^3.0.6
|
||||
dart_jsonwebtoken: ^2.14.2
|
||||
|
||||
dev_dependencies:
|
||||
lints: ^3.0.0
|
||||
|
@ -28,7 +28,7 @@ func main() {
|
||||
projectRepo := repository.NewProjectRepository(database.Projects())
|
||||
projectTaskRepo := repository.NewProjectTaskRepository(database.ProjectTasks())
|
||||
timeEntryRepo := repository.NewTimeEntryRepository(database.TimeEntries())
|
||||
authRepo := repository.NewInMemoryAuthRepository("secret")
|
||||
authRepo := repository.NewInMemoryAuthRepositoryImpl("secret")
|
||||
|
||||
// Initialize services
|
||||
userService := services.NewUserService(userRepo)
|
||||
|
@ -19,7 +19,7 @@ type InMemoryAuthRepository struct {
|
||||
mu sync.RWMutex
|
||||
}
|
||||
|
||||
func NewInMemoryAuthRepository(secretKey string) repository.AuthRepository {
|
||||
func NewInMemoryAuthRepositoryImpl(secretKey string) repository.AuthRepository {
|
||||
return &InMemoryAuthRepository{
|
||||
secretKey: secretKey,
|
||||
sessionCache: make(map[string]string),
|
Loading…
x
Reference in New Issue
Block a user