the-algorithm/unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/tweetypie_event/BaseTweetypieTweetEventDelete.scala
twitter-team 617c8c787d Open-sourcing Unified User Actions
Unified User Action (UUA) is a centralized, real-time stream of user actions on Twitter, consumed by various product, ML, and marketing teams. UUA makes sure all internal teams consume the uniformed user actions data in an accurate and fast way.
2023-04-14 16:45:37 -05:00

147 lines
5.7 KiB
Scala

package com.twitter.unified_user_actions.adapter.tweetypie_event
import com.twitter.tweetypie.thriftscala.QuotedTweet
import com.twitter.tweetypie.thriftscala.Share
import com.twitter.tweetypie.thriftscala.TweetDeleteEvent
import com.twitter.tweetypie.thriftscala.TweetEventFlags
import com.twitter.unified_user_actions.adapter.common.AdapterUtils
import com.twitter.unified_user_actions.thriftscala.ActionType
import com.twitter.unified_user_actions.thriftscala.AuthorInfo
import com.twitter.unified_user_actions.thriftscala.EventMetadata
import com.twitter.unified_user_actions.thriftscala.Item
import com.twitter.unified_user_actions.thriftscala.SourceLineage
import com.twitter.unified_user_actions.thriftscala.TweetInfo
import com.twitter.unified_user_actions.thriftscala.UnifiedUserAction
import com.twitter.unified_user_actions.thriftscala.UserIdentifier
trait BaseTweetypieTweetEventDelete extends BaseTweetypieTweetEvent[TweetDeleteEvent] {
type ExtractedEvent
protected def actionType: ActionType
def getUnifiedUserAction(
tweetDeleteEvent: TweetDeleteEvent,
tweetEventFlags: TweetEventFlags
): Option[UnifiedUserAction] =
extract(tweetDeleteEvent).map { extractedEvent =>
UnifiedUserAction(
userIdentifier = getUserIdentifier(tweetDeleteEvent),
item = getItem(extractedEvent, tweetDeleteEvent),
actionType = actionType,
eventMetadata = getEventMetadata(tweetDeleteEvent, tweetEventFlags)
)
}
protected def extract(tweetDeleteEvent: TweetDeleteEvent): Option[ExtractedEvent]
protected def getItem(extractedEvent: ExtractedEvent, tweetDeleteEvent: TweetDeleteEvent): Item
protected def getUserIdentifier(tweetDeleteEvent: TweetDeleteEvent): UserIdentifier =
UserIdentifier(userId = tweetDeleteEvent.user.map(_.id))
protected def getEventMetadata(
tweetDeleteEvent: TweetDeleteEvent,
flags: TweetEventFlags
): EventMetadata =
EventMetadata(
sourceTimestampMs = flags.timestampMs,
receivedTimestampMs = AdapterUtils.currentTimestampMs,
sourceLineage = SourceLineage.ServerTweetypieEvents,
traceId = None, // Currently traceId is not stored in TweetDeleteEvent.
// UUA sets this to None since there is no request level language info.
language = None,
// UUA sets this to be consistent with IESource. For the definition,
// see https://sourcegraph.twitter.biz/git.twitter.biz/source/-/blob/src/thrift/com/twitter/tweetypie/tweet.thrift?L1001.
// The definition here conflicts with the intention of UUA to log the request country code
// rather than the signup / geo-tagging country.
countryCode = tweetDeleteEvent.tweet.place.flatMap(_.countryCode),
/* clientApplicationId is user's app id if the delete is initiated by a user,
* or auditor's app id if the delete is initiated by an auditor */
clientAppId = tweetDeleteEvent.audit.flatMap(_.clientApplicationId),
clientVersion = None // Currently clientVersion is not stored in TweetDeleteEvent.
)
}
object TweetypieDeleteEvent extends BaseTweetypieTweetEventDelete {
type ExtractedEvent = Long
override protected val actionType: ActionType = ActionType.ServerTweetDelete
override protected def extract(tweetDeleteEvent: TweetDeleteEvent): Option[Long] = Some(
tweetDeleteEvent.tweet.id)
protected def getItem(
tweetId: Long,
tweetDeleteEvent: TweetDeleteEvent
): Item =
Item.TweetInfo(
TweetInfo(
actionTweetId = tweetId,
actionTweetAuthorInfo =
Some(AuthorInfo(authorId = tweetDeleteEvent.tweet.coreData.map(_.userId)))
))
}
object TweetypieUnretweetEvent extends BaseTweetypieTweetEventDelete {
override protected val actionType: ActionType = ActionType.ServerTweetUnretweet
override type ExtractedEvent = Share
override protected def extract(tweetDeleteEvent: TweetDeleteEvent): Option[Share] =
tweetDeleteEvent.tweet.coreData.flatMap(_.share)
override protected def getItem(share: Share, tweetDeleteEvent: TweetDeleteEvent): Item =
Item.TweetInfo(
TweetInfo(
actionTweetId = share.sourceStatusId,
actionTweetAuthorInfo = Some(AuthorInfo(authorId = Some(share.sourceUserId))),
retweetingTweetId = Some(tweetDeleteEvent.tweet.id)
)
)
}
object TweetypieUnreplyEvent extends BaseTweetypieTweetEventDelete {
case class PredicateOutput(tweetId: Long, userId: Long)
override type ExtractedEvent = PredicateOutput
override protected val actionType: ActionType = ActionType.ServerTweetUnreply
override protected def extract(tweetDeleteEvent: TweetDeleteEvent): Option[PredicateOutput] =
tweetDeleteEvent.tweet.coreData
.flatMap(_.reply).flatMap(r =>
r.inReplyToStatusId.map(tweetId => PredicateOutput(tweetId, r.inReplyToUserId)))
override protected def getItem(
repliedTweet: PredicateOutput,
tweetDeleteEvent: TweetDeleteEvent
): Item = {
Item.TweetInfo(
TweetInfo(
actionTweetId = repliedTweet.tweetId,
actionTweetAuthorInfo = Some(AuthorInfo(authorId = Some(repliedTweet.userId))),
replyingTweetId = Some(tweetDeleteEvent.tweet.id)
)
)
}
}
object TweetypieUnquoteEvent extends BaseTweetypieTweetEventDelete {
override protected val actionType: ActionType = ActionType.ServerTweetUnquote
type ExtractedEvent = QuotedTweet
override protected def extract(tweetDeleteEvent: TweetDeleteEvent): Option[QuotedTweet] =
tweetDeleteEvent.tweet.quotedTweet
override protected def getItem(
quotedTweet: QuotedTweet,
tweetDeleteEvent: TweetDeleteEvent
): Item =
Item.TweetInfo(
TweetInfo(
actionTweetId = quotedTweet.tweetId,
actionTweetAuthorInfo = Some(AuthorInfo(authorId = Some(quotedTweet.userId))),
quotingTweetId = Some(tweetDeleteEvent.tweet.id)
)
)
}