1010import org .slf4j .Logger ;
1111import org .slf4j .LoggerFactory ;
1212import org .springframework .stereotype .Component ;
13+ import org .togglz .core .manager .FeatureManager ;
1314
1415import com .mastercloudapps .twitterscheduler .application .model .operation .PublishPendingTweetOnDemandOperation ;
1516import com .mastercloudapps .twitterscheduler .application .model .scheduler .SchedulerConfiguration ;
1617import com .mastercloudapps .twitterscheduler .application .model .twitter .PublishTweetRequest ;
18+ import com .mastercloudapps .twitterscheduler .application .model .twitter .PublishTweetResponse ;
1719import com .mastercloudapps .twitterscheduler .application .service .twitter .TwitterService ;
1820import com .mastercloudapps .twitterscheduler .application .usecase .PublishPendingTweetOnDemandUseCase ;
1921import com .mastercloudapps .twitterscheduler .application .usecase .PublishPendingTweetsUseCase ;
22+ import com .mastercloudapps .twitterscheduler .configuration .featureflags .Features ;
2023import com .mastercloudapps .twitterscheduler .domain .pending .PendingTweet ;
2124import com .mastercloudapps .twitterscheduler .domain .pending .PendingTweetPort ;
2225import com .mastercloudapps .twitterscheduler .domain .shared .NullableInstant ;
2326import com .mastercloudapps .twitterscheduler .domain .tweet .PublicationType ;
2427import com .mastercloudapps .twitterscheduler .domain .tweet .Tweet ;
28+ import com .mastercloudapps .twitterscheduler .domain .tweet .TweetImage ;
2529import com .mastercloudapps .twitterscheduler .domain .tweet .TweetPort ;
2630
2731@ Component
@@ -36,15 +40,18 @@ public class PublisherService implements PublishPendingTweetsUseCase, PublishPen
3640 private PendingTweetPort pendingTweetPort ;
3741
3842 private TweetPort tweetPort ;
43+
44+ private FeatureManager featureManager ;
3945
4046 public PublisherService (final SchedulerConfiguration schedulerConfiguration ,
4147 final TwitterService twitterService , final PendingTweetPort pendingTweetPort ,
42- final TweetPort tweetPort ) {
48+ final TweetPort tweetPort , final FeatureManager featureManager ) {
4349
4450 this .schedulerConfiguration = schedulerConfiguration ;
4551 this .twitterService = twitterService ;
4652 this .pendingTweetPort = pendingTweetPort ;
4753 this .tweetPort = tweetPort ;
54+ this .featureManager = featureManager ;
4855 }
4956
5057 @ Override
@@ -59,25 +66,18 @@ public void publishPending() {
5966 logger .info ("Recovered " + pendingTweets .size () + " pending tweets to publish" );
6067
6168 pendingTweets .forEach (pending -> {
62-
63- final var publishedTweet = twitterService .publish (PublishTweetRequest .builder ()
64- .message (pending .message ().message ())
65- .build ());
69+
70+ final var publishedTweet = twitterService .publish (this .buildPublishTweetRequest (pending ));
6671
6772 logger .info ("Successful scheduled publication for pending tweet with id = " + pending .id ().id ());
73+
6874 publishedTweet .ifPresent (published -> {
6975
7076 pendingTweetPort .delete (pending .id ().id ());
71-
72- tweetPort .create (Tweet .builder ()
73- .id (published .getId ())
74- .message (published .getMessage ())
75- .url (published .getUrl ())
76- .requestedPublicationDate (pending .publicationDate ().instant ())
77- .publishedAt (published .getPublishedAt ())
78- .createdAt (NullableInstant .now ().instant ())
79- .publicationType (PublicationType .SCHEDULED )
80- .build ());
77+
78+ tweetPort .create (this
79+ .buildTweet (publishedTweet .get (), pending , PublicationType .SCHEDULED ));
80+
8181 });
8282 });
8383 }
@@ -90,29 +90,66 @@ public Optional<Tweet> publishImmediatly(PublishPendingTweetOnDemandOperation op
9090 if (pending .isPresent ()) {
9191
9292 logger .info ("Found pending tweet with id = " + pending .get ().id () + " to publish on demand" );
93- final var publishedTweet = twitterService .publish (PublishTweetRequest .builder ()
94- .message (pending .get ().message ().message ())
95- .build ());
93+
94+ final var publishedTweet = twitterService .publish (this .buildPublishTweetRequest (pending .get ()));
9695
97- logger .info ("Successful on demand publication for pending tweet with id = " + pending .get ().id ().id ());
9896 if (publishedTweet .isPresent ()) {
99-
97+
98+ logger .info ("Successful on demand publication for pending tweet with id = " + pending .get ().id ().id ()
99+ + "tweetId is " + publishedTweet .get ().getId ());
100+
100101 pendingTweetPort .delete (pending .get ().id ().id ());
101102
102- final var tweet = tweetPort .create (Tweet .builder ()
103- .id (publishedTweet .get ().getId ())
104- .message (publishedTweet .get ().getMessage ())
105- .url (publishedTweet .get ().getUrl ())
106- .requestedPublicationDate (pending .get ().publicationDate ().instant ())
107- .publishedAt (publishedTweet .get ().getPublishedAt ())
108- .createdAt (NullableInstant .now ().instant ())
109- .publicationType (PublicationType .ON_DEMAND )
110- .build ());
103+ final var tweet = tweetPort .create (this
104+ .buildTweet (publishedTweet .get (), pending .get (), PublicationType .ON_DEMAND ));
111105
112106 return Optional .of (tweet );
113107 }
114108 }
115109 return Optional .empty ();
116110 }
111+
112+ private PublishTweetRequest buildPublishTweetRequest (PendingTweet pendingTweet ) {
113+
114+ final var builder = PublishTweetRequest .builder ()
115+ .message (pendingTweet .message ().message ());
116+
117+ if (featureManager .isActive (Features .TWEETS_WITH_IMAGES )) {
118+ Optional .ofNullable (pendingTweet .getImages ())
119+ .ifPresent (images -> {
120+ builder .images (images .stream ()
121+ .map (image -> image .url ().url ())
122+ .collect (Collectors .toList ()));
123+ });
124+ }
125+
126+ return builder .build ();
127+ }
128+
129+ private Tweet buildTweet (PublishTweetResponse publishTweetResponse , PendingTweet pendingTweet , PublicationType publicationType ) {
130+
131+ final var builder = Tweet .builder ()
132+ .id (publishTweetResponse .getId ())
133+ .message (publishTweetResponse .getMessage ())
134+ .url (publishTweetResponse .getUrl ())
135+ .requestedPublicationDate (pendingTweet .publicationDate ().instant ())
136+ .publishedAt (publishTweetResponse .getPublishedAt ())
137+ .createdAt (NullableInstant .now ().instant ())
138+ .publicationType (publicationType );
139+
140+ if (!publishTweetResponse .getImages ().isEmpty ()) {
141+ builder .images (publishTweetResponse .getImages ().stream ()
142+ .map (image -> TweetImage .builder ()
143+ .id (image .getId ())
144+ .size (image .getSize ())
145+ .type (image .getType ())
146+ .width (image .getWidth ())
147+ .height (image .getHeight ())
148+ .build ())
149+ .collect (Collectors .toList ()));
150+ }
151+
152+ return builder .build ();
153+ }
117154
118155}
0 commit comments