Module: Symphonia::ControllerExtensions

Extended by:
ActiveSupport::Concern
Included in:
ApplicationController
Defined in:
lib/symphonia/controller_extensions.rb

Defined Under Namespace

Classes: Unauthorized

Instance Method Summary collapse

Instance Method Details

#admin_requireObject Also known as: require_admin



90
91
92
93
94
95
96
97
# File 'lib/symphonia/controller_extensions.rb', line 90

def admin_require
  return unless 

  unless current_user.admin?
    render_403
    false
  end
end

#authorizeObject

Raises:



145
146
147
148
149
150
# File 'lib/symphonia/controller_extensions.rb', line 145

def authorize
  return true if Symphonia::User.current.admin?
  raise Unauthorized if Symphonia::User.current.logged_in?

  
end

#back_urlObject



25
26
27
28
29
30
31
# File 'lib/symphonia/controller_extensions.rb', line 25

def back_url
  url = params[:back_url].presence
  if url.nil? && (referer = request.env['HTTP_REFERER'].presence)
    url = CGI.unescape(referer.to_s)
  end
  url
end

#current_userObject



138
139
140
141
142
143
# File 'lib/symphonia/controller_extensions.rb', line 138

def current_user
  return (Symphonia::User.current ||= @current_user) if defined?(@current_user)

  @current_user = current_user_session&.user
  Symphonia::User.current = @current_user || Symphonia::User::Anonymous.new
end

#current_user_sessionObject



132
133
134
135
136
# File 'lib/symphonia/controller_extensions.rb', line 132

def current_user_session
  return @current_user_session if defined?(@current_user_session)

  @current_user_session = UserSession.find
end

#handle_unverified_requestObject

Raises:

  • (ActionController::InvalidAuthenticityToken)


152
153
154
155
156
157
158
159
# File 'lib/symphonia/controller_extensions.rb', line 152

def handle_unverified_request
  return true if current_user&.logged_in? && request.format&.json?

  current_user_session&.destroy
  raise ActionController::InvalidAuthenticityToken

  # redirect_to main_app.root_url
end

#login_require(_format = nil) ⇒ Object Also known as: require_login, require_user

protected



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/symphonia/controller_extensions.rb', line 70

def (_format = nil)
  if current_user.nil? || !current_user.logged_in?
    respond_to do |format|
      format.html do
        store_location
        redirect_to symphonia., flash: { error: t(:text_login_require) }
      end
      format.json do
        render json: { errors: 'You must be logged in to access this endpoint' }, status: :unauthorized
      end
      format.any { head :unauthorized }
    end
    return false
  end
  true
end


128
129
130
# File 'lib/symphonia/controller_extensions.rb', line 128

def menu_item(item = nil)
  @menu_item = (item || controller_name)
end

#redirect_back_or_default(default, options = {}) ⇒ Object



165
166
167
168
# File 'lib/symphonia/controller_extensions.rb', line 165

def redirect_back_or_default(default, options = {})
  options ||= {}
  redirect_to(params[:back_url] || default, options)
end

#redirect_to_referer_or(*args, &block) ⇒ Object

Redirects to the request referer if present, redirects to args or call block otherwise.



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/symphonia/controller_extensions.rb', line 34

def redirect_to_referer_or(*args, &block)
  redirect_to :back
rescue ::ActionController::RedirectBackError
  if args.any?
    redirect_to(*args)
  elsif block_given?
    block.call
  else
    raise "#redirect_to_referer_or takes arguments or a block"
  end
end

#render_403Object



101
102
103
104
105
106
107
108
109
# File 'lib/symphonia/controller_extensions.rb', line 101

def render_403
  respond_to do |format|
    format.html { render template: 'common/403', message: :notice_not_authorized, status: :forbidden }
    format.js do
      render plain: "alert('#{t :text_access_deny}')", message: :notice_not_authorized, status: :forbidden
    end
    format.any { head 403, message: :notice_not_authorized }
  end
end

#render_404Object



111
112
113
114
115
116
# File 'lib/symphonia/controller_extensions.rb', line 111

def render_404
  respond_to do |format|
    format.html { render template: 'common/404', message: :notice_page_not_found, status: :not_found }
    format.any { head 404, message: :not_found }
  end
end

#render_api_head(status) ⇒ Object

Renders a head API response



124
125
126
# File 'lib/symphonia/controller_extensions.rb', line 124

def render_api_head(status)
  head status
end

#render_api_okObject

Renders a 200 response for successful updates or deletions via the API



119
120
121
# File 'lib/symphonia/controller_extensions.rb', line 119

def render_api_ok
  render_api_head :ok
end

#set_default_localeObject



62
63
64
65
66
# File 'lib/symphonia/controller_extensions.rb', line 62

def set_default_locale
  return unless (enforce_default = Symphonia.config.default_locale)

  I18n.locale = enforce_default
end

#set_localeObject

private



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/symphonia/controller_extensions.rb', line 48

def set_locale
  params_locale = params.fetch(:locale, nil).presence
  params_locale ||= session[:locale].presence
  params_locale ||= request.env['HTTP_ACCEPT_LANGUAGE'].to_s.split(',').collect { |l| l.scan(/^[a-z]{2}/) }.flatten
  client_lang = Array(params_locale).compact
  client_lang.unshift current_user.language if current_user.language
  @client_lang = client_lang.detect { |l| I18n.available_locales.include?(l.to_sym) }

  I18n.locale = (@client_lang || I18n.default_locale)
  session[:locale] = I18n.locale

  logger.debug "* Locale set to '#{I18n.locale}'"
end

#store_locationObject



161
162
163
# File 'lib/symphonia/controller_extensions.rb', line 161

def store_location
  session[:return_to] = request.url
end