lib/authtown.rb in authtown-0.1.0 vs lib/authtown.rb in authtown-0.2.0

- old
+ new

@@ -3,50 +3,69 @@ require "bridgetown" require "mail" require "authtown/builder" require "authtown/view_mixin" -# REQUIRES: -# init :"bridgetown-activerecord", sequel_support: :postgres - -# ActiveRecord schema: +# rubocop:disable Layout/LineLength +### Simple migration strategy: # -# class CreateUsers < ActiveRecord::Migration[7.0] -# def change -# create_table :users do |t| -# t.string :email, null: false, index: { unique: true } -# t.string :first_name -# t.string :password_hash, null: false -# t.timestamps +# Sequel.migration do +# change do +# extension :date_arithmetic + +# create_table(:users) do +# primary_key :id, type: :Bignum +# citext :email, null: false +# constraint :valid_email, email: /^[^,;@ \r\n]+@[^,@; \r\n]+\.[^,@; \r\n]+$/ +# String :first_name +# String :password_hash, null: false +# index :email, unique: true # end -# end -# end -# -# class CreateAccountRememberKeys < ActiveRecord::Migration[7.0] -# def change -# create_table :account_remember_keys do |t| -# t.foreign_key :users, column: :id -# t.string :key, null: false -# t.datetime :deadline, null: false + +# # Used by the remember me feature +# create_table(:account_remember_keys) do +# foreign_key :id, :users, primary_key: true, type: :Bignum +# String :key, null: false +# DateTime :deadline, { null: false, default: Sequel.date_add(Sequel::CURRENT_TIMESTAMP, days: 30) } # end + +# create_table(:account_password_reset_keys) do +# foreign_key :id, :users, primary_key: true, type: :Bignum +# String :key, null: false +# DateTime :deadline, { null: false, default: Sequel.date_add(Sequel::CURRENT_TIMESTAMP, days: 1) } +# DateTime :email_last_sent, null: false, default: Sequel::CURRENT_TIMESTAMP +# end # end # end +# rubocop:enable Layout/LineLength -class Authtown::Current < ActiveSupport::CurrentAttributes - # @!parse def self.user = User.new - attribute :user +Thread.attr_accessor :authtown_state +class Authtown::Current + class << self + def thread_state = Thread.current.authtown_state ||= {} + + def user=(new_user) + thread_state[:user] = new_user + end + + def user = thread_state[:user] + end end # rubocop:disable Metrics/BlockLength # @param config [Bridgetown::Configuration::ConfigurationDSL] # @param rodauth_config [Proc] Bridgetown.initializer :authtown do | config, rodauth_config: nil, - account_landing_page: "/account/profile" + account_landing_page: "/account/profile", + user_class_resolver: -> { User } | + config.authtown ||= {} + config.authtown.user_class_resolver ||= user_class_resolver + config.only :server do require "authtown/routes/rodauth" # @param app [Class<Roda>] config.roda do |app| @@ -54,13 +73,15 @@ secret = ENV.fetch("RODA_SECRET_KEY") app.plugin(:sessions, secret:) app.plugin :rodauth do - enable :login, :logout, :create_account, :remember, :reset_password + enable :login, :logout, :create_account, :remember, :reset_password, :internal_request hmac_secret secret + base_url config.url + prefix "/auth" login_redirect account_landing_page create_account_redirect account_landing_page logout_redirect "/" @@ -90,10 +111,10 @@ before_create_account do # Make sure timestamps get saved account[:created_at] = account[:updated_at] = Time.now - account[:first_name] = param(:first_name) + account[:first_name] = param(:first_name) if param(:first_name) end after_login do remember_login end