120 lines
4.0 KiB
Scala
120 lines
4.0 KiB
Scala
package com.twitter.home_mixer.functional_component.decorator.urt.builder
|
|
|
|
import com.twitter.home_mixer.model.HomeFeatures.RealNamesFeature
|
|
import com.twitter.product_mixer.core.feature.featuremap.FeatureMap
|
|
import com.twitter.product_mixer.core.model.marshalling.response.urt.metadata._
|
|
import com.twitter.product_mixer.core.pipeline.PipelineQuery
|
|
import com.twitter.stringcenter.client.StringCenter
|
|
import com.twitter.stringcenter.client.core.ExternalString
|
|
|
|
private[decorator] case class SocialContextIdAndScreenName(
|
|
socialContextId: Long,
|
|
screenName: String)
|
|
|
|
object EngagerSocialContextBuilder {
|
|
private val UserIdRequestParamName = "user_id"
|
|
private val DirectInjectionContentSourceRequestParamName = "dis"
|
|
private val DirectInjectionIdRequestParamName = "diid"
|
|
private val DirectInjectionContentSourceSocialProofUsers = "socialproofusers"
|
|
private val SocialProofUrl = ""
|
|
}
|
|
|
|
case class EngagerSocialContextBuilder(
|
|
contextType: GeneralContextType,
|
|
stringCenter: StringCenter,
|
|
oneUserString: ExternalString,
|
|
twoUsersString: ExternalString,
|
|
moreUsersString: ExternalString,
|
|
timelineTitle: ExternalString) {
|
|
import EngagerSocialContextBuilder._
|
|
|
|
def apply(
|
|
socialContextIds: Seq[Long],
|
|
query: PipelineQuery,
|
|
candidateFeatures: FeatureMap
|
|
): Option[SocialContext] = {
|
|
val realNames = candidateFeatures.getOrElse(RealNamesFeature, Map.empty[Long, String])
|
|
val validSocialContextIdAndScreenNames = socialContextIds.flatMap { socialContextId =>
|
|
realNames
|
|
.get(socialContextId).map(screenName =>
|
|
SocialContextIdAndScreenName(socialContextId, screenName))
|
|
}
|
|
|
|
validSocialContextIdAndScreenNames match {
|
|
case Seq(user) =>
|
|
val socialContextString =
|
|
stringCenter.prepare(oneUserString, Map("user" -> user.screenName))
|
|
Some(mkOneUserSocialContext(socialContextString, user.socialContextId))
|
|
case Seq(firstUser, secondUser) =>
|
|
val socialContextString =
|
|
stringCenter
|
|
.prepare(
|
|
twoUsersString,
|
|
Map("user1" -> firstUser.screenName, "user2" -> secondUser.screenName))
|
|
Some(
|
|
mkManyUserSocialContext(
|
|
socialContextString,
|
|
query.getRequiredUserId,
|
|
validSocialContextIdAndScreenNames.map(_.socialContextId)))
|
|
|
|
case firstUser +: otherUsers =>
|
|
val otherUsersCount = otherUsers.size
|
|
val socialContextString =
|
|
stringCenter
|
|
.prepare(
|
|
moreUsersString,
|
|
Map("user" -> firstUser.screenName, "count" -> otherUsersCount))
|
|
Some(
|
|
mkManyUserSocialContext(
|
|
socialContextString,
|
|
query.getRequiredUserId,
|
|
validSocialContextIdAndScreenNames.map(_.socialContextId)))
|
|
case _ => None
|
|
}
|
|
}
|
|
|
|
private def mkOneUserSocialContext(socialContextString: String, userId: Long): GeneralContext = {
|
|
GeneralContext(
|
|
contextType = contextType,
|
|
text = socialContextString,
|
|
url = None,
|
|
contextImageUrls = None,
|
|
landingUrl = Some(
|
|
Url(
|
|
urlType = DeepLink,
|
|
url = "",
|
|
urtEndpointOptions = None
|
|
)
|
|
)
|
|
)
|
|
}
|
|
|
|
private def mkManyUserSocialContext(
|
|
socialContextString: String,
|
|
viewerId: Long,
|
|
socialContextIds: Seq[Long]
|
|
): GeneralContext = {
|
|
GeneralContext(
|
|
contextType = contextType,
|
|
text = socialContextString,
|
|
url = None,
|
|
contextImageUrls = None,
|
|
landingUrl = Some(
|
|
Url(
|
|
urlType = UrtEndpoint,
|
|
url = SocialProofUrl,
|
|
urtEndpointOptions = Some(UrtEndpointOptions(
|
|
requestParams = Some(Map(
|
|
UserIdRequestParamName -> viewerId.toString,
|
|
DirectInjectionContentSourceRequestParamName -> DirectInjectionContentSourceSocialProofUsers,
|
|
DirectInjectionIdRequestParamName -> socialContextIds.mkString(",")
|
|
)),
|
|
title = Some(stringCenter.prepare(timelineTitle)),
|
|
cacheId = None,
|
|
subtitle = None
|
|
))
|
|
))
|
|
)
|
|
}
|
|
}
|