fix and restore activity truncation

crosstable3
Thibault Duplessis 2021-09-18 14:40:27 +02:00
parent 80c336fbe8
commit 3367eec955
2 changed files with 19 additions and 9 deletions

View File

@ -1,5 +1,7 @@
package lila.activity
import reactivemongo.api.bson._
import lila.db.AsyncCollFailingSilently
import lila.db.dsl._
import lila.game.Game
@ -152,9 +154,9 @@ final class ActivityWriteApi(
!setters.isEmpty ?? {
coll.update
.one($id(activity.id), $set(setters), upsert = true)
// .flatMap {
// _.upserted.nonEmpty ?? truncateAfterInserting(coll, activity.id)
// }
.flatMap {
_.upserted.nonEmpty ?? truncateAfterInserting(coll, activity.id)
}
.void
}
}
@ -170,8 +172,16 @@ final class ActivityWriteApi(
.one[Bdoc]
.flatMap {
_.flatMap(_.getAsOpt[Activity.Id]("_id")) ?? { oldId =>
coll.delete.one($doc("_id" $lte oldId)).void
coll.delete
.one(
$doc(
"_id" -> $doc(
"$lte" -> oldId,
"$regex" -> BSONRegex(s"^${id.userId}$idSep", "")
)
)
)
.void
}
}
}

View File

@ -19,18 +19,18 @@ private object BSONHandlers {
import activities._
import model._
def regexId(userId: User.ID): Bdoc = "_id" $startsWith s"$userId:"
val idSep = ':'
def regexId(userId: User.ID): Bdoc = "_id" $startsWith s"$userId$idSep"
implicit lazy val activityIdHandler = {
val sep = ':'
tryHandler[Id](
{ case BSONString(v) =>
v split sep match {
v split idSep match {
case Array(userId, dayStr) => Success(Id(userId, Day(Integer.parseInt(dayStr))))
case _ => handlerBadValue(s"Invalid activity id $v")
}
},
id => BSONString(s"${id.userId}$sep${id.day.value}")
id => BSONString(s"${id.userId}$idSep${id.day.value}")
)
}