让我们说有一个架构:
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
。
但是,我想看看之前是否有人这样做可以先提供一些答案。
感谢您的帮助!
答案 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