class User < Table def initialize(db) super db, "User" end # Find user by ID, returns multiple results if multiple IDs exist # (which wont happen since IDs are unique) def find_by_id(id) resp = self.get("*", "id = ?", id) end # Find user by email, same as above but for emails. # Also unique def find_by_email(email) resp = self.get("*", "email = ?", email) end private def validate_credentials(email, name, password, password_confirm) # Field check check_all_fields = email != "" && name != "" && password != "" && password_confirm != "" # Check email check_email_dupe = self.find_by_email(email).length <= 0 check_email_valid = email.match(EMAIL_REGEX) != nil # Name check_name_len = name.length >= MIN_NAME_LEN # Password check_pass_equals = password == password_confirm check_pass_len = password.length >= MIN_PASSWORD_LEN # This code is really ugly # TODO: refactor if not check_all_fields then return false, REGISTER_ERRORS[:fields] elsif not check_email_dupe then return false, REGISTER_ERRORS[:email_dupe] elsif not check_email_valid then return false, REGISTER_ERRORS[:email_fake] elsif not check_name_len then return false, REGISTER_ERRORS[:name_len] elsif not check_pass_equals then return false, REGISTER_ERRORS[:pass_notequals] elsif not check_pass_len then return false, REGISTER_ERRORS[:pass_len] else return true, "" end end # Register a new user # Returns: success?, data # TODO: input checks & ERRORS! def register(email, name, password, password_confirm) check, errorstr = self.validate_credentials(email, name, password, password_confirm) if( check ) then pw_hash = BCrypt::Password.create(password) data = { # payload name: name, email: email, pw_hash: pw_hash } resp = self.insert(data) # insert into the db return check, resp else return check, errorstr end end end