-
-
Notifications
You must be signed in to change notification settings - Fork 62
Expand file tree
/
Copy pathMembersSummariser.scala
More file actions
71 lines (60 loc) · 2.14 KB
/
Copy pathMembersSummariser.scala
File metadata and controls
71 lines (60 loc) · 2.14 KB
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package services.opencollective
import jakarta.inject.Singleton
import jakarta.inject.Inject
import org.apache.pekko.actor.ActorSystem
import com.google.inject.name.Named
import models.opencollective.FallbackMembers
import models.opencollective.OpenCollectiveMember
import org.slf4j.LoggerFactory
import scala.concurrent.ExecutionContext
import scala.concurrent.Future
import scala.concurrent.duration._
import scala.util.Failure
import scala.util.Success
trait MembersSummariser {
/**
* Fetch and summarise the members from OpenCollective.
*/
def fetchMembers: Future[Seq[OpenCollectiveMember]]
}
class DefaultMembersSummariser @Inject() (openCollective: OpenCollective)(using
ec: ExecutionContext,
) extends MembersSummariser {
def fetchMembers = {
for {
members <- openCollective.fetchMembers()
} yield {
val filteredMembers = members.filter(m =>
m.isActive && m.role == "BACKER" && m.name != "Guest" && m.totalAmountDonated >= 50,
) // Users with the name "Guest" don't even have a profile picture
filteredMembers.sortBy(_.totalAmountDonated).reverse
}
}
}
@Singleton
class CachingMembersSummariser @Inject() (
actorSystem: ActorSystem,
@Named("openCollectiveMembersSummariser") delegate: MembersSummariser,
)(using ec: ExecutionContext)
extends MembersSummariser {
private val log = LoggerFactory.getLogger(classOf[CachingMembersSummariser])
@volatile private var members: Seq[OpenCollectiveMember] = FallbackMembers.members
actorSystem.scheduler.scheduleWithFixedDelay(0.seconds, 24.hours)(() => {
delegate.fetchMembers.onComplete {
case Failure(t) => log.error("Unable to load members from OpenCollective", t)
case Success(ms) =>
if (members != ms) {
val count = members.size
log.info("Loaded {} members for OpenCollective", count)
}
members = ms
}
})
def fetchMembers = Future.successful(members)
}
/**
* For use "offline", ie in development, when you don't have access the OpenCollective APi
*/
class OfflineMembersSummariser extends MembersSummariser {
def fetchMembers = Future.successful(FallbackMembers.members)
}