the-algorithm/unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/tweetypie_event/BaseTweetypieTweetEventDele...

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)
)
)
}