From 52bb8843b3c740bcbc7feda227f2480a51d2afce Mon Sep 17 00:00:00 2001 From: Tran Thai Tuan Date: Wed, 27 Nov 2024 11:23:20 +0700 Subject: [PATCH] feat: catch chat, message api exceptions --- .../datasources/chat_remote_datasource.dart | 94 ++++++++++++------- .../chat/repositories/chat_repository.dart | 62 ++++++------ .../message_remote_datasource.dart | 56 +++++++---- .../repositories/message_repository.dart | 27 +++--- lib/flutter_waterbus_sdk.dart | 27 +++--- lib/types/error/failures.dart | 4 + lib/types/error/meeting_failure.dart | 33 +++++++ lib/types/error/message_failure.dart | 9 ++ lib/types/error/user_failure.dart | 3 + lib/types/models/exceptions/exceptions.dart | 4 + .../models/exceptions/meeting_exceptions.dart | 60 ++++++++++++ .../models/exceptions/message_exceptions.dart | 37 ++++++++ lib/waterbus_sdk_impl.dart | 30 +++--- lib/waterbus_sdk_interface.dart | 31 +++--- 14 files changed, 344 insertions(+), 133 deletions(-) create mode 100644 lib/types/error/meeting_failure.dart create mode 100644 lib/types/error/message_failure.dart create mode 100644 lib/types/error/user_failure.dart create mode 100644 lib/types/models/exceptions/exceptions.dart create mode 100644 lib/types/models/exceptions/meeting_exceptions.dart create mode 100644 lib/types/models/exceptions/message_exceptions.dart diff --git a/lib/core/api/chat/datasources/chat_remote_datasource.dart b/lib/core/api/chat/datasources/chat_remote_datasource.dart index e1f9e69..d85671a 100644 --- a/lib/core/api/chat/datasources/chat_remote_datasource.dart +++ b/lib/core/api/chat/datasources/chat_remote_datasource.dart @@ -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> getConversations({ + Future>> getConversations({ required int skip, required int limit, required int status, }); - Future> getArchivedConversations({ + Future>> getArchivedConversations({ required int skip, required int limit, }); - Future deleteConversation({required int meetingId}); - Future archivedConversation({required int code}); - Future leaveConversation({required int code}); - Future addMember({required int code, required int userId}); - Future deleteMember({required int code, required int userId}); - Future acceptInvite({required int meetingId}); - Future updateConversation({ + Future> deleteConversation({required int meetingId}); + Future> archivedConversation({required int code}); + Future> leaveConversation({required int code}); + Future> addMember({required int code, required int userId}); + Future> deleteMember({ + required int code, + required int userId, + }); + Future> acceptInvite({required int meetingId}); + Future> updateConversation({ required Meeting meeting, String? password, }); @@ -39,7 +44,7 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource { ); @override - Future> getConversations({ + Future>> getConversations({ required int skip, required int limit, required int status, @@ -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> getArchivedConversations({ + Future>> getArchivedConversations({ required int skip, required int limit, }) async { @@ -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> _handleDecryptLastMessage( @@ -115,7 +120,7 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource { } @override - Future updateConversation({ + Future> updateConversation({ required Meeting meeting, String? password, }) async { @@ -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 deleteConversation({required int meetingId}) async { + Future> 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 leaveConversation({required int code}) async { + Future> leaveConversation({required int code}) async { final Response response = await _remoteData.deleteRoute( '${ApiEndpoints.meetings}/$code', ); @@ -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 acceptInvite({required int meetingId}) async { + Future> acceptInvite({required int meetingId}) async { final Response response = await _remoteData.postRoute( '${ApiEndpoints.acceptInvite}/$meetingId', ); @@ -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 addMember({required int code, required int userId}) async { + Future> addMember({ + required int code, + required int userId, + }) async { final Response response = await _remoteData.postRoute( '${ApiEndpoints.meetingMembers}/$code', body: {"userId": userId}, @@ -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 deleteMember({ + Future> deleteMember({ required int code, required int userId, }) async { @@ -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 archivedConversation({required int code}) async { + Future> archivedConversation({required int code}) async { final Response response = await _remoteData.postRoute( '${ApiEndpoints.archivedMeeeting}/$code', ); @@ -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); } } diff --git a/lib/core/api/chat/repositories/chat_repository.dart b/lib/core/api/chat/repositories/chat_repository.dart index 38c4ee4..854803d 100644 --- a/lib/core/api/chat/repositories/chat_repository.dart +++ b/lib/core/api/chat/repositories/chat_repository.dart @@ -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> getConversations({ + Future>> getConversations({ required int status, required int limit, required int skip, }); - Future> getArchivedConversations({ + Future>> getArchivedConversations({ required int skip, required int limit, }); - Future updateConversation({ + Future> updateConversation({ required Meeting meeting, String? password, }); - Future deleteConversation(int meetingId); - Future leaveConversation({required int code}); - Future addMember({required int code, required int userId}); - Future deleteMember({required int code, required int userId}); - Future acceptInvite({required int meetingId}); - Future archivedConversation({required int code}); + Future> deleteConversation(int meetingId); + Future> leaveConversation({required int code}); + Future> addMember({required int code, required int userId}); + Future> deleteMember({ + required int code, + required int userId, + }); + Future> acceptInvite({required int meetingId}); + Future> archivedConversation({required int code}); } @LazySingleton(as: ChatRepository) @@ -34,12 +38,12 @@ class ChatRepositoryImpl extends ChatRepository { ); @override - Future> getConversations({ + Future>> getConversations({ required int status, required limit, required skip, }) async { - final List conversations = + final Result> conversations = await _remoteDataSource.getConversations( skip: skip, limit: limit, @@ -50,11 +54,11 @@ class ChatRepositoryImpl extends ChatRepository { } @override - Future> getArchivedConversations({ + Future>> getArchivedConversations({ required limit, required skip, }) async { - final List archivedConversations = + final Result> archivedConversations = await _remoteDataSource.getArchivedConversations( skip: skip, limit: limit, @@ -64,8 +68,8 @@ class ChatRepositoryImpl extends ChatRepository { } @override - Future deleteConversation(int meetingId) async { - final bool isSucceed = await _remoteDataSource.deleteConversation( + Future> deleteConversation(int meetingId) async { + final Result isSucceed = await _remoteDataSource.deleteConversation( meetingId: meetingId, ); @@ -73,8 +77,8 @@ class ChatRepositoryImpl extends ChatRepository { } @override - Future leaveConversation({required int code}) async { - final Meeting? meeting = await _remoteDataSource.leaveConversation( + Future> leaveConversation({required int code}) async { + final Result meeting = await _remoteDataSource.leaveConversation( code: code, ); @@ -82,8 +86,8 @@ class ChatRepositoryImpl extends ChatRepository { } @override - Future acceptInvite({required int meetingId}) async { - final Meeting? meeting = await _remoteDataSource.acceptInvite( + Future> acceptInvite({required int meetingId}) async { + final Result meeting = await _remoteDataSource.acceptInvite( meetingId: meetingId, ); @@ -91,8 +95,11 @@ class ChatRepositoryImpl extends ChatRepository { } @override - Future addMember({required int code, required int userId}) async { - final Meeting? member = await _remoteDataSource.addMember( + Future> addMember({ + required int code, + required int userId, + }) async { + final Result member = await _remoteDataSource.addMember( code: code, userId: userId, ); @@ -101,11 +108,11 @@ class ChatRepositoryImpl extends ChatRepository { } @override - Future deleteMember({ + Future> deleteMember({ required int code, required int userId, }) async { - final Meeting? meeting = await _remoteDataSource.deleteMember( + final Result meeting = await _remoteDataSource.deleteMember( code: code, userId: userId, ); @@ -114,11 +121,11 @@ class ChatRepositoryImpl extends ChatRepository { } @override - Future updateConversation({ + Future> updateConversation({ required Meeting meeting, String? password, }) async { - final bool isSucceed = await _remoteDataSource.updateConversation( + final Result isSucceed = await _remoteDataSource.updateConversation( meeting: meeting, password: password, ); @@ -127,8 +134,9 @@ class ChatRepositoryImpl extends ChatRepository { } @override - Future archivedConversation({required int code}) async { - final Meeting? meeting = await _remoteDataSource.archivedConversation( + Future> archivedConversation({required int code}) async { + final Result meeting = + await _remoteDataSource.archivedConversation( code: code, ); diff --git a/lib/core/api/messages/datasources/message_remote_datasource.dart b/lib/core/api/messages/datasources/message_remote_datasource.dart index 03f9efc..222bf01 100644 --- a/lib/core/api/messages/datasources/message_remote_datasource.dart +++ b/lib/core/api/messages/datasources/message_remote_datasource.dart @@ -7,24 +7,26 @@ 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 MessageRemoteDataSource { - Future> getMessageByRoom({ + Future>> getMessageByRoom({ required int meetingId, required int limit, required int skip, }); - Future sendMessage({ + Future> sendMessage({ required int meetingId, required String data, }); - Future editMessage({ + Future> editMessage({ required int messageId, required String data, }); - Future deleteMessage({required int messageId}); + Future> deleteMessage({required int messageId}); } @LazySingleton(as: MessageRemoteDataSource) @@ -36,7 +38,7 @@ class MessageRemoteDataSourceImpl extends MessageRemoteDataSource { ); @override - Future> getMessageByRoom({ + Future>> getMessageByRoom({ required int meetingId, required int limit, required int skip, @@ -51,13 +53,17 @@ class MessageRemoteDataSourceImpl extends MessageRemoteDataSource { .map((message) => MessageModel.fromMap(message)) .toList(); - return await compute(_handleDecryptMessages, { - "messages": messages, - "key": WaterbusSdk.privateMessageKey, - }); + return Result.success( + await compute(_handleDecryptMessages, { + "messages": messages, + "key": WaterbusSdk.privateMessageKey, + }), + ); } - return []; + return Result.failure( + (response.data['message'] as String).messageException, + ); } static Future> _handleDecryptMessages( @@ -78,7 +84,7 @@ class MessageRemoteDataSourceImpl extends MessageRemoteDataSource { } @override - Future sendMessage({ + Future> sendMessage({ required int meetingId, required String data, }) async { @@ -91,14 +97,18 @@ class MessageRemoteDataSourceImpl extends MessageRemoteDataSource { ); if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) { - return MessageModel.fromMap(response.data).copyWith(data: data); + return Result.success( + MessageModel.fromMap(response.data).copyWith(data: data), + ); } - return null; + return Result.failure( + (response.data['message'] as String).messageException, + ); } @override - Future editMessage({ + Future> editMessage({ required int messageId, required String data, }) async { @@ -110,22 +120,30 @@ class MessageRemoteDataSourceImpl extends MessageRemoteDataSource { ); if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) { - return MessageModel.fromMap(response.data).copyWith(data: data); + return Result.success( + MessageModel.fromMap(response.data).copyWith(data: data), + ); } - return null; + return Result.failure( + (response.data['message'] as String).messageException, + ); } @override - Future deleteMessage({required int messageId}) async { + Future> deleteMessage({ + required int messageId, + }) async { final Response response = await _remoteData.deleteRoute( "${ApiEndpoints.chats}/$messageId", ); if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) { - return MessageModel.fromMap(response.data); + return Result.success(MessageModel.fromMap(response.data)); } - return null; + return Result.failure( + (response.data['message'] as String).messageException, + ); } } diff --git a/lib/core/api/messages/repositories/message_repository.dart b/lib/core/api/messages/repositories/message_repository.dart index 4ddbdbb..eb826c1 100644 --- a/lib/core/api/messages/repositories/message_repository.dart +++ b/lib/core/api/messages/repositories/message_repository.dart @@ -2,23 +2,24 @@ import 'package:injectable/injectable.dart'; import 'package:waterbus_sdk/core/api/messages/datasources/message_remote_datasource.dart'; import 'package:waterbus_sdk/types/models/message_model.dart'; +import 'package:waterbus_sdk/types/result.dart'; abstract class MessageRepository { - Future> getMessageByRoom({ + Future>> getMessageByRoom({ required int meetingId, required int limit, required int skip, }); - Future sendMessage({ + Future> sendMessage({ required int meetingId, required String data, }); - Future editMessage({ + Future> editMessage({ required int messageId, required String data, }); - Future deleteMessage({required int messageId}); + Future> deleteMessage({required int messageId}); } @LazySingleton(as: MessageRepository) @@ -30,46 +31,46 @@ class MessageRepositoryImpl extends MessageRepository { ); @override - Future deleteMessage({required int messageId}) async { - final MessageModel? messageModel = + Future> deleteMessage({required int messageId}) async { + final Result messageModel = await _remoteDataSource.deleteMessage(messageId: messageId); return messageModel; } @override - Future editMessage({ + Future> editMessage({ required int messageId, required String data, }) async { - final MessageModel? messageModel = + final Result messageModel = await _remoteDataSource.editMessage(messageId: messageId, data: data); return messageModel; } @override - Future> getMessageByRoom({ + Future>> getMessageByRoom({ required int meetingId, required int limit, required int skip, }) async { - final List messages = + final Result> result = await _remoteDataSource.getMessageByRoom( meetingId: meetingId, skip: skip, limit: limit, ); - return messages; + return result; } @override - Future sendMessage({ + Future> sendMessage({ required int meetingId, required String data, }) async { - final MessageModel? message = + final Result message = await _remoteDataSource.sendMessage(meetingId: meetingId, data: data); return message; diff --git a/lib/flutter_waterbus_sdk.dart b/lib/flutter_waterbus_sdk.dart index 790f7d2..003c796 100644 --- a/lib/flutter_waterbus_sdk.dart +++ b/lib/flutter_waterbus_sdk.dart @@ -12,6 +12,7 @@ import 'package:waterbus_sdk/types/index.dart'; import 'package:waterbus_sdk/types/models/conversation_socket_event.dart'; import 'package:waterbus_sdk/types/models/draw_model.dart'; import 'package:waterbus_sdk/types/models/record_model.dart'; +import 'package:waterbus_sdk/types/result.dart'; import 'package:waterbus_sdk/utils/callkit/callkit_listener.dart'; import 'package:waterbus_sdk/waterbus_sdk_interface.dart'; @@ -282,31 +283,31 @@ class WaterbusSdk { } // Chat - Future addMember(int code, int userId) async { + Future> addMember(int code, int userId) async { return await _sdk.addMember(code: code, userId: userId); } - Future deleteMember(int code, int userId) async { + Future> deleteMember(int code, int userId) async { return await _sdk.deleteMember(code: code, userId: userId); } - Future acceptInvite(int meetingId) async { + Future> acceptInvite(int meetingId) async { return await _sdk.acceptInvite(meetingId: meetingId); } - Future leaveConversation(int code) async { + Future> leaveConversation(int code) async { return await _sdk.leaveConversation(code: code); } - Future archivedConversation(int code) async { + Future> archivedConversation(int code) async { return await _sdk.archivedConversation(code: code); } - Future deleteConversation(int conversationId) async { + Future> deleteConversation(int conversationId) async { return await _sdk.deleteConversation(conversationId); } - Future> getConversations({ + Future>> getConversations({ required int skip, int limit = 10, int status = 2, @@ -318,7 +319,7 @@ class WaterbusSdk { ); } - Future> getArchivedConversations({ + Future>> getArchivedConversations({ required int skip, int limit = 10, }) async { @@ -328,7 +329,7 @@ class WaterbusSdk { ); } - Future updateConversation({ + Future> updateConversation({ required Meeting meeting, String? password, }) async { @@ -339,7 +340,7 @@ class WaterbusSdk { } // Messages - Future> getMessageByRoom({ + Future>> getMessageByRoom({ required int meetingId, required int skip, int limit = 10, @@ -351,21 +352,21 @@ class WaterbusSdk { ); } - Future sendMessage({ + Future> sendMessage({ required int meetingId, required String data, }) async { return await _sdk.sendMessage(meetingId: meetingId, data: data); } - Future editMessage({ + Future> editMessage({ required int messageId, required String data, }) async { return await _sdk.editMessage(messageId: messageId, data: data); } - Future deleteMessage({required int messageId}) async { + Future> deleteMessage({required int messageId}) async { return await _sdk.deleteMessage(messageId: messageId); } diff --git a/lib/types/error/failures.dart b/lib/types/error/failures.dart index 79b6373..17892da 100644 --- a/lib/types/error/failures.dart +++ b/lib/types/error/failures.dart @@ -1,5 +1,9 @@ import 'package:equatable/equatable.dart'; +part "meeting_failure.dart"; +part "message_failure.dart"; +part "user_failure.dart"; + abstract class Failure extends Equatable { final String? message; diff --git a/lib/types/error/meeting_failure.dart b/lib/types/error/meeting_failure.dart new file mode 100644 index 0000000..b845138 --- /dev/null +++ b/lib/types/error/meeting_failure.dart @@ -0,0 +1,33 @@ +part of 'failures.dart'; + +class RoomNotFound extends Failure {} + +class NotAllowedToUpdateRoom extends Failure {} + +class WrongPassword extends Failure {} + +class NotAllowToJoinDirectly extends Failure {} + +class NotExistsParticipant extends Failure {} + +class NotExistsCCU extends Failure {} + +class IsAlreadyInRoom extends Failure {} + +class HostNotFound extends Failure {} + +class NotAllowToAddUser extends Failure {} + +class HasNotJoinedMeeting extends Failure {} + +class MemberNotFound extends Failure {} + +class ParticipantNotFound extends Failure {} + +class OnlyAllowHostStartRecord extends Failure {} + +class OnlyAllowHostStopRecord extends Failure {} + +class NotAllowedToLeaveTheRoom extends Failure {} + +class OnlyHostPermitedToArchivedTheRoom extends Failure {} diff --git a/lib/types/error/message_failure.dart b/lib/types/error/message_failure.dart new file mode 100644 index 0000000..5d9f551 --- /dev/null +++ b/lib/types/error/message_failure.dart @@ -0,0 +1,9 @@ +part of 'failures.dart'; + +class NotAllowedGetMessages extends Failure {} + +class NotAllowedModifyMessage extends Failure {} + +class MessageNotFound extends Failure {} + +class MessageHasBeenDelete extends Failure {} diff --git a/lib/types/error/user_failure.dart b/lib/types/error/user_failure.dart new file mode 100644 index 0000000..d796563 --- /dev/null +++ b/lib/types/error/user_failure.dart @@ -0,0 +1,3 @@ +part of 'failures.dart'; + +class UserNotFound extends Failure {} diff --git a/lib/types/models/exceptions/exceptions.dart b/lib/types/models/exceptions/exceptions.dart new file mode 100644 index 0000000..a6c7648 --- /dev/null +++ b/lib/types/models/exceptions/exceptions.dart @@ -0,0 +1,4 @@ +import 'package:waterbus_sdk/types/error/failures.dart'; + +part "meeting_exceptions.dart"; +part "message_exceptions.dart"; diff --git a/lib/types/models/exceptions/meeting_exceptions.dart b/lib/types/models/exceptions/meeting_exceptions.dart new file mode 100644 index 0000000..050461e --- /dev/null +++ b/lib/types/models/exceptions/meeting_exceptions.dart @@ -0,0 +1,60 @@ +part of 'exceptions.dart'; + +enum MeetingException { + roomNotFound("Room Not Found"), + userNotFound('User not found'), + notAllowedToUpdateRoom('User not allowed to update rooom'), + wrongPassword('Wrong password!'), + notAllowToJoinDirectly('User not allow to join directly'), + notExistsParticipant('Not exists participant'), + notExistsCCU('Not exists CCU'), + isAlreadyInRoom('User already in room'), + hostNotFound('Host not found'), + notAllowToAddUser('You not allow to add user'), + hasNotJoinedMeeting('User not joined meeting'), + memberNotFound('Member Not Found'), + participantNotFound('Participant Not Found'), + onlyAllowHostStartRecord('Only allow host start record'), + onlyAllowHostStopRecord('Only allow host stop record'), + notAllowedToLeaveTheRoom( + 'Host not allowed to leave the room. You can archive chats if the room no longer active.', + ), + onlyHostPermitedToArchivedTheRoom('Only Host permited to archived the room.'), + ; + + const MeetingException(this.message); + + final String message; + + Failure get meetingFailure => switch (this) { + MeetingException.roomNotFound => RoomNotFound(), + MeetingException.userNotFound => UserNotFound(), + MeetingException.notAllowedToUpdateRoom => NotAllowedToUpdateRoom(), + MeetingException.wrongPassword => WrongPassword(), + MeetingException.notAllowToJoinDirectly => NotAllowToJoinDirectly(), + MeetingException.notExistsParticipant => NotExistsParticipant(), + MeetingException.notExistsCCU => NotExistsCCU(), + MeetingException.isAlreadyInRoom => IsAlreadyInRoom(), + MeetingException.hostNotFound => HostNotFound(), + MeetingException.notAllowToAddUser => NotAllowToAddUser(), + MeetingException.hasNotJoinedMeeting => HasNotJoinedMeeting(), + MeetingException.memberNotFound => MemberNotFound(), + MeetingException.participantNotFound => ParticipantNotFound(), + MeetingException.onlyAllowHostStartRecord => OnlyAllowHostStartRecord(), + MeetingException.onlyAllowHostStopRecord => OnlyAllowHostStopRecord(), + MeetingException.notAllowedToLeaveTheRoom => NotAllowedToLeaveTheRoom(), + MeetingException.onlyHostPermitedToArchivedTheRoom => + OnlyHostPermitedToArchivedTheRoom(), + }; +} + +extension MeetingExceptionX on String { + Failure get meetingException { + final int index = MeetingException.values + .indexWhere((exception) => exception.message == this); + + if (index == -1) return ServerFailure(); + + return MeetingException.values[index].meetingFailure; + } +} diff --git a/lib/types/models/exceptions/message_exceptions.dart b/lib/types/models/exceptions/message_exceptions.dart new file mode 100644 index 0000000..ef1445c --- /dev/null +++ b/lib/types/models/exceptions/message_exceptions.dart @@ -0,0 +1,37 @@ +part of 'exceptions.dart'; + +enum MessageException { + roomNotFound("Room Not Found"), + notAllowedGetMessages( + "You not allowed get messages from room that you not stay in there", + ), + notAllowedModifyMessage("You not allowed modify message of other users"), + userNotFound('User not found'), + messageHasBeenDelete('Message has been deleted'), + messageNotFound("Message not found"), + ; + + const MessageException(this.message); + + final String message; + + Failure get messageFailure => switch (this) { + MessageException.roomNotFound => RoomNotFound(), + MessageException.userNotFound => UserNotFound(), + MessageException.messageNotFound => MessageNotFound(), + MessageException.messageHasBeenDelete => MessageHasBeenDelete(), + MessageException.notAllowedGetMessages => NotAllowedGetMessages(), + MessageException.notAllowedModifyMessage => NotAllowedModifyMessage(), + }; +} + +extension MessageExceptionX on String { + Failure get messageException { + final int index = MessageException.values + .indexWhere((exception) => exception.message == this); + + if (index == -1) return ServerFailure(); + + return MessageException.values[index].messageFailure; + } +} diff --git a/lib/waterbus_sdk_impl.dart b/lib/waterbus_sdk_impl.dart index 26aa3b1..c4edc97 100644 --- a/lib/waterbus_sdk_impl.dart +++ b/lib/waterbus_sdk_impl.dart @@ -20,6 +20,7 @@ import 'package:waterbus_sdk/types/enums/draw_action.dart'; import 'package:waterbus_sdk/types/models/create_meeting_params.dart'; import 'package:waterbus_sdk/types/models/draw_model.dart'; import 'package:waterbus_sdk/types/models/record_model.dart'; +import 'package:waterbus_sdk/types/result.dart'; import 'package:waterbus_sdk/utils/logger/logger.dart'; import 'package:waterbus_sdk/utils/replaykit/replaykit_helper.dart'; import 'package:waterbus_sdk/waterbus_sdk_interface.dart'; @@ -322,12 +323,12 @@ class SdkCore extends WaterbusSdkInterface { // Chat @override - Future deleteConversation(int conversationId) async { + Future> deleteConversation(int conversationId) async { return await _chatRepository.deleteConversation(conversationId); } @override - Future> getConversations({ + Future>> getConversations({ required int skip, int limit = 10, int status = 2, @@ -340,7 +341,7 @@ class SdkCore extends WaterbusSdkInterface { } @override - Future> getArchivedConversations({ + Future>> getArchivedConversations({ int limit = 10, required int skip, }) async { @@ -351,7 +352,7 @@ class SdkCore extends WaterbusSdkInterface { } @override - Future updateConversation({ + Future> updateConversation({ required Meeting meeting, String? password, }) async { @@ -362,27 +363,30 @@ class SdkCore extends WaterbusSdkInterface { } @override - Future acceptInvite({required int meetingId}) async { + Future> acceptInvite({required int meetingId}) async { return await _chatRepository.acceptInvite(meetingId: meetingId); } @override - Future addMember({required int code, required int userId}) async { + Future> addMember({ + required int code, + required int userId, + }) async { return await _chatRepository.addMember(code: code, userId: userId); } @override - Future leaveConversation({required int code}) async { + Future> leaveConversation({required int code}) async { return await _chatRepository.leaveConversation(code: code); } @override - Future archivedConversation({required int code}) async { + Future> archivedConversation({required int code}) async { return await _chatRepository.archivedConversation(code: code); } @override - Future deleteMember({ + Future> deleteMember({ required int code, required int userId, }) async { @@ -391,7 +395,7 @@ class SdkCore extends WaterbusSdkInterface { // Messages @override - Future> getMessageByRoom({ + Future>> getMessageByRoom({ required int meetingId, required int skip, int limit = 10, @@ -404,7 +408,7 @@ class SdkCore extends WaterbusSdkInterface { } @override - Future sendMessage({ + Future> sendMessage({ required int meetingId, required String data, }) async { @@ -415,7 +419,7 @@ class SdkCore extends WaterbusSdkInterface { } @override - Future editMessage({ + Future> editMessage({ required int messageId, required String data, }) async { @@ -426,7 +430,7 @@ class SdkCore extends WaterbusSdkInterface { } @override - Future deleteMessage({required int messageId}) async { + Future> deleteMessage({required int messageId}) async { return await _messageRepository.deleteMessage(messageId: messageId); } diff --git a/lib/waterbus_sdk_interface.dart b/lib/waterbus_sdk_interface.dart index 234e12b..fc6935a 100644 --- a/lib/waterbus_sdk_interface.dart +++ b/lib/waterbus_sdk_interface.dart @@ -4,6 +4,7 @@ import 'package:waterbus_sdk/flutter_waterbus_sdk.dart'; import 'package:waterbus_sdk/types/enums/draw_action.dart'; import 'package:waterbus_sdk/types/models/draw_model.dart'; import 'package:waterbus_sdk/types/models/record_model.dart'; +import 'package:waterbus_sdk/types/result.dart'; abstract class WaterbusSdkInterface { Future initializeApp(); @@ -30,42 +31,44 @@ abstract class WaterbusSdkInterface { }); // Chat - Future> getConversations({ + Future>> getConversations({ int status = 2, int limit = 10, required int skip, }); - Future> getArchivedConversations({ + Future>> getArchivedConversations({ int limit = 10, required int skip, }); - Future updateConversation({ + Future> updateConversation({ required Meeting meeting, String? password, }); - Future deleteConversation(int conversationId); - Future leaveConversation({required int code}); - Future addMember({required int code, required int userId}); - Future deleteMember({required int code, required int userId}); - Future acceptInvite({required int meetingId}); - Future archivedConversation({required int code}); + Future> deleteConversation(int conversationId); + Future> leaveConversation({required int code}); + Future> addMember({required int code, required int userId}); + Future> deleteMember({ + required int code, + required int userId, + }); + Future> acceptInvite({required int meetingId}); + Future> archivedConversation({required int code}); // Messages - Future> getMessageByRoom({ + Future>> getMessageByRoom({ required int skip, required int meetingId, int limit = 10, }); - - Future sendMessage({ + Future> sendMessage({ required int meetingId, required String data, }); - Future editMessage({ + Future> editMessage({ required int messageId, required String data, }); - Future deleteMessage({required int messageId}); + Future> deleteMessage({required int messageId}); // Meeting Future createRoom({