147 lines
5.7 KiB
Scala
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)
|
|
)
|
|
)
|
|
}
|