Почтовый сервер собственный.
Структура письма:
{
id: number, // messageId
from: string,
to: string,
date: number, // unix
subject?: string,
text: string,
html?: string,
checked: boolean
}
Отличия тикета в том, что он приходит не в виде сообщения на почту, а через обращение на платформе:
{
id: number, // ticketId
startDate: number,
endDate?: number,
from: string,
subject: string,
question: string,
answer?: string
}
Отображаться должны в отдельном месте (как будто папка в обычной почте).
При отправке ответа среди прочего должен передаваться id тикета.
Ещё:
есть два варианта тикетов: для зарегистрированных пользователей и для остальных
(возможно, в дальнейшем, для зарегистрированных пользователей будет больше полей).
То есть, должны быть следующие папки сообщений:
- почта (входящие / исходящие);
- тикеты для пользователей платформы;
- тикеты для всех остальных.
Поскольку тикеты подразумевают закрытие после ответа, то для них нужно в одном месте показывать и вопрос, и ответ (при наличии).
Если было открыто входящее сообщение впервые, нужно отправить данные об этом на сервер
(checked изменится на true).
С тикетами такого нет, они считаются прочитанными только после ответа
(endDate и answer перестанут быть null).
Также напоминаю, что нужна возможность использовать шаблон для всех видов исходящих сообщений.
Сам шаблон на сервер передавать не нужно, только текст и название шаблона
(возможно, в дальнейшем, нужна будет возможность простенького конструктора html, но сейчас текст просто подставляется в указанное место).
файлы с шаблонами вида
exports = / export function(body) {
return `<html>...${body}...</html>`;
}
будут.
И напоследок - примеры payload'ов для общения с сервером:
interface OutgoingMailData {
from: string;
to: string;
subject?: string;
text: string;
template?: string;
}
Отправить письмо:
{
type: "sendMessage",
params: OutgoingMailData
}
Ответить на тикет:
{
type: "answerInnerTicket" | "answerOuterTicket",
params: OutgoingMailData & {
ticketId: number
}
}
Письмо прочитано:
{
type: "messageChecked",
params: {
messageId: number
}
}
Загрузить входящие письма:
{
type: "getInboxMessages",
params: {
page?: number = 0,
checked?: boolean = null,
from?: string,
to?: string, // для входящих может быть изменён только для суперпользователя
subject?: string,
text?: string
}
}
Payload бэка на последнее:
{
amount: number, // количество подошедших
list: MailData[]
}
Логика понимания того, какой это пользователь будет позже