mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 19:17:48 +00:00 
			
		
		
		
	 ef24eef0b9
			
		
	
	ef24eef0b9
	
	
	
		
			
			This PR has the following changes - Add `LINEAR_CLIENT_ID` and `LINEAR_CLIENT_SECRET` to installation config - Add Linear config to super_admin/features.yml - Replace usage of ENV.fetch with GlobalConfigService.load for fetch Client Id and Secret.
		
			
				
	
	
		
			74 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| class Linear::CallbacksController < ApplicationController
 | |
|   include Linear::IntegrationHelper
 | |
| 
 | |
|   def show
 | |
|     @response = oauth_client.auth_code.get_token(
 | |
|       params[:code],
 | |
|       redirect_uri: "#{base_url}/linear/callback"
 | |
|     )
 | |
| 
 | |
|     handle_response
 | |
|   rescue StandardError => e
 | |
|     Rails.logger.error("Linear callback error: #{e.message}")
 | |
|     redirect_to linear_redirect_uri
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def oauth_client
 | |
|     app_id = GlobalConfigService.load('LINEAR_CLIENT_ID', nil)
 | |
|     app_secret = GlobalConfigService.load('LINEAR_CLIENT_SECRET', nil)
 | |
| 
 | |
|     OAuth2::Client.new(
 | |
|       app_id,
 | |
|       app_secret,
 | |
|       {
 | |
|         site: 'https://api.linear.app',
 | |
|         token_url: '/oauth/token',
 | |
|         authorize_url: '/oauth/authorize'
 | |
|       }
 | |
|     )
 | |
|   end
 | |
| 
 | |
|   def handle_response
 | |
|     hook = account.hooks.new(
 | |
|       access_token: parsed_body['access_token'],
 | |
|       status: 'enabled',
 | |
|       app_id: 'linear',
 | |
|       settings: {
 | |
|         token_type: parsed_body['token_type'],
 | |
|         expires_in: parsed_body['expires_in'],
 | |
|         scope: parsed_body['scope']
 | |
|       }
 | |
|     )
 | |
|     # You may wonder why we're not handling the refresh token update, since the token will expire only after 10 years, https://github.com/linear/linear/issues/251
 | |
|     hook.save!
 | |
|     redirect_to linear_redirect_uri
 | |
|   rescue StandardError => e
 | |
|     Rails.logger.error("Linear callback error: #{e.message}")
 | |
|     redirect_to linear_redirect_uri
 | |
|   end
 | |
| 
 | |
|   def account
 | |
|     @account ||= Account.find(account_id)
 | |
|   end
 | |
| 
 | |
|   def account_id
 | |
|     return unless params[:state]
 | |
| 
 | |
|     verify_linear_token(params[:state])
 | |
|   end
 | |
| 
 | |
|   def linear_redirect_uri
 | |
|     "#{ENV.fetch('FRONTEND_URL', nil)}/app/accounts/#{account.id}/settings/integrations/linear"
 | |
|   end
 | |
| 
 | |
|   def parsed_body
 | |
|     @parsed_body ||= @response.response.parsed
 | |
|   end
 | |
| 
 | |
|   def base_url
 | |
|     ENV.fetch('FRONTEND_URL', 'http://localhost:3000')
 | |
|   end
 | |
| end
 |