Migration.scala 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package com.weEat.migrations
  2. import org.mongodb.scala.MongoDatabase
  3. import scala.concurrent.{ExecutionContext,Future}
  4. import scala.util.{Success,Failure}
  5. import scala.io.Source
  6. import com.weEat.models._
  7. trait Migration {
  8. def execute(db: MongoDatabase): Future[Any]
  9. }
  10. object Migration {
  11. implicit val ec: ExecutionContext = ExecutionContext.global
  12. val migrations = Seq(
  13. InitDb,
  14. SeedNutrition,
  15. RestoreFromFile(Source.fromResource("db-seeds/nutrients.json"), Nutrient)
  16. //RestoreFromFile(Source.fromResource("db-seeds/usda-foods.json"), FoodNode)
  17. )
  18. def executeAll(db: MongoDatabase) = executeFutures(db, migrations)
  19. def updateToLatest(db: MongoDatabase) = {
  20. val collection = db.getCollection[Metadata](Metadata.collectionName)
  21. collection.find().first().headOption().map({
  22. case Some(Metadata(last)) =>
  23. executeFutures(db, migrations.slice(last + 1, migrations.size))
  24. case None => executeAll(db)
  25. }).flatten
  26. }
  27. private def executeFutures(db: MongoDatabase, seq: Seq[Migration]): Future[Any] =
  28. seq match {
  29. case head::tail => head.execute(db).transformWith({
  30. case Success(_) => executeFutures(db, tail)
  31. case Failure(e) => db.getCollection[Metadata](Metadata.collectionName)
  32. .insertOne(Metadata(migrations.size - seq.size)).head()
  33. .transform(_ => Failure(e))
  34. })
  35. case Nil => db.getCollection[Metadata](Metadata.collectionName)
  36. .insertOne(Metadata(migrations.size)).head()
  37. }
  38. }