Migration.scala 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. RecipeVersionCollection,
  17. //RestoreFromFile(Source.fromResource("db-seeds/usda-foods.json"), FoodNode),
  18. )
  19. def executeAll(db: MongoDatabase) = executeFutures(db, migrations).transform {
  20. case Failure(e) => throw e
  21. case Success(_) => Success(())
  22. }
  23. def updateToLatest(db: MongoDatabase) = {
  24. val collection = db.getCollection[Metadata](Metadata.collectionName)
  25. collection.find().first().headOption().map({
  26. case Some(Metadata(last)) =>
  27. executeFutures(db, migrations.slice(last, migrations.size))
  28. case None => executeAll(db)
  29. }).flatten
  30. }
  31. private def executeFutures(db: MongoDatabase, seq: Seq[Migration]): Future[Any] =
  32. seq match {
  33. case head::tail => head.execute(db).transformWith({
  34. case Success(_) => executeFutures(db, tail)
  35. case Failure(e) => db.getCollection[Metadata](Metadata.collectionName)
  36. .insertOne(Metadata(migrations.size - seq.size)).head()
  37. .transform(_ => Failure(e))
  38. })
  39. case Nil => db.getCollection[Metadata](Metadata.collectionName)
  40. .insertOne(Metadata(migrations.size)).head()
  41. }
  42. }