# auto_register: false # frozen_string_literal: true require "hanami/action" module EuchreCamp class Action < Hanami::Action include Deps[ users_repo: 'repositories.users', players_repo: 'repositories.players', matches_repo: 'repositories.matches' ] protected # Get current user from session def current_user(request) user_id = request.session[:user_id] return nil unless user_id users_repo.by_id(user_id) end # Get current player from session def current_player(request) player_id = request.session[:player_id] return nil unless player_id players_repo.by_id(player_id) end # Check if user is logged in def logged_in?(request) !request.session[:user_id].nil? end # Require authentication - redirect to login if not logged in def require_authentication(request, response) unless logged_in?(request) response.flash[:error] = 'Please login to continue' response.redirect_to '/login' end end # Require specific role def require_role(request, response, *allowed_roles) user = current_user(request) return false unless user unless allowed_roles.include?(user.role.to_sym) response.flash[:error] = 'Access denied' response.redirect_to '/rankings' return false end true end # Check authorization for an action def authorize(request, response, action, resource = nil, context = {}) user = current_user(request) return false unless user unless EuchreCamp::Services::Authorization.can?(user, action, resource, context) response.flash[:error] = 'You do not have permission to perform this action' response.redirect_to '/rankings' return false end true end # Helper to pass current_player to view def render_with_player(request, response, **options) player = current_player(request) response.render(view, current_player: player, **options) end # Get match and check if user can edit it def get_editable_match(request, response, match_id) match = matches_repo.by_id(match_id) return nil unless match user = current_user(request) return match unless user # Check if match is within 5 minutes for regular users if EuchreCamp::Services::Authorization.can?(user, :edit_own_match_within_5_min, match) match else response.flash[:error] = 'Match cannot be edited (too old or not your match)' response.redirect_to '/admin/matches' nil end end end end