zammad/zammad

View on GitHub
lib/external_credential/facebook.rb

Summary

Maintainability
B
4 hrs
Test Coverage
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/

class ExternalCredential::Facebook

  def self.app_verify(params)
    request_account_to_link(params, false)
    params
  end

  def self.request_account_to_link(credentials = {}, app_required = true)
    external_credential = ExternalCredential.find_by(name: 'facebook')
    raise Exceptions::UnprocessableEntity, __('No Facebook app configured!') if !external_credential && app_required

    if external_credential
      if credentials[:application_id].blank?
        credentials[:application_id] = external_credential.credentials['application_id']
      end
      if credentials[:application_secret].blank?
        credentials[:application_secret] = external_credential.credentials['application_secret']
      end
    end

    raise Exceptions::UnprocessableEntity, __("The required parameter 'application_id' is missing.") if credentials[:application_id].blank?
    raise Exceptions::UnprocessableEntity, __("The required parameter 'application_secret' is missing.") if credentials[:application_secret].blank?

    oauth = Koala::Facebook::OAuth.new(
      credentials[:application_id],
      credentials[:application_secret],
      ExternalCredential.callback_url('facebook'),
    )
    oauth.get_app_access_token.inspect
    state = SecureRandom.uuid
    {
      request_token: state,
      # authorize_url: oauth.url_for_oauth_code(permissions: 'publish_pages, manage_pages, user_posts', state: state),
      # authorize_url: oauth.url_for_oauth_code(permissions: 'publish_pages, manage_pages', state: state),
      authorize_url: oauth.url_for_oauth_code(permissions: 'pages_manage_posts, pages_manage_engagement, pages_manage_metadata, pages_read_engagement, pages_read_user_content', state: state),
    }
  end

  def self.link_account(_request_token, params)
    #    fail if request_token.params[:oauth_token] != params[:state]
    external_credential = ExternalCredential.find_by(name: 'facebook')
    raise Exceptions::UnprocessableEntity, __('No Facebook app configured!') if !external_credential

    oauth = Koala::Facebook::OAuth.new(
      external_credential.credentials['application_id'],
      external_credential.credentials['application_secret'],
      ExternalCredential.callback_url('facebook'),
    )

    access_token = oauth.get_access_token(params[:code])
    client = Koala::Facebook::API.new(access_token)
    user = client.get_object('me')
    # p client.get_connections('me', 'accounts').inspect
    pages = client.get_connections('me', 'accounts').map do |page|
      {
        id:           page['id'],
        name:         page['name'],
        access_token: page['access_token']
      }
    end

    # check if account already exists
    Channel.where(area: 'Facebook::Account').each do |channel|
      next if !channel.options
      next if !channel.options['user']
      next if !channel.options['user']['id']
      next if channel.options['user']['id'] != user['id']

      channel.options['auth']['access_token'] = access_token
      channel.options['pages'] = pages
      channel.save!
      return channel
    end

    # create channel
    Channel.create!(
      area:          'Facebook::Account',
      options:       {
        adapter: 'facebook',
        auth:    {
          access_token: access_token
        },
        user:    user,
        pages:   pages,
        sync:    {
          pages: [],
        }
      },
      active:        true,
      created_by_id: 1,
      updated_by_id: 1,
    )
  end

end