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 initialized = false private def _is_initialized: Future[Boolean] = { if (initialized) Future.successful(true) else db.withCollection(User) { (users) => import org.mongodb.scala.model.Filters._ users.find(equal("isAdmin", true)).head() }.flatten.map({ (user) => initialized = user != null initialized }) } def initalizer() = Action.async { implicit request: Request[AnyContent] => _is_initialized map { case true => MovedPermanently(routes.ViewController.loader("").url) case false => Ok(views.html.initalizer()) } } // 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]]] => // First verify that we haven't already been initialized 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({ (_) => initialized = true; MovedPermanently(routes.ViewController.loader("").url) }) } def loader(s: String) = Action.async { implicit request: Request[AnyContent] => _is_initialized map { case true => Ok(views.html.viewLoader()) case false => TemporaryRedirect(routes.ViewController.initalizer().url) } } }