torin-asakura / shdvor

Репа шиномонтажки
https://shdvor.pro
BSD 3-Clause "New" or "Revised" License
0 stars 0 forks source link

Telegram бот для записи на переобувку #70

Open Nelfimov opened 1 month ago

Nelfimov commented 1 month ago

С чем связан запрос на фичу?

Необходимо разработать Telegram бота, через которого можно было бы записываться на переобувку

Расскажите как вы это себе видите

Архитектура: clean - https://github.com/atls/serverless-yandex

Приложите пример реализаций

https://github.com/atls/migration-bot/tree/refactor/promise-to-wizard

Nelfimov commented 1 month ago

@TorinAsakura проверь пожалуйста задачу.

Для шиномонтажки бота с мониторингом записей делаем отдельного?

TorinAsakura commented 4 weeks ago

@TorinAsakura проверь пожалуйста задачу.

Для шиномонтажки бота с мониторингом записей делаем отдельного?

каким мониторингом? каких записей?

Nelfimov commented 4 weeks ago

@TorinAsakura мы проговаривали - запись пользователя должна быть подтверждаемой со стороны монтажки. Для этого делаем отдельного бота?

TorinAsakura commented 3 weeks ago

@TorinAsakura мы проговаривали - запись пользователя должна быть подтверждаемой со стороны монтажки. Для этого делаем отдельного бота?

конечно, бот оператора и бот записи

kirill-ivanovvv commented 1 week ago

@Nelfimov, подскажи пожалуйста

Nelfimov commented 1 week ago
  • не понимаю, почему в candify applicant вынесен в отдельный сервис

Микросервисная архитектура. Бэкенд разделен по DDD

Для твоей задачи это не нужно.

  • если делать по аналогии с текущим приложением, то слой для этого бота я должен назвать booking-telegram-bot

Делаем так

Nelfimov commented 1 week ago

@effektivnayarabota1 обрати внимание - добавил еще требование:

  • [ ] должен быть эндпоинт для записи через REST API с сайта (форма "Записаться")
kirill-ivanovvv commented 1 week ago

Текущий статус

TorinAsakura commented 1 week ago
  • если делать по аналогии с текущим приложением, то слой для этого бота я должен назвать booking-telegram-bot

telegram-bot это твой контекст, это никак не может быть слоем

booking - выглядит как домен, если вы по DDD собираетесь работать

kirill-ivanovvv commented 1 week ago

Текущий статус

kirill-ivanovvv commented 1 week ago

@Nelfimov нужна помощь

  1. связал порты в infrastructure.providers - дает ошибку, предлагает импортиовать порт в один из модулей. насколько понимаю, так они рабоать не будут?
log ```ts ➤ YN0000: ┌ Service Development ➤ YN0000: │ Starting server... ➤ YN0000: │ nestjs:NestFactory Starting Nest application... ➤ YN0000: │ Welcome to tgsnake! ➤ YN0000: │ Using version: 3.3.1 - Stable ➤ YN0000: │ Thanks for using tgsnake ➤ YN0000: │ (tgsnake) warning - If you use the experimental option, we strongly do not recommend using this function. 19/9/2024 13:38:5.353 ➤ YN0000: │ [Nest] 149776 - 09/19/2024, 1:38:05 PM LOG [InstanceLoader] BotServiceEntrypointModule dependencies initialized ➤ YN0000: │ [Nest] 149776 - 09/19/2024, 1:38:05 PM LOG [InstanceLoader] TgsnakeAdapterModule dependencies initialized +1ms ➤ YN0000: │ nestjs:ExceptionHandl Nest can't resolve dependencies of the SendMessageUseCase (?). Please make sure that the argument TelegramClientPort at index [0] is ➤ YN0000: │ er available in the TelegramBotApplicationModule context. ➤ YN0000: │ ➤ YN0000: │ Potential solutions: ➤ YN0000: │ - Is TelegramBotApplicationModule a valid NestJS module? ➤ YN0000: │ - If TelegramClientPort is a provider, is it part of the current TelegramBotApplicationModule? ➤ YN0000: │ - If TelegramClientPort is exported from a separate @Module, is that module imported within TelegramBotApplicationModule? ➤ YN0000: │ @Module({ ➤ YN0000: │ imports: [ /* the Module containing TelegramClientPort */ ] ➤ YN0000: │ }) ➤ YN0000: │ ```
  1. где инициировать клиент tgsnake. через порты мы передаем инициированный клиент, верно?
  2. useCase используется Processor. В serveless-yandex этот Processor вызывается в handler. у нас ентрипоинт сделан по-другому - bootstrap через NestFactory.create. Пробовал сделать также, как в serverless-yandex - не получилось, была бесконечная загрузка. как использовать useCase в нашем случае? если инициировать его в адаптере, будет ли возможно вызывать useCase из адаптера?
Nelfimov commented 1 week ago

@effektivnayarabota1 технически ошибка была на очевидном месте, любая нормальная IDE тебе подсветила бы. Оставил в ревью комменты с деталями

kirill-ivanovvv commented 1 week ago

Текущий статус

kirill-ivanovvv commented 1 week ago

@Nelfimov а hmr должен нормально работать? у меня на модули жалуется HMR is not implemented for module chunk format yet в сети нашел вот такую инфу: https://github.com/webpack/webpack/issues/17636

kirill-ivanovvv commented 1 week ago
  • когда шиномонтажка подтверждает запись
Nelfimov commented 1 week ago

@Nelfimov а hmr должен нормально работать? у меня на модули жалуется HMR is not implemented for module chunk format yet в сети нашел вот такую инфу: webpack/webpack#17636

Забирай из мастера новый бандл

  • когда шиномонтажка подтверждает запись
  • шиномонтажка будет подтверждать запись тоже через бота?

https://github.com/torin-asakura/shdvor/issues/70#issuecomment-2323292352

kirill-ivanovvv commented 1 week ago

@Nelfimov в опроснике дублирую поля с формы на сайте, или вывожу только эти два вопроса?

  • какая машина
  • [ ] какой диаметр колес

image

Nelfimov commented 1 week ago

дублируешь

kirill-ivanovvv commented 1 week ago

Текущий статус

Nelfimov commented 1 week ago
  1. adapter экспортирует методы типа sendMessage, reply - исключительно взаимодействие с этой библиотекой

Да

  1. use-case подтягивает эти методы и использует их. приводить данные с запросов я буду на этот уровень. весь conversation у меня будет также на этом уровне

Некорректно сформулировал - use-case находится в application. Это значит что взаимодействовать с адаптерами будет через порты. Имплементация порта - в infrastructure

  1. в consumer висит и слушает события. если выполняет условие одного события, выполнение кода уходит на уровень в use-case

cosunmer или processor - отвечает за получение сообщения. Дальше он передает полученное в use-case

https://github.com/atls/serverless-yandex/blob/master/contexts/video-optimizer/infrastructure-module/src/processors/object-created.processor.ts

kirill-ivanovvv commented 5 days ago

Текущий статус

@Nelfimov посмотри пожалуйста:

Актуальная ветка

https://github.com/torin-asakura/shdvor/tree/feat/booking-telegram-bot

Nelfimov commented 4 days ago

@Nelfimov посмотри пожалуйста:

Все правильно - юз кейс обрабатывает уже конкретный случай. А прослушивание надо выделять в отдельный объект в инфраструктуре.

Можешь разделить логически юз кейсы, напр:

kirill-ivanovvv commented 4 days ago

@Nelfimov нам нужно делать graphql - запросы, текущие клиенты не подходят - они только для некста.

  1. создам apollo-adapter
  2. создам graphql-server контекст
  3. у этого контекста на данный момент будет только один useCase - query, в него буду передавать тело запроса, которое буду брать из @globals - они у нас уже готовы.
  4. graphql-query-use-case буду вызывать в processor (слушатель, функция в которой прослушиваем), пришедшие данные буду передавать в telegram-bot-use-case аргументом

нашел инструкцию, буду делать по ней - https://docs.nestjs.com/graphql/quick-start

Nelfimov commented 4 days ago

Сделай пока на REST чтобы не усложнять. Потом добавим граф

Nelfimov commented 4 days ago

Ты же понял зачем это?

Нужно чтобы была запись

Только для сайта нужен REST контроллер.

Т.к. и бот и заявка с сайта в конце концов попадут в БД, то можно сделать один юз кейс для них - сохранение в БД

kirill-ivanovvv commented 4 days ago

Т.к. и бот и заявка с сайта в конце концов попадут в БД, то можно сделать один юз кейс для них - сохранение в БД

да, это понял.

я хочу для начала получить список кузовов, диаметр колес и тип ремонта. на сайте мы эти данные получаем через graphql-запрос через apollo image

Nelfimov commented 4 days ago

тогда ок

kirill-ivanovvv commented 4 days ago

Текущий статус

kirill-ivanovvv commented 3 days ago

Текущий статус

Nelfimov commented 3 days ago

Я думаю время можно держать в числовом формате. Можно ограничиться минутами

kirill-ivanovvv commented 2 days ago

Текущий статус

screens ![image](https://github.com/user-attachments/assets/2910668a-5b8b-42b1-9173-c2751b810fa3) ![image](https://github.com/user-attachments/assets/a10ccd3d-b214-4d11-8452-7688a1d7435c) ![image](https://github.com/user-attachments/assets/339f3008-8fa6-4c07-8a1b-29f70aa17751)
kirill-ivanovvv commented 1 day ago

Текущий статус

Nelfimov commented 1 day ago

Давай в понедельник сделанную часть передашь на промежуточное ревью

kirill-ivanovvv commented 15 hours ago

Давай в понедельник сделанную часть передашь на промежуточное ревью

хорошо