mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-09 08:47:11 -05:00
70 lines
2.1 KiB
Ruby
70 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Family::MembershipsController < ApplicationController
|
|
before_action :authenticate_user!
|
|
before_action :ensure_family_feature_enabled!
|
|
before_action :set_family, except: %i[create]
|
|
before_action :set_membership, only: %i[destroy]
|
|
before_action :set_invitation, only: %i[create]
|
|
|
|
def create
|
|
unless @invitation.pending?
|
|
redirect_to root_path, alert: 'This invitation has already been processed' and return
|
|
end
|
|
|
|
if @invitation.expired?
|
|
redirect_to root_path, alert: 'This invitation is no longer valid or has expired' and return
|
|
end
|
|
|
|
if @invitation.email != current_user.email
|
|
redirect_to root_path, alert: 'This invitation is not for your email address' and return
|
|
end
|
|
|
|
service = Families::AcceptInvitation.new(
|
|
invitation: @invitation,
|
|
user: current_user
|
|
)
|
|
|
|
if service.call
|
|
redirect_to family_path, notice: 'Welcome to the family!'
|
|
else
|
|
redirect_to root_path, alert: service.error_message || 'Unable to accept invitation'
|
|
end
|
|
rescue StandardError => e
|
|
Rails.logger.error "Error accepting family invitation: #{e.message}"
|
|
redirect_to root_path, alert: 'An unexpected error occurred. Please try again later'
|
|
end
|
|
|
|
def destroy
|
|
authorize @membership
|
|
|
|
member_user = @membership.user
|
|
service = Families::Memberships::Destroy.new(user: current_user, member_to_remove: member_user)
|
|
|
|
if service.call
|
|
if member_user == current_user
|
|
redirect_to new_family_path, notice: 'You have left the family'
|
|
else
|
|
redirect_to family_path, notice: "#{member_user.email} has been removed from the family"
|
|
end
|
|
else
|
|
redirect_to family_path, alert: service.error_message || 'Failed to remove member'
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def set_family
|
|
@family = current_user.family
|
|
|
|
redirect_to new_family_path, alert: 'You are not in a family' and return unless @family
|
|
end
|
|
|
|
def set_membership
|
|
@membership = @family.family_memberships.find(params[:id])
|
|
end
|
|
|
|
def set_invitation
|
|
@invitation = Family::Invitation.find_by!(token: params[:token])
|
|
end
|
|
end
|