Module: Moderate::Moderation

Extended by:
ActiveSupport::Concern
Defined in:
app/controllers/concerns/moderate/moderation.rb

Overview

Drop-in admin moderation actions for a host’s admin controller (BYOUI).

class Admin::ReportsController < ApplicationController
  include Moderate::Moderation   # resolve/dismiss (+ uphold/reject) actions
  before_action :require_admin   # you bring auth
end

‘moderate` deliberately ships NO admin UI — Trust & Safety chrome (branding, auth, layout) is the part every app wants to own. What it DOES own is the decision logic: every status change must go through the model’s atomic decision method (‘resolve!`/`dismiss!`/`uphold!`/`reject!`) so content removal, bans, the notify/audit hooks, the DSA Art. 17 statement-of-reasons, and the Art. 20 appeal window all happen together-or-not-at-all. This concern is the thin HTTP glue that calls those methods, so a host gets the standard wiring for free and never hand-rolls a raw `status = “…”` update (which would skip every one of those guarantees). See docs/madmin.md.

The actions assume ‘@record` is already loaded (madmin’s ResourceController and most admin frameworks set it from the member route). If yours doesn’t, override ‘moderation_record` below.

Instance Method Summary collapse

Instance Method Details

#dismissObject

Dismiss (action) a report/flag: no violation found. Note still required.



48
49
50
51
52
53
54
# File 'app/controllers/concerns/moderate/moderation.rb', line 48

def dismiss
  record = moderation_record
  record.dismiss!(by: moderation_actor, note: moderation_note)
  redirect_after_moderation(record, notice: moderation_t(:dismissed))
rescue => error
  redirect_after_moderation(record, alert: moderation_error(:dismiss, error))
end

#rejectObject



69
70
71
72
73
74
75
# File 'app/controllers/concerns/moderate/moderation.rb', line 69

def reject
  record = moderation_record
  record.reject!(by: moderation_actor, note: moderation_note)
  redirect_after_moderation(record, notice: moderation_t(:rejected))
rescue => error
  redirect_after_moderation(record, alert: moderation_error(:reject, error))
end

#resolveObject

Resolve (action) a report/flag: optionally remove the offending content and/or ban the responsible user, always with a moderator + a note.

‘remove_content`/`ban_user` come from the form as checkboxes (“1”/“0”); the model casts them, but we pass them through untouched so the model stays the one place that interprets them. `note` is required by the model (it feeds the statement of reasons) — we let the model raise and turn that into a flash.



39
40
41
42
43
44
45
# File 'app/controllers/concerns/moderate/moderation.rb', line 39

def resolve
  record = moderation_record
  record.resolve!(**moderation_decision_params)
  redirect_after_moderation(record, notice: moderation_t(:resolved))
rescue => error
  redirect_after_moderation(record, alert: moderation_error(:resolve, error))
end

#upholdObject

— Appeal decisions (DSA Art. 20) ————————————– An appeal is a free, electronic, human-decided internal complaint against a decision. ‘uphold!` OVERTURNS the original decision; `reject!` CONFIRMS it. eur-lex.europa.eu/eli/reg/2022/2065/oj (Article 20)



61
62
63
64
65
66
67
# File 'app/controllers/concerns/moderate/moderation.rb', line 61

def uphold
  record = moderation_record
  record.uphold!(by: moderation_actor, note: moderation_note)
  redirect_after_moderation(record, notice: moderation_t(:upheld))
rescue => error
  redirect_after_moderation(record, alert: moderation_error(:uphold, error))
end