Skip to content

Commit 0e3472d

Browse files
Wahid NasriWahid Nasri
Wahid Nasri
authored and
Wahid Nasri
committed
prepare invitations events, table, v0
1 parent 9552f3a commit 0e3472d

22 files changed

+651
-60
lines changed

lib/MqttImpl/MqttArchiveHandler.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class MqttArchiveHandler extends ArchiveHandler {
3535
}
3636
} else if (topic.toLowerCase().startsWith("archivesmyid/")) {
3737
User user = User.fromJson(payload);
38+
clientHandler.joinMyEvents(user.id);
3839
_userController.add(user);
3940
}
4041
});

lib/MqttImpl/MqttChatEventsSender.dart

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import 'package:flutter_mqtt/MqttImpl/topics_generator.dart';
22
import 'package:flutter_mqtt/abstraction/ChatEventsSender.dart';
33
import 'package:flutter_mqtt/abstraction/ClientHandler.dart';
44
import 'package:flutter_mqtt/abstraction/models/ChatMarkerMessage.dart';
5+
import 'package:flutter_mqtt/abstraction/models/InvitationMessage.dart';
56
import 'package:flutter_mqtt/abstraction/models/enums/ChatMarker.dart';
7+
import 'package:flutter_mqtt/abstraction/models/enums/InvitationMessageType.dart';
68
import 'package:flutter_mqtt/abstraction/models/enums/MessageType.dart';
79
import 'package:flutter_mqtt/abstraction/models/TypingMessage.dart';
810
import 'package:uuid/uuid.dart';
@@ -15,7 +17,12 @@ class MqttChatEventsSender extends ChatEventsSender {
1517
void sendChatMarker(String messageId, ChatMarker marker, String bareRoom) {
1618
String topic = TopicsNamesGenerator.getEventsTopicForBareRoom(bareRoom);
1719

18-
ChatMarkerMessage msg = ChatMarkerMessage(id: Uuid().v4(), type: MessageType.ChatMarker, fromId: "", referenceId: messageId, status: marker);
20+
ChatMarkerMessage msg = ChatMarkerMessage(
21+
id: Uuid().v4(),
22+
type: MessageType.ChatMarker,
23+
fromId: "",
24+
referenceId: messageId,
25+
status: marker);
1926
clientHandler.sendPayload(msg.toJson(), topic);
2027
}
2128

@@ -31,4 +38,20 @@ class MqttChatEventsSender extends ChatEventsSender {
3138
String topic = TopicsNamesGenerator.getEventsTopicForBareRoom(bareRoom);
3239
clientHandler.sendPayload(message.toJson(), topic);
3340
}
41+
42+
@override
43+
void respondToInvitation(String sednderId, bool accept) {
44+
// TODO: implement respondToInvitation
45+
}
46+
47+
@override
48+
void sendInvitation(String username, String? invitationId) {
49+
InvitationMessage message = InvitationMessage(
50+
id: invitationId ?? Uuid().v4(),
51+
type: MessageType.EventInvitationRequest,
52+
invitationMessageType: InvitationMessageType.REQUEST_RESPONSE);
53+
54+
String topic = "invitations/" + username;
55+
clientHandler.sendPayload(message.toJson().toString(), topic);
56+
}
3457
}

lib/MqttImpl/MqttClient.dart

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class MqttClient extends ClientHandler {
3232
Platform.operatingSystem.toLowerCase() == 'windows'
3333
? 'localhost'
3434
: '172.16.14.99',
35-
//: '192.168.100.11',
35+
//: '192.168.100.11',
3636
cid,
3737
1883);
3838
// _client = MqttServerClient.withPort('broker.emqx.io', resource, 1883
@@ -191,6 +191,12 @@ class MqttClient extends ClientHandler {
191191
_client!.subscribe("presence/" + contactId, MqttQos.atLeastOnce);
192192
}
193193

194+
@override
195+
void joinMyEvents(String myId) {
196+
_client!.subscribe(TopicsNamesGenerator.getPersonalEventsForBareId(myId),
197+
MqttQos.atLeastOnce);
198+
}
199+
194200
@override
195201
void leaveContactEvents(String contactId) {
196202
if (_client == null) {
@@ -211,8 +217,12 @@ class MqttClient extends ClientHandler {
211217
final bytes = file.readAsBytesSync();
212218

213219
var mime = lookupMimeType(file.path);
214-
String base64Image =
215-
"data:" + (mime ?? "text/plain") + ";base64," + base64Encode(bytes) + "," + basename(file.path);
220+
String base64Image = "data:" +
221+
(mime ?? "text/plain") +
222+
";base64," +
223+
base64Encode(bytes) +
224+
"," +
225+
basename(file.path);
216226

217227
sendPayload(base64Image, channel);
218228
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import 'dart:async';
2+
import 'dart:convert';
3+
4+
import 'package:flutter_mqtt/abstraction/ClientHandler.dart';
5+
import 'package:flutter_mqtt/abstraction/InvitationsHandler.dart';
6+
import 'package:flutter_mqtt/abstraction/models/BaseMessage.dart';
7+
import 'package:flutter_mqtt/abstraction/models/InvitationMessage.dart';
8+
import 'package:flutter_mqtt/abstraction/models/enums/InvitationMessageType.dart';
9+
10+
class MqttInvitationHandler extends InvitationHandler {
11+
final ClientHandler clientHandler;
12+
StreamController<InvitationMessage> _invitationsController =
13+
StreamController.broadcast();
14+
StreamController<InvitationMessage> _invitationsUpdatesController =
15+
StreamController.broadcast();
16+
17+
MqttInvitationHandler(this.clientHandler) {
18+
clientHandler.allMessagesStream().listen((payloadWithTopic) {
19+
String topic = payloadWithTopic.topic;
20+
if (topic.startsWith("personalevents")) {
21+
String payload = payloadWithTopic.payload;
22+
var map = json.decode(payload);
23+
var bm = BaseMessage.fromJson(map);
24+
if (bm.isInvitationEvent()) {
25+
InvitationMessage invitationMessage = InvitationMessage.fromJson(map);
26+
if (invitationMessage.invitationMessageType ==
27+
InvitationMessageType.REQUEST_RESPONSE) {
28+
_invitationsController.add(invitationMessage);
29+
} else {
30+
_invitationsUpdatesController.add(invitationMessage);
31+
}
32+
}
33+
}
34+
});
35+
}
36+
@override
37+
Stream<InvitationMessage> invitationUpdatesStream() {
38+
return _invitationsUpdatesController.stream;
39+
}
40+
41+
@override
42+
Stream<InvitationMessage> newInvitationsStream() {
43+
return _invitationsController.stream;
44+
}
45+
}

lib/MqttImpl/MqttOnlineReader.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class MqttOnlineReader extends MessageOnlineReaderHandler {
4747
TypingMessage tMsg = TypingMessage.fromJson(payload);
4848
_typingController.add(tMsg);
4949
}
50-
} else if (topic.toLowerCase().startsWith("archives")) {}
50+
}
5151
});
5252
}
5353

lib/MqttImpl/topics_generator.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class TopicsNamesGenerator {
88
}
99

1010
static String getPersonalEventsForBareId(String bareId) {
11-
return "events/" + bareId;
11+
return "personalevents/" + bareId;
1212
}
1313

1414
static String getChattingTopicForBareRoom(String bareRoom) {

lib/abstraction/ChatEventsSender.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,7 @@ abstract class ChatEventsSender {
88
ChatMessage message, ChatMarker marker, String bareRoom) {
99
sendChatMarker(message.id, marker, bareRoom);
1010
}
11+
12+
void sendInvitation(String username, String? invitationId);
13+
void respondToInvitation(String sednderId, bool accept);
1114
}

lib/abstraction/ClientHandler.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ abstract class ClientHandler {
1414
String? getClientId();
1515
void joinRoom(String room); //similar to subscribe to topic
1616
void joinContactEvents(String contactId);
17+
void joinMyEvents(String myId);
1718
void leaveRoom(String bareRoom);
1819
void leaveContactEvents(String contactId);
1920
void sendPayload(String payload, String channel);
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import 'package:flutter_mqtt/abstraction/models/InvitationMessage.dart';
2+
3+
abstract class InvitationHandler {
4+
Stream<InvitationMessage> newInvitationsStream();
5+
Stream<InvitationMessage> invitationUpdatesStream();
6+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'package:flutter/foundation.dart';
2+
import 'package:flutter_mqtt/abstraction/models/enums/InvitationMessageType.dart';
3+
import 'package:flutter_mqtt/abstraction/models/enums/MessageType.dart';
4+
5+
class InvitationMessage {
6+
late String id;
7+
late MessageType type;
8+
late InvitationMessageType invitationMessageType;
9+
String? text;
10+
String? fromId;
11+
String? fromName;
12+
String? fromAvatar;
13+
14+
InvitationMessage(
15+
{required this.id,
16+
required this.type,
17+
required this.invitationMessageType,
18+
this.text,
19+
this.fromId,
20+
this.fromName,
21+
this.fromAvatar});
22+
23+
InvitationMessage.fromJson(Map<String, dynamic> json) {
24+
id = json['id'];
25+
//type = MessageType.values[json['type']];
26+
type =
27+
MessageType.values.where((e) => describeEnum(e) == json['type']).first;
28+
invitationMessageType = InvitationMessageType.values
29+
.where((e) => describeEnum(e) == json['invitationMessageType'])
30+
.first;
31+
text = json['text'];
32+
fromId = json['fromId'];
33+
fromName = json['fromName'];
34+
fromAvatar = json['fromAvatar'];
35+
}
36+
37+
Map<String, dynamic> toJson() {
38+
final Map<String, dynamic> data = new Map<String, dynamic>();
39+
data['id'] = this.id;
40+
data['type'] = this.type;
41+
data['invitationMessageType'] = this.invitationMessageType;
42+
data['text'] = this.text;
43+
data['fromId'] = this.fromId;
44+
data['fromName'] = this.fromName;
45+
data['fromAvatar'] = this.fromAvatar;
46+
return data;
47+
}
48+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
enum InvitationMessageType { REQUEST_RESPONSE, ERROR, INFO }

lib/db/appdata/AppData.dart

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:flutter_mqtt/abstraction/models/enums/ChatMarker.dart';
2+
import 'package:flutter_mqtt/abstraction/models/enums/InvitationMessageType.dart';
23
import 'package:flutter_mqtt/db/appdata/ContactsHandler.dart';
34
import 'package:flutter_mqtt/db/appdata/MessageHandler.dart';
45
import 'package:flutter_mqtt/db/appdata/UsersHandler.dart';
@@ -44,7 +45,9 @@ class AppData {
4445
var dbMessage = message.toDbMessage();
4546
MyDatabase.instance()!.messageDao.addMessage(dbMessage);
4647
//SEND CHAT MARKER
47-
ChatApp.instance()!.eventsSender.sendChatMarker(message.id, ChatMarker.delivered, message.roomId);
48+
ChatApp.instance()!
49+
.eventsSender
50+
.sendChatMarker(message.id, ChatMarker.delivered, message.roomId);
4851
});
4952
//============Chat Marker==========//
5053
ChatApp.instance()!
@@ -61,6 +64,23 @@ class AppData {
6164
.setMessageDelivered(markerMessage.referenceId);
6265
}
6366
});
67+
68+
//========== Invitations =========//
69+
ChatApp.instance()!
70+
.invitationHandler
71+
.newInvitationsStream()
72+
.listen((invitation) {
73+
MyDatabase.instance()!
74+
.invitationDao
75+
.addInvitation(invitation.toDbInvitation());
76+
});
77+
78+
ChatApp.instance()!
79+
.invitationHandler
80+
.invitationUpdatesStream()
81+
.listen((invitation) {
82+
if (invitation.invitationMessageType == InvitationMessageType.INFO) {}
83+
});
6484
}
6585

6686
Future deleteAllAndDisconnect() async {
@@ -71,6 +91,7 @@ class AppData {
7191
ChatApp.instance()!.disconnect();
7292
await deleteAll();
7393
}
94+
7495
Future deleteAll() async {
7596
await usersHandler.deleteAll();
7697
await messagesHandler.deleteAll();

lib/db/appdata/extensions/MessagesExtensions.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter_mqtt/abstraction/models/ChatMessage.dart';
22
import 'package:flutter_mqtt/abstraction/models/ContactChat.dart';
3+
import 'package:flutter_mqtt/abstraction/models/InvitationMessage.dart';
34
import 'package:flutter_mqtt/db/database.dart';
45

56
extension DbMessageConversions on DbMessage {
@@ -34,3 +35,10 @@ extension ContactChatConversions on ContactChat {
3435
return dbc;
3536
}
3637
}
38+
39+
extension InvitationConversions on InvitationMessage {
40+
DbInvitation toDbInvitation() {
41+
return DbInvitation(
42+
id: id, fromId: fromId!, fromName: fromName, fromAvatar: fromAvatar);
43+
}
44+
}

lib/db/dao/invitation_dao.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'package:flutter_mqtt/db/database.dart';
2+
import 'package:flutter_mqtt/db/tables/InvitationTable.dart';
3+
import 'package:moor/moor.dart';
4+
part 'invitation_dao.g.dart';
5+
6+
@UseDao(tables: [Invitations])
7+
class InvitationDao extends DatabaseAccessor<MyDatabase>
8+
with _$InvitationDaoMixin {
9+
InvitationDao(MyDatabase attachedDatabase) : super(attachedDatabase);
10+
11+
Future<int> addInvitation(DbInvitation cts) {
12+
return into(invitations).insertOnConflictUpdate(cts);
13+
}
14+
15+
Stream<List<DbInvitation>> getAllInvitations() {
16+
return select(invitations).watch();
17+
}
18+
}

lib/db/dao/invitation_dao.g.dart

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/db/database.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import 'package:flutter_mqtt/db/dao/contact_dao.dart';
2+
import 'package:flutter_mqtt/db/dao/invitation_dao.dart';
23
import 'package:flutter_mqtt/db/dao/message_dao.dart';
34
import 'package:flutter_mqtt/db/dao/user_dao.dart';
45
import 'package:flutter_mqtt/db/tables/ContactTable.dart';
6+
import 'package:flutter_mqtt/db/tables/InvitationTable.dart';
57
import 'package:flutter_mqtt/db/tables/MessageTable.dart';
68
import 'package:flutter_mqtt/db/tables/UserTable.dart';
79
import 'package:moor/moor.dart';
@@ -24,16 +26,17 @@ LazyDatabase _openConnection() {
2426
}
2527

2628
@UseMoor(
27-
tables: [Contacts, Users, Messages],
28-
daos: [UserDao, ContactDao, MessageDao])
29+
tables: [Contacts, Users, Messages, Invitations],
30+
daos: [UserDao, ContactDao, MessageDao, InvitationDao])
2931
class MyDatabase extends _$MyDatabase {
3032
static MyDatabase? _instance;
31-
static MyDatabase? instance(){
32-
if(_instance == null){
33+
static MyDatabase? instance() {
34+
if (_instance == null) {
3335
_instance = MyDatabase._();
3436
}
3537
return _instance;
3638
}
39+
3740
// we tell the database where to store the data with this constructor
3841
MyDatabase._() : super(_openConnection());
3942

0 commit comments

Comments
 (0)