the-algorithm/tweetypie/server/src/main/scala/com/twitter/tweetypie/handler/GetTweetCountsHandler.scala
twitter-team 01dbfee4c0 Open-sourcing Tweetypie
Tweetypie is the core Tweet service that handles the reading and writing of Tweet data.
2023-05-19 16:20:06 -05:00

45 lines
1.6 KiB
Scala

package com.twitter.tweetypie
package handler
import com.twitter.servo.util.FutureArrow
import com.twitter.stitch.Stitch
import com.twitter.tweetypie.repository._
import com.twitter.tweetypie.thriftscala._
/**
* Handler for the `getTweetCounts` endpoint.
*/
object GetTweetCountsHandler {
type Type = FutureArrow[GetTweetCountsRequest, Seq[GetTweetCountsResult]]
def apply(repo: TweetCountsRepository.Type): Type = {
def idToResult(id: TweetId, req: GetTweetCountsRequest): Stitch[GetTweetCountsResult] =
Stitch
.join(
// .liftToOption() converts any failures to None result
if (req.includeRetweetCount) repo(RetweetsKey(id)).liftToOption() else Stitch.None,
if (req.includeReplyCount) repo(RepliesKey(id)).liftToOption() else Stitch.None,
if (req.includeFavoriteCount) repo(FavsKey(id)).liftToOption() else Stitch.None,
if (req.includeQuoteCount) repo(QuotesKey(id)).liftToOption() else Stitch.None,
if (req.includeBookmarkCount) repo(BookmarksKey(id)).liftToOption() else Stitch.None
).map {
case (retweetCount, replyCount, favoriteCount, quoteCount, bookmarkCount) =>
GetTweetCountsResult(
tweetId = id,
retweetCount = retweetCount,
replyCount = replyCount,
favoriteCount = favoriteCount,
quoteCount = quoteCount,
bookmarkCount = bookmarkCount
)
}
FutureArrow[GetTweetCountsRequest, Seq[GetTweetCountsResult]] { request =>
Stitch.run(
Stitch.traverse(request.tweetIds)(idToResult(_, request))
)
}
}
}