Skip to content

Commit

Permalink
feat: catch chat, message api exceptions
Browse files Browse the repository at this point in the history
  • Loading branch information
chopper985 committed Nov 27, 2024
1 parent ea2f6d3 commit 52bb884
Show file tree
Hide file tree
Showing 14 changed files with 344 additions and 133 deletions.
94 changes: 60 additions & 34 deletions lib/core/api/chat/datasources/chat_remote_datasource.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,30 @@ 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/flutter_waterbus_sdk.dart';
import 'package:waterbus_sdk/types/models/exceptions/exceptions.dart';
import 'package:waterbus_sdk/types/result.dart';
import 'package:waterbus_sdk/utils/encrypt/encrypt.dart';

abstract class ChatRemoteDataSource {
Future<List<Meeting>> getConversations({
Future<Result<List<Meeting>>> getConversations({
required int skip,
required int limit,
required int status,
});
Future<List<Meeting>> getArchivedConversations({
Future<Result<List<Meeting>>> getArchivedConversations({
required int skip,
required int limit,
});
Future<bool> deleteConversation({required int meetingId});
Future<Meeting?> archivedConversation({required int code});
Future<Meeting?> leaveConversation({required int code});
Future<Meeting?> addMember({required int code, required int userId});
Future<Meeting?> deleteMember({required int code, required int userId});
Future<Meeting?> acceptInvite({required int meetingId});
Future<bool> updateConversation({
Future<Result<bool>> deleteConversation({required int meetingId});
Future<Result<Meeting>> archivedConversation({required int code});
Future<Result<Meeting>> leaveConversation({required int code});
Future<Result<Meeting>> addMember({required int code, required int userId});
Future<Result<Meeting>> deleteMember({
required int code,
required int userId,
});
Future<Result<Meeting>> acceptInvite({required int meetingId});
Future<Result<bool>> updateConversation({
required Meeting meeting,
String? password,
});
Expand All @@ -39,7 +44,7 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
);

@override
Future<List<Meeting>> getConversations({
Future<Result<List<Meeting>>> getConversations({
required int skip,
required int limit,
required int status,
Expand All @@ -57,14 +62,14 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
"key": WaterbusSdk.privateMessageKey,
};

return await compute(_handleDecryptLastMessage, message);
return Result.success(await compute(_handleDecryptLastMessage, message));
}

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

@override
Future<List<Meeting>> getArchivedConversations({
Future<Result<List<Meeting>>> getArchivedConversations({
required int skip,
required int limit,
}) async {
Expand All @@ -81,10 +86,10 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
"key": WaterbusSdk.privateMessageKey,
};

return await compute(_handleDecryptLastMessage, message);
return Result.success(await compute(_handleDecryptLastMessage, message));
}

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

static Future<List<Meeting>> _handleDecryptLastMessage(
Expand Down Expand Up @@ -115,7 +120,7 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
}

@override
Future<bool> updateConversation({
Future<Result<bool>> updateConversation({
required Meeting meeting,
String? password,
}) async {
Expand All @@ -124,20 +129,28 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
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<bool> deleteConversation({required int meetingId}) async {
Future<Result<bool>> deleteConversation({required int meetingId}) async {
final response = await _remoteData.deleteRoute(
"${ApiEndpoints.chatsConversations}/$meetingId",
);

return [StatusCode.ok, StatusCode.created].contains(response.statusCode);
if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) {
return Result.success(true);
}

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

@override
Future<Meeting?> leaveConversation({required int code}) async {
Future<Result<Meeting>> leaveConversation({required int code}) async {
final Response response = await _remoteData.deleteRoute(
'${ApiEndpoints.meetings}/$code',
);
Expand All @@ -148,14 +161,16 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
"key": WaterbusSdk.privateMessageKey,
};

return (await compute(_handleDecryptLastMessage, message)).first;
return Result.success(
(await compute(_handleDecryptLastMessage, message)).first,
);
}

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

@override
Future<Meeting?> acceptInvite({required int meetingId}) async {
Future<Result<Meeting>> acceptInvite({required int meetingId}) async {
final Response response = await _remoteData.postRoute(
'${ApiEndpoints.acceptInvite}/$meetingId',
);
Expand All @@ -166,14 +181,19 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
"key": WaterbusSdk.privateMessageKey,
};

return (await compute(_handleDecryptLastMessage, message)).first;
return Result.success(
(await compute(_handleDecryptLastMessage, message)).first,
);
}

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

@override
Future<Meeting?> addMember({required int code, required int userId}) async {
Future<Result<Meeting>> addMember({
required int code,
required int userId,
}) async {
final Response response = await _remoteData.postRoute(
'${ApiEndpoints.meetingMembers}/$code',
body: {"userId": userId},
Expand All @@ -185,14 +205,16 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
"key": WaterbusSdk.privateMessageKey,
};

return (await compute(_handleDecryptLastMessage, message)).first;
return Result.success(
(await compute(_handleDecryptLastMessage, message)).first,
);
}

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

@override
Future<Meeting?> deleteMember({
Future<Result<Meeting>> deleteMember({
required int code,
required int userId,
}) async {
Expand All @@ -207,14 +229,16 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
"key": WaterbusSdk.privateMessageKey,
};

return (await compute(_handleDecryptLastMessage, message)).first;
return Result.success(
(await compute(_handleDecryptLastMessage, message)).first,
);
}

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

@override
Future<Meeting?> archivedConversation({required int code}) async {
Future<Result<Meeting>> archivedConversation({required int code}) async {
final Response response = await _remoteData.postRoute(
'${ApiEndpoints.archivedMeeeting}/$code',
);
Expand All @@ -225,9 +249,11 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
"key": WaterbusSdk.privateMessageKey,
};

return (await compute(_handleDecryptLastMessage, message)).first;
return Result.success(
(await compute(_handleDecryptLastMessage, message)).first,
);
}

return null;
return Result.failure(response.data['message'].toString().meetingException);
}
}
62 changes: 35 additions & 27 deletions lib/core/api/chat/repositories/chat_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,31 @@ import 'package:injectable/injectable.dart';

import 'package:waterbus_sdk/core/api/chat/datasources/chat_remote_datasource.dart';
import 'package:waterbus_sdk/flutter_waterbus_sdk.dart';
import 'package:waterbus_sdk/types/result.dart';

abstract class ChatRepository {
Future<List<Meeting>> getConversations({
Future<Result<List<Meeting>>> getConversations({
required int status,
required int limit,
required int skip,
});
Future<List<Meeting>> getArchivedConversations({
Future<Result<List<Meeting>>> getArchivedConversations({
required int skip,
required int limit,
});
Future<bool> updateConversation({
Future<Result<bool>> updateConversation({
required Meeting meeting,
String? password,
});
Future<bool> deleteConversation(int meetingId);
Future<Meeting?> leaveConversation({required int code});
Future<Meeting?> addMember({required int code, required int userId});
Future<Meeting?> deleteMember({required int code, required int userId});
Future<Meeting?> acceptInvite({required int meetingId});
Future<Meeting?> archivedConversation({required int code});
Future<Result<bool>> deleteConversation(int meetingId);
Future<Result<Meeting>> leaveConversation({required int code});
Future<Result<Meeting>> addMember({required int code, required int userId});
Future<Result<Meeting>> deleteMember({
required int code,
required int userId,
});
Future<Result<Meeting>> acceptInvite({required int meetingId});
Future<Result<Meeting>> archivedConversation({required int code});
}

@LazySingleton(as: ChatRepository)
Expand All @@ -34,12 +38,12 @@ class ChatRepositoryImpl extends ChatRepository {
);

@override
Future<List<Meeting>> getConversations({
Future<Result<List<Meeting>>> getConversations({
required int status,
required limit,
required skip,
}) async {
final List<Meeting> conversations =
final Result<List<Meeting>> conversations =
await _remoteDataSource.getConversations(
skip: skip,
limit: limit,
Expand All @@ -50,11 +54,11 @@ class ChatRepositoryImpl extends ChatRepository {
}

@override
Future<List<Meeting>> getArchivedConversations({
Future<Result<List<Meeting>>> getArchivedConversations({
required limit,
required skip,
}) async {
final List<Meeting> archivedConversations =
final Result<List<Meeting>> archivedConversations =
await _remoteDataSource.getArchivedConversations(
skip: skip,
limit: limit,
Expand All @@ -64,35 +68,38 @@ class ChatRepositoryImpl extends ChatRepository {
}

@override
Future<bool> deleteConversation(int meetingId) async {
final bool isSucceed = await _remoteDataSource.deleteConversation(
Future<Result<bool>> deleteConversation(int meetingId) async {
final Result<bool> isSucceed = await _remoteDataSource.deleteConversation(
meetingId: meetingId,
);

return isSucceed;
}

@override
Future<Meeting?> leaveConversation({required int code}) async {
final Meeting? meeting = await _remoteDataSource.leaveConversation(
Future<Result<Meeting>> leaveConversation({required int code}) async {
final Result<Meeting> meeting = await _remoteDataSource.leaveConversation(
code: code,
);

return meeting;
}

@override
Future<Meeting?> acceptInvite({required int meetingId}) async {
final Meeting? meeting = await _remoteDataSource.acceptInvite(
Future<Result<Meeting>> acceptInvite({required int meetingId}) async {
final Result<Meeting> meeting = await _remoteDataSource.acceptInvite(
meetingId: meetingId,
);

return meeting;
}

@override
Future<Meeting?> addMember({required int code, required int userId}) async {
final Meeting? member = await _remoteDataSource.addMember(
Future<Result<Meeting>> addMember({
required int code,
required int userId,
}) async {
final Result<Meeting> member = await _remoteDataSource.addMember(
code: code,
userId: userId,
);
Expand All @@ -101,11 +108,11 @@ class ChatRepositoryImpl extends ChatRepository {
}

@override
Future<Meeting?> deleteMember({
Future<Result<Meeting>> deleteMember({
required int code,
required int userId,
}) async {
final Meeting? meeting = await _remoteDataSource.deleteMember(
final Result<Meeting> meeting = await _remoteDataSource.deleteMember(
code: code,
userId: userId,
);
Expand All @@ -114,11 +121,11 @@ class ChatRepositoryImpl extends ChatRepository {
}

@override
Future<bool> updateConversation({
Future<Result<bool>> updateConversation({
required Meeting meeting,
String? password,
}) async {
final bool isSucceed = await _remoteDataSource.updateConversation(
final Result<bool> isSucceed = await _remoteDataSource.updateConversation(
meeting: meeting,
password: password,
);
Expand All @@ -127,8 +134,9 @@ class ChatRepositoryImpl extends ChatRepository {
}

@override
Future<Meeting?> archivedConversation({required int code}) async {
final Meeting? meeting = await _remoteDataSource.archivedConversation(
Future<Result<Meeting>> archivedConversation({required int code}) async {
final Result<Meeting> meeting =
await _remoteDataSource.archivedConversation(
code: code,
);

Expand Down
Loading

0 comments on commit 52bb884

Please sign in to comment.