package com.weEat.controllers import javax.inject._ import play.api.mvc._ import com.weEat.services.MongoDBService import com.weEat.models.User import scala.concurrent.Future import org.bson.types.ObjectId /** * This controller creates an `Action` to handle HTTP requests to the * application's home page. */ @Singleton class ViewController @Inject()( val controllerComponents: ControllerComponents, db: MongoDBService ) (implicit val webJarsUtil: org.webjars.play.WebJarsUtil ) extends BaseController { implicit val ec = scala.concurrent.ExecutionContext.global private var initalized = false def initalizer() = Action.async { implicit request: Request[AnyContent] => db.withCollection(User) { users => import org.mongodb.scala.model.Filters._ users.find(equal("isAdmin", true)).head() }.flatten.map { case null => Ok(views.html.initalizer()) case _ => initalized = true; MovedPermanently(routes.ViewController.loader("").url) } } // Basically everything about this function is a special case. // I don't like it, but it is unique among every other bit of functionality. def initalize() = Action.async(parse.formUrlEncoded) { implicit request: Request[Map[String, Seq[String]]] => db.withCollection(User) { users => import org.mongodb.scala.model.Filters._ import com.github.t3hnar.bcrypt.BCryptStrOps users.find(equal("isAdmin", true)).head().flatMap { case null => users.insertOne(User( new ObjectId, request.body("fname")(0), request.body("lname")(0), request.body("email")(0), request.body("password")(0).boundedBcrypt, isAdmin = true )).head() case existingAdmin => Future.successful(existingAdmin) } }.flatten.map({ _ => initalized = true; MovedPermanently(routes.ViewController.loader("").url) }) } def loader(s: String) = Action { implicit request: Request[AnyContent] => if (initalized) Ok(views.html.viewLoader()) else TemporaryRedirect(routes.ViewController.initalizer().url) } }