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



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

def admin_require
  return unless 
  return if current_user.admin?

  render_403
  false
end

#authorizeObject

Raises:



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

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

  
end

#back_urlObject



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

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



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

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



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

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

  @current_user_session = UserSession.find
end

#handle_unverified_requestObject



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

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

  current_user_session&.destroy
  # raise ActionController::InvalidAuthenticityToken

  super
end

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

protected



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

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


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

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

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



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

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.



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

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



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

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 :forbidden, message: :notice_not_authorized }
  end
end

#render_404Object



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

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

#render_api_head(status) ⇒ Object

Renders a head API response



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

def render_api_head(status)
  head status
end

#render_api_okObject

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



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

def render_api_ok
  render_api_head :ok
end

#set_default_localeObject



64
65
66
67
68
# File 'lib/symphonia/controller_extensions.rb', line 64

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

  I18n.locale = enforce_default
end

#set_localeObject

private



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

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



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

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