Проверьте подтверждение адреса электронной почты пользователя через DataExplorer

Через API мне нужно определить, подтвердили ли пользователи свои адреса электронной почты. Используя DataExplorer, я запрашиваю таблицу email_tokens, но запутался в том, как интерпретировать несколько строк для одного идентификатора пользователя. Когда есть несколько строк, N-1 из них имеют expired = true, но строка с expired = false не кажется отражением текущего состояния подтверждения адреса электронной почты. Например, есть подтверждённые пользователи, у которых в строке email_tokens с expired = false указано confirmed = false. Вероятно, я иду неверным путём. Прошу совета. Спасибо!

@michebs, возможно ли отследить это с помощью запроса Data Explorer?

Привет, Дэвид,

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

Надеюсь, это поможет.

SELECT 
    user,	
    email 
FROM email_tokens
WHERE 
    expired = false
    AND confirmed = true

Что вы пытаетесь достичь?

@michebs — Да. Это тот запрос, который я сначала использовал, но обнаружил, что небольшая группа наших активных пользователей не возвращается этим запросом. При этом, если посмотреть на одного из таких пользователей на странице «Администрирование пользователей», его адрес электронной почты валиден (не помечен как не подтверждён).

@pfaffman — Мы используем эти данные для управления одним из переходов состояний в сервисах, которые мы предоставляем нашим членам как на сайте. Когда новый член регистрируется и запрашивает услуги, нам сначала нужно убедиться, что мы можем связаться с ним для оказания этих услуг.

Для примера, выполним следующий запрос:

SELECT
  e.user_id,
  e.expired,
  e.confirmed,
  e.email
FROM email_tokens as e
WHERE e.user_id = 33

При просмотре данных одного из наших самых активных пользователей получаем:

user_id,expired,confirmed,email
33,false,false,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,true,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,false,somebody@somewhere.com
33,true,true,somebody@somewhere.com

Единственная строка, где запись не истекла, показывает, что email не подтверждён.

Если у вас есть контроль над вашей системой, вы можете использовать веб-хук Discourse для уведомления системы о том, что пользователь активирован. Однако, я почти уверен, что простое решение заключается в проверке поля active в записи пользователя. Я почти уверен, что оно устанавливается только после того, как пользователь подтвердит свой адрес электронной почты.

http://localhost:3000/admin/users/1/jay.json вернёт запись вида:

{
id: 1,
username: "jay",
name: "Jay User",
avatar_template: "/user_avatar/localhost/jay/{size}/3_2.png",
email: "jay@nowehre.invalid",
secondary_emails: [ ],
active: true,
admin: true,
moderator: false,
last_seen_at: "2020-11-04T20:13:04.240Z",
last_emailed_at: null,
created_at: "2020-10-05T21:14:52.570Z",
last_seen_age: 27.86773951,
last_emailed_age: null,
created_at_age: 2588319.53785305,
trust_level: 1,
.....
},

users.active выглядит именно тем, что мне нужно. Спасибо!