Class: Moderate::Services::ResolveAppeal
- Inherits:
-
Object
- Object
- Moderate::Services::ResolveAppeal
- Defined in:
- lib/moderate/services/resolve_appeal.rb
Overview
ResolveAppeal — the human decision on a DSA Article 20 appeal, behind
appeal.uphold! / appeal.reject!.
Art. 20 demands appeals be decided "in a timely, non-discriminatory, diligent
and non-arbitrary manner" and crucially "NOT SOLELY ON THE BASIS OF AUTOMATED
MEANS." That last clause is why there is no auto-decide path here at all:
uphold!/reject! REQUIRE a by: moderator and a note: — a human and a
reason — and the model column for the moderator (resolved_by) makes the human
decider part of the permanent record.
See: https://eur-lex.europa.eu/eli/reg/2022/2065/oj (Article 20).
Same atomic discipline as ResolveReport: the transition runs under a row lock,
re-checks open? inside the lock (so two moderators can't both decide the same
appeal), and the notification happens after the lock releases.
NOTE on enforcement: upholding an appeal means the ORIGINAL decision was wrong
and should be reversed (Art. 20 outcomes must be acted on). Reversal is
host-specific — re-publishing content, lifting a ban — and the gem can't know
how to undo an arbitrary host action. So this service records the upheld
outcome and emits appeal_decision; the host wires the actual reversal off
that event (or off its audit hook). We document this rather than pretend a
generic "un-remove" exists.
Instance Method Summary collapse
-
#initialize(appeal, by:) ⇒ ResolveAppeal
constructor
A new instance of ResolveAppeal.
- #reject!(note:) ⇒ Object
- #uphold!(note:) ⇒ Object
Constructor Details
#initialize(appeal, by:) ⇒ ResolveAppeal
Returns a new instance of ResolveAppeal.
28 29 30 31 |
# File 'lib/moderate/services/resolve_appeal.rb', line 28 def initialize(appeal, by:) @appeal = appeal @moderator = by end |
Instance Method Details
#reject!(note:) ⇒ Object
37 38 39 |
# File 'lib/moderate/services/resolve_appeal.rb', line 37 def reject!(note:) transition!("rejected", note) end |
#uphold!(note:) ⇒ Object
33 34 35 |
# File 'lib/moderate/services/resolve_appeal.rb', line 33 def uphold!(note:) transition!("upheld", note) end |