the-algorithm/tweetypie/server/src/main/scala/com/twitter/tweetypie/store/LimiterStore.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

42 lines
1.4 KiB
Scala

package com.twitter.tweetypie
package store
import com.twitter.tweetypie.backends.LimiterService
import com.twitter.tweetypie.thriftscala._
trait LimiterStore extends TweetStoreBase[LimiterStore] with InsertTweet.Store {
def wrap(w: TweetStore.Wrap): LimiterStore =
new TweetStoreWrapper(w, this) with LimiterStore with InsertTweet.StoreWrapper
}
object LimiterStore {
def apply(
incrementCreateSuccess: LimiterService.IncrementByOne,
incrementMediaTags: LimiterService.Increment
): LimiterStore =
new LimiterStore {
override val insertTweet: FutureEffect[InsertTweet.Event] =
FutureEffect[InsertTweet.Event] { event =>
Future.when(!event.dark) {
val userId = event.user.id
val contributorUserId: Option[UserId] = event.tweet.contributor.map(_.userId)
val mediaTags = getMediaTagMap(event.tweet)
val mediaTagCount = countDistinctUserMediaTags(mediaTags)
Future
.join(
incrementCreateSuccess(userId, contributorUserId),
incrementMediaTags(userId, contributorUserId, mediaTagCount)
)
.unit
}
}
}
def countDistinctUserMediaTags(mediaTags: Map[MediaId, Seq[MediaTag]]): Int =
mediaTags.values.flatten.toSeq
.collect { case MediaTag(MediaTagType.User, Some(userId), _, _) => userId }
.distinct
.size
}