11module Admin
22 class MeetingsController < BaseController
3+ rate_limit to : 5 , within : 1 . minute , only : %i[ create import_minutes auto_tag ] , with : -> { redirect_back fallback_location : admin_meetings_path , alert : "Too many requests. Please wait a moment." }
4+
35 def index
46 @meetings = Meeting . includes ( agenda_versions : { agenda_sections : :agenda_items } ) . chronological
57 end
@@ -48,6 +50,7 @@ def create
4850 service = AgendaImportService . new ( data ) . call
4951
5052 if service . success?
53+ audit ( "agenda.import" , target : service . meeting , metadata : { version : service . agenda_version . version_number } )
5154 notice = if service . new_version?
5255 "New version (v#{ service . agenda_version . version_number } ) added for this meeting."
5356 else
@@ -98,6 +101,7 @@ def apply_agenda
98101 Rails . cache . delete ( cache_key )
99102
100103 if service . success?
104+ audit ( "agenda.apply_changes" , target : @meeting , metadata : { changes_applied : accepted . size } )
101105 redirect_to admin_meeting_path ( @meeting ) , notice : "#{ accepted . size } change(s) applied successfully."
102106 else
103107 redirect_to admin_meeting_path ( @meeting ) , alert : service . errors . join ( ", " )
@@ -129,6 +133,7 @@ def import_minutes
129133 service = MinutesImportService . new ( data ) . call
130134
131135 if service . success?
136+ audit ( "minutes.import" , target : @meeting )
132137 notice = "Minutes imported successfully."
133138 notice += " Warnings: #{ service . warnings . join ( '; ' ) } " if service . warnings . any?
134139 redirect_to admin_meeting_path ( @meeting ) , notice : notice
@@ -147,6 +152,7 @@ def delete_minutes
147152 end
148153 end
149154
155+ audit ( "minutes.delete" , target : @meeting )
150156 redirect_to admin_meeting_path ( @meeting ) , notice : "Minutes data deleted."
151157 end
152158
@@ -155,9 +161,11 @@ def publish
155161 @agenda_version = @meeting . agenda_versions . find ( params [ :version_id ] )
156162 if @agenda_version . published?
157163 @agenda_version . unpublish!
164+ audit ( "agenda.unpublish" , target : @meeting , metadata : { version : @agenda_version . version_number } )
158165 redirect_to admin_meeting_path ( @meeting ) , notice : "Version #{ @agenda_version . version_number } unpublished."
159166 else
160167 @agenda_version . publish!
168+ audit ( "agenda.publish" , target : @meeting , metadata : { version : @agenda_version . version_number } )
161169 redirect_to admin_meeting_path ( @meeting ) , notice : "Version #{ @agenda_version . version_number } published."
162170 end
163171 end
@@ -170,12 +178,14 @@ def auto_tag
170178 AutoTaggingService . new ( items ) . call
171179
172180 tagged_count = items . count { |i | i . tags . reload . any? }
181+ audit ( "meeting.auto_tag" , target : @meeting , metadata : { tagged : tagged_count , total : items . size } )
173182 redirect_to admin_meeting_path ( @meeting ) ,
174183 notice : "Auto-tagged #{ tagged_count } of #{ items . size } items."
175184 end
176185
177186 def destroy
178187 @meeting = Meeting . find ( params [ :id ] )
188+ audit ( "meeting.destroy" , target : @meeting , metadata : { date : @meeting . date . to_s } )
179189 @meeting . destroy!
180190 redirect_to admin_meetings_path , notice : "Meeting deleted."
181191 end
0 commit comments