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