В приложении Node, где есть служба обмена сообщениями, я добавил метод для добавления беседы и участника. Функциональность метода заключается в том, что когда новый запрос попадает в API для обмена сообщениями, он вызывает метод, называемый JoinConversation. В запросе есть некоторые входные данные от клиента, и на основе этих входных данных метод выполняет проверку на основе некоторых условий.
- Это первая проверка, существуют ли уже разговоры о том же в БД. Если он существует, то проверяет, существует ли уже член. Если входная информация участника присутствует в БД для этого разговора, он возвращает связанный разговор, но если участник не настроен заранее, то создает нового участника для этого разговора.
- Если выше указано false, это означает, что беседа не существует, тогда создается новая беседа, а также создается новый участник.
Этот метод отлично справляется со своей задачей, но то, как я его написал, кажется мне излишним, и я искал лучший способ написать его и с меньшим количеством строк, если бы это было возможно.
Код этого и игнорировать DAO это внешний модуль безопасности, который я не могу объяснить. В методе используются KnexJS и Apollo.
joinConversation({ input }) {
const { ApolloError } = this.errors;
return this.withDAO(async ({ conversation, member }) => {
const { originId, memberId, memberType, name, originType } = input;
const existingConversation = await conversation.selectFirst({
originId,
originType,
});
if (existingConversation) {
const existingMemberPerDocument = await member.selectFirst({
memberId,
});
if (!isEmpty(existingMemberPerDocument)) {
await conversation.selectFirst({
conversationId: existingConversation.conversationId,
originType: existingConversation.originType,
});
return existingConversation;
}
await member.insert({
conversationId: existingConversation.id,
memberId,
memberType,
name,
});
if (isEmpty(member)) {
throw new ApolloError('Error while Adding new conversation member!');
}
return existingMemberPerDocument;
}
const createdConversation = await conversation.insert({
...input,
});
if (isEmpty(createdConversation)) {
throw new ApolloError('Error while Adding new conversation!');
}
await member.insert({
conversationId: createdConversation.id,
memberId,
memberType,
name,
});
return createdConversation;
});
}
