Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(Draft) Feat: Map API of chat feature #10

Open
wants to merge 2 commits into
base: migration/v2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions lib/constants/api_enpoints.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,19 @@ class ApiEndpoints {
// Users
static const String users = 'users';
static const String username = 'users/username';
static const String searchUsers = 'users/search';

// Meetings
static const String meetings = 'meetings';
static const String joinWithPassword = 'meetings/join/password';
static const String joinWithoutPassword = 'meetings/join';
static const String meetingConversations = 'meetings/conversations';
static const String meetingMembers = 'meetings/members';
static const String acceptInvite = 'meetings/members/accept';

// Chats
static const String chats = 'chats';
static const String chatsConversations = 'chats/conversations';

// Messages
}
103 changes: 103 additions & 0 deletions lib/core/api/chat/datasources/chat_remote_datasource.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import 'package:dio/dio.dart';
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/index.dart';

abstract class ChatRemoteDataSource {
Future<List<Meeting>> getConversations({
required int skip,
required int limit,
required int status,
});
Future<bool> deleteConversation({required int meetingId});
Future<bool> addMember({required int code, required int userId});
Future<Meeting?> deleteMember({required int code, required int userId});
Future<Meeting?> acceptInvite({required int code});
}

@LazySingleton(as: ChatRemoteDataSource)
class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
final BaseRemoteData _remoteData;
ChatRemoteDataSourceImpl(
this._remoteData,
);

@override
Future<List<Meeting>> getConversations({
required int skip,
required int limit,
required int status,
}) async {
final Response response = await _remoteData.getRoute(
"${ApiEndpoints.meetingConversations}/$status",
query: "limit=$limit&status=$status",
);

if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) {
final List list = response.data;
return list.map((meeting) => Meeting.fromMap(meeting)).toList();
}

return [];
}

@override
Future<bool> deleteConversation({required int meetingId}) async {
final response = await _remoteData.deleteRoute(
"${ApiEndpoints.chatsConversations}/$meetingId",
);

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

return false;
}

@override
Future<Meeting?> acceptInvite({required int code}) async {
final Response response = await _remoteData.postRoute(
'${ApiEndpoints.acceptInvite}/$code',
);

if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) {
return Meeting.fromMap(response.data);
}

return null;
}

@override
Future<bool> addMember({required int code, required int userId}) async {
final Response response = await _remoteData.postRoute(
'${ApiEndpoints.meetingMembers}/$code',
body: {"userId": userId},
);

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

return false;
}

@override
Future<Meeting?> deleteMember({
required int code,
required int userId,
}) async {
final Response response = await _remoteData.deleteRoute(
'${ApiEndpoints.meetingMembers}/$code',
body: {"userId": userId},
);

if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) {
return Meeting.fromMap(response.data);
}

return null;
}
}
82 changes: 82 additions & 0 deletions lib/core/api/chat/repositories/chat_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import 'package:injectable/injectable.dart';

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

abstract class ChatRepository {
Future<List<Meeting>> getConversations({
required int status,
required int limit,
required int skip,
});
Future<bool> deleteConversation(int meetingId);
Future<bool> addMember({required int code, required int userId});
Future<Meeting?> deleteMember({required int code, required int userId});
Future<Meeting?> acceptInvite({required int code});
}

@LazySingleton(as: ChatRepository)
class ChatRepositoryImpl extends ChatRepository {
final ChatRemoteDataSource _remoteDataSource;

ChatRepositoryImpl(
this._remoteDataSource,
);

@override
Future<List<Meeting>> getConversations({
required int status,
required limit,
required skip,
}) async {
final List<Meeting> conversations =
await _remoteDataSource.getConversations(
skip: skip,
limit: limit,
status: status,
);

return conversations;
}

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

return isSucceed;
}

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

return isSucceed;
}

@override
Future<bool> addMember({required int code, required int userId}) async {
final bool isSucceed = await _remoteDataSource.addMember(
code: code,
userId: userId,
);

return isSucceed;
}

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

return meeting;
}
}
100 changes: 100 additions & 0 deletions lib/core/api/messages/datasources/message_remote_datasource.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import 'package:dio/dio.dart';
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/message_model.dart';

abstract class MessageRemoteDataSource {
Future<List<MessageModel>> getMessageByRoom({
required int meetingId,
required int limit,
required int skip,
});

Future<MessageModel?> sendMessage({
required int meetingId,
required String data,
});
Future<bool> editMessage({
required int meetingId,
required String data,
});
Future<bool> deleteMessage({required int meetingId});
}

@LazySingleton(as: MessageRemoteDataSource)
class MessageRemoteDataSourceImpl extends MessageRemoteDataSource {
final BaseRemoteData _remoteData;

MessageRemoteDataSourceImpl(
this._remoteData,
);

@override
Future<List<MessageModel>> getMessageByRoom({
required int meetingId,
required int limit,
required int skip,
}) async {
final Response response = await _remoteData.getRoute(
"${ApiEndpoints.chats}/$meetingId",
query: "limit=$limit&skip=$skip",
);

if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) {
final List rawList = response.data;
return rawList.map((message) => MessageModel.fromMap(message)).toList();
}

return [];
}

@override
Future<MessageModel?> sendMessage({
required int meetingId,
required String data,
}) async {
final Response response = await _remoteData.postRoute(
"${ApiEndpoints.chats}/$meetingId",
body: {"data": data},
);

if ([StatusCode.ok, StatusCode.created].contains(response.statusCode)) {
return MessageModel.fromMap(response.data);
}

return null;
}

@override
Future<bool> editMessage({
required int meetingId,
required String data,
}) async {
final Response response = await _remoteData.putRoute(
"${ApiEndpoints.chats}/$meetingId",
{"data": data},
);

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

return false;
}

@override
Future<bool> deleteMessage({required int meetingId}) async {
final Response response = await _remoteData.deleteRoute(
"${ApiEndpoints.chats}/$meetingId",
);

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

return false;
}
}
74 changes: 74 additions & 0 deletions lib/core/api/messages/repositories/message_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
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';

abstract class MessageRepository {
Future<List<MessageModel>> getMessageByRoom({
required int meetingId,
required int limit,
required int skip,
});

Future<MessageModel?> sendMessage({
required int meetingId,
required String data,
});
Future<bool> editMessage({required int meetingId, required String data});
Future<bool> deleteMessage({required int meetingId});
}

@LazySingleton(as: MessageRepository)
class MessageRepositoryImpl extends MessageRepository {
final MessageRemoteDataSource _remoteDataSource;

MessageRepositoryImpl(
this._remoteDataSource,
);

@override
Future<bool> deleteMessage({required int meetingId}) async {
final bool isSucceed =
await _remoteDataSource.deleteMessage(meetingId: meetingId);

return isSucceed;
}

@override
Future<bool> editMessage({
required int meetingId,
required String data,
}) async {
final bool isSucceed =
await _remoteDataSource.editMessage(meetingId: meetingId, data: data);

return isSucceed;
}

@override
Future<List<MessageModel>> getMessageByRoom({
required int meetingId,
required int limit,
required int skip,
}) async {
final List<MessageModel> messages =
await _remoteDataSource.getMessageByRoom(
meetingId: meetingId,
skip: skip,
limit: limit,
);

return messages;
}

@override
Future<MessageModel?> sendMessage({
required int meetingId,
required String data,
}) async {
final MessageModel? message =
await _remoteDataSource.sendMessage(meetingId: meetingId, data: data);

return message;
}
}
Loading
Loading