clear team swiss cache
parent
5698d9e521
commit
963b2eb7c1
|
@ -65,7 +65,8 @@ final class SwissApi(
|
|||
roundInterval = data.realRoundInterval
|
||||
)
|
||||
)
|
||||
colls.swiss.insert.one(swiss) inject swiss
|
||||
colls.swiss.insert.one(swiss) >>-
|
||||
cache.featuredInTeam.invalidate(swiss.teamId) inject swiss
|
||||
}
|
||||
|
||||
def update(old: Swiss, data: SwissForm.SwissData): Funit = {
|
||||
|
@ -132,7 +133,7 @@ final class SwissApi(
|
|||
}
|
||||
|
||||
def featuredInTeam(teamId: TeamID): Fu[List[Swiss]] =
|
||||
cache.featuredInTeamCache.get(teamId) flatMap { ids =>
|
||||
cache.featuredInTeam.get(teamId) flatMap { ids =>
|
||||
colls.swiss.byOrderedIds[Swiss, Swiss.Id](ids)(_.id)
|
||||
}
|
||||
|
||||
|
@ -296,7 +297,7 @@ final class SwissApi(
|
|||
if (swiss.isStarted) finish(swiss)
|
||||
else if (swiss.isCreated) destroy(swiss)
|
||||
else funit
|
||||
}
|
||||
} >>- cache.featuredInTeam.invalidate(swiss.teamId)
|
||||
|
||||
private[swiss] def startPendingRounds: Funit =
|
||||
colls.swiss.ext
|
||||
|
|
|
@ -22,25 +22,30 @@ final private class SwissCache(
|
|||
expireAfter = Syncache.ExpireAfterAccess(20 minutes)
|
||||
)
|
||||
|
||||
private[swiss] val featuredInTeamCache =
|
||||
cacheApi[TeamID, List[Swiss.Id]](256, "swiss.visibleByTeam") {
|
||||
_.expireAfterAccess(30 minutes)
|
||||
.buildAsyncFuture { teamId =>
|
||||
val max = 5
|
||||
for {
|
||||
enterable <- colls.swiss.primitive[Swiss.Id](
|
||||
$doc("teamId" -> teamId, "finishedAt" $exists false),
|
||||
$sort asc "startsAt",
|
||||
nb = max,
|
||||
"_id"
|
||||
)
|
||||
finished <- colls.swiss.primitive[Swiss.Id](
|
||||
$doc("teamId" -> teamId, "finishedAt" $exists true),
|
||||
$sort desc "startsAt",
|
||||
nb = max - enterable.size,
|
||||
"_id"
|
||||
)
|
||||
} yield enterable ::: finished
|
||||
}
|
||||
private[swiss] object featuredInTeam {
|
||||
private val compute = (teamId: TeamID) => {
|
||||
val max = 5
|
||||
for {
|
||||
enterable <- colls.swiss.primitive[Swiss.Id](
|
||||
$doc("teamId" -> teamId, "finishedAt" $exists false),
|
||||
$sort asc "startsAt",
|
||||
nb = max,
|
||||
"_id"
|
||||
)
|
||||
finished <- colls.swiss.primitive[Swiss.Id](
|
||||
$doc("teamId" -> teamId, "finishedAt" $exists true),
|
||||
$sort desc "startsAt",
|
||||
nb = max - enterable.size,
|
||||
"_id"
|
||||
)
|
||||
} yield enterable ::: finished
|
||||
}
|
||||
private val cache = cacheApi[TeamID, List[Swiss.Id]](256, "swiss.visibleByTeam") {
|
||||
_.expireAfterAccess(30 minutes)
|
||||
.buildAsyncFuture(compute)
|
||||
}
|
||||
|
||||
def get(teamId: TeamID) = cache get teamId
|
||||
def invalidate(teamId: TeamID) = cache.put(teamId, compute(teamId))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue