0

J'ai un contrôleur qui a beaucoup de logique métier, je voudrais déplacer le code à l'intérieur Action.async bloc de code. Ce code fonctionne, comment puis-je passer à une autre classe (service) le code qui est à l'intérieur de la Action.async ?:play framework 2.5 déplacer Action.async logique du contrôleur au service

def tweetsnew(query: String) = Action.async { 
// Move From Here... 
credentials.map { 
    case (consumerKey, requestToken) => 
    ws.url("https://api.twitter.com/1.1/search/tweets.json") 
     .sign(OAuthCalculator(consumerKey, requestToken)) 
     .withQueryString("q" -> query) 
     .withQueryString("max_id" -> "833342796736167936") 
     .get().map { twitterResponse => 
     if (twitterResponse.status == 200) { 
     // Here There Are More Complex Logic 
     Ok("That is fine: "+twitterResponse.body) 
     } else { 
     throw new Exception(s"Could not retrieve tweets for $query query term") 
     } 
    } 
}.getOrElse { 
    Future.failed(new Exception("You did not correctly configure the Twitter credentials")) 
} 
//....To Here. To Another Class 
} 

J'ai vérifié le docummentation, quelque chose lié à create a Future[Result] mais je ne suis pas en mesure pour que la fonction renvoie le même type que celui attendu par Action.async.

+0

Merci @vdebegue c'est une bonne solution. Je voudrais proposer une autre solution. –

Répondre

1

Action.async attend un type de retour de Future[Result] vous devez donc créer une fonction qui renvoie une Future[Result]

Première étape, extraire votre code à une fonction:

object TwitterService { 
    def search(query: String, consumerKey: ConsumerKey, requestToken: RequestToken)(implicit ws: WSClient, ec: ExecutionContext): Future[Result] = { 
    // your code that make the ws call that returns Ok("...") 
    } 
} 

Ensuite, dans le contrôleur appeler votre fonction :

def tweetsnew(query: String) = Action.async { 
    credentials.map { 
    case (consumerKey, requestToken) => TwitterService.search(query, consumerKey, requestToken) 
    }.getOrElse { 
    // Better to send a bad request or a redirect instead of an Exception 
    Future.successful(BadRequest("Credentials not set")) 
    } 
} 
+0

Merci @vdebegue. Je voudrais proposer une autre solution. Pour créer un trait au service comme celui-ci: '@ImplementedBy (classof [Twitterfeed]) QueryTweets de trait { def queryByWord (requête: String): Future [Option [JsValue]] }' 2) la mise en œuvre du trait en service, même fichier: classe 'TwitterFeed @Inject() {étend QueryTweets // Un code complexe JSON.parse ("" "{" changeByObject ":" oui "}" "") Certains (aJsonResponse) } ' 3) Dans contrôleur: ' def tweetsnew (requête: String) = {Action.async queryTweets.queryByWord (requête) .flatMap { cas Certains (réponse) => { Future.success ful (Ok (réponse)) } } ' –

+1

Cela fonctionne aussi, cela dépend quand vous préférez injecter vos dépendances sur' WSClient' et 'ExecutionContext'. Votre chemin est plus "java-ish" – vdebergue