如何使Ecto Schema中的值到期?

时间:2017-06-26 20:38:17

标签: elixir phoenix-framework ecto

让我们说有一个架构:

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

当用户想要重置其密钥时,在:reset_key_token字段中设置哈希。我们的想法是:reset_key_token应该放回nil说,在一周后设置了令牌。我的问题是:

是否有一种标准方式来使Ecto架构的价值到期?

我一直在寻找一段时间,但还没有找到关于这个主题的任何内容。但是,我找到了this MySQL question并想到了同样的想法:

1.-向架构添加:reset_key_token_expires, Ecto.DateTime

2.-在阅读之前(在我的情况下,我也需要在写入之前),如果时间已过,请检查:reset_key_token_expires并将其设置为nil

但是,我想看看之前是否有人这样做可以先提供一些答案。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你真的需要在值到期后将值设置为nil吗?对于此用例,您只想在到期后阻止令牌使用,我只是将值与控制器中处理重置密钥的当前时间进行比较。这是一些代码:

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