defmodule <%= schema_module %>Token do use Ecto.Schema import Ecto.Query alias <%= schema_module %> @hash_algorithm :sha256 @session_validity_in_days 60 @reset_password_validity_in_days 1 schema "users_tokens" do field :token, :binary field :context, :string belongs_to :user, <%= schema_module %> timestamps(type: :utc_datetime, updated_at: false) end def build_session_token(user) do token = Dialup.Auth.SessionToken.generate() {token, build_hashed_token(user, "session", token)} end def build_email_token(user, context) do token = Dialup.Auth.SessionToken.generate() {token, build_hashed_token(user, context, token)} end def verify_session_token_query(token) do query = from token in token_and_context_query(token, "session"), join: user in assoc(token, :user), where: token.inserted_at > ago(@session_validity_in_days, "day"), select: user {:ok, query} end def verify_email_token_query(token, context) do days = case context do "reset_password" -> @reset_password_validity_in_days _ -> 7 end query = from token in token_and_context_query(token, context), join: user in assoc(token, :user), where: token.inserted_at > ago(^days, "day"), select: user {:ok, query} end defp build_hashed_token(user, context, token) do %<%= schema_module %>Token{ token: Dialup.Auth.SessionToken.hash(token), context: context, user_id: user.id } end def token_and_context_query(token, context) do from <%= schema_module %>Token, where: [token: ^Dialup.Auth.SessionToken.hash(token), context: ^context] end def user_and_context_query(user, context) do from t in <%= schema_module %>Token, where: t.user_id == ^user.id and t.context == ^context end end