11package org .baeldung .web .schedule ;
22
3- import java .util .Arrays ;
43import java .util .Date ;
54import java .util .List ;
6- import java .util .concurrent .TimeUnit ;
75
86import org .baeldung .persistence .dao .PostRepository ;
97import org .baeldung .persistence .model .Post ;
10- import org .baeldung .persistence .model .User ;
11- import org .baeldung .reddit .util .RedditApiConstants ;
8+ import org .baeldung .persistence .service .RedditService ;
129import org .slf4j .Logger ;
1310import org .slf4j .LoggerFactory ;
1411import org .springframework .beans .factory .annotation .Autowired ;
15- import org .springframework .beans .factory .annotation .Qualifier ;
1612import org .springframework .scheduling .annotation .Scheduled ;
17- import org .springframework .security .authentication .UsernamePasswordAuthenticationToken ;
18- import org .springframework .security .core .authority .SimpleGrantedAuthority ;
19- import org .springframework .security .core .context .SecurityContextHolder ;
20- import org .springframework .security .oauth2 .client .OAuth2RestTemplate ;
21- import org .springframework .security .oauth2 .common .DefaultOAuth2AccessToken ;
22- import org .springframework .security .oauth2 .common .DefaultOAuth2RefreshToken ;
2313import org .springframework .stereotype .Component ;
24- import org .springframework .util .LinkedMultiValueMap ;
25- import org .springframework .util .MultiValueMap ;
26-
27- import com .fasterxml .jackson .databind .JsonNode ;
2814
2915@ Component
3016public class RedditScheduler {
3117
3218 @ Autowired
33- @ Qualifier ("schedulerRedditTemplate" )
34- private OAuth2RestTemplate redditRestTemplate ;
19+ private RedditService service ;
3520
3621 @ Autowired
3722 private PostRepository postReopsitory ;
@@ -43,7 +28,7 @@ public void schedulePosts() {
4328 final List <Post > posts = postReopsitory .findBySubmissionDateBeforeAndIsSent (new Date (), false );
4429 logger .info (posts .size () + " Posts in the queue." );
4530 for (final Post post : posts ) {
46- submitPost (post );
31+ service . submitPost (post );
4732 }
4833 }
4934
@@ -52,105 +37,8 @@ public void checkAndReSubmitPosts() {
5237 final List <Post > submitted = postReopsitory .findByRedditIDNotNullAndNoOfAttemptsGreaterThan (0 );
5338 logger .info (submitted .size () + " Posts to check their score" );
5439 for (final Post post : submitted ) {
55- checkAndReSubmit (post );
56- }
57- }
58-
59- private void submitPost (final Post post ) {
60- try {
61- submitPostInternal (post );
62- } catch (final Exception e ) {
63- logger .error ("Error occurred while submitting post " + post .toString (), e );
64- }
65- }
66-
67- private void submitPostInternal (final Post post ) {
68- final User user = post .getUser ();
69- final DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken (user .getAccessToken ());
70- token .setRefreshToken (new DefaultOAuth2RefreshToken ((user .getRefreshToken ())));
71- token .setExpiration (user .getTokenExpiration ());
72- redditRestTemplate .getOAuth2ClientContext ().setAccessToken (token );
73- //
74- final UsernamePasswordAuthenticationToken userAuthToken = new UsernamePasswordAuthenticationToken (user .getUsername (), token .getValue (), Arrays .asList (new SimpleGrantedAuthority ("ROLE_USER" )));
75- SecurityContextHolder .getContext ().setAuthentication (userAuthToken );
76- //
77- final MultiValueMap <String , String > param = new LinkedMultiValueMap <String , String >();
78- param .add (RedditApiConstants .TITLE , post .getTitle ());
79- param .add (RedditApiConstants .SR , post .getSubreddit ());
80- param .add (RedditApiConstants .URL , post .getUrl ());
81- param .add (RedditApiConstants .API_TYPE , "json" );
82- param .add (RedditApiConstants .KIND , "link" );
83- param .add (RedditApiConstants .RESUBMIT , "true" );
84- param .add (RedditApiConstants .THEN , "comments" );
85- if (post .isSendReplies ()) {
86- param .add (RedditApiConstants .SENDREPLIES , "true" );
87- }
88-
89- logger .info ("Submit link with these parameters: " + param .entrySet ());
90- final JsonNode node = redditRestTemplate .postForObject ("https://oauth.reddit.com/api/submit" , param , JsonNode .class );
91- parseResponse (node , post );
92- }
93-
94- private void parseResponse (JsonNode node , Post post ) {
95- final JsonNode errorNode = node .get ("json" ).get ("errors" ).get (0 );
96- if (errorNode == null ) {
97- post .setSent (true );
98- post .setSubmissionResponse ("Successfully sent" );
99- post .setRedditID (node .get ("json" ).get ("data" ).get ("id" ).asText ());
100- post .setNoOfAttempts (post .getNoOfAttempts () - 1 );
101- postReopsitory .save (post );
102- logger .info ("Successfully sent " + post .toString ());
103- } else {
104- post .setSubmissionResponse (errorNode .toString ());
105- postReopsitory .save (post );
106- logger .info ("Error occurred: " + errorNode .toString () + "while submitting post " + post .toString ());
40+ service .checkAndReSubmit (post );
10741 }
10842 }
10943
110- private int getPostScore (String redditId ) {
111- final JsonNode node = redditRestTemplate .getForObject ("https://oauth.reddit.com/api/info?id=t3_" + redditId , JsonNode .class );
112- logger .info (node .toString ());
113- final int score = node .get ("data" ).get ("children" ).get (0 ).get ("data" ).get ("score" ).asInt ();
114- logger .info ("post score = " + score );
115- return score ;
116- }
117-
118- private void deletePost (String redditId ) {
119- final MultiValueMap <String , String > param = new LinkedMultiValueMap <String , String >();
120- param .add ("id" , "t3_" + redditId );
121- final JsonNode node = redditRestTemplate .postForObject ("https://oauth.reddit.com/api/del.json" , param , JsonNode .class );
122- logger .info (node .toString ());
123- }
124-
125- private void checkAndReSubmit (Post post ) {
126- try {
127- checkAndReSubmitInternal (post );
128- } catch (final Exception e ) {
129- logger .error ("Error occurred while check post " + post .toString (), e );
130- }
131- }
132-
133- private void checkAndReSubmitInternal (Post post ) {
134- final long currentTime = new Date ().getTime ();
135- final long interval = currentTime - post .getSubmissionDate ().getTime ();
136- final long intervalInMinutes = TimeUnit .MINUTES .convert (interval , TimeUnit .MILLISECONDS );
137- if (intervalInMinutes > post .getTimeInterval ()) {
138- final int score = getPostScore (post .getRedditID ());
139- if (score < post .getMinScoreRequired ()) {
140- deletePost (post .getRedditID ());
141- post .setRedditID (null );
142- post .setSubmissionDate (new Date (currentTime + interval ));
143- post .setSent (false );
144- post .setSubmissionResponse ("Not sent yet" );
145- postReopsitory .save (post );
146- } else {
147- post .setNoOfAttempts (0 );
148- postReopsitory .save (post );
149- }
150- }
151- }
152-
153- public void setRedditRestTemplate (final OAuth2RestTemplate redditRestTemplate ) {
154- this .redditRestTemplate = redditRestTemplate ;
155- }
15644}
0 commit comments