check phone repo

This commit is contained in:
efrilm
2025-09-18 05:51:17 +07:00
parent c072e4c168
commit c3263edb89
14 changed files with 1324 additions and 3 deletions
+8
View File
@@ -0,0 +1,8 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import '../../domain/auth/auth.dart';
part 'auth_dtos.freezed.dart';
part 'auth_dtos.g.dart';
part 'dto/check_phone_dto.dart';
@@ -0,0 +1,410 @@
// 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_dtos.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',
);
CheckPhoneDto _$CheckPhoneDtoFromJson(Map<String, dynamic> json) {
return _CheckPhoneDto.fromJson(json);
}
/// @nodoc
mixin _$CheckPhoneDto {
@JsonKey(name: 'status')
String? get status => throw _privateConstructorUsedError;
@JsonKey(name: 'message')
String? get message => throw _privateConstructorUsedError;
@JsonKey(name: 'data')
CheckPhoneDataDto? get data => throw _privateConstructorUsedError;
/// Serializes this CheckPhoneDto to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of CheckPhoneDto
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$CheckPhoneDtoCopyWith<CheckPhoneDto> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $CheckPhoneDtoCopyWith<$Res> {
factory $CheckPhoneDtoCopyWith(
CheckPhoneDto value,
$Res Function(CheckPhoneDto) then,
) = _$CheckPhoneDtoCopyWithImpl<$Res, CheckPhoneDto>;
@useResult
$Res call({
@JsonKey(name: 'status') String? status,
@JsonKey(name: 'message') String? message,
@JsonKey(name: 'data') CheckPhoneDataDto? data,
});
$CheckPhoneDataDtoCopyWith<$Res>? get data;
}
/// @nodoc
class _$CheckPhoneDtoCopyWithImpl<$Res, $Val extends CheckPhoneDto>
implements $CheckPhoneDtoCopyWith<$Res> {
_$CheckPhoneDtoCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of CheckPhoneDto
/// 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 CheckPhoneDataDto?,
)
as $Val,
);
}
/// Create a copy of CheckPhoneDto
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$CheckPhoneDataDtoCopyWith<$Res>? get data {
if (_value.data == null) {
return null;
}
return $CheckPhoneDataDtoCopyWith<$Res>(_value.data!, (value) {
return _then(_value.copyWith(data: value) as $Val);
});
}
}
/// @nodoc
abstract class _$$CheckPhoneDtoImplCopyWith<$Res>
implements $CheckPhoneDtoCopyWith<$Res> {
factory _$$CheckPhoneDtoImplCopyWith(
_$CheckPhoneDtoImpl value,
$Res Function(_$CheckPhoneDtoImpl) then,
) = __$$CheckPhoneDtoImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({
@JsonKey(name: 'status') String? status,
@JsonKey(name: 'message') String? message,
@JsonKey(name: 'data') CheckPhoneDataDto? data,
});
@override
$CheckPhoneDataDtoCopyWith<$Res>? get data;
}
/// @nodoc
class __$$CheckPhoneDtoImplCopyWithImpl<$Res>
extends _$CheckPhoneDtoCopyWithImpl<$Res, _$CheckPhoneDtoImpl>
implements _$$CheckPhoneDtoImplCopyWith<$Res> {
__$$CheckPhoneDtoImplCopyWithImpl(
_$CheckPhoneDtoImpl _value,
$Res Function(_$CheckPhoneDtoImpl) _then,
) : super(_value, _then);
/// Create a copy of CheckPhoneDto
/// 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(
_$CheckPhoneDtoImpl(
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 CheckPhoneDataDto?,
),
);
}
}
/// @nodoc
@JsonSerializable()
class _$CheckPhoneDtoImpl extends _CheckPhoneDto {
const _$CheckPhoneDtoImpl({
@JsonKey(name: 'status') this.status,
@JsonKey(name: 'message') this.message,
@JsonKey(name: 'data') this.data,
}) : super._();
factory _$CheckPhoneDtoImpl.fromJson(Map<String, dynamic> json) =>
_$$CheckPhoneDtoImplFromJson(json);
@override
@JsonKey(name: 'status')
final String? status;
@override
@JsonKey(name: 'message')
final String? message;
@override
@JsonKey(name: 'data')
final CheckPhoneDataDto? data;
@override
String toString() {
return 'CheckPhoneDto(status: $status, message: $message, data: $data)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$CheckPhoneDtoImpl &&
(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 CheckPhoneDto
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$CheckPhoneDtoImplCopyWith<_$CheckPhoneDtoImpl> get copyWith =>
__$$CheckPhoneDtoImplCopyWithImpl<_$CheckPhoneDtoImpl>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$CheckPhoneDtoImplToJson(this);
}
}
abstract class _CheckPhoneDto extends CheckPhoneDto {
const factory _CheckPhoneDto({
@JsonKey(name: 'status') final String? status,
@JsonKey(name: 'message') final String? message,
@JsonKey(name: 'data') final CheckPhoneDataDto? data,
}) = _$CheckPhoneDtoImpl;
const _CheckPhoneDto._() : super._();
factory _CheckPhoneDto.fromJson(Map<String, dynamic> json) =
_$CheckPhoneDtoImpl.fromJson;
@override
@JsonKey(name: 'status')
String? get status;
@override
@JsonKey(name: 'message')
String? get message;
@override
@JsonKey(name: 'data')
CheckPhoneDataDto? get data;
/// Create a copy of CheckPhoneDto
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$CheckPhoneDtoImplCopyWith<_$CheckPhoneDtoImpl> get copyWith =>
throw _privateConstructorUsedError;
}
CheckPhoneDataDto _$CheckPhoneDataDtoFromJson(Map<String, dynamic> json) {
return _CheckPhoneDataDto.fromJson(json);
}
/// @nodoc
mixin _$CheckPhoneDataDto {
@JsonKey(name: 'phone_number')
String? get phoneNumber => throw _privateConstructorUsedError;
/// Serializes this CheckPhoneDataDto to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of CheckPhoneDataDto
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$CheckPhoneDataDtoCopyWith<CheckPhoneDataDto> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $CheckPhoneDataDtoCopyWith<$Res> {
factory $CheckPhoneDataDtoCopyWith(
CheckPhoneDataDto value,
$Res Function(CheckPhoneDataDto) then,
) = _$CheckPhoneDataDtoCopyWithImpl<$Res, CheckPhoneDataDto>;
@useResult
$Res call({@JsonKey(name: 'phone_number') String? phoneNumber});
}
/// @nodoc
class _$CheckPhoneDataDtoCopyWithImpl<$Res, $Val extends CheckPhoneDataDto>
implements $CheckPhoneDataDtoCopyWith<$Res> {
_$CheckPhoneDataDtoCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of CheckPhoneDataDto
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({Object? phoneNumber = freezed}) {
return _then(
_value.copyWith(
phoneNumber: freezed == phoneNumber
? _value.phoneNumber
: phoneNumber // ignore: cast_nullable_to_non_nullable
as String?,
)
as $Val,
);
}
}
/// @nodoc
abstract class _$$CheckPhoneDataDtoImplCopyWith<$Res>
implements $CheckPhoneDataDtoCopyWith<$Res> {
factory _$$CheckPhoneDataDtoImplCopyWith(
_$CheckPhoneDataDtoImpl value,
$Res Function(_$CheckPhoneDataDtoImpl) then,
) = __$$CheckPhoneDataDtoImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({@JsonKey(name: 'phone_number') String? phoneNumber});
}
/// @nodoc
class __$$CheckPhoneDataDtoImplCopyWithImpl<$Res>
extends _$CheckPhoneDataDtoCopyWithImpl<$Res, _$CheckPhoneDataDtoImpl>
implements _$$CheckPhoneDataDtoImplCopyWith<$Res> {
__$$CheckPhoneDataDtoImplCopyWithImpl(
_$CheckPhoneDataDtoImpl _value,
$Res Function(_$CheckPhoneDataDtoImpl) _then,
) : super(_value, _then);
/// Create a copy of CheckPhoneDataDto
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({Object? phoneNumber = freezed}) {
return _then(
_$CheckPhoneDataDtoImpl(
phoneNumber: freezed == phoneNumber
? _value.phoneNumber
: phoneNumber // ignore: cast_nullable_to_non_nullable
as String?,
),
);
}
}
/// @nodoc
@JsonSerializable()
class _$CheckPhoneDataDtoImpl implements _CheckPhoneDataDto {
const _$CheckPhoneDataDtoImpl({
@JsonKey(name: 'phone_number') this.phoneNumber,
});
factory _$CheckPhoneDataDtoImpl.fromJson(Map<String, dynamic> json) =>
_$$CheckPhoneDataDtoImplFromJson(json);
@override
@JsonKey(name: 'phone_number')
final String? phoneNumber;
@override
String toString() {
return 'CheckPhoneDataDto(phoneNumber: $phoneNumber)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$CheckPhoneDataDtoImpl &&
(identical(other.phoneNumber, phoneNumber) ||
other.phoneNumber == phoneNumber));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType, phoneNumber);
/// Create a copy of CheckPhoneDataDto
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$CheckPhoneDataDtoImplCopyWith<_$CheckPhoneDataDtoImpl> get copyWith =>
__$$CheckPhoneDataDtoImplCopyWithImpl<_$CheckPhoneDataDtoImpl>(
this,
_$identity,
);
@override
Map<String, dynamic> toJson() {
return _$$CheckPhoneDataDtoImplToJson(this);
}
}
abstract class _CheckPhoneDataDto implements CheckPhoneDataDto {
const factory _CheckPhoneDataDto({
@JsonKey(name: 'phone_number') final String? phoneNumber,
}) = _$CheckPhoneDataDtoImpl;
factory _CheckPhoneDataDto.fromJson(Map<String, dynamic> json) =
_$CheckPhoneDataDtoImpl.fromJson;
@override
@JsonKey(name: 'phone_number')
String? get phoneNumber;
/// Create a copy of CheckPhoneDataDto
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$CheckPhoneDataDtoImplCopyWith<_$CheckPhoneDataDtoImpl> get copyWith =>
throw _privateConstructorUsedError;
}
+31
View File
@@ -0,0 +1,31 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'auth_dtos.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$CheckPhoneDtoImpl _$$CheckPhoneDtoImplFromJson(Map<String, dynamic> json) =>
_$CheckPhoneDtoImpl(
status: json['status'] as String?,
message: json['message'] as String?,
data: json['data'] == null
? null
: CheckPhoneDataDto.fromJson(json['data'] as Map<String, dynamic>),
);
Map<String, dynamic> _$$CheckPhoneDtoImplToJson(_$CheckPhoneDtoImpl instance) =>
<String, dynamic>{
'status': instance.status,
'message': instance.message,
'data': instance.data,
};
_$CheckPhoneDataDtoImpl _$$CheckPhoneDataDtoImplFromJson(
Map<String, dynamic> json,
) => _$CheckPhoneDataDtoImpl(phoneNumber: json['phone_number'] as String?);
Map<String, dynamic> _$$CheckPhoneDataDtoImplToJson(
_$CheckPhoneDataDtoImpl instance,
) => <String, dynamic>{'phone_number': instance.phoneNumber};
@@ -0,0 +1,53 @@
import 'dart:developer';
import 'package:injectable/injectable.dart';
import 'package:data_channel/data_channel.dart';
import '../../../common/api/api_client.dart';
import '../../../common/api/api_failure.dart';
import '../../../common/url/api_path.dart';
import '../../../domain/auth/auth.dart';
import '../auth_dtos.dart';
@injectable
class AuthRemoteDataProvider {
final ApiClient _apiClient;
final String _logName = "AuthRemoteDataProvider";
AuthRemoteDataProvider(this._apiClient);
Future<DC<AuthFailure, CheckPhoneDto>> checkPhone({
required String phoneNumber,
}) async {
try {
final response = await _apiClient.post(
ApiPath.checkPhone,
data: {'phone_number': phoneNumber},
);
if (response.data['code'] == 401) {
return DC.error(
AuthFailure.serverError(
ApiFailure.unauthorized('Incorrect email or password'),
),
);
}
if (response.data['success'] == false) {
if ((response.data['errors'] as List).isNotEmpty) {
if (response.data['errors'][0]['code'] == 303) {
return DC.error(
AuthFailure.dynamicErrorMessage('No. Telepon Tidak Boleh Kosong'),
);
}
}
}
final dto = CheckPhoneDto.fromJson(response.data['data']);
return DC.data(dto);
} on ApiFailure catch (e, s) {
log('checkPhone', name: _logName, error: e, stackTrace: s);
return DC.error(AuthFailure.serverError(e));
}
}
}
@@ -0,0 +1,30 @@
part of '../auth_dtos.dart';
@freezed
class CheckPhoneDto with _$CheckPhoneDto {
const CheckPhoneDto._();
const factory CheckPhoneDto({
@JsonKey(name: 'status') String? status,
@JsonKey(name: 'message') String? message,
@JsonKey(name: 'data') CheckPhoneDataDto? data,
}) = _CheckPhoneDto;
factory CheckPhoneDto.fromJson(Map<String, dynamic> json) =>
_$CheckPhoneDtoFromJson(json);
CheckPhone toDomain() => CheckPhone(
status: status ?? '',
message: message ?? '',
phoneNumber: data?.phoneNumber ?? '',
);
}
@freezed
class CheckPhoneDataDto with _$CheckPhoneDataDto {
const factory CheckPhoneDataDto({
@JsonKey(name: 'phone_number') String? phoneNumber,
}) = _CheckPhoneDataDto;
factory CheckPhoneDataDto.fromJson(Map<String, dynamic> json) =>
_$CheckPhoneDataDtoFromJson(json);
}
@@ -0,0 +1,38 @@
import 'dart:developer';
import 'package:dartz/dartz.dart';
import 'package:injectable/injectable.dart';
import '../../../domain/auth/auth.dart';
import '../datasources/remote_data_provider.dart';
@Injectable(as: IAuthRepository)
class AuthRepository implements IAuthRepository {
final AuthRemoteDataProvider _remoteDataProvider;
final String _logName = 'AuthRepository';
AuthRepository(this._remoteDataProvider);
@override
Future<Either<AuthFailure, CheckPhone>> checkPhone({
required String phoneNumber,
}) async {
try {
final result = await _remoteDataProvider.checkPhone(
phoneNumber: phoneNumber,
);
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());
}
}
}