Modération et expiration
phil/listingsModération avant ou après publication
Le moderation d'un genre vaut Moderation::BeforePublication ou Moderation::AfterPublication.
- Avant publication :
submit()envoie une annonce àpending_review, et personne d'autre ne la voit jusqu'à ce qu'un modérateur appelleapprove(), qui la publie, oureject(), qui la renvoie à son auteur avec unModerationReason. Une annonce publiée que son auteur modifie retourne àpending_review, en gardant son expiration. - Après publication :
submit()publie une annonce tout de suite. Les membres signalent ce qui ne devrait pas s'y trouver.
Un modérateur peut retirer pour de bon, avec remove(), une annonce en attente, publiée, masquée ou expirée, avec son
motif. Les motifs sont des clés (spam, off_topic, unsafe) que l'application traduit et liste.
Signalements
report($policy, $reporter, $at) compte le signalement d'un membre sur une annonce visible ; l'auteur ne peut pas
signaler la sienne, et une annonce qui n'est pas visible ne peut pas être signalée. Le second signalement d'un même
membre ne change rien. Le signalement qui porte le nombre de signaleurs distincts au reportsToHide du genre rend
l'annonce hidden, quel que soit le genre de modération : elle quitte l'affichage jusqu'à ce qu'un modérateur la
restaure avec approve(), qui efface les signalements et garde son expiration tant que celle-ci est à venir, ou la
retire avec remove().
Les signalements eux-mêmes (leur motif, leur texte, la file qu'un modérateur consulte) appartiennent à l'application, ou à un bundle de modération : l'annonce compte les signaleurs dont elle a besoin pour décider quand se masquer.
Expiration
Une annonce est publiée pendant les lifetimeDays du genre à partir de sa publication ; une fois expiresAt dépassé,
isVisibleAt() est faux. at($at) change une annonce publiée dont l'expiration est passée en annonce expirée, pour un
planificateur qui tient les statuts à jour ; une annonce expirée garde tout le reste.
Rappels
needsReminderAt($policy, $at) est vrai quand l'auteur devrait recevoir un rappel pour prolonger : l'annonce est
visible, elle peut encore être prolongée, $at se trouve dans les reminderDays du genre avant son expiration, et
aucun rappel n'a été envoyé depuis sa dernière prolongation. L'application envoie le rappel, une notification qui porte
l'identifiant de l'annonce, puis enregistre markReminded($at). Un genre avec reminderDays: 0 n'envoie jamais de
rappel. Dans cette esquisse, $store est le stockage des annonces de l'application et RemindToExtend son message :
foreach ($store->publishedExpiringBefore($now->modify('+7 days')) as $listing) {
if ($listing->needsReminderAt($policies->get($listing->kind), $now)) {
$bus->dispatch(new RemindToExtend($listing->id->value));
$store->save($listing->markReminded($now));
}
}
Prolongations
extend($policy, $at) ajoute les extensionDays du genre à une annonce publiée ou expirée, comptés à partir de son
expiration ou de $at, selon la date la plus tardive : une prolongation hâtive ne perd aucun jour, une prolongation
tardive part d'aujourd'hui. Une annonce expirée est publiée de nouveau. Chaque prolongation compte dans le
maxExtensions du genre ; au-delà, extend() lance ForbiddenTransition, et l'auteur rédige une nouvelle annonce. Le
rappel redevient dû avant la nouvelle expiration.