This repository has been archived on 2021-10-24. You can view files and clone it, but cannot push or open issues or pull requests.
greenlight/app/models/user.rb

95 lines
2.6 KiB
Ruby
Raw Normal View History

2018-06-26 10:29:46 -04:00
# frozen_string_literal: true
2018-05-07 16:06:01 -04:00
2018-06-26 10:29:46 -04:00
class User < ApplicationRecord
2018-05-31 15:04:18 -04:00
after_create :initialize_main_room
2018-06-26 10:29:46 -04:00
before_save { email.try(:downcase!) }
2018-05-09 16:31:52 -04:00
2018-05-29 15:28:29 -04:00
has_many :rooms
2018-05-31 15:04:18 -04:00
belongs_to :main_room, class_name: 'Room', foreign_key: :room_id, required: false
2018-05-07 16:06:01 -04:00
2018-05-09 16:31:52 -04:00
validates :name, length: { maximum: 24 }, presence: true
validates :provider, presence: true
2018-06-26 10:29:46 -04:00
validates :image, format: { with: /\.(png|jpg)\Z/i }, allow_blank: true
2018-06-12 17:28:02 -04:00
validates :email, length: { maximum: 60 }, allow_blank: true,
2018-05-09 16:31:52 -04:00
uniqueness: { case_sensitive: false },
2018-06-26 10:29:46 -04:00
format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
2018-05-09 16:31:52 -04:00
validates :password, length: { minimum: 6 }, confirmation: true, if: :greenlight_account?
2018-05-09 16:31:52 -04:00
2018-06-08 14:44:08 -04:00
# We don't want to require password validations on all accounts.
2018-05-09 16:31:52 -04:00
has_secure_password(validations: false)
2018-05-07 16:06:01 -04:00
class << self
# Generates a user from omniauth.
def from_omniauth(auth)
2018-06-26 10:29:46 -04:00
find_or_initialize_by(social_uid: auth['uid'], provider: auth['provider']).tap do |u|
2018-07-04 15:22:59 -04:00
u.name = send("#{auth['provider']}_name", auth) unless u.name
u.username = send("#{auth['provider']}_username", auth) unless u.username
2018-06-26 10:29:46 -04:00
u.email = send("#{auth['provider']}_email", auth)
u.image = send("#{auth['provider']}_image", auth)
u.save!
end
2018-05-11 15:57:31 -04:00
end
2018-05-07 16:06:01 -04:00
private
# Provider attributes.
def twitter_name(auth)
auth['info']['name']
end
def twitter_username(auth)
auth['info']['nickname']
end
def twitter_email(auth)
auth['info']['email']
end
2018-05-25 11:55:48 -04:00
def twitter_image(auth)
2018-06-21 10:17:46 -04:00
auth['info']['image'].gsub("http", "https").gsub("_normal", "")
2018-05-25 11:55:48 -04:00
end
2018-05-07 16:06:01 -04:00
def google_name(auth)
auth['info']['name']
end
def google_username(auth)
auth['info']['email'].split('@').first
end
def google_email(auth)
auth['info']['email']
end
2018-05-25 11:55:48 -04:00
def google_image(auth)
2018-06-12 17:28:02 -04:00
auth['info']['image']
2018-05-25 11:55:48 -04:00
end
end
2018-06-13 13:27:29 -04:00
# Retrives a list of all a users rooms that are not the main room, sorted by last session date.
def secondary_rooms
secondary = (rooms - [main_room])
2018-06-26 10:29:46 -04:00
no_session, session = secondary.partition { |r| r.last_session.nil? }
sorted = session.sort_by(&:last_session)
sorted + no_session
2018-05-07 16:06:01 -04:00
end
2018-05-28 18:10:20 -04:00
def firstname
name.split(' ').first
end
2018-06-08 14:44:08 -04:00
def greenlight_account?
provider == "greenlight"
end
2018-05-09 16:31:52 -04:00
private
2018-06-03 14:57:30 -04:00
# Initializes a room for the user and assign a BigBlueButton user id.
2018-05-31 15:04:18 -04:00
def initialize_main_room
2018-06-15 14:41:07 -04:00
self.uid = "gl-#{(0...12).map { (65 + rand(26)).chr }.join.downcase}"
2018-05-31 22:15:18 -04:00
self.main_room = Room.create!(owner: self, name: firstname + "'s Room")
2018-06-26 10:29:46 -04:00
save
2018-05-09 16:31:52 -04:00
end
2018-05-07 16:06:01 -04:00
end