-
Notifications
You must be signed in to change notification settings - Fork 12.2k
/
ReplyScreenNameHydrator.scala
33 lines (26 loc) · 1.16 KB
/
ReplyScreenNameHydrator.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.twitter.tweetypie
package hydrator
import com.twitter.stitch.NotFound
import com.twitter.tweetypie.core._
import com.twitter.tweetypie.repository._
import com.twitter.tweetypie.thriftscala._
object ReplyScreenNameHydrator {
import TweetLenses.Reply.{inReplyToScreenName => screenNameLens}
type Type = ValueHydrator[Option[Reply], TweetCtx]
val hydratedField: FieldByPath =
fieldByPath(Tweet.CoreDataField, TweetCoreData.ReplyField, Reply.InReplyToScreenNameField)
def once(h: ValueHydrator[Option[Reply], TweetCtx]): Type =
TweetHydration.completeOnlyOnce(
hydrationType = HydrationType.ReplyScreenName,
hydrator = h
)
def apply[C](repo: UserIdentityRepository.Type): ValueHydrator[Option[Reply], C] =
ValueHydrator[Reply, C] { (reply, ctx) =>
val key = UserKey(reply.inReplyToUserId)
repo(key).liftToTry.map {
case Return(user) => ValueState.modified(screenNameLens.set(reply, Some(user.screenName)))
case Throw(NotFound) => ValueState.unmodified(reply)
case Throw(_) => ValueState.partial(reply, hydratedField)
}
}.onlyIf((reply, _) => screenNameLens.get(reply).isEmpty).liftOption
}