Skip to content

Commit

Permalink
feat: catch api user, auth exception
Browse files Browse the repository at this point in the history
  • Loading branch information
chopper985 committed Dec 16, 2024
1 parent 52bb884 commit 4a8c650
Show file tree
Hide file tree
Showing 16 changed files with 557 additions and 300 deletions.
20 changes: 13 additions & 7 deletions lib/core/api/auth/datasources/auth_remote_datasource.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ import 'package:waterbus_sdk/constants/api_enpoints.dart';
import 'package:waterbus_sdk/constants/http_status_code.dart';
import 'package:waterbus_sdk/core/api/auth/datasources/auth_local_datasource.dart';
import 'package:waterbus_sdk/core/api/base/base_remote_data.dart';
import 'package:waterbus_sdk/types/error/failures.dart';
import 'package:waterbus_sdk/types/models/auth_payload_model.dart';
import 'package:waterbus_sdk/types/models/user_model.dart';
import 'package:waterbus_sdk/types/result.dart';

abstract class AuthRemoteDataSource {
Future<(String?, String?)> refreshToken();
Future<User?> signInWithSocial(AuthPayloadModel authPayload);
Future<bool> logOut();
Future<Result<User>> signInWithSocial(AuthPayloadModel authPayload);
Future<Result<bool>> logOut();
}

@LazySingleton(as: AuthRemoteDataSource)
Expand All @@ -22,7 +24,7 @@ class AuthRemoteDataSourceImpl extends AuthRemoteDataSource {
AuthRemoteDataSourceImpl(this._baseRemoteData, this._localDataSource);

@override
Future<User?> signInWithSocial(AuthPayloadModel authPayload) async {
Future<Result<User>> signInWithSocial(AuthPayloadModel authPayload) async {
final Map<String, dynamic> body = authPayload.toMap();

final Response response = await _baseRemoteData.postRoute(
Expand All @@ -39,10 +41,10 @@ class AuthRemoteDataSourceImpl extends AuthRemoteDataSource {
refreshToken: refreshToken,
);

return User.fromMap(response.data['user']);
return Result.success(User.fromMap(response.data['user']));
}

return null;
return Result.failure(ServerFailure());
}

@override
Expand All @@ -61,11 +63,15 @@ class AuthRemoteDataSourceImpl extends AuthRemoteDataSource {
}

@override
Future<bool> logOut() async {
Future<Result<bool>> logOut() async {
final Response response = await _baseRemoteData.deleteRoute(
ApiEndpoints.auth,
);

return response.statusCode == StatusCode.noContent;
if (response.statusCode == StatusCode.noContent) {
return Result.success(true);
}

return Result.failure(ServerFailure());
}
}
29 changes: 17 additions & 12 deletions lib/core/api/auth/repositories/auth_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ import 'package:injectable/injectable.dart';

import 'package:waterbus_sdk/core/api/auth/datasources/auth_local_datasource.dart';
import 'package:waterbus_sdk/core/api/auth/datasources/auth_remote_datasource.dart';
import 'package:waterbus_sdk/types/error/failures.dart';
import 'package:waterbus_sdk/types/models/auth_payload_model.dart';
import 'package:waterbus_sdk/types/models/user_model.dart';
import 'package:waterbus_sdk/types/result.dart';

abstract class AuthRepository {
Future<bool> refreshToken();
Future<User?> loginWithSocial(AuthPayloadModel params);
Future<bool> logOut();
Future<Result<bool>> refreshToken();
Future<Result<User>> loginWithSocial(AuthPayloadModel params);
Future<Result<bool>> logOut();
}

@LazySingleton(as: AuthRepository)
Expand All @@ -19,33 +21,36 @@ class AuthRepositoryImpl extends AuthRepository {
AuthRepositoryImpl(this._localDataSource, this._remoteDataSource);

@override
Future<User?> loginWithSocial(AuthPayloadModel params) async {
final User? response = await _remoteDataSource.signInWithSocial(params);
Future<Result<User>> loginWithSocial(AuthPayloadModel params) async {
final Result<User> result =
await _remoteDataSource.signInWithSocial(params);

return response;
return result;
}

@override
Future<bool> refreshToken() async {
Future<Result<bool>> refreshToken() async {
final (String? accessToken, String? refreshToken) =
await _remoteDataSource.refreshToken();

if (accessToken == null || refreshToken == null) return false;
if (accessToken == null || refreshToken == null) {
return Result.failure(ServerFailure());
}

_localDataSource.saveTokens(
accessToken: accessToken,
refreshToken: refreshToken,
);

return true;
return Result.success(true);
}

@override
Future<bool> logOut() async {
final bool isSignedOut = await _remoteDataSource.logOut();
Future<Result<bool>> logOut() async {
final Result<bool> result = await _remoteDataSource.logOut();

_localDataSource.clearToken();

return isSignedOut;
return result;
}
}
83 changes: 51 additions & 32 deletions lib/core/api/meetings/datasources/meeting_remote_datesource.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,34 @@ import 'package:injectable/injectable.dart';
import 'package:waterbus_sdk/constants/api_enpoints.dart';
import 'package:waterbus_sdk/constants/http_status_code.dart';
import 'package:waterbus_sdk/core/api/base/base_remote_data.dart';
import 'package:waterbus_sdk/types/models/exceptions/exceptions.dart';
import 'package:waterbus_sdk/types/models/meeting_model.dart';
import 'package:waterbus_sdk/types/models/record_model.dart';
import 'package:waterbus_sdk/types/result.dart';

abstract class MeetingRemoteDataSource {
Future<Meeting?> createMeeting({
Future<Result<Meeting>> createMeeting({
required Meeting meeting,
required String password,
});
Future<bool> updateMeeting({
Future<Result<bool>> updateMeeting({
required Meeting meeting,
required String password,
});
Future<Meeting?> joinMeetingWithPassword({
Future<Result<Meeting>> joinMeetingWithPassword({
required Meeting meeting,
required String password,
});
Future<Meeting?> joinMeetingWithoutPassword({
Future<Result<Meeting>> joinMeetingWithoutPassword({
required Meeting meeting,
});
Future<Meeting?> getInfoMeeting(int code);
Future<List<RecordModel>> getRecords({required int skip, required int limit});
Future<int?> startRecord(int roomId);
Future<bool> stopRecord(int roomId);
Future<Result<Meeting>> getInfoMeeting(int code);
Future<Result<List<RecordModel>>> getRecords({
required int skip,
required int limit,
});
Future<Result<int>> startRecord(int roomId);
Future<Result<bool>> stopRecord(int roomId);
}

@LazySingleton(as: MeetingRemoteDataSource)
Expand All @@ -37,7 +42,7 @@ class MeetingRemoteDataSourceImpl extends MeetingRemoteDataSource {
);

@override
Future<Meeting?> createMeeting({
Future<Result<Meeting>> createMeeting({
required Meeting meeting,
required String password,
}) async {
Expand All @@ -48,29 +53,29 @@ class MeetingRemoteDataSourceImpl extends MeetingRemoteDataSource {

if (response.statusCode == StatusCode.created) {
final Map<String, dynamic> rawData = response.data;
return Meeting.fromMap(rawData);
return Result.success(Meeting.fromMap(rawData));
}

return null;
return Result.failure(response.data['message'].toString().meetingException);
}

@override
Future<Meeting?> getInfoMeeting(int code) async {
Future<Result<Meeting>> getInfoMeeting(int code) async {
final Response response = await _remoteData.getRoute(
'${ApiEndpoints.meetings}/$code',
);

if (response.statusCode == StatusCode.ok &&
response.data.toString().isNotEmpty) {
final Map<String, dynamic> rawData = response.data;
return Meeting.fromMap(rawData);
return Result.success(Meeting.fromMap(rawData));
}

return null;
return Result.failure(response.data['message'].toString().meetingException);
}

@override
Future<Meeting?> joinMeetingWithPassword({
Future<Result<Meeting>> joinMeetingWithPassword({
required Meeting meeting,
required String password,
}) async {
Expand All @@ -81,16 +86,18 @@ class MeetingRemoteDataSourceImpl extends MeetingRemoteDataSource {

if (response.statusCode == StatusCode.created) {
final Map<String, dynamic> rawData = response.data;
return Meeting.fromMap(rawData).copyWith(
latestJoinedAt: DateTime.now(),
return Result.success(
Meeting.fromMap(rawData).copyWith(
latestJoinedAt: DateTime.now(),
),
);
}

return null;
return Result.failure(response.data['message'].toString().meetingException);
}

@override
Future<Meeting?> joinMeetingWithoutPassword({
Future<Result<Meeting>> joinMeetingWithoutPassword({
required Meeting meeting,
}) async {
final Response response = await _remoteData.postRoute(
Expand All @@ -99,16 +106,18 @@ class MeetingRemoteDataSourceImpl extends MeetingRemoteDataSource {

if (response.statusCode == StatusCode.created) {
final Map<String, dynamic> rawData = response.data;
return Meeting.fromMap(rawData).copyWith(
latestJoinedAt: DateTime.now(),
return Result.success(
Meeting.fromMap(rawData).copyWith(
latestJoinedAt: DateTime.now(),
),
);
}

return null;
return Result.failure(response.data['message'].toString().meetingException);
}

@override
Future<bool> updateMeeting({
Future<Result<bool>> updateMeeting({
required Meeting meeting,
required String password,
}) async {
Expand All @@ -117,45 +126,55 @@ class MeetingRemoteDataSourceImpl extends MeetingRemoteDataSource {
meeting.toMapCreate(password: password),
);

return response.statusCode == StatusCode.ok;
if (response.statusCode == StatusCode.ok) {
return Result.success(true);
}

return Result.failure(response.data['message'].toString().meetingException);
}

@override
Future<List<RecordModel>> getRecords({
Future<Result<List<RecordModel>>> getRecords({
required int skip,
required int limit,
}) async {
final Response response = await _remoteData.getRoute(ApiEndpoints.records);

if (response.statusCode == StatusCode.ok) {
final List rawData = response.data;
return rawData.map((data) => RecordModel.fromMap(data)).toList();
return Result.success(
rawData.map((data) => RecordModel.fromMap(data)).toList(),
);
}

return [];
return Result.failure(response.data['message'].toString().meetingException);
}

@override
Future<int?> startRecord(int roomId) async {
Future<Result<int>> startRecord(int roomId) async {
final Response response = await _remoteData.postRoute(
ApiEndpoints.startRecord,
queryParameters: {"code": roomId},
);

if (response.statusCode == StatusCode.created) {
return response.data['id'];
return Result.success(response.data['id']);
}

return null;
return Result.failure(response.data['message'].toString().meetingException);
}

@override
Future<bool> stopRecord(int roomId) async {
Future<Result<bool>> stopRecord(int roomId) async {
final Response response = await _remoteData.postRoute(
ApiEndpoints.stopRecord,
queryParameters: {"code": roomId},
);

return response.statusCode == StatusCode.created;
if (response.statusCode == StatusCode.created) {
return Result.success(true);
}

return Result.failure(response.data['message'].toString().meetingException);
}
}
Loading

0 comments on commit 4a8c650

Please sign in to comment.