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