2017-06-26 4 views
0

Disons qu'il est un schéma:Comment faire pour expirer une valeur dans un schéma Ecto?

schema "players" do 
    :key, :string 
    :reset_key_token, :string 
end 

Un hachage est défini dans le champ :reset_key_token lorsque l'utilisateur veut réinitialiser leur clé. L'idée est que le :reset_key_token devrait être remis à nil dire, après une semaine le jeton a été fixé. Ma question est:

Existe-t-il un moyen standard d'expirer la valeur d'un schéma Ecto?

Je cherchais depuis longtemps, mais je n'ai encore rien trouvé sur le sujet. Cependant, j'ai trouvé this MySQL question et pensé à suivre la même idée:

1.- Ajouter un :reset_key_token_expires, Ecto.DateTime au schéma.

2.- Avant une lecture (dans mon cas j'en ai besoin aussi avant une écriture), vérifiez :reset_key_token_expires et réglez-le sur nil si le temps s'est écoulé.

Mais j'aimerais voir si quelqu'un qui a déjà fait cela pourrait fournir des réponses en premier.

Merci pour l'aide!

+1

La méthode sonne bien, sauf que je ne serais pas remis à zéro la valeur, mais expires Attribuez au contrôleur montrent une erreur si 'reset_key_token_expires' est supérieure à l'heure actuelle. – Dogbert

Répondre

1

Avez-vous vraiment besoin de pour définir la valeur à nil après son expiration? Dans ce cas d'utilisation, où vous voulez juste empêcher l'utilisation du jeton après l'expiration, je comparerais simplement la valeur avec l'heure actuelle dans le contrôleur qui gère la réinitialisation de la clé. Voici un code:

def reset_key(conn, %{"username" => username, "reset_key_token" => reset_key_token}) do 
    user = Repo.get_by!(User, username: username) 
    if reset_key_token == user.reset_key_token do 
    case DateTime.compare(user.reset_key_token_expires, DateTime.utc_now) do 
     :gt -> 
     # token is still valid 
     _ -> 
     # token is expired 
    end 
    else 
    # token is invalid 
    end 
end 
+0

Cela semble être une bonne option, merci! –