implement save of thread and members

This commit is contained in:
grimhilt
2023-03-31 16:07:02 +02:00
parent a82ff9b85b
commit 68e1dfe7d8
10 changed files with 225 additions and 142 deletions

View File

@@ -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);
}
}
}

View 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,
};

View File

@@ -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,
};