Создавайте разговоры и добавляйте новых участников, избегая дублирования

В приложении Node, где есть служба обмена сообщениями, я добавил метод для добавления беседы и участника. Функциональность метода заключается в том, что когда новый запрос попадает в API для обмена сообщениями, он вызывает метод, называемый JoinConversation. В запросе есть некоторые входные данные от клиента, и на основе этих входных данных метод выполняет проверку на основе некоторых условий.

  1. Это первая проверка, существуют ли уже разговоры о том же в БД. Если он существует, то проверяет, существует ли уже член. Если входная информация участника присутствует в БД для этого разговора, он возвращает связанный разговор, но если участник не настроен заранее, то создает нового участника для этого разговора.
  2. Если выше указано 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;
    });
  }
        
        

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *