123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
- class ChannelsAdmin::MicrosoftGraphController < ChannelsAdmin::BaseController
- def area
- 'MicrosoftGraph::Account'.freeze
- end
- def index
- system_online_service = Setting.get('system_online_service')
- assets = {}
- external_credential_ids = []
- ExternalCredential.where(name: 'microsoft_graph').each do |external_credential|
- assets = external_credential.assets(assets)
- external_credential_ids.push external_credential.id
- end
- channels = Service::Channel::Admin::List.new(area: area).execute
- channel_ids = []
- channels.each do |channel|
- assets = channel.assets(assets)
- channel_ids.push channel.id
- end
- not_used_email_address_ids = []
- EmailAddress.find_each do |email_address|
- next if system_online_service && email_address.preferences && email_address.preferences['online_service_disable']
- assets = email_address.assets(assets)
- if !email_address.channel_id || !email_address.active || !Channel.exists?(email_address.channel_id)
- not_used_email_address_ids.push email_address.id
- end
- end
- render json: {
- assets: assets,
- not_used_email_address_ids: not_used_email_address_ids,
- channel_ids: channel_ids,
- external_credential_ids: external_credential_ids,
- callback_url: ExternalCredential.callback_url('microsoft_graph'),
- }
- end
- def inbound
- channel = Channel.find_by(id: params[:id], area:)
- channel.refresh_xoauth2!
- inbound_prepare_channel(channel, params)
- result = EmailHelper::Probe.inbound(channel.options[:inbound])
- raise Exceptions::UnprocessableEntity, (result[:message_human] || result[:message]) if result[:result] == 'invalid'
- render json: result
- end
- def verify
- channel = Channel.find_by(id: params[:id], area:)
- verify_prepare_channel(channel, params)
- channel.save!
- render json: {}
- end
- def group
- channel = Channel.find_by(id: params[:id], area:)
- channel.group_id = params[:group_id]
- channel.save!
- render json: {}
- end
- def folders
- channel = Channel.find_by(id: params[:id], area:)
- raise Exceptions::UnprocessableEntity, __('Could not find the channel.') if channel.nil?
- channel_mailbox = channel.options.dig('inbound', 'options', 'shared_mailbox') || channel.options.dig('inbound', 'options', 'user')
- raise Exceptions::UnprocessableEntity, __('Could not identify the channel mailbox.') if channel_mailbox.nil?
- channel.refresh_xoauth2!(force: true)
- graph = ::MicrosoftGraph.new access_token: channel.options.dig('auth', 'access_token'), mailbox: channel_mailbox
- begin
- folders = graph.get_message_folders_tree
- rescue ::MicrosoftGraph::ApiError => e
- error = {
- message: e.message,
- code: e.error_code,
- }
- end
- render json: { folders:, error: }
- end
- private
- def inbound_prepare_channel(channel, params)
- channel.group_id = params[:group_id] if params[:group_id].present?
- channel.active = params[:active] if params.key?(:active)
- channel.options[:inbound] ||= {}
- channel.options[:inbound][:options] ||= {}
- %w[folder_id keep_on_server].each do |key|
- next if params.dig(:options, key).nil?
- channel.options[:inbound][:options][key] = params[:options][key]
- end
- end
- def verify_prepare_channel(channel, params)
- inbound_prepare_channel(channel, params)
- %w[archive archive_before archive_state_id].each do |key|
- next if params.dig(:options, key).nil?
- channel.options[:inbound][:options][key] = params[:options][key]
- end
- channel.status_in = 'ok'
- channel.status_out = 'ok'
- channel.last_log_in = nil
- channel.last_log_out = nil
- end
- end
|