157 lines
4.3 KiB
Ruby
157 lines
4.3 KiB
Ruby
class User
|
|
include SimplyStored::Couch
|
|
include ActiveModel::SerializerSupport
|
|
attr_accessor :number_of_lists_at_supplier
|
|
|
|
property :name
|
|
property :active_list_id
|
|
property :admin, type: :boolean, default: false
|
|
|
|
#FACEBOOK
|
|
property :provider
|
|
property :uid
|
|
property :oauth_token
|
|
property :oauth_expires_at
|
|
property :auth_data
|
|
|
|
devise_plugins = [:database_authenticatable, :registerable, :confirmable, :recoverable, :rememberable, :trackable] #, :omniauthable, {omniauth_providers: [:facebook, :instagram]}] #, :token_authenticatable , :registerable
|
|
devise_plugins -= [:trackable] if Rails.env.test? # creates conflicts
|
|
devise *devise_plugins
|
|
|
|
property :authentication_token
|
|
|
|
has_and_belongs_to_many :lists, storing_keys: false
|
|
has_many :orders
|
|
has_many :list_payments
|
|
|
|
validates_uniqueness_of :email
|
|
before_save :ensure_authentication_token
|
|
|
|
#has_many :error_logs
|
|
has_many :user_feedbacks
|
|
|
|
view :by_authentication_token, key: :authentication_token
|
|
view :by_email, key: :email
|
|
#view :by_facebook, key: [:provider, :uid] #DEPRICATE on successful change to by_provider
|
|
#view :by_provider, key: [:provider, :uid]
|
|
view :by_provider_and_uid, key: [:provider, :uid]
|
|
|
|
def self.find_for_oauth(auth_data, controller_current_user)
|
|
#user = database.view(self.by_provider(key: [auth_data.provider, auth_data.uid], limit: 1)).first
|
|
attributes = {
|
|
provider: auth_data.provider,
|
|
uid: auth_data.uid,
|
|
name: auth_data.info.nickname,
|
|
email: auth_data.info.email,
|
|
password: Devise.friendly_token[0,20],
|
|
oauth_token: auth_data.credentials.token,
|
|
oauth_expires_at: auth_data.credentials.expires ? Time.at(auth_data.credentials.expires_at) : nil,
|
|
auth_data: auth_data
|
|
}
|
|
|
|
if user = find_by_email(attributes[:email])
|
|
# Update the provider attributes to keep the email unique and valid. This means that
|
|
# if two people from other providers, with the same e-mail, can hijack the mozo account.
|
|
# probability: around zero
|
|
unless user.provider == attributes[:provider] and user.uid == attributes[:uid]
|
|
user.update attributes
|
|
end
|
|
else
|
|
user = create attributes
|
|
end
|
|
user
|
|
end
|
|
|
|
# needed for cmtool
|
|
def is_admin?
|
|
admin?
|
|
end
|
|
def active?
|
|
true
|
|
end
|
|
|
|
def facebook_id
|
|
uid
|
|
end
|
|
|
|
def provider_info
|
|
case provider.to_sym
|
|
when :facebook then {}
|
|
when :instagram
|
|
uri = URI.parse("https://api.instagram.com/v1/users/#{uid}?access_token=#{auth_data['credentials']['token']}")
|
|
JSON.parse(Net::HTTP.get(uri)) rescue {ok: false, error: 'cannot_parse_response'}
|
|
else
|
|
{ok: false, error: 'provider_unknown'}
|
|
end
|
|
end
|
|
|
|
def avatar
|
|
return '' unless provider.present?
|
|
case provider.to_sym
|
|
when :facebook then "https://graph.facebook.com/#{uid}/picture?type=square"
|
|
when :instagram then auth_data['info'].try(:[], 'image')
|
|
end
|
|
end
|
|
|
|
def self.from_omniauth(auth)
|
|
#binding.pry
|
|
end
|
|
|
|
def list_is_closed!
|
|
self.active_list_id = nil
|
|
save
|
|
end
|
|
|
|
# This is the user name as it is shown to the supplier
|
|
def supplier_name
|
|
name = auth_data.try(:[], 'info').try(:[], 'name')
|
|
name || email.to_s.sub(/@.*/, '')
|
|
end
|
|
|
|
# This is the user name as it is shown to other users
|
|
def friends_name
|
|
auth_data['info']['nickname'] rescue name.to_s
|
|
end
|
|
|
|
def has_active_list?
|
|
active_list_id.present?
|
|
end
|
|
|
|
# only used for testing so far
|
|
def active_list
|
|
return nil unless has_active_list?
|
|
List.find(active_list_id)
|
|
rescue SimplyStored::RecordNotFound
|
|
nil
|
|
end
|
|
|
|
#####################################
|
|
# Taken from devise 2.2
|
|
#####################################
|
|
|
|
# Generate new authentication token (a.k.a. "single access token").
|
|
def reset_authentication_token
|
|
self.authentication_token = self.class.authentication_token
|
|
end
|
|
|
|
# Generate new authentication token and save the record.
|
|
def reset_authentication_token!
|
|
reset_authentication_token
|
|
save(:validate => false)
|
|
end
|
|
|
|
# Generate authentication token unless already exists.
|
|
def ensure_authentication_token
|
|
reset_authentication_token if authentication_token.blank?
|
|
end
|
|
|
|
# Generate authentication token unless already exists and save the record.
|
|
def ensure_authentication_token!
|
|
reset_authentication_token! if authentication_token.blank?
|
|
end
|
|
|
|
def self.authentication_token
|
|
SecureRandom.hex(24)
|
|
end
|
|
end
|