clear team swiss cache

pull/6572/head
Thibault Duplessis 2020-05-07 15:29:26 -06:00
parent 5698d9e521
commit 963b2eb7c1
2 changed files with 29 additions and 23 deletions

View File

@ -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

View File

@ -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))
}
}