@@ -15,14 +15,14 @@ def index
1515
1616 def show
1717 @invoice = invoice
18+ token_based_access = !integer_id? ( params [ :id ] )
19+
20+ # Authorize for authenticated access (integer ID), skip for token-based access
21+ authorize @invoice , :show? unless token_based_access
1822
1923 respond_to do |format |
2024 format . html
21- format . pdf do
22- render pdf : "Factuur #{ @invoice . human_id } " ,
23- template : 'invoices/show.html.erb' ,
24- lowquality : true
25- end
25+ format . pdf { render_invoice_pdf }
2626 end
2727 end
2828
@@ -42,6 +42,9 @@ def create
4242
4343 def pay # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
4444 @invoice = invoice
45+ token_based_access = !integer_id? ( params [ :id ] )
46+
47+ authorize @invoice , :pay? unless token_based_access
4548
4649 if @invoice . paid?
4750 redirect_to invoice_path params [ :id ]
@@ -73,14 +76,41 @@ def send_invoice
7376
7477 private
7578
79+ def integer_id? ( id )
80+ Integer ( id )
81+ true
82+ rescue ArgumentError
83+ false
84+ end
85+
7686 def invoice
7787 @invoice = Invoice . find ( Integer ( params [ :id ] ) )
78- authorize @invoice
7988 rescue ArgumentError
8089 @invoice = Invoice . find_by! ( token : params [ :id ] )
8190 end
8291
8392 def permitted_attributes
8493 params . require ( :invoice ) . permit ( %i[ user_id activity_id name_override email_override rows ] , rows_attributes : %i[ name amount price ] )
8594 end
95+
96+ def render_invoice_pdf # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
97+ token_based_access = !integer_id? ( params [ :id ] )
98+ authorize @invoice , :download? unless token_based_access
99+
100+ html = render_to_string (
101+ template : 'invoices/show' ,
102+ formats : [ :html ] ,
103+ layout : 'pdf'
104+ )
105+ pdf = Grover . new ( html ) . to_pdf
106+ send_data pdf , filename : "Factuur-#{ @invoice . human_id } .pdf" , type : 'application/pdf' , disposition : 'attachment'
107+ rescue StandardError => e
108+ Rails . logger . error "Failed to generate PDF for invoice #{ @invoice . id } : #{ e . message } "
109+ if request . format . pdf?
110+ render plain : 'Er is een fout opgetreden bij het genereren van de PDF. Probeer het later opnieuw.' , status : :internal_server_error
111+ else
112+ flash [ :error ] = 'Er is een fout opgetreden bij het genereren van de PDF. Probeer het later opnieuw.'
113+ redirect_to invoice_path ( @invoice )
114+ end
115+ end
86116end
0 commit comments