implement save of thread and members
This commit is contained in:
@@ -6,10 +6,14 @@ const {
|
||||
isRoomGroup,
|
||||
findRoomsFromMessage,
|
||||
hasSameMembersAsParent,
|
||||
registerThread,
|
||||
registerMember,
|
||||
getAllMembers,
|
||||
} = require("../db/saveMessageApp");
|
||||
|
||||
const { findRoomByOwner, getAddresseId, getUserIdOfMailbox } = require("../db/mail");
|
||||
const { nbMembers } = require("./utils/statusUtils");
|
||||
const { nbMembers } = require("./utils/envelopeUtils");
|
||||
const { logger } = require("../system/Logger");
|
||||
|
||||
/**
|
||||
* take object address and join mailbox and host to return mailbox@host
|
||||
@@ -26,11 +30,11 @@ async function initiateRoom(envelope, ownerId, messageId, isSeen) {
|
||||
}
|
||||
|
||||
const roomType = {
|
||||
ROOM: 'room',
|
||||
CHANNEL: 'channel',
|
||||
GROUP: 'group',
|
||||
DM: 'dm',
|
||||
THREAD: 'thread'
|
||||
ROOM: 0,
|
||||
CHANNEL: 1,
|
||||
GROUP: 2,
|
||||
DM: 3,
|
||||
THREAD: 4
|
||||
}
|
||||
|
||||
class registerMessageInApp {
|
||||
@@ -56,19 +60,30 @@ class registerMessageInApp {
|
||||
return this.ownerId == this.userId;
|
||||
}
|
||||
|
||||
async initiateRoom(owner, roomType) {
|
||||
// todo roomType
|
||||
await createRoom(this.envelope.subject, owner, this.messageId).then(async (roomId) => {
|
||||
// todo register members
|
||||
await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date);
|
||||
async registerMembers(roomId) {
|
||||
getAllMembers(this.messageId).then((res) => {
|
||||
res[0].id.split(',').foreach(async (memberId) => {
|
||||
await registerMember(roomId, memberId);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async initiateRoom(owner, type) {
|
||||
try {
|
||||
const roomId = await createRoom(this.envelope.subject, owner, this.messageId, type);
|
||||
await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date);
|
||||
this.registerMembers(roomId);
|
||||
return roomId;
|
||||
} catch (err) {
|
||||
logger.error(err);
|
||||
}
|
||||
}
|
||||
|
||||
async createOrRegisterOnExistence(owner, roomType) {
|
||||
await findRoomByOwner(owner).then(async (res) => {
|
||||
if (res.length == 0) {
|
||||
// first message with this sender
|
||||
await initiateRoom(owner, roomType);
|
||||
await this.initiateRoom(owner, roomType);
|
||||
} else {
|
||||
// not a reply, add to the list of message if this sender
|
||||
await registerMessageInRoom(this.messageId, res[0].room_id, this.isSeen, this.envelope.date);
|
||||
@@ -76,11 +91,28 @@ class registerMessageInApp {
|
||||
});
|
||||
}
|
||||
|
||||
async initiateThread() {
|
||||
await createRoom(this.envelope.subject, owner, this.messageId, roomType.THREAD).then(async (roomId) => {
|
||||
// find parent room infos
|
||||
await getRoomInfo(this.envelope.inReplyTo).then(async (room) => {
|
||||
// todo room not lenght, reply to transfer ?
|
||||
let root_id = room[0].root_id
|
||||
if (!root_id) root_id = room[0].room_id
|
||||
await registerThread(roomId, room[0].room_id, root_id);
|
||||
});
|
||||
// impl register previous message ?
|
||||
await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date);
|
||||
await this.registerMembers(roomId);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
async createOrRegisterOnMembers(roomId) {
|
||||
const hasSameMembers = await hasSameMembersAsParent(this.messageID, this.envelope.inReplyTo);
|
||||
if (hasSameMembers) {
|
||||
await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date);
|
||||
} else {
|
||||
await this.initiateThread();
|
||||
await createThread(this.envelope.subject, this.ownerId, this.messageId, roomId, this.isDm()).then(
|
||||
async (threadId) => {
|
||||
await registerMessageInThread(this.messageId, threadId, this.isSeen);
|
||||
@@ -105,7 +137,7 @@ class registerMessageInApp {
|
||||
initiateRoom(this.envelope, this.ownerId, this.messageId, this.isSeen);
|
||||
}
|
||||
} else {
|
||||
await this.createOrRegisterOnExistence(this.ownerId, roomType.ROOM);
|
||||
await this.createOrRegisterOnExistence(this.ownerId, roomType.CHANNEL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
21
back/mails/utils/envelopeUtils.js
Normal file
21
back/mails/utils/envelopeUtils.js
Normal file
@@ -0,0 +1,21 @@
|
||||
function nbMembers(envelope) {
|
||||
return getMembers(envelope).length;
|
||||
}
|
||||
|
||||
function getMembers(envelope) {
|
||||
const members = [];
|
||||
const fields = ["from", "to", "sender", "replyTo", "cc", "bcc"];
|
||||
fields.forEach((field) => {
|
||||
if (!envelope[field]) return;
|
||||
envelope[field].forEach((member) => {
|
||||
if (members.find((m) => m.mailbox === member.mailbox && m.host === member.host)) return;
|
||||
members.push(member);
|
||||
});
|
||||
});
|
||||
return members;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
nbMembers,
|
||||
getMembers,
|
||||
};
|
||||
@@ -1,18 +0,0 @@
|
||||
function nbMembers(envelope) {
|
||||
let nbMembers =
|
||||
(envelope.bcc?.length ?? 0) +
|
||||
(envelope.cc?.length ?? 0) +
|
||||
(envelope.to?.length ?? 0) +
|
||||
(envelope.from?.length ?? 0);
|
||||
if (
|
||||
envelope.sender?.length > 0 &&
|
||||
!(envelope.sender[0].mailbox == envelope.from[0].mailbox && envelope.sender[0].host == envelope.from[0].host)
|
||||
) {
|
||||
nbMembers += envelope.sender?.length ?? 0;
|
||||
}
|
||||
return nbMembers;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
nbMembers,
|
||||
};
|
||||
Reference in New Issue
Block a user