Vérifier que l'e-mail de l'utilisateur est confirmé via DataExplorer

Via l’API, je dois déterminer si les identifiants d’utilisateurs ont déjà confirmé leur adresse e-mail ou non. En utilisant DataExplorer, j’interroge la table email_tokens, mais je suis confus quant à l’interprétation de plusieurs lignes pour un identifiant d’utilisateur donné. Lorsqu’il y a plusieurs lignes, N-1 d’entre elles ont expired = true, mais la ligne avec expired = false ne semble pas refléter l’état actuel de la confirmation de l’adresse e-mail. Par exemple, il existe des utilisateurs vérifiés dont la ligne email_tokens avec expired = false affiche confirmed = false. Je procède probablement de la mauvaise manière. Veuillez me conseiller. Merci !

@michebs, est-il possible de suivre cela avec une requête Data Explorer ?

Bonjour David,

Lorsque l’utilisateur confirme son e-mail, la colonne confirmed est mise à jour. En ajoutant true au filtre, vous listerez uniquement les adresses e-mail confirmées.

J’espère que cela vous aidera.

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

Que cherchez-vous à accomplir ?

@michebs - Oui. C’est la requête que j’ai d’abord essayée, mais j’ai constaté qu’il existe un petit sous-ensemble d’utilisateurs actifs qui ne sont pas renvoyés par cette requête. Pourtant, en examinant l’un de ces utilisateurs sur sa page « Utilisateurs administrateurs », son adresse e-mail est valide (elle n’est pas marquée comme non vérifiée).

@pfaffman - Nous utilisons ces données pour piloter l’une des transitions d’état dans les services que nous fournissons à nos membres, tant sur le site. Lorsqu’un nouveau membre s’inscrit et demande des services, nous voulons d’abord savoir que nous pouvons le contacter pour lui fournir ces services.

Pour illustrer avec un exemple, voici cette requête :

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

L’examen d’un de nos utilisateurs les plus actifs retourne :

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

La seule ligne non expirée indique que l’e-mail n’est pas confirmé.

Si vous avez le contrôle de votre système, vous pouvez utiliser un webhook Discourse pour notifier votre système que l’utilisateur est activé. Mais je suis presque certain que la solution la plus simple consiste à vérifier le champ active dans l’enregistrement de l’utilisateur. Je suis pratiquement sûr qu’il n’est défini qu’une fois que l’utilisateur a validé son adresse e-mail.

http://localhost:3000/admin/users/1/jay.json vous renverra un enregistrement tel que :

{
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 semble exactement ce dont j’ai besoin. Merci !