Don't send posts to social media multiple times

Check if a post has previously been sent to social media, by checking
the value of a `field_sent_to_social_media` field.

This field is hidden on the node add/edit forms, and populated when a
post is sent to social media. Once this happens, it will not be sent to
social media again.

This change also populates the field for all existing posts, so that
they won't be re-sent to social media either.
This commit is contained in:
Oliver Davies 2020-08-12 20:28:19 +01:00
parent 8761f9c4cc
commit 8385d6fef7
10 changed files with 114 additions and 2 deletions

View file

@ -7,6 +7,7 @@ dependencies:
- field.field.node.post.field_excerpt
- field.field.node.post.field_has_tweet
- field.field.node.post.field_images
- field.field.node.post.field_sent_to_social_media
- field.field.node.post.field_series
- field.field.node.post.field_tags
- node.type.post
@ -127,4 +128,5 @@ content:
region: content
settings: { }
third_party_settings: { }
hidden: { }
hidden:
field_sent_to_social_media: true

View file

@ -7,6 +7,7 @@ dependencies:
- field.field.node.post.field_excerpt
- field.field.node.post.field_has_tweet
- field.field.node.post.field_images
- field.field.node.post.field_sent_to_social_media
- field.field.node.post.field_series
- field.field.node.post.field_tags
- node.type.post
@ -25,6 +26,16 @@ content:
settings: { }
third_party_settings: { }
region: content
field_sent_to_social_media:
weight: 3
label: above
settings:
format: default
format_custom_false: ''
format_custom_true: ''
third_party_settings: { }
type: boolean
region: content
field_tags:
weight: 2
label: above

View file

@ -8,6 +8,7 @@ dependencies:
- field.field.node.post.field_excerpt
- field.field.node.post.field_has_tweet
- field.field.node.post.field_images
- field.field.node.post.field_sent_to_social_media
- field.field.node.post.field_series
- field.field.node.post.field_tags
- node.type.post
@ -34,5 +35,6 @@ hidden:
body: true
field_has_tweet: true
field_images: true
field_sent_to_social_media: true
field_series: true
field_tags: true

View file

@ -0,0 +1,23 @@
uuid: 4f639dd0-6634-43ea-89a8-141dfde87059
langcode: en
status: true
dependencies:
config:
- field.storage.node.field_sent_to_social_media
- node.type.post
id: node.post.field_sent_to_social_media
field_name: field_sent_to_social_media
entity_type: node
bundle: post
label: 'Sent to social media'
description: ''
required: false
translatable: false
default_value:
-
value: 0
default_value_callback: ''
settings:
on_label: 'On'
off_label: 'Off'
field_type: boolean

View file

@ -0,0 +1,18 @@
uuid: 2fead662-4d91-4788-b739-8e1a56d236af
langcode: en
status: true
dependencies:
module:
- node
id: node.field_sent_to_social_media
field_name: field_sent_to_social_media
entity_type: node
type: boolean
settings: { }
module: core
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

View file

@ -0,0 +1,17 @@
<?php
declare(strict_types=1);
use Drupal\custom\Repository\PostRepository;
/**
* Mark existing blog posts as sent to social media.
*/
function custom_update_8001(): void {
$posts = \Drupal::service(PostRepository::class)->getAll();
foreach ($posts as $post) {
$post->set('field_sent_to_social_media', TRUE);
$post->save();
}
}

View file

@ -7,5 +7,8 @@ services:
tags:
- { name: event_subscriber }
Drupal\custom\Repository\PostRepository:
autowire: true
Drupal\custom\Service\TalkCounter:
autowire: true

View file

@ -18,6 +18,10 @@ use Drupal\node\Entity\Node;
*/
class Post extends Node implements ContentEntityBundleInterface {
public function hasBeenSentToSocialMedia(): bool {
return (bool) $this->get('field_sent_to_social_media')->getString();
}
public function hasTweet(): bool {
return (bool) $this->get('field_has_tweet')->getString();
}

View file

@ -37,7 +37,10 @@ final class PushBlogPostToSocialMedia implements EventSubscriberInterface {
return;
}
// TODO: Check that the post has not already been pushed.
// If this post has already been sent to social media, do not send it again.
if ($entity->hasBeenSentToSocialMedia()) {
return;
}
$url = \Drupal::configFactory()->get('opdavies_talks.config')
->get('zapier_post_tweet_url');
@ -47,6 +50,8 @@ final class PushBlogPostToSocialMedia implements EventSubscriberInterface {
'message' => $entity->toTweet(),
],
]);
$entity->set('field_sent_to_social_media', TRUE);
}
}

View file

@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
namespace Drupal\custom\Repository;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Illuminate\Support\Collection;
final class PostRepository {
private EntityStorageInterface $nodeStorage;
public function __construct(EntityTypeManagerInterface $entityTypeManager) {
$this->nodeStorage = $entityTypeManager->getStorage('node');
}
public function getAll(): Collection {
return new Collection(
$this->nodeStorage->loadByProperties([
'type' => 'post',
])
);
}
}