Регрессия приводит к отправке ошибочных уведомлений по электронной почте всем пользователям в очереди на утверждение более 60 дней

В Discourse можно настроить режим, при котором учётные записи пользователей создаются при регистрации, но должны быть одобрены сотрудником перед активацией. Это распространено, например, на сайтах с подпиской.

В работе этой функции были два важных аспекта:

  1. При отклонении учётных записей сотрудниками никогда не отправлялись негативные уведомления. Уведомление отправлялось только в одном случае — когда сотрудник одобрял учётную запись.

  2. Любой элемент в очереди на рассмотрение, будь то пост или учётная запись, по умолчанию отклоняется через 60 дней, если модератор не предпринимает действий в течение этого периода. Эта логика существовала во многих предыдущих версиях Discourse, так как этот путь был выбран как «безопасный по умолчанию».

К сожалению, когда мы добавили новую запрошенную функцию, позволяющую пользователям узнавать причину отказа, мы не учли, что комбинация пунктов #1 и #2, указанных выше, привела к тому, что Discourse отправил индивидуальные негативные уведомления всем пользователям, находившимся в очереди на одобрение более 60 дней!

Эти электронные письма выглядели так:

и содержали под брендом клиента следующую фразу:

Сотрудник отклонил вашу учётную запись на {brand}.

Отправка такого сообщения стольким «отклонённым» учётным записям создала проблемы для наших клиентов на хостинге. Мы глубоко сожалеем об этой ошибке — это полностью наша вина в Discourse, и вся ответственность лежит на нас.

В настоящее время мы работаем с нашими клиентами, чтобы сделать всё возможное для исправления ситуации.

Мы хотим чётко заявить: это наш баг, и мы отправили очень запутанное, плохо сформулированное письмо многим клиентам, что привело к значительным нарушениям работы и, возможно, даже к потере доходов из-за отмены подписок клиентами. Нам очень жаль это, и самое меньшее, что мы можем сделать, — это сообщить всем, что это проблема Discourse, и мы в Discourse ошибочно отправили это негативное письмо. Мы полностью несём ответственность за этот баг и его последствия. Если вы получили это письмо, это произошло не по вине кого-либо, кроме нас — команды Discourse.

Мы понимаем, насколько серьёзна эта ситуация. Мы продолжаем тесно работать с провайдером членства и нашими пострадавшими клиентами, чтобы взять на себя ответственность за свои действия и улучшить процессы, чтобы подобное не повторилось.

Мы также предлагаем следующий месяц хостинга для этого клиента бесплатно в качестве компенсации за причинённые проблемы. Мы искренне извиняемся за ошибку и то, как она повлияла на наших клиентов. Мы обязательно пересмотрим наши процессы, чтобы убедиться, что подобные проблемы в будущем будут менее вероятны.

Джефф Аткин
Генеральный директор, Discourse

28 лайков

Вот что мы сделали, чтобы исправить проблему и предотвратить её повторение:

Этот коммит решает сразу три задачи, так как исправил три проблемы, которые привели к этой ошибке и мешали нам быстро найти корневую причину.

  1. Мы убедились, что «журналы электронной почты» не удаляются при удалении учётной записи пользователя. Если бы у нас были журналы электронной почты удалённых пользователей, мы могли бы быстро увидеть все отправленные письма об отклонении.

  2. Мы обеспечили, что во всех местах кода, где удаляется пользователь, правильно устанавливается «контекст», чтобы мы могли чётко определить, где и почему был удалён пользователь. В коде было несколько мест, где контекст не устанавливался, поэтому мы не знали, почему эти пользователи были удалены, и нам приходилось копаться в коде, чтобы разобраться.

  3. Мы исправили саму ошибку, и теперь письма об отклонении больше не будут отправляться пользователям, автоматически удалённым из списка проверяемых.

Все эти изменения сопровождаются тестами, чтобы мы могли быть уверены, что не допустим регрессии.

18 лайков