package com.weEat.migrations import org.mongodb.scala.MongoDatabase import com.mongodb.client.model._ import org.mongodb.scala.model.Filters._ import org.mongodb.scala.model.Field import org.mongodb.scala.bson.{BsonArray,BsonDocument} import com.weEat.shared.models.{FoodNodeId,RecipeNodeId} import com.weEat.models.{FoodNodeView,FoodNode,RecipeVersion} import scala.concurrent.ExecutionContext object RecipeVersionCollection extends Migration { implicit val ec: ExecutionContext = ExecutionContext.global private def typ = `type` _ def execute(db: MongoDatabase) = createRecipeVersionCollection(db) .flatMap((_) => createFoodView(db)) def createRecipeVersionCollection(db: MongoDatabase) = db.createCollection(RecipeVersion.collectionName).head().flatMap({ (_) => val foods = db.getCollection[RecipeNodeId](FoodNode.collectionName) foods.aggregate(Seq( Aggregates.`match`(equal("_t", "RecipeNodeId")), Aggregates.addFields(Field("vid", "$_id")), Aggregates.out(RecipeVersion.collectionName) )).head().flatMap({ (_) => val foods = db.getCollection[FoodNodeId](FoodNode.collectionName) foods.aggregate(Seq( Aggregates.`match`(equal("_t", "RecipeNodeId")), Aggregates.project(Projections.fields( Projections.include("_id", "uid", "name"), Projections.computed("headVid", "$_id"), Projections.computed("_t", "RecipeMetaNodeId") )), Aggregates.merge(FoodNode.collectionName) )) .head() }) }) def createFoodView(db: MongoDatabase) = db.createView( FoodNodeView.collectionName, FoodNode.collectionName, Seq( Aggregates.lookup( RecipeVersion.collectionName, "headVid", "_id", "recipe" ), Aggregates.addFields(Field("recipe._id", "$_id")), Aggregates.replaceRoot( BsonDocument(("$ifNull", BsonArray( BsonDocument(("$first", "$recipe")), "$$ROOT" ))) ), Aggregates.project(Projections.exclude("recipe")), ) ).head() }