From 207dda29dfff86069b708a2a5b5dd76e594453c0 Mon Sep 17 00:00:00 2001 From: efrilm Date: Thu, 18 Sep 2025 06:03:02 +0700 Subject: [PATCH] Register Repo --- lib/common/extension/date_extension.dart | 33 ++ lib/common/extension/extension.dart | 4 + lib/common/url/api_path.dart | 1 + lib/domain/auth/auth.dart | 1 + lib/domain/auth/auth.freezed.dart | 232 +++++++++ lib/domain/auth/entities/register_entity.dart | 20 + .../auth/repositories/i_auth_repository.dart | 6 + lib/infrastructure/auth/auth_dtos.dart | 1 + .../auth/auth_dtos.freezed.dart | 451 ++++++++++++++++++ lib/infrastructure/auth/auth_dtos.g.dart | 32 ++ .../datasources/remote_data_provider.dart | 46 ++ lib/infrastructure/auth/dto/register_dto.dart | 36 ++ .../auth/repositories/auth_repository.dart | 26 + lib/injection.config.dart | 11 + 14 files changed, 900 insertions(+) create mode 100644 lib/common/extension/date_extension.dart create mode 100644 lib/domain/auth/entities/register_entity.dart create mode 100644 lib/infrastructure/auth/dto/register_dto.dart diff --git a/lib/common/extension/date_extension.dart b/lib/common/extension/date_extension.dart new file mode 100644 index 0000000..0c552fd --- /dev/null +++ b/lib/common/extension/date_extension.dart @@ -0,0 +1,33 @@ +part of 'extension.dart'; + +extension DateTimeIndonesia on DateTime { + /// Format: 13 Agustus 2025 + String get toDate { + return DateFormat('d MMMM yyyy', 'id_ID').format(this); + } + + /// Format: 13 Agustus 2025 20:00 + String get toDatetime { + return DateFormat('d MMMM yyyy HH:mm', 'id_ID').format(this); + } + + /// Format: Rabu, 13 Agustus 2025 + String get toDayDate { + return DateFormat('EEEE, d MMMM yyyy', 'id_ID').format(this); + } + + /// Format: 13/08/2025 + String get toShortDate { + return DateFormat('dd/MM/yyyy', 'id_ID').format(this); + } + + /// Format: 13-08-2025 + String get toServerDate { + return DateFormat('dd-MM-yyyy', 'id_ID').format(this); + } + + /// Format jam: 14:30 + String get toHourMinute { + return DateFormat('HH:mm', 'id_ID').format(this); + } +} diff --git a/lib/common/extension/extension.dart b/lib/common/extension/extension.dart index efae5b7..90c7b9f 100644 --- a/lib/common/extension/extension.dart +++ b/lib/common/extension/extension.dart @@ -1,5 +1,9 @@ +import 'package:intl/intl.dart'; + import '../../domain/auth/auth.dart'; +part 'date_extension.dart'; + extension StringExt on String { CheckPhoneStatus toCheckPhoneStatus() { switch (this) { diff --git a/lib/common/url/api_path.dart b/lib/common/url/api_path.dart index ab0e15e..395ec2e 100644 --- a/lib/common/url/api_path.dart +++ b/lib/common/url/api_path.dart @@ -1,3 +1,4 @@ class ApiPath { static String checkPhone = '/api/v1/customer-auth/check-phone'; + static String register = '/api/v1/customer-auth/register/start'; } diff --git a/lib/domain/auth/auth.dart b/lib/domain/auth/auth.dart index 6464513..f1bf5b2 100644 --- a/lib/domain/auth/auth.dart +++ b/lib/domain/auth/auth.dart @@ -6,6 +6,7 @@ import '../../common/api/api_failure.dart'; part 'auth.freezed.dart'; part 'entities/check_phone_entity.dart'; +part 'entities/register_entity.dart'; part 'failures/auth_failure.dart'; part 'repositories/i_auth_repository.dart'; diff --git a/lib/domain/auth/auth.freezed.dart b/lib/domain/auth/auth.freezed.dart index 4b03f36..acb4047 100644 --- a/lib/domain/auth/auth.freezed.dart +++ b/lib/domain/auth/auth.freezed.dart @@ -192,6 +192,238 @@ abstract class _CheckPhone implements CheckPhone { throw _privateConstructorUsedError; } +/// @nodoc +mixin _$Register { + String get status => throw _privateConstructorUsedError; + String get message => throw _privateConstructorUsedError; + String get registrationToken => throw _privateConstructorUsedError; + String get otpToken => throw _privateConstructorUsedError; + int get expiresIn => throw _privateConstructorUsedError; + + /// Create a copy of Register + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $RegisterCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $RegisterCopyWith<$Res> { + factory $RegisterCopyWith(Register value, $Res Function(Register) then) = + _$RegisterCopyWithImpl<$Res, Register>; + @useResult + $Res call({ + String status, + String message, + String registrationToken, + String otpToken, + int expiresIn, + }); +} + +/// @nodoc +class _$RegisterCopyWithImpl<$Res, $Val extends Register> + implements $RegisterCopyWith<$Res> { + _$RegisterCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Register + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = null, + Object? message = null, + Object? registrationToken = null, + Object? otpToken = null, + Object? expiresIn = null, + }) { + return _then( + _value.copyWith( + status: null == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String, + message: null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + registrationToken: null == registrationToken + ? _value.registrationToken + : registrationToken // ignore: cast_nullable_to_non_nullable + as String, + otpToken: null == otpToken + ? _value.otpToken + : otpToken // ignore: cast_nullable_to_non_nullable + as String, + expiresIn: null == expiresIn + ? _value.expiresIn + : expiresIn // ignore: cast_nullable_to_non_nullable + as int, + ) + as $Val, + ); + } +} + +/// @nodoc +abstract class _$$RegisterImplCopyWith<$Res> + implements $RegisterCopyWith<$Res> { + factory _$$RegisterImplCopyWith( + _$RegisterImpl value, + $Res Function(_$RegisterImpl) then, + ) = __$$RegisterImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({ + String status, + String message, + String registrationToken, + String otpToken, + int expiresIn, + }); +} + +/// @nodoc +class __$$RegisterImplCopyWithImpl<$Res> + extends _$RegisterCopyWithImpl<$Res, _$RegisterImpl> + implements _$$RegisterImplCopyWith<$Res> { + __$$RegisterImplCopyWithImpl( + _$RegisterImpl _value, + $Res Function(_$RegisterImpl) _then, + ) : super(_value, _then); + + /// Create a copy of Register + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = null, + Object? message = null, + Object? registrationToken = null, + Object? otpToken = null, + Object? expiresIn = null, + }) { + return _then( + _$RegisterImpl( + status: null == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String, + message: null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + registrationToken: null == registrationToken + ? _value.registrationToken + : registrationToken // ignore: cast_nullable_to_non_nullable + as String, + otpToken: null == otpToken + ? _value.otpToken + : otpToken // ignore: cast_nullable_to_non_nullable + as String, + expiresIn: null == expiresIn + ? _value.expiresIn + : expiresIn // ignore: cast_nullable_to_non_nullable + as int, + ), + ); + } +} + +/// @nodoc + +class _$RegisterImpl implements _Register { + const _$RegisterImpl({ + required this.status, + required this.message, + required this.registrationToken, + required this.otpToken, + required this.expiresIn, + }); + + @override + final String status; + @override + final String message; + @override + final String registrationToken; + @override + final String otpToken; + @override + final int expiresIn; + + @override + String toString() { + return 'Register(status: $status, message: $message, registrationToken: $registrationToken, otpToken: $otpToken, expiresIn: $expiresIn)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$RegisterImpl && + (identical(other.status, status) || other.status == status) && + (identical(other.message, message) || other.message == message) && + (identical(other.registrationToken, registrationToken) || + other.registrationToken == registrationToken) && + (identical(other.otpToken, otpToken) || + other.otpToken == otpToken) && + (identical(other.expiresIn, expiresIn) || + other.expiresIn == expiresIn)); + } + + @override + int get hashCode => Object.hash( + runtimeType, + status, + message, + registrationToken, + otpToken, + expiresIn, + ); + + /// Create a copy of Register + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$RegisterImplCopyWith<_$RegisterImpl> get copyWith => + __$$RegisterImplCopyWithImpl<_$RegisterImpl>(this, _$identity); +} + +abstract class _Register implements Register { + const factory _Register({ + required final String status, + required final String message, + required final String registrationToken, + required final String otpToken, + required final int expiresIn, + }) = _$RegisterImpl; + + @override + String get status; + @override + String get message; + @override + String get registrationToken; + @override + String get otpToken; + @override + int get expiresIn; + + /// Create a copy of Register + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$RegisterImplCopyWith<_$RegisterImpl> get copyWith => + throw _privateConstructorUsedError; +} + /// @nodoc mixin _$AuthFailure { @optionalTypeArgs diff --git a/lib/domain/auth/entities/register_entity.dart b/lib/domain/auth/entities/register_entity.dart new file mode 100644 index 0000000..d441c20 --- /dev/null +++ b/lib/domain/auth/entities/register_entity.dart @@ -0,0 +1,20 @@ +part of '../auth.dart'; + +@freezed +class Register with _$Register { + const factory Register({ + required String status, + required String message, + required String registrationToken, + required String otpToken, + required int expiresIn, + }) = _Register; + + factory Register.empty() => const Register( + status: '', + message: '', + registrationToken: '', + otpToken: '', + expiresIn: 0, + ); +} diff --git a/lib/domain/auth/repositories/i_auth_repository.dart b/lib/domain/auth/repositories/i_auth_repository.dart index f36fc25..0f50b36 100644 --- a/lib/domain/auth/repositories/i_auth_repository.dart +++ b/lib/domain/auth/repositories/i_auth_repository.dart @@ -4,4 +4,10 @@ abstract class IAuthRepository { Future> checkPhone({ required String phoneNumber, }); + + Future> register({ + required String phoneNumber, + required String name, + required DateTime birthDate, + }); } diff --git a/lib/infrastructure/auth/auth_dtos.dart b/lib/infrastructure/auth/auth_dtos.dart index 8b87acb..6db07e8 100644 --- a/lib/infrastructure/auth/auth_dtos.dart +++ b/lib/infrastructure/auth/auth_dtos.dart @@ -6,3 +6,4 @@ part 'auth_dtos.freezed.dart'; part 'auth_dtos.g.dart'; part 'dto/check_phone_dto.dart'; +part 'dto/register_dto.dart'; diff --git a/lib/infrastructure/auth/auth_dtos.freezed.dart b/lib/infrastructure/auth/auth_dtos.freezed.dart index b0e183e..8b5c333 100644 --- a/lib/infrastructure/auth/auth_dtos.freezed.dart +++ b/lib/infrastructure/auth/auth_dtos.freezed.dart @@ -408,3 +408,454 @@ abstract class _CheckPhoneDataDto implements CheckPhoneDataDto { _$$CheckPhoneDataDtoImplCopyWith<_$CheckPhoneDataDtoImpl> get copyWith => throw _privateConstructorUsedError; } + +RegisterDto _$RegisterDtoFromJson(Map json) { + return _RegisterDto.fromJson(json); +} + +/// @nodoc +mixin _$RegisterDto { + @JsonKey(name: 'status') + String? get status => throw _privateConstructorUsedError; + @JsonKey(name: 'message') + String? get message => throw _privateConstructorUsedError; + @JsonKey(name: 'data') + RegisterDataDto? get data => throw _privateConstructorUsedError; + + /// Serializes this RegisterDto to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of RegisterDto + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $RegisterDtoCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $RegisterDtoCopyWith<$Res> { + factory $RegisterDtoCopyWith( + RegisterDto value, + $Res Function(RegisterDto) then, + ) = _$RegisterDtoCopyWithImpl<$Res, RegisterDto>; + @useResult + $Res call({ + @JsonKey(name: 'status') String? status, + @JsonKey(name: 'message') String? message, + @JsonKey(name: 'data') RegisterDataDto? data, + }); + + $RegisterDataDtoCopyWith<$Res>? get data; +} + +/// @nodoc +class _$RegisterDtoCopyWithImpl<$Res, $Val extends RegisterDto> + implements $RegisterDtoCopyWith<$Res> { + _$RegisterDtoCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of RegisterDto + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = freezed, + Object? message = freezed, + Object? data = freezed, + }) { + return _then( + _value.copyWith( + status: freezed == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String?, + message: freezed == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String?, + data: freezed == data + ? _value.data + : data // ignore: cast_nullable_to_non_nullable + as RegisterDataDto?, + ) + as $Val, + ); + } + + /// Create a copy of RegisterDto + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $RegisterDataDtoCopyWith<$Res>? get data { + if (_value.data == null) { + return null; + } + + return $RegisterDataDtoCopyWith<$Res>(_value.data!, (value) { + return _then(_value.copyWith(data: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$RegisterDtoImplCopyWith<$Res> + implements $RegisterDtoCopyWith<$Res> { + factory _$$RegisterDtoImplCopyWith( + _$RegisterDtoImpl value, + $Res Function(_$RegisterDtoImpl) then, + ) = __$$RegisterDtoImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({ + @JsonKey(name: 'status') String? status, + @JsonKey(name: 'message') String? message, + @JsonKey(name: 'data') RegisterDataDto? data, + }); + + @override + $RegisterDataDtoCopyWith<$Res>? get data; +} + +/// @nodoc +class __$$RegisterDtoImplCopyWithImpl<$Res> + extends _$RegisterDtoCopyWithImpl<$Res, _$RegisterDtoImpl> + implements _$$RegisterDtoImplCopyWith<$Res> { + __$$RegisterDtoImplCopyWithImpl( + _$RegisterDtoImpl _value, + $Res Function(_$RegisterDtoImpl) _then, + ) : super(_value, _then); + + /// Create a copy of RegisterDto + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = freezed, + Object? message = freezed, + Object? data = freezed, + }) { + return _then( + _$RegisterDtoImpl( + status: freezed == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String?, + message: freezed == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String?, + data: freezed == data + ? _value.data + : data // ignore: cast_nullable_to_non_nullable + as RegisterDataDto?, + ), + ); + } +} + +/// @nodoc +@JsonSerializable() +class _$RegisterDtoImpl extends _RegisterDto { + const _$RegisterDtoImpl({ + @JsonKey(name: 'status') this.status, + @JsonKey(name: 'message') this.message, + @JsonKey(name: 'data') this.data, + }) : super._(); + + factory _$RegisterDtoImpl.fromJson(Map json) => + _$$RegisterDtoImplFromJson(json); + + @override + @JsonKey(name: 'status') + final String? status; + @override + @JsonKey(name: 'message') + final String? message; + @override + @JsonKey(name: 'data') + final RegisterDataDto? data; + + @override + String toString() { + return 'RegisterDto(status: $status, message: $message, data: $data)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$RegisterDtoImpl && + (identical(other.status, status) || other.status == status) && + (identical(other.message, message) || other.message == message) && + (identical(other.data, data) || other.data == data)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, status, message, data); + + /// Create a copy of RegisterDto + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$RegisterDtoImplCopyWith<_$RegisterDtoImpl> get copyWith => + __$$RegisterDtoImplCopyWithImpl<_$RegisterDtoImpl>(this, _$identity); + + @override + Map toJson() { + return _$$RegisterDtoImplToJson(this); + } +} + +abstract class _RegisterDto extends RegisterDto { + const factory _RegisterDto({ + @JsonKey(name: 'status') final String? status, + @JsonKey(name: 'message') final String? message, + @JsonKey(name: 'data') final RegisterDataDto? data, + }) = _$RegisterDtoImpl; + const _RegisterDto._() : super._(); + + factory _RegisterDto.fromJson(Map json) = + _$RegisterDtoImpl.fromJson; + + @override + @JsonKey(name: 'status') + String? get status; + @override + @JsonKey(name: 'message') + String? get message; + @override + @JsonKey(name: 'data') + RegisterDataDto? get data; + + /// Create a copy of RegisterDto + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$RegisterDtoImplCopyWith<_$RegisterDtoImpl> get copyWith => + throw _privateConstructorUsedError; +} + +RegisterDataDto _$RegisterDataDtoFromJson(Map json) { + return _RegisterDataDto.fromJson(json); +} + +/// @nodoc +mixin _$RegisterDataDto { + @JsonKey(name: 'registration_token') + String? get registrationToken => throw _privateConstructorUsedError; + @JsonKey(name: 'otp_token') + String? get otpToken => throw _privateConstructorUsedError; + @JsonKey(name: 'expires_in') + int? get expiresIn => throw _privateConstructorUsedError; + + /// Serializes this RegisterDataDto to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of RegisterDataDto + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $RegisterDataDtoCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $RegisterDataDtoCopyWith<$Res> { + factory $RegisterDataDtoCopyWith( + RegisterDataDto value, + $Res Function(RegisterDataDto) then, + ) = _$RegisterDataDtoCopyWithImpl<$Res, RegisterDataDto>; + @useResult + $Res call({ + @JsonKey(name: 'registration_token') String? registrationToken, + @JsonKey(name: 'otp_token') String? otpToken, + @JsonKey(name: 'expires_in') int? expiresIn, + }); +} + +/// @nodoc +class _$RegisterDataDtoCopyWithImpl<$Res, $Val extends RegisterDataDto> + implements $RegisterDataDtoCopyWith<$Res> { + _$RegisterDataDtoCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of RegisterDataDto + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? registrationToken = freezed, + Object? otpToken = freezed, + Object? expiresIn = freezed, + }) { + return _then( + _value.copyWith( + registrationToken: freezed == registrationToken + ? _value.registrationToken + : registrationToken // ignore: cast_nullable_to_non_nullable + as String?, + otpToken: freezed == otpToken + ? _value.otpToken + : otpToken // ignore: cast_nullable_to_non_nullable + as String?, + expiresIn: freezed == expiresIn + ? _value.expiresIn + : expiresIn // ignore: cast_nullable_to_non_nullable + as int?, + ) + as $Val, + ); + } +} + +/// @nodoc +abstract class _$$RegisterDataDtoImplCopyWith<$Res> + implements $RegisterDataDtoCopyWith<$Res> { + factory _$$RegisterDataDtoImplCopyWith( + _$RegisterDataDtoImpl value, + $Res Function(_$RegisterDataDtoImpl) then, + ) = __$$RegisterDataDtoImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({ + @JsonKey(name: 'registration_token') String? registrationToken, + @JsonKey(name: 'otp_token') String? otpToken, + @JsonKey(name: 'expires_in') int? expiresIn, + }); +} + +/// @nodoc +class __$$RegisterDataDtoImplCopyWithImpl<$Res> + extends _$RegisterDataDtoCopyWithImpl<$Res, _$RegisterDataDtoImpl> + implements _$$RegisterDataDtoImplCopyWith<$Res> { + __$$RegisterDataDtoImplCopyWithImpl( + _$RegisterDataDtoImpl _value, + $Res Function(_$RegisterDataDtoImpl) _then, + ) : super(_value, _then); + + /// Create a copy of RegisterDataDto + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? registrationToken = freezed, + Object? otpToken = freezed, + Object? expiresIn = freezed, + }) { + return _then( + _$RegisterDataDtoImpl( + registrationToken: freezed == registrationToken + ? _value.registrationToken + : registrationToken // ignore: cast_nullable_to_non_nullable + as String?, + otpToken: freezed == otpToken + ? _value.otpToken + : otpToken // ignore: cast_nullable_to_non_nullable + as String?, + expiresIn: freezed == expiresIn + ? _value.expiresIn + : expiresIn // ignore: cast_nullable_to_non_nullable + as int?, + ), + ); + } +} + +/// @nodoc +@JsonSerializable() +class _$RegisterDataDtoImpl implements _RegisterDataDto { + const _$RegisterDataDtoImpl({ + @JsonKey(name: 'registration_token') this.registrationToken, + @JsonKey(name: 'otp_token') this.otpToken, + @JsonKey(name: 'expires_in') this.expiresIn, + }); + + factory _$RegisterDataDtoImpl.fromJson(Map json) => + _$$RegisterDataDtoImplFromJson(json); + + @override + @JsonKey(name: 'registration_token') + final String? registrationToken; + @override + @JsonKey(name: 'otp_token') + final String? otpToken; + @override + @JsonKey(name: 'expires_in') + final int? expiresIn; + + @override + String toString() { + return 'RegisterDataDto(registrationToken: $registrationToken, otpToken: $otpToken, expiresIn: $expiresIn)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$RegisterDataDtoImpl && + (identical(other.registrationToken, registrationToken) || + other.registrationToken == registrationToken) && + (identical(other.otpToken, otpToken) || + other.otpToken == otpToken) && + (identical(other.expiresIn, expiresIn) || + other.expiresIn == expiresIn)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => + Object.hash(runtimeType, registrationToken, otpToken, expiresIn); + + /// Create a copy of RegisterDataDto + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$RegisterDataDtoImplCopyWith<_$RegisterDataDtoImpl> get copyWith => + __$$RegisterDataDtoImplCopyWithImpl<_$RegisterDataDtoImpl>( + this, + _$identity, + ); + + @override + Map toJson() { + return _$$RegisterDataDtoImplToJson(this); + } +} + +abstract class _RegisterDataDto implements RegisterDataDto { + const factory _RegisterDataDto({ + @JsonKey(name: 'registration_token') final String? registrationToken, + @JsonKey(name: 'otp_token') final String? otpToken, + @JsonKey(name: 'expires_in') final int? expiresIn, + }) = _$RegisterDataDtoImpl; + + factory _RegisterDataDto.fromJson(Map json) = + _$RegisterDataDtoImpl.fromJson; + + @override + @JsonKey(name: 'registration_token') + String? get registrationToken; + @override + @JsonKey(name: 'otp_token') + String? get otpToken; + @override + @JsonKey(name: 'expires_in') + int? get expiresIn; + + /// Create a copy of RegisterDataDto + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$RegisterDataDtoImplCopyWith<_$RegisterDataDtoImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/infrastructure/auth/auth_dtos.g.dart b/lib/infrastructure/auth/auth_dtos.g.dart index ef59358..8d8c872 100644 --- a/lib/infrastructure/auth/auth_dtos.g.dart +++ b/lib/infrastructure/auth/auth_dtos.g.dart @@ -29,3 +29,35 @@ _$CheckPhoneDataDtoImpl _$$CheckPhoneDataDtoImplFromJson( Map _$$CheckPhoneDataDtoImplToJson( _$CheckPhoneDataDtoImpl instance, ) => {'phone_number': instance.phoneNumber}; + +_$RegisterDtoImpl _$$RegisterDtoImplFromJson(Map json) => + _$RegisterDtoImpl( + status: json['status'] as String?, + message: json['message'] as String?, + data: json['data'] == null + ? null + : RegisterDataDto.fromJson(json['data'] as Map), + ); + +Map _$$RegisterDtoImplToJson(_$RegisterDtoImpl instance) => + { + 'status': instance.status, + 'message': instance.message, + 'data': instance.data, + }; + +_$RegisterDataDtoImpl _$$RegisterDataDtoImplFromJson( + Map json, +) => _$RegisterDataDtoImpl( + registrationToken: json['registration_token'] as String?, + otpToken: json['otp_token'] as String?, + expiresIn: (json['expires_in'] as num?)?.toInt(), +); + +Map _$$RegisterDataDtoImplToJson( + _$RegisterDataDtoImpl instance, +) => { + 'registration_token': instance.registrationToken, + 'otp_token': instance.otpToken, + 'expires_in': instance.expiresIn, +}; diff --git a/lib/infrastructure/auth/datasources/remote_data_provider.dart b/lib/infrastructure/auth/datasources/remote_data_provider.dart index 6904fe8..181bf22 100644 --- a/lib/infrastructure/auth/datasources/remote_data_provider.dart +++ b/lib/infrastructure/auth/datasources/remote_data_provider.dart @@ -5,6 +5,7 @@ import 'package:data_channel/data_channel.dart'; import '../../../common/api/api_client.dart'; import '../../../common/api/api_failure.dart'; +import '../../../common/extension/extension.dart'; import '../../../common/url/api_path.dart'; import '../../../domain/auth/auth.dart'; import '../auth_dtos.dart'; @@ -50,4 +51,49 @@ class AuthRemoteDataProvider { return DC.error(AuthFailure.serverError(e)); } } + + Future> register({ + required String phoneNumber, + required String name, + required DateTime birthDate, + }) async { + try { + final response = await _apiClient.post( + ApiPath.register, + data: { + 'phone_number': phoneNumber, + 'name': name, + 'birth_date': birthDate.toServerDate, + }, + ); + + if (response.data['success'] == false) { + if ((response.data['errors'] as List).isNotEmpty) { + if (response.data['errors'][0]['code'] == "900") { + return DC.error( + AuthFailure.dynamicErrorMessage('No. Telepon Sudah Terdaftar'), + ); + } else { + return DC.error( + AuthFailure.dynamicErrorMessage( + 'Terjadi kesalahan coba lagi nanti', + ), + ); + } + } else { + return DC.error( + AuthFailure.dynamicErrorMessage( + 'Terjadi kesalahan coba lagi nanti', + ), + ); + } + } + + final dto = RegisterDto.fromJson(response.data['data']); + return DC.data(dto); + } on ApiFailure catch (e, s) { + log('register', name: _logName, error: e, stackTrace: s); + return DC.error(AuthFailure.serverError(e)); + } + } } diff --git a/lib/infrastructure/auth/dto/register_dto.dart b/lib/infrastructure/auth/dto/register_dto.dart new file mode 100644 index 0000000..4cadceb --- /dev/null +++ b/lib/infrastructure/auth/dto/register_dto.dart @@ -0,0 +1,36 @@ +part of '../auth_dtos.dart'; + +@freezed +class RegisterDto with _$RegisterDto { + const RegisterDto._(); + + const factory RegisterDto({ + @JsonKey(name: 'status') String? status, + @JsonKey(name: 'message') String? message, + @JsonKey(name: 'data') RegisterDataDto? data, + }) = _RegisterDto; + + factory RegisterDto.fromJson(Map json) => + _$RegisterDtoFromJson(json); + + /// mapping ke domain + Register toDomain() => Register( + status: status ?? '', + message: message ?? '', + registrationToken: data?.registrationToken ?? '', + otpToken: data?.otpToken ?? '', + expiresIn: data?.expiresIn ?? 0, + ); +} + +@freezed +class RegisterDataDto with _$RegisterDataDto { + const factory RegisterDataDto({ + @JsonKey(name: 'registration_token') String? registrationToken, + @JsonKey(name: 'otp_token') String? otpToken, + @JsonKey(name: 'expires_in') int? expiresIn, + }) = _RegisterDataDto; + + factory RegisterDataDto.fromJson(Map json) => + _$RegisterDataDtoFromJson(json); +} diff --git a/lib/infrastructure/auth/repositories/auth_repository.dart b/lib/infrastructure/auth/repositories/auth_repository.dart index e54af98..8939153 100644 --- a/lib/infrastructure/auth/repositories/auth_repository.dart +++ b/lib/infrastructure/auth/repositories/auth_repository.dart @@ -35,4 +35,30 @@ class AuthRepository implements IAuthRepository { return left(const AuthFailure.unexpectedError()); } } + + @override + Future> register({ + required String phoneNumber, + required String name, + required DateTime birthDate, + }) async { + try { + final result = await _remoteDataProvider.register( + phoneNumber: phoneNumber, + name: name, + birthDate: birthDate, + ); + + if (result.hasError) { + return left(result.error!); + } + + final auth = result.data!.toDomain(); + + return right(auth); + } catch (e, s) { + log('checkPhoneError', name: _logName, error: e, stackTrace: s); + return left(const AuthFailure.unexpectedError()); + } + } } diff --git a/lib/injection.config.dart b/lib/injection.config.dart index a73afbf..b39f14c 100644 --- a/lib/injection.config.dart +++ b/lib/injection.config.dart @@ -17,7 +17,12 @@ import 'package:enaklo/common/di/di_connectivity.dart' as _i644; import 'package:enaklo/common/di/di_dio.dart' as _i842; import 'package:enaklo/common/di/di_shared_preferences.dart' as _i672; import 'package:enaklo/common/network/network_client.dart' as _i109; +import 'package:enaklo/domain/auth/auth.dart' as _i995; import 'package:enaklo/env.dart' as _i372; +import 'package:enaklo/infrastructure/auth/datasources/remote_data_provider.dart' + as _i818; +import 'package:enaklo/infrastructure/auth/repositories/auth_repository.dart' + as _i879; import 'package:enaklo/presentation/router/app_router.dart' as _i698; import 'package:get_it/get_it.dart' as _i174; import 'package:injectable/injectable.dart' as _i526; @@ -52,6 +57,12 @@ extension GetItInjectableX on _i174.GetIt { gh.lazySingleton<_i842.ApiClient>( () => _i842.ApiClient(gh<_i361.Dio>(), gh<_i372.Env>()), ); + gh.factory<_i818.AuthRemoteDataProvider>( + () => _i818.AuthRemoteDataProvider(gh<_i842.ApiClient>()), + ); + gh.factory<_i995.IAuthRepository>( + () => _i879.AuthRepository(gh<_i818.AuthRemoteDataProvider>()), + ); return this; } }