73 lines
No EOL
1.6 KiB
Ruby
73 lines
No EOL
1.6 KiB
Ruby
require 'pathname'
|
|
require 'sqlite3'
|
|
require 'bcrypt'
|
|
|
|
module TonTonWeb
|
|
User = Struct.new(:id, :name, :username, :email, :password_digest)
|
|
|
|
class Auth
|
|
attr_reader :root
|
|
|
|
def initialize root_path
|
|
@root = Pathname.new root_path
|
|
|
|
@db = SQLite3::Database.new(@root+ 'database.sqlite')
|
|
end
|
|
|
|
def create_tables
|
|
@db.execute "create table users (id integer primary key, name text, username text, email text, password_digest text);"
|
|
end
|
|
|
|
def create_user **options
|
|
name = options.fetch :name
|
|
username = options.fetch :username
|
|
email = options.fetch :email
|
|
password = options.fetch :password
|
|
|
|
# Assert user doesn't exists
|
|
|
|
hashed_password = BCrypt::Password.create(password)
|
|
|
|
@db.execute(
|
|
"insert into users (name, username, email, password_digest) values (?,?,?,?);",
|
|
[name, username, email, password]
|
|
)
|
|
|
|
return # Return user
|
|
end
|
|
|
|
def delete_user id
|
|
@db.execute "delete from users where id = ?;", id
|
|
end
|
|
|
|
def find_user **options
|
|
name = options[:name]
|
|
username = options[:username]
|
|
email = options[:email]
|
|
|
|
if not (name or username or email)
|
|
raise "No options to find user."
|
|
end
|
|
|
|
user = nil
|
|
|
|
user_query_template = "select id, name, username, email, password_digest from users where name = ? or username = ? or email = ?"
|
|
|
|
@db.execute(user_query_template, [name, username, email]) do |row|
|
|
user = TonTonWeb::User.new(*row)
|
|
end
|
|
|
|
return user
|
|
end
|
|
|
|
def authenticate username, password
|
|
user = find_user(username: username)
|
|
|
|
if BCrypt::Password.new(user.password_digest) == password
|
|
return user
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
end |