migrate coach pictures to picfit

pull/9756/head
Thibault Duplessis 2021-09-08 09:42:51 +02:00
parent cece5c7e19
commit d6aea5367b
2 changed files with 71 additions and 4 deletions

View File

@ -0,0 +1,66 @@
package lila.coach
import scala.concurrent.duration._
import akka.stream.scaladsl._
import play.api.libs.Files
import play.api.mvc.MultipartFormData
import reactivemongo.akkastream.cursorProducer
import lila.common.LilaStream
import lila.db.dsl._
import lila.game.Pov
import lila.memo.PicfitApi
import akka.util.ByteString
final private class CoachPictureMigration(
coll: Coll,
picfitApi: PicfitApi,
imageRepo: lila.db.ImageRepo
)(implicit
ec: scala.concurrent.ExecutionContext,
mat: akka.stream.Materializer
) {
import BsonHandlers._
def apply() =
coll
.find($doc("picturePath" $exists true, "picture" $exists false))
.sort($sort desc "user.seenAt")
.cursor[Bdoc]()
.documentSource()
.throttle(20, 1 second)
.mapAsync(1)(migrate)
.via(lila.common.LilaStream.logRate[Unit]("coach.picfit.migration")(logger))
.toMat(LilaStream.sinkCount)(Keep.right)
.run()
.addEffect { count =>
println(s"$count coaches migrated")
}
.void
private def migrate(s: Bdoc): Funit = {
val coachId = s string "_id" err "missing id"
val picPath = s string "picturePath" err "missing picturePath"
val picId = picPath.split('/').headOption err "missing picId"
imageRepo.fetch(picId) flatMap {
case None =>
println(s"Missing picture for coach $coachId pic $picPath")
funit
case Some(pic) =>
val part: MultipartFormData.FilePart[Source[ByteString, _]] = MultipartFormData.FilePart(
key = "data",
filename = pic.name,
contentType = "image/jpeg".some,
ref = Source(ByteString.fromArray(pic.data) :: Nil),
fileSize = pic.size
)
picfitApi.uploadSource(s"coach:$coachId", part, coachId, monitor = false) flatMap { picture =>
coll.updateField($id(coachId), "picture", picture.id.value).void
}
} recover { case e: Exception =>
if (!e.getMessage.contains("Invalid file type: "))
logger.error(s"Can't migrate coach $coachId", e)
}
}
}

View File

@ -3,6 +3,7 @@ package lila.coach
import com.softwaremill.macwire._
import io.methvin.play.autoconfig._
import play.api.Configuration
import scala.concurrent.duration._
import lila.common.config._
import lila.security.Permission
@ -22,7 +23,7 @@ final class Env(
db: lila.db.Db,
picfitApi: lila.memo.PicfitApi,
imageRepo: lila.db.ImageRepo
)(implicit ec: scala.concurrent.ExecutionContext) {
)(implicit ec: scala.concurrent.ExecutionContext, system: akka.actor.ActorSystem) {
private val config = appConfig.get[CoachConfig]("coach")(AutoConfig.loader)
@ -61,7 +62,7 @@ final class Env(
}.unit
}
// system.scheduler.scheduleOnce(1 minute) {
// wire[StreamerPictureMigration]().unit
// }
system.scheduler.scheduleOnce(1 minute) {
wire[CoachPictureMigration]().unit
}
}