-
11
module Admin
-
11
class AdminController < ApplicationController
-
11
before_action :require_admin!, :set_admin_border
-
-
11
private
-
-
11
def require_admin!
-
18
else: 16
then: 2
unless Current.user.admin? || Current.impersonating?
-
2
render plain: "Admins only",
-
status: :forbidden
-
end
-
end
-
-
11
def set_admin_border
-
16
@admin_border = true
-
end
-
end
-
end
-
module Admin
-
class BandsController < AdminController
-
before_action :set_band, except: %i[
-
index
-
]
-
-
def index
-
@bands = Band.all
-
end
-
-
def show
-
end
-
-
def edit
-
end
-
-
def update
-
updated = @band.update(edit_band_params)
-
if updated
-
redirect_to edit_admin_band_path(@band), notice: "Band updated"
-
else
-
flash[:alert] = @band.errors.full_messages
-
render :edit, status: :unprocessable_entity
-
end
-
end
-
-
def destroy
-
@band.destroy!
-
redirect_to admin_bands_path, notice: "Band deleted."
-
end
-
-
private
-
-
def set_band
-
@band = Band.find(params[:id])
-
redirect_to admin_bands_path, alert: "Band not found" unless @band
-
end
-
-
def edit_band_params
-
params.require(:band).permit(
-
:name
-
)
-
end
-
end
-
end
-
5
module Admin
-
5
class ImpersonationController < AdminController
-
5
def create
-
3
target_user = User.find(params[:user_id])
-
3
session[:impersonation] = {
-
original_user_id: Current.user.id,
-
target_user_id: target_user.id,
-
started_at: Time.current.utc
-
}
-
-
3
redirect_to(events_path, notice: "Impersonating '#{target_user.username}'")
-
end
-
-
5
def destroy
-
2
else: 1
then: 1
return redirect_to(admin_users_path, alert: "No active impersonation session") unless session[:impersonation]
-
-
1
target_user = User.find(session[:impersonation]["target_user_id"])
-
1
original_user = User.find(session[:impersonation]["original_user_id"])
-
1
username = target_user.username
-
-
1
session[:user_id] = original_user.id
-
1
session.delete(:impersonation)
-
-
1
redirect_to(admin_users_path, notice: "Ended impersonation of #{username}")
-
end
-
end
-
end
-
10
module Admin
-
10
class UsersController < AdminController
-
10
before_action :set_user, except: %i[
-
index
-
]
-
-
10
def index
-
4
then: 2
else: 2
@user_type = params[:user_type]&.to_sym
-
-
4
then: 1
else: 3
if @user_type && !User.user_types[@user_type]
-
1
flash[:alert] = "Invalid user type"
-
1
redirect_to admin_users_path
-
end
-
-
4
@user_types = User.user_types.keys
-
-
@users =
-
4
then: 2
if @user_type
-
2
User.where(user_type: @user_type)
-
else: 2
else
-
2
User.all
-
end
-
end
-
-
10
def show
-
end
-
-
10
def edit
-
end
-
-
10
def update
-
3
updated = @user.update(edit_user_params)
-
2
then: 1
if updated
-
1
redirect_to edit_admin_user_path(@user), notice: "User updated"
-
else: 1
else
-
1
flash[:alert] = @user.errors.full_messages
-
1
render :edit, status: :unprocessable_entity
-
end
-
end
-
-
10
def destroy
-
1
@user.destroy!
-
1
redirect_to admin_users_path, notice: "User deleted."
-
end
-
-
10
private
-
-
10
def set_user
-
7
@user = User.find_by(username: params[:username])
-
7
else: 7
then: 0
redirect_to admin_users_path, alert: "User not found" unless @user
-
end
-
-
10
def edit_user_params
-
3
params.require(:user).permit(
-
:username,
-
:name,
-
:email,
-
:user_type
-
)
-
end
-
end
-
end
-
# frozen_string_literal: true
-
-
16
class ApplicationController < ActionController::Base
-
16
before_action :set_current_user
-
16
before_action :require_login
-
16
helper_method :show_tabs, :nav_tabs, :my_pending_invites, :body_class, :set_current_user_by_session
-
-
16
def nav_tabs
-
389
else: 382
then: 7
return unless show_tabs
-
382
@nav_tabs ||= build_nav_tabs
-
end
-
-
16
def my_pending_invites
-
198
then: 191
else: 7
else: 62
then: 136
return unless Current.user&.member?
-
62
@my_pending_invites ||= Permission.where(user_id: Current.user.id, status: "pending")
-
end
-
-
16
def body_class
-
198
then: 7
else: 191
@admin_border ? "admin-background" : ""
-
end
-
-
16
def show_tabs
-
580
@show_tabs ||= Current.user.present?
-
end
-
-
16
private
-
-
16
def set_current_user
-
409
set_current_user_by_session(session)
-
end
-
-
16
def set_current_user_by_session(session)
-
410
then: 2
if session[:impersonation]
-
2
else: 408
handle_impersonation(session)
-
408
then: 275
elsif session[:user_id]
-
275
set_regular_user(session[:user_id])
-
else: 133
else
-
133
clear_current_user
-
end
-
end
-
-
16
def handle_impersonation(session)
-
2
impersonation = session[:impersonation]
-
original_user_id =
-
2
impersonation["original_user_id"] ||
-
impersonation[:original_user_id]
-
-
target_user_id =
-
2
impersonation["target_user_id"] ||
-
impersonation[:target_user_id]
-
-
started_at =
-
2
impersonation["started_at"] ||
-
impersonation[:started_at]
-
-
2
original_user = User.find_by(id: original_user_id)
-
2
target_user = User.find_by(id: target_user_id)
-
-
2
then: 2
if valid_impersonation?(original_user, target_user, started_at)
-
2
set_impersonated_user(original_user, target_user)
-
else: 0
else
-
end_impersonation(session)
-
end
-
end
-
-
16
def valid_impersonation?(original_user, target_user, started_at)
-
failure_reasons = {
-
2
then: 2
else: 0
original_not_admin: !original_user&.admin?,
-
no_target_user: !target_user,
-
missing_time: !started_at,
-
too_old: started_at && started_at.to_time < 12.hours.ago
-
8
}.select! { |k, v| !!v }.keys
-
-
2
then: 0
if failure_reasons.any?
-
then: 0
else: 0
if request
-
flash[:alert] = "Impersonation failed: #{failure_reasons.inspect}"
-
end
-
false
-
else: 2
else
-
2
true
-
end
-
end
-
-
16
def set_impersonated_user(original_user, target_user)
-
2
Current.user = target_user
-
2
Current.impersonator = original_user
-
end
-
-
16
def set_regular_user(user_id)
-
275
user = User.find_by(id: user_id)
-
275
then: 275
if user
-
275
Current.user = user
-
275
Current.impersonator = nil
-
else: 0
else
-
clear_current_user
-
end
-
end
-
-
16
def clear_current_user
-
133
Current.user = nil
-
133
Current.impersonator = nil
-
end
-
-
16
def end_impersonation(session)
-
session.delete(:impersonation)
-
set_regular_user(session[:user_id])
-
end
-
-
16
def require_login
-
409
then: 276
else: 133
then: 408
else: 1
return if Current.user&.confirmed? || allowed_path?
-
-
1
then: 0
if Current.user && !Current.user.confirmed?
-
handle_unconfirmed_user
-
else: 1
else
-
1
redirect_to_login
-
end
-
end
-
-
16
def allowed_path?
-
[
-
133
login_path,
-
logout_path,
-
register_path,
-
not_confirmed_path,
-
resend_confirmation_path,
-
confirm_registration_path,
-
confirm_registration_submit_path
-
].include?(request.path)
-
end
-
-
16
def handle_unconfirmed_user
-
else: 0
then: 0
unless [not_confirmed_path, resend_confirmation_path].include?(request.path)
-
flash[:alert] = "Your account is not confirmed"
-
redirect_to not_confirmed_path
-
end
-
end
-
-
16
def redirect_to_login
-
1
flash[:alert] = "You must be logged in"
-
1
redirect_to login_url
-
end
-
-
16
def build_nav_tabs
-
tabs = [
-
191
{display_name: "Events", url: events_path},
-
{display_name: "Bands", url: bands_path}
-
]
-
-
191
then: 129
else: 62
if Current.user.admin? || Current.user.organiser?
-
129
tabs << {display_name: "Sharing", url: permissions_path}
-
end
-
-
191
tabs
-
end
-
end
-
16
class BandsController < ApplicationController
-
16
include EventsHelper
-
-
16
before_action :set_band, only: %i[show edit update destroy]
-
16
before_action :set_view, only: %i[show edit update]
-
16
before_action :verify_organiser, only: %i[create]
-
16
before_action :verify_organiser_or_admin, only: %i[destroy]
-
-
16
def index
-
8
@bands = Current.user.bands
-
8
@bands = sort_bands(@bands, params[:sort])
-
-
8
then: 1
if @bands.count == 0
-
1
else: 7
redirect_to action: :new
-
7
then: 1
else: 6
elsif !Current.user.admin? && @bands.count == 1
-
1
redirect_to @bands.first
-
end
-
end
-
-
16
def edit
-
end
-
-
16
def show
-
end
-
-
16
def new
-
1
@band = Band.new
-
end
-
-
16
def create
-
2
@band = Band.new(band_params)
-
-
begin
-
2
Band.transaction do
-
2
@band.save!
-
2
Permission.create!(
-
item_type: "Band",
-
item_id: @band.id,
-
user_id: Current.user.id,
-
status: :owned,
-
permission_type: :edit
-
)
-
end
-
1
redirect_to @band, notice: "Band was successfully created"
-
rescue ActiveRecord::RecordInvalid
-
1
render :new, status: :unprocessable_entity
-
end
-
end
-
-
16
def update
-
2
then: 1
if @band.update(band_params)
-
1
redirect_to @band, notice: "Band was successfully updated."
-
else: 1
else
-
1
render :edit
-
end
-
end
-
-
16
def destroy
-
4
Rails.logger.debug { "Attempting to destroy band: #{@band.inspect}" }
-
2
then: 1
if @band.destroy
-
2
Rails.logger.debug { "Band destroyed: #{@band.inspect}" }
-
1
redirect_to bands_url, notice: "Band was successfully destroyed."
-
else: 1
else
-
2
Rails.logger.debug { "Band cannot be deleted: #{@band.errors.inspect}" }
-
1
redirect_to @band, alert: @band.errors.full_messages.to_sentence
-
end
-
end
-
-
16
private
-
-
16
def set_band
-
6
@band = Current.user.bands.find(params[:id])
-
6
@events = @band.events
-
6
.then { |rel| filter_by_period(rel, params[:period]) }
-
6
.then { |rel| sort_results(rel, params[:sort]) }
-
end
-
-
16
def set_view
-
4
@views = %w[overview events shares]
-
4
@views_subtitles = [nil, "(#{@band.events.count})", nil]
-
@view =
-
4
then: 0
@views.include?(params["view"]) ?
-
else: 4
params["view"] :
-
"overview"
-
end
-
-
16
def verify_organiser
-
2
else: 2
then: 0
redirect_to bands_url unless Current.user.organiser?
-
end
-
-
16
def verify_organiser_or_admin
-
2
else: 2
then: 0
redirect_to bands_url unless Current.user.organiser? || Current.user.admin?
-
end
-
-
16
def sort_bands(bands, sort_param)
-
8
then: 4
else: 4
sort_by, sort_order = sort_param&.split
-
8
then: 3
if sort_by.present? && Band.column_names.include?(sort_by)
-
3
then: 2
else: 1
bands.order(sort_by => ((sort_order == "DESC") ? :desc : :asc))
-
else: 5
else
-
5
bands.order(name: :asc)
-
end
-
end
-
-
16
def band_params
-
4
params.require(:band).permit(:name, :description, member_ids: [])
-
end
-
end
-
16
class EventsController < ApplicationController
-
16
include EventsHelper
-
-
16
before_action :set_event, only: %i[show edit update destroy]
-
16
before_action :set_bands, only: %i[new edit create update]
-
-
16
def index
-
149
@events = Current.user.events
-
149
.then { |rel| filter_by_period(rel, params[:period]) }
-
149
.then { |rel| filter_by_band(rel, params[:band_id]) }
-
149
.then { |rel| sort_results(rel, params[:sort]) }
-
end
-
-
16
def new
-
1
@event = Event.new
-
1
then: 0
else: 1
@event.band_ids = [params[:band_id]] if params[:band_id].present?
-
end
-
-
16
def show
-
end
-
-
16
def edit
-
end
-
-
16
def create
-
4
@event = Event.new(event_params)
-
-
3
then: 3
if @event.save
-
3
create_owner_permission(@event)
-
1
redirect_to @event, notice: "Event was successfully created"
-
else: 0
else
-
render :new, status: :unprocessable_entity
-
end
-
end
-
-
16
def update
-
10
then: 8
if @event.update(event_params)
-
8
redirect_to @event, notice: "Event was successfully updated."
-
else: 1
else
-
1
render :edit, status: :unprocessable_entity
-
end
-
end
-
-
16
def destroy
-
2
@event.destroy!
-
1
redirect_to events_url, notice: "Event was successfully destroyed."
-
rescue ActiveRecord::RecordNotDestroyed
-
1
redirect_to @event, alert: @event.errors.full_messages.to_sentence
-
end
-
-
16
private
-
-
16
def set_event
-
15
@event = Current.user.events.find(params[:id])
-
rescue ActiveRecord::RecordNotFound
-
2
redirect_to events_url, alert: "Event not found."
-
end
-
-
16
def set_bands
-
15
@bands = Current.user.bands
-
end
-
-
16
def event_params
-
14
permitted = params.require(:event).permit(
-
:name,
-
:description,
-
:start_date,
-
band_ids: []
-
)
-
-
14
permitted_band_ids = @bands.pluck(:id)
-
-
14
permitted.tap do |params|
-
14
params[:band_ids] = params[:band_ids].to_a.compact_blank.map(&:to_i)
-
14
invalid_bands = params[:band_ids] - permitted_band_ids
-
14
then: 1
else: 13
if invalid_bands.any?
-
1
raise ArgumentError, "Invalid band_ids: #{invalid_bands}"
-
end
-
end
-
end
-
-
16
def create_owner_permission(event)
-
3
event.permissions.create!(
-
user: Current.user,
-
status: :owned,
-
permission_type: :edit
-
)
-
end
-
end
-
9
class MembersController < ApplicationController
-
9
before_action :set_member, only: [:show, :edit, :update, :destroy]
-
-
9
def edit
-
end
-
-
9
def show
-
end
-
-
9
def index
-
1
@members = Member.all
-
end
-
-
9
def new
-
1
@member = Member.new
-
end
-
-
9
def create
-
2
@member = Member.new(member_params)
-
2
else: 1
then: 1
return render :new, status: :unprocessable_entity unless @member.save
-
-
1
@permission = Permission.create(
-
item_type: "Member",
-
item_id: @member.id,
-
user: Current.user,
-
status: :owned,
-
permission_type: "edit"
-
)
-
1
else: 1
then: 0
return render :new, status: :unprocessable_entity unless @permission.save
-
-
1
redirect_to @member, notice: "Member was successfully created."
-
end
-
-
9
def update
-
2
Member.transaction do
-
2
@member.assign_attributes(member_params)
-
2
then: 1
if @member.save
-
1
redirect_to @member, notice: "Member was successfully updated." and return
-
else: 1
else
-
1
logger.warn "members/update error: #{@member.errors.full_messages}"
-
1
render :edit, status: :unprocessable_entity and return
-
end
-
end
-
rescue ActiveRecord::RecordInvalid => e
-
logger.warn "members/update transaction error: #{e.message}"
-
render :edit, status: :unprocessable_entity
-
end
-
-
9
def destroy
-
1
@member.destroy!
-
1
redirect_to members_url, notice: "Member was successfully destroyed."
-
end
-
-
9
private
-
-
9
def set_member
-
5
@member = Current.user.members.find(params[:id])
-
end
-
-
9
def member_params
-
4
params.require(:member).permit(
-
:name, :description, :skills_list, band_ids: []
-
)
-
end
-
end
-
14
class PermissionsController < ApplicationController
-
14
include PermissionsHelper
-
-
14
before_action :set_permission, only: [:update, :destroy]
-
14
before_action :organiser_only, only: [:new, :create]
-
14
before_action :set_form_options, only: [:new, :create]
-
-
14
def index
-
@permissions =
-
6
then: 1
if Current.user.admin?
-
1
Permission.all
-
else: 5
else
-
5
Permission.where(
-
"bestowing_user_id = :user_id OR user_id = :user_id",
-
user_id: Current.user.id
-
)
-
end
-
end
-
-
14
def new
-
1
@permission = Permission.new
-
end
-
-
14
def create
-
3
params = permission_create_params
-
3
item_param = params.delete(:item)
-
-
3
@permission = Permission.new(params)
-
3
@permission.bestowing_user = Current.user
-
3
@permission.status = "pending"
-
3
@permission.item_type, @permission.item_id = item_param.split("_")
-
3
then: 2
else: 1
@permission.item_type&.capitalize!
-
-
3
then: 1
if @permission.save!
-
1
redirect_to permissions_path, notice: "Invitation created"
-
else: 0
else
-
render :new, status: :unprocessable_entity
-
end
-
end
-
-
14
def update
-
7
params = permission_update_params
-
7
then: 3
if !@permission.user || @permission.user != Current.user
-
3
else: 4
render plain: "Not your invite", status: :forbidden
-
4
then: 1
elsif !@permission.pending?
-
1
render plain: "Invite not pending", status: :bad_request
-
else: 3
else
-
3
@permission.update(params)
-
2
then: 1
if @permission.accepted?
-
1
redirect_to @permission.item, notice: "Invitation accepted"
-
else: 1
else
-
1
redirect_to permissions_path, alert: "Invitation rejected"
-
end
-
end
-
rescue ArgumentError
-
1
render plain: "Not updated", status: :bad_request
-
end
-
-
14
def destroy
-
3
then: 1
if Current.user.admin?
-
1
@permission.destroy!
-
1
redirect_to root_path, notice: "Invitation deleted"
-
else: 2
else
-
2
render plain: "Only organisers can create permissions.", status: :forbidden
-
end
-
end
-
-
14
private
-
-
14
def organiser_only
-
6
else: 4
then: 2
unless Current.user.organiser?
-
2
render plain: "Organisers only", status: :forbidden
-
end
-
end
-
-
14
def set_form_options
-
4
@users = potential_users
-
4
@items = potential_items(Current.user)
-
4
@permission_types = %w[view edit]
-
end
-
-
14
def set_permission
-
10
@permission = Permission.find(params[:id])
-
end
-
-
14
def permission_create_params
-
3
params.require(:permission).permit(:user_id, :item, :permission_type)
-
end
-
-
14
def permission_update_params
-
7
params.require(:permission).permit(:status)
-
end
-
end
-
16
class SessionsController < ApplicationController
-
16
def new
-
4
then: 2
else: 2
redirect_to events_path if Current.user
-
4
@user = User.new
-
end
-
-
16
def create
-
137
username, password = login_params.values_at(:username, :password)
-
136
logger.debug("Login attempt from #{username}")
-
136
user = User.find_or_create_by(username: username)
-
136
then: 135
if user.authenticate(password)
-
135
session[:user_id] = user.id
-
135
logger.debug("Login success: #{username}")
-
135
redirect_to events_path, notice: "Logged in successfully."
-
else: 1
else
-
1
@user = User.new
-
1
@user.username = username
-
1
logger.debug "Login failed: #{user.inspect}"
-
1
flash[:alert] = "Invalid username or password"
-
1
render :new, status: :unprocessable_entity
-
end
-
end
-
-
16
def destroy
-
1
session[:user_id] = nil
-
1
redirect_to login_path, notice: "Logged out successfully."
-
end
-
-
16
private
-
-
16
def login_params
-
137
params.require(:user).permit(:username, :password)
-
end
-
end
-
10
class UserMailsController < ApplicationController
-
10
before_action :set_mail, only: :show
-
10
before_action :can_view_mail, only: :show
-
-
10
def show
-
end
-
-
10
def index
-
@mails =
-
3
then: 1
if Current.user.admin?
-
1
UserMail.order(updated_at: :desc)
-
else: 2
else
-
2
UserMail.where(user_id: Current.user.id).order(updated_at: :desc)
-
end
-
end
-
-
10
def create
-
2
@mail = UserMailer.send_confirmation_registration(Current.user)
-
-
2
then: 1
if @mail.persisted?
-
1
redirect_to user_mails_path, notice: "Confirmation sent successfully"
-
else: 1
else
-
1
redirect_to user_mails_path, alert: "Failed to send confirmation"
-
end
-
end
-
-
10
private
-
-
10
def set_mail
-
5
@mail = UserMail.find(params[:id])
-
end
-
-
10
def can_view_mail
-
5
then: 3
else: 2
return if @mail && (@mail.user_id == Current.user.id || Current.user.admin?)
-
-
2
redirect_to user_mails_path, alert: "Cannot view this mail"
-
end
-
end
-
5
class Users::RegistrationController < ApplicationController
-
5
before_action :set_user, only: %i[
-
edit
-
update
-
]
-
-
5
def edit
-
end
-
-
5
def update
-
1
else: 0
then: 1
UserMailer.send_confirmation_registration(@user) unless @user.confirmed?
-
end
-
-
5
def new
-
4
@token = params[:token]
-
4
verifier = Rails.application.config.message_verifier
-
-
begin
-
4
data = verifier.verify(@token)
-
3
@user = User.find(data["user_id"])
-
3
then: 1
else: 2
if @user.confirmed?
-
1
redirect_to account_path,
-
notice: "Your account is already confirmed"
-
end
-
-
3
then: 1
else: 2
then: 1
else: 2
if data["expires_at"]&.< Time.current.to_i
-
1
flash[:alert] = "Your confirmation link has expired: #{data}."
-
1
redirect_to register_path
-
end
-
rescue ActiveSupport::MessageVerifier::InvalidSignature
-
1
flash[:alert] = "Invalid confirmation link."
-
1
redirect_to register_path
-
end
-
end
-
-
5
def create
-
3
token = params[:token]
-
3
verifier = Rails.application.config.message_verifier
-
-
begin
-
3
data = verifier.verify(token)
-
-
2
then: 2
else: 0
then: 1
if data["expires_at"]&.>= Time.current.to_i
-
1
@user = User.find(data["user_id"])
-
1
@user.update(confirmed: true)
-
1
flash[:notice] = "Your registration has been confirmed."
-
1
redirect_to login_path
-
else: 1
else
-
1
flash[:alert] = "Your confirmation link has expired: #{data}."
-
1
redirect_to register_path
-
end
-
rescue ActiveSupport::MessageVerifier::InvalidSignature
-
1
flash[:alert] = "Invalid confirmation link."
-
1
redirect_to register_path
-
end
-
end
-
-
5
private
-
-
5
def set_user
-
2
@user = User.find(session[:user_id])
-
2
then: 1
else: 1
redirect_to account_path if @user.confirmed?
-
end
-
end
-
12
class UsersController < ApplicationController
-
12
before_action :check_admin_user, only: %i[
-
create
-
new
-
]
-
-
12
before_action :set_user, only: %i[
-
edit
-
update
-
]
-
-
12
before_action :check_not_logged_in, only: %i[
-
create
-
new
-
]
-
-
12
def new
-
1
@user = User.new
-
end
-
-
12
def create
-
4
@user = User.new(create_user_params)
-
-
4
then: 1
else: 3
if @user.admin? && !@allow_admin_user
-
1
flash.now[:alert] = "No more admin users allowed"
-
1
return render :new, status: :unprocessable_entity
-
end
-
-
3
then: 2
if @user.save
-
2
session[:user_id] = @user.id
-
2
redirect_to account_path, notice: "You registered successfully. Well done!"
-
else: 1
else
-
1
render :new, status: :unprocessable_entity
-
end
-
end
-
-
12
def edit
-
end
-
-
12
def update
-
4
then: 4
else: 0
if params[:user][:password].blank?
-
4
params[:user].delete(:password)
-
4
params[:user].delete(:password_confirmation)
-
end
-
-
4
then: 2
if @user.update(update_user_params)
-
2
flash[:notice] = "Updated successfully"
-
2
redirect_to account_url
-
else: 2
else
-
2
errors = @user.errors.full_messages.join(", ").downcase
-
2
render plain: "Could not update user: #{errors}",
-
status: :forbidden
-
end
-
end
-
-
12
private
-
-
12
def create_user_params
-
4
params.require(:user).permit(
-
:username,
-
:name,
-
:email,
-
:password,
-
:password_confirmation,
-
:time_zone,
-
:user_type
-
)
-
end
-
-
12
def update_user_params
-
4
params.require(:user).permit(
-
:name,
-
:email,
-
:password,
-
:password_confirmation,
-
:time_zone
-
)
-
end
-
-
12
def set_user
-
6
@user = Current.user
-
6
else: 6
then: 0
redirect_to login_path unless @user
-
end
-
-
12
def check_admin_user
-
6
@allow_admin_user = User.admin.count.zero?
-
end
-
-
12
def check_not_logged_in
-
6
else: 5
then: 1
redirect_to account_path unless Current.user.nil?
-
end
-
end
-
1
module ApplicationHelper
-
1
def page_heading(str)
-
159
content_tag(:h1, str, class: "text-gray-900 text-xl")
-
end
-
-
1
def filter_link(name, path, css_class, active)
-
449
link_to_if(!active, name, path, class: "#{css_class} hover:underline") do
-
149
content_tag(:span, name, class: "#{css_class} font-bold")
-
end
-
end
-
-
1
def table_header_sort(
-
resource,
-
column,
-
display_text,
-
default_sort_column = nil,
-
default_sort_direction = "asc"
-
)
-
271
then: 32
else: 239
current_sort_column, current_sort_direction = params[:sort]&.split
-
271
current_sort_column ||= default_sort_column
-
271
current_sort_direction ||= default_sort_direction
-
-
271
then: 9
if current_sort_column == column
-
9
then: 3
else: 6
new_sort_direction = (current_sort_direction == "asc") ? "desc" : "asc"
-
9
sort_icon = sort_direction_icon(current_sort_direction)
-
else: 262
else
-
262
new_sort_direction = default_sort_direction
-
end
-
-
271
params = {sort: "#{column} #{new_sort_direction}"}
-
271
then: 55
else: 216
params[:period] = request.params[:period] if request.params[:period]
-
-
271
new_params = request.query_parameters
-
.except(:page, :sort)
-
.merge(sort: "#{column} #{new_sort_direction}")
-
-
271
sort_url = url_for(new_params)
-
-
271
link_to "#{display_text}#{sort_icon}".html_safe, sort_url
-
end
-
-
1
def flash_banner(key, msg = nil, &block)
-
152
content_tag :div, class: "#{key} banner" do
-
152
then: 6
else: 146
if block && msg.blank?
-
6
msg = capture(&block)
-
end
-
-
152
concat(content_tag(:div, msg))
-
152
concat(hidden_checkbox_tag(key))
-
152
concat(close_button(key))
-
end
-
end
-
-
1
private
-
-
1
def sort_direction_icon(direction)
-
9
when: 3
case direction
-
3
when: 1
when "asc" then " <span>â–¼</span>"
-
1
else: 5
when "desc" then " <span>â–²</span>"
-
5
else ""
-
end
-
end
-
-
1
def hidden_checkbox_tag(key)
-
152
tag.input type: "checkbox", class: "hidden", id: "banneralert-#{key}"
-
end
-
-
1
def close_button(key)
-
152
tag.label class: "close", style: "width:30px", for: "banneralert-#{key}" do
-
152
tag.svg class: "fill-current h-6 w-6", role: "button", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20" do
-
152
concat(tag.title("Close"))
-
152
concat(tag.path(d: "M14.348 14.849a1.2 1.2 0 0 1-1.697 0L10 11.819l-2.651 3.029a1.2 1.2 0 1 1-1.697-1.697l2.758-3.15-2.759-3.152a1.2 1.2 0 1 1 1.697-1.697L10 8.183l2.651-3.031a1.2 1.2 0 1 1 1.697 1.697l-2.758 3.152 2.758 3.15a1.2 1.2 0 0 1 0 1.698z"))
-
end
-
end
-
end
-
end
-
1
module EventsHelper
-
1
def filter_by_period(events, period)
-
155
when: 1
case period
-
1
when: 145
when "past" then events.past
-
145
else: 9
when "future", nil then events.future
-
9
else events
-
end
-
end
-
-
1
def filter_by_band(events, band_id)
-
149
else: 1
then: 148
return events unless band_id.present? && band_id.to_i.positive?
-
1
events.joins(:bands).where(bands: {id: band_id})
-
end
-
-
1
def sort_results(events, sort_param)
-
155
column, direction = extract_sort_params(sort_param)
-
155
else: 5
then: 150
return events unless Event.attribute_names.include?(column.to_s)
-
5
events.order(column => direction)
-
end
-
-
1
def extract_sort_params(sort_param)
-
155
col, dir = sort_param.to_s.split
-
155
then: 3
else: 152
dir = %w[desc DESC].include?(dir) ? :desc : :asc
-
155
[col.presence || :date, dir]
-
end
-
end
-
1
module MembersHelper
-
end
-
1
module PermissionsHelper
-
1
def potential_users
-
4
User.member.pluck(:username, :id)
-
end
-
-
1
def potential_items(owner)
-
46
invitable_klasses = [Event, Band, Member]
-
46
invitable_klasses.flat_map do |klass|
-
138
pluck_and_prefix(klass, owner)
-
end
-
end
-
-
1
private
-
-
1
def pluck_and_prefix(klass, owner)
-
138
owned_permissions = owner.send(:"owned_#{klass.to_s.downcase.pluralize}")
-
138
owned_item_ids = owned_permissions.pluck(:item_id)
-
138
items = klass.where(id: owned_item_ids).pluck(:id, :name)
-
138
items.map do |id, name|
-
49
["#{name} (#{klass})", "#{klass}_#{id}"]
-
end
-
end
-
end
-
1
module SessionsHelper
-
end
-
1
module Users::RegistrationHelper
-
end
-
1
class ApplicationJob < ActiveJob::Base
-
# Automatically retry jobs that encountered a deadlock
-
# retry_on ActiveRecord::Deadlocked
-
-
# Most jobs are safe to ignore if the underlying records are no longer available
-
# discard_on ActiveJob::DeserializationError
-
end
-
1
class SendMailJob < ApplicationJob
-
1
queue_as :default
-
1
retry_on StandardError, wait: 1.minute, attempts: 5
-
-
1
def perform(user_mail_id)
-
user_mail = UserMail.find(user_mail_id)
-
user_mail.attempt_send
-
end
-
end
-
12
module FormBuilders
-
12
class NiceFormBuilder < ActionView::Helpers::FormBuilder
-
12
class_attribute :text_field_helpers,
-
default: field_helpers - %i[
-
label
-
check_box
-
radio_button
-
fields_for
-
fields
-
hidden_field
-
file_field
-
]
-
-
12
TEXT_FIELD_STYLE = "text_field".freeze
-
12
TEXT_AREA_STYLE = "textarea_field".freeze
-
12
SELECT_FIELD_STYLE = "select_field".freeze
-
12
SUBMIT_BUTTON_STYLE = "primary_button".freeze
-
12
CHECKBOX_FIELD_STYLE = "checkbox_group".freeze
-
12
DATE_SELECT_STYLE = "date_select".freeze
-
12
TIME_SELECT_STYLE = "time_select".freeze
-
-
12
text_field_helpers.each do |field_method|
-
216
define_method(field_method) do |method, options = {}|
-
96
then: 48
if options.delete(:already_nice)
-
48
super(method, options)
-
else: 48
else
-
48
text_like_field(field_method, method, options)
-
end
-
end
-
end
-
-
12
def submit(value = nil, options = {})
-
23
custom_opts, opts = partition_custom_opts(options)
-
23
classes = apply_style_classes(SUBMIT_BUTTON_STYLE, custom_opts)
-
-
23
super(value, {class: classes}.merge(opts))
-
end
-
-
12
def select(method, choices = nil, options = {}, html_options = {}, &block)
-
11
custom_opts, opts = partition_custom_opts(options)
-
11
classes = apply_style_classes(SELECT_FIELD_STYLE, custom_opts, method)
-
-
11
labels = labels(method, custom_opts[:label], options)
-
11
field = super(
-
method,
-
choices,
-
opts,
-
html_options.merge({class: classes}),
-
&block
-
)
-
-
11
@template.content_tag("div", labels + field, {class: "field"})
-
end
-
-
12
def collection_checkboxes(
-
method,
-
collection,
-
value_method,
-
text_method,
-
options = {},
-
html_options = {},
-
&block
-
)
-
2
custom_opts, opts = partition_custom_opts(options)
-
-
2
classes = apply_style_classes(
-
CHECKBOX_FIELD_STYLE,
-
custom_opts,
-
method
-
)
-
-
2
labels = labels(method, custom_opts[:label], options)
-
-
2
html_options = html_options.merge(class: classes)
-
-
2
check_boxes = super(
-
method,
-
collection,
-
value_method,
-
text_method,
-
opts,
-
html_options,
-
&block
-
)
-
-
2
@template.content_tag(
-
"div",
-
labels + check_boxes,
-
{class: "field"}
-
)
-
end
-
-
12
def date_select(method, options = {}, html_options = {})
-
2
custom_opts, opts = partition_custom_opts(options)
-
2
classes = apply_style_classes(nil, custom_opts, method)
-
-
2
labels = labels(method, custom_opts[:label], options)
-
2
field = @template.content_tag("div",
-
super(method, opts, html_options.merge(class: classes)),
-
{class: "flex flex-row gap-4"})
-
-
2
@template.content_tag("div", labels + field, {class: "field"})
-
end
-
-
12
def time_select(method, options = {}, html_options = {})
-
2
custom_opts, opts = partition_custom_opts(options)
-
2
classes = apply_style_classes(nil, custom_opts, method)
-
-
2
labels = labels(method, custom_opts[:label], options)
-
2
field = @template.content_tag("div",
-
super(method, opts, html_options.merge(class: classes)),
-
{class: "flex flex-row gap-4"})
-
-
2
@template.content_tag("div", labels + field, {class: "field"})
-
end
-
-
12
private
-
-
12
def text_like_field(field_method, object_method, options = {})
-
48
custom_opts, opts = partition_custom_opts(options)
-
48
then: 0
else: 48
style = (field_method == :text_area) ? TEXT_AREA_STYLE : TEXT_FIELD_STYLE
-
48
classes = apply_style_classes(style, custom_opts, object_method)
-
-
field_options = {
-
48
class: classes,
-
then: 48
else: 0
title: errors_for(object_method)&.join(" ")
-
}.compact.merge(opts).merge(already_nice: true)
-
-
48
field = send(field_method, object_method, field_options)
-
48
labels = labels(object_method, custom_opts[:label], options)
-
-
48
@template.content_tag("div", labels + field, {class: "field"})
-
end
-
-
12
def labels(object_method, label_options, field_options)
-
65
label = nice_label(object_method, label_options, field_options)
-
65
error_label = error_label(object_method, field_options)
-
-
65
label + error_label
-
end
-
-
12
def nice_label(object_method, label_options, field_options)
-
67
then: 8
else: 59
text, label_opts = label_options.present? ? label_options.values_at(:text, :except) : [nil, {}]
-
67
label_opts ||= {}
-
-
67
label_classes = label_opts[:class].to_s
-
67
then: 0
else: 67
label_classes += " disabled" if field_options[:disabled]
-
-
67
label(object_method, text, {
-
class: label_classes.strip
-
}.merge(label_opts.except(:class)))
-
end
-
-
12
def error_label(object_method, options)
-
65
then: 63
else: 2
return if errors_for(object_method).blank?
-
-
2
error_message = @object.errors[object_method].collect(&:titleize).join(", ")
-
2
nice_label(object_method, {text: error_message, class: "error_message"}, options)
-
end
-
-
12
def border_color_classes(object_method)
-
88
else: 65
then: 23
return "" unless object_method
-
65
then: 2
else: 63
"has_error" if errors_for(object_method).present?
-
end
-
-
12
def apply_style_classes(base_class, custom_opts, object_method = nil)
-
[
-
88
base_class,
-
border_color_classes(object_method),
-
custom_opts[:class]
-
].compact.join(" ")
-
end
-
-
12
CUSTOM_OPTS = [:label, :class].freeze
-
-
12
def partition_custom_opts(opts)
-
116
opts.partition { |k, _| CUSTOM_OPTS.include?(k) }.map(&:to_h)
-
end
-
-
12
def errors_for(object_method)
-
178
else: 178
then: 0
return unless @object.present? && object_method.present?
-
-
178
@object.errors[object_method]
-
end
-
end
-
end
-
8
class ApplicationMailer < ActionMailer::Base
-
8
layout "mailer"
-
end
-
class TestMailer < ApplicationMailer
-
def test_email(to)
-
Rails.logger.info "Preparing to send test email to #{to}."
-
-
mail(
-
to: to,
-
subject: "Test Email",
-
body: "This is a test email."
-
)
-
end
-
end
-
# app/mailers/user_mailer.rb
-
8
class UserMailer < ApplicationMailer
-
8
CONFIRM_REGISTRATION_SUBJECT = "Thank you for joining Libregig"
-
-
8
def confirm_registration(user_mail)
-
1
@username = user_mail.params["username"]
-
1
@url = user_mail.params["url"]
-
-
1
mail(to: user_mail.recipient, subject: CONFIRM_REGISTRATION_SUBJECT)
-
end
-
-
8
def self.send_confirmation_registration(user)
-
1
confirmation_token = user.confirmation_tokens.create!(token: SecureRandom.urlsafe_base64)
-
-
1
user_mail = UserMail.new(
-
user: user,
-
recipient: user.email,
-
subject: CONFIRM_REGISTRATION_SUBJECT,
-
template: "confirm_registration",
-
params: {
-
username: user.username,
-
url: generate_confirmation_url(confirmation_token)
-
}
-
)
-
-
1
then: 1
if user_mail.save
-
1
SendMailJob.perform_later(user_mail.id)
-
else: 0
else
-
errors = user_mail.errors.full_messages.join(", ")
-
Rails.logger.error("Failed to create UserMail: #{errors}")
-
end
-
-
1
user_mail
-
end
-
-
8
def self.generate_confirmation_url(confirmation_token)
-
2
Rails.application.routes.url_helpers.confirm_registration_url(
-
token: confirmation_token.token,
-
host: Rails.configuration.server_url
-
)
-
end
-
end
-
1
class ApplicationRecord < ActiveRecord::Base
-
1
primary_abstract_class
-
end
-
1
class Band < ApplicationRecord
-
1
has_many :event_bands, dependent: :destroy
-
1
has_many :events, through: :event_bands
-
-
1
has_many :band_members, dependent: :restrict_with_error
-
1
has_many :members, through: :band_members
-
1
has_many :permission, as: :item, dependent: :destroy
-
-
1
validates :description, presence: true
-
1
validates :name, presence: true
-
-
1
include Auditable
-
1
audit_log_columns :name, :description
-
-
1
def owner
-
2
then: 2
else: 0
permission.where(status: :owned).first&.user
-
end
-
-
1
def url
-
1
Rails.application.routes.url_helpers.edit_band_path(self)
-
end
-
-
1
def editable?
-
1
Current.user.admin? ||
-
Current.user.owned_bands.any? { |b| b.id == id }
-
end
-
end
-
16
class BandMember < ApplicationRecord
-
16
belongs_to :member
-
16
belongs_to :band
-
end
-
3
class BandsAudit < ApplicationRecord
-
3
self.table_name = "bands_audit"
-
-
3
belongs_to :band
-
end
-
1
module Auditable
-
1
extend ActiveSupport::Concern
-
-
1
included do
-
3
after_update_commit :log_changes
-
end
-
-
1
def log_changes
-
17
changes_to_log.each do |column, values|
-
26
audit_class.create!(
-
item_id => id,
-
:column_changed => column,
-
:old_value => values.first,
-
:user_id => Current.user.id
-
)
-
end
-
end
-
-
1
private
-
-
1
def changes_to_log
-
17
saved_changes.slice(*self.class.logged_columns)
-
end
-
-
1
def audit_class
-
26
"#{self.class.name.pluralize}Audit".constantize
-
end
-
-
1
def item_id
-
26
"#{self.class.name.downcase}_id"
-
end
-
-
1
class_methods do
-
1
def audit_log_columns(*columns)
-
3
@logged_columns = columns.map(&:to_s)
-
end
-
-
1
def logged_columns
-
17
@logged_columns || []
-
end
-
end
-
end
-
9
class ConfirmationToken < ApplicationRecord
-
9
belongs_to :user
-
-
9
before_create :set_expires_at, unless: :expires_at?
-
-
9
validates :token, presence: true, uniqueness: true
-
-
13
scope :valid, -> { where("expires_at > ?", Time.current) }
-
-
9
private
-
-
9
def set_expires_at
-
5
self.expires_at = 24.hours.from_now
-
end
-
end
-
1
class Current < ActiveSupport::CurrentAttributes
-
1
attribute :_user
-
1
attribute :_impersonator
-
-
1297
resets { Time.zone = nil }
-
-
1
def user=(user)
-
416
self._user = user
-
416
update_time_zone
-
end
-
-
1
def user
-
2641
_user
-
end
-
-
1
def impersonator=(impersonator)
-
410
self._impersonator = impersonator
-
410
update_time_zone
-
end
-
-
1
def impersonator
-
1
_impersonator
-
end
-
-
1
def impersonating?
-
194
_impersonator.present?
-
end
-
-
1
private
-
-
1
def update_time_zone
-
826
then: 560
else: 266
then: 0
else: 266
Time.zone = _user&.time_zone || _impersonator&.time_zone
-
end
-
end
-
1
class Event < ApplicationRecord
-
1
has_many :event_bands, dependent: :destroy
-
1
has_many :bands, through: :event_bands
-
1
has_many :permissions, as: :item, dependent: :destroy
-
-
3
scope :past, -> { where(<<~SQL) }
-
end_date IS NULL OR
-
start_date IS NULL OR
-
end_date <= CURRENT_TIMESTAMP
-
SQL
-
-
147
scope :future, -> { where(<<~SQL) }
-
end_date IS NULL OR
-
start_date IS NULL OR
-
end_date >= CURRENT_TIMESTAMP
-
SQL
-
-
1
include Auditable
-
1
audit_log_columns :name, :description, :start_date, :end_date
-
-
1
def owner
-
2
then: 2
else: 0
permissions.where(status: :owned).first&.user
-
end
-
-
1
def url
-
1
Rails.application.routes.url_helpers.edit_event_path(self)
-
end
-
-
1
def external_url
-
1
Rails.application.routes.url_helpers.edit_event_url(self, host: Rails.application.config.server_url)
-
end
-
end
-
1
class EventBand < ApplicationRecord
-
1
belongs_to :event
-
1
belongs_to :band
-
end
-
8
class EventsAudit < ApplicationRecord
-
8
self.table_name = "events_audit"
-
8
belongs_to :event
-
end
-
1
class Member < ApplicationRecord
-
1
has_many :band_members, dependent: :destroy
-
1
has_many :bands, through: :band_members
-
-
1
has_many :member_skills, dependent: :destroy
-
1
has_many :skills, through: :member_skills
-
-
128
validates :skills, presence: true, if: -> { skills_list.present? }
-
-
1
has_many :permission, as: :item, dependent: :destroy
-
-
1
include Auditable
-
1
audit_log_columns :name, :description
-
-
1
def owner
-
9
then: 9
else: 0
Permission.where(
-
status: :owned,
-
item_type: "Member",
-
item_id: id
-
).first&.user
-
end
-
-
1
def skills_list
-
129
skills.pluck(:name).join(", ")
-
end
-
-
1
def skills_list=(skills_string)
-
then: 0
else: 0
return if skills_string.blank?
-
-
skill_names =
-
skills_string
-
.downcase
-
.split(",")
-
.map(&:strip)
-
.compact_blank
-
.uniq
-
-
then: 0
else: 0
return if skill_names.empty?
-
-
transaction do
-
member_skills.destroy_all
-
skill_names.each do |name|
-
skill = Skill.find_or_create_by!(name: name)
-
else: 0
then: 0
member_skills.create!(skill: skill) unless member_skills.exists?(skill: skill)
-
end
-
end
-
end
-
-
1
def editable
-
1
false
-
end
-
end
-
16
class MemberSkill < ApplicationRecord
-
16
belongs_to :member
-
16
belongs_to :skill
-
-
16
validates :member_id, uniqueness: {scope: :skill_id}
-
end
-
3
class MembersAudit < ApplicationRecord
-
3
self.table_name = "members_audit"
-
3
belongs_to :member
-
end
-
16
class Permission < ApplicationRecord
-
16
include PermissionsHelper
-
-
16
belongs_to :user, class_name: "User"
-
16
belongs_to :bestowing_user, class_name: "User", optional: true
-
16
belongs_to :item, polymorphic: true
-
-
16
scope :accepted, -> { where(status: :accepted) }
-
16
scope :accepted_or_owned, -> { where(status: %i[accepted owned]) }
-
16
scope :item_type, ->(type) { where(item_type: type) }
-
-
16
def self.join_models(model)
-
table_name = model.to_s.pluralize
-
klass_name = model.to_s.classify
-
joins("
-
JOIN #{table_name}
-
ON #{table_name}.id = permissions.item_id
-
AND permissions.item_type = '#{klass_name}'
-
")
-
end
-
-
16
scope :bands, -> { join_models(:band) }
-
16
scope :events, -> { join_models(:event) }
-
16
scope :members, -> { join_models(:member) }
-
-
16
scope :system_permissions, -> { where(bestowing_user: nil) }
-
-
16
validates :item_type, presence: true
-
16
validates :permission_type, presence: true, inclusion: {in: %w[view edit]}
-
16
validates :status, presence: true, inclusion: {in: %w[owned pending accepted rejected]}
-
16
validate :bestowing_user_must_be_organiser_or_nil, :user_must_be_member_or_organiser
-
-
16
validate :valid_item
-
16
validate :valid_user
-
-
16
enum :status, {
-
owned: "owned",
-
pending: "pending",
-
accepted: "accepted",
-
rejected: "rejected"
-
}
-
-
16
private
-
-
16
def valid_item
-
352
then: 310
else: 42
return true if bestowing_user.nil?
-
-
42
item_ids = potential_items(bestowing_user).pluck(1)
-
42
item_str = "#{item_type}_#{item_id}"
-
-
42
else: 39
then: 3
unless item_ids.include?(item_str)
-
3
errors.add(:item, "is not a valid selection for #{bestowing_user}. Valid options: #{item_ids}")
-
end
-
end
-
-
16
def valid_user
-
# TODO: make this fancier
-
352
else: 352
then: 0
unless User.find(user_id)
-
errors.add(:user, "is not a valid selection")
-
end
-
end
-
-
16
def bestowing_user_must_be_organiser_or_nil
-
352
else: 351
then: 1
unless bestowing_user.nil? || bestowing_user.organiser?
-
1
errors.add(:bestowing_user, "must be an organiser")
-
end
-
end
-
-
16
def user_must_be_member_or_organiser
-
352
then: 352
else: 0
then: 102
else: 0
else: 349
then: 3
unless user&.organiser? || user&.member?
-
3
errors.add(:user, "must be a member or organiser")
-
end
-
end
-
end
-
1
class Skill < ApplicationRecord
-
1
has_many :member_skills, dependent: :destroy
-
1
has_many :members, through: :member_skills
-
-
1
validates :name, presence: true
-
end
-
1
class User < ApplicationRecord
-
1
enum :user_type, {admin: 0, member: 1, organiser: 2}
-
-
1
has_secure_password
-
1
has_many :permissions,
-
dependent: :destroy,
-
inverse_of: :user
-
-
65
has_many :owned_bands, -> { where(permissions: {item_type: "Band", status: :owned}) },
-
through: :permissions,
-
source: :item,
-
source_type: "Band"
-
-
65
has_many :owned_events, -> { where(permissions: {item_type: "Event", status: :owned}) },
-
through: :permissions,
-
source: :item,
-
source_type: "Event"
-
-
65
has_many :owned_members, -> { where(permissions: {item_type: "Member", status: :owned}) },
-
through: :permissions,
-
source: :item,
-
source_type: "Member"
-
-
1
has_many :confirmation_tokens, dependent: :destroy
-
-
560
then: 556
else: 3
before_save { email&.downcase! }
-
1
before_validation :set_default_time_zone
-
-
1
validates :username,
-
presence: true,
-
uniqueness: true
-
-
1
validates :email,
-
presence: {message: "can't be blank"},
-
uniqueness: true,
-
format: {with: URI::MailTo::EMAIL_REGEXP, message: "is invalid", allow_blank: true}
-
-
1
validates :password,
-
presence: true,
-
length: {minimum: 6},
-
if: :password_required?,
-
allow_blank: true
-
-
1
validates :password_confirmation,
-
presence: true,
-
allow_blank: true
-
-
1
validates :time_zone,
-
inclusion: {
-
151
in: ActiveSupport::TimeZone.all.map { |t| t.tzinfo.name },
-
message: "%{value} is not a valid time zone"
-
}, allow_blank: true
-
-
1
def confirmed?
-
287
confirmed || admin?
-
end
-
-
1
def to_param
-
204
username
-
end
-
-
1
def owned_links
-
3
then: 1
else: 2
return @owned_links if defined?(@owned_links)
-
@owned_links =
-
2
bands.select(:name, :id) +
-
events.select(:name, :id) +
-
members.select(:name, :id)
-
end
-
-
1
def bands
-
36
then: 3
else: 33
return @bands if defined?(@bands)
-
@bands =
-
33
then: 21
admin? ?
-
else: 12
Band.all :
-
Band.where(id: band_permissions.map(&:item_id))
-
end
-
-
1
def events
-
172
then: 3
else: 169
return @events if defined?(@events)
-
@events =
-
169
then: 88
admin? ?
-
else: 81
Event.all :
-
Event.where(id: event_permissions.map(&:item_id))
-
end
-
-
1
def members
-
13
then: 3
else: 10
return @members if defined?(@members)
-
@members =
-
10
then: 1
admin? ?
-
else: 9
Member.all :
-
Member.where(id: member_permissions.map(&:item_id))
-
end
-
-
1
private
-
-
1
def password_required?
-
1169
new_record? || password.present?
-
end
-
-
1
def event_permissions
-
81
permissions.where(status: [:accepted, :owned], item_type: "Event")
-
end
-
-
1
def band_permissions
-
12
permissions.where(status: [:accepted, :owned], item_type: "Band")
-
end
-
-
1
def member_permissions
-
9
permissions.where(status: [:accepted, :owned], item_type: "Member")
-
end
-
-
1
def set_default_time_zone
-
583
then: 8
else: 575
self.time_zone = "Etc/UTC" if time_zone.blank?
-
end
-
end
-
1
class UserMail < ApplicationRecord
-
1
belongs_to :user
-
-
1
enum :state, {pending: 0, sending: 1, sent: 2, failed: 3}
-
-
1
validates :subject, presence: true, length: {maximum: 120}
-
1
validates :recipient, presence: true, length: {maximum: 255}
-
1
validates :template, presence: true, length: {maximum: 50}
-
1
validates :params, presence: true
-
-
1
def html_content
-
4
content(:html)
-
end
-
-
1
def text_content
-
4
content(:text)
-
end
-
-
1
def attempt_send
-
3
else: 2
then: 1
return unless pending?
-
-
2
update!(state: :sending)
-
-
begin
-
2
UserMailer.confirm_registration(self).deliver_now
-
1
update!(state: :sent)
-
1
Rails.logger.info("Mail sent successfully to #{recipient}.")
-
rescue => e
-
1
then: 0
else: 1
raise e if Rails.env.development?
-
1
update!(state: :failed)
-
1
Rails.logger.error("Failed to send mail to #{recipient}: #{e}")
-
end
-
end
-
-
1
private
-
-
1
def content(format)
-
8
ApplicationController.render(
-
layout: false,
-
template: "user_mailer/#{template}",
-
assigns: params,
-
formats: [format]
-
)
-
end
-
end