wf-order-review-request
Назначение
Контур 2 системы отзывов: один раз попросить клиента оставить отзыв после завершения работы.
Один запуск находит один заказ, который завершился достаточно давно, по которому есть клиент, которому можно написать, и по которому ещё ни разу не отправлялся запрос; создаёт для него персональную одноразовую ссылку на отзыв в ; и отправляет запрос через rp-reviews.lm-ses
Почему это рабочий процесс
Вопрос «по каким завершённым заказам ещё не отправлялся запрос» охватывает два сервиса, которым запрещено знать друг о друге: не знает, что такое отзыв, а rp-orders хранит rp-reviews как непрозрачную строку. Сопоставление этих двух списков — именно то, для чего нужен поток, а orderId позволяет пережить перезапуск без создания второй ссылки.rt.node
Структура
read-settings → list-finished (completed, updatedAt ≤ now − delay)
→ list-invites (which of those were already asked)
→ create-invite → send-email → mark-sent | mark-failed
Один email за запуск: так зависший адрес не блокирует очередь позади него, а расписание определяет частоту отправки. формирует письмо и ничего не создаёт: репетиционный запуск, после которого осталась бы действующая ссылка, заставил бы следующий настоящий запуск пропустить этот заказ как уже обработанный.dryRun
Отклонённое письмо возвращается из как lm-ses, а не в виде исключения, поэтому это обычная ветка, которая помечает приглашение как { success: false }, а не граница обработки ошибок.failed
Параметры
(обязательный) — адрес отправителя.from(обязательный) —ses.SesCredentials— подставляется вместоshopNameв шаблонах.{{shopName}}— переопределяетdelayHoursдля обработки накопившихся запросов.ReviewSettings.requestDelayHours— сформировать и остановиться.dryRun
Тема, текст, базовый URL ссылки и задержка берутся из , поэтому магазин может менять собственные формулировки, не затрагивая этот поток.reviews.getSettings()
Прямые зависимости модуля
g-ordersg-reviewsg-ses
Исходный код
modules/workflows/wf-order-review-request