ViewController.scala 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package com.weEat.controllers
  2. import javax.inject._
  3. import play.api.mvc._
  4. import com.weEat.services.MongoDBService
  5. import com.weEat.models.User
  6. import scala.concurrent.Future
  7. import org.bson.types.ObjectId
  8. /**
  9. * This controller creates an `Action` to handle HTTP requests to the
  10. * application's home page.
  11. */
  12. @Singleton
  13. class ViewController @Inject()(
  14. val controllerComponents: ControllerComponents,
  15. db: MongoDBService
  16. ) (implicit
  17. val webJarsUtil: org.webjars.play.WebJarsUtil
  18. ) extends BaseController {
  19. implicit val ec = scala.concurrent.ExecutionContext.global
  20. private var initialized = false
  21. private def _is_initialized: Future[Boolean] = {
  22. if (initialized) Future.successful(true)
  23. else db.withCollection(User) { (users) =>
  24. import org.mongodb.scala.model.Filters._
  25. users.find(equal("isAdmin", true)).head()
  26. }.flatten.map({ (user) =>
  27. initialized = user != null
  28. initialized
  29. })
  30. }
  31. def initalizer() = Action.async { implicit request: Request[AnyContent] =>
  32. _is_initialized map {
  33. case true => MovedPermanently(routes.ViewController.loader("").url)
  34. case false => Ok(views.html.initalizer())
  35. }
  36. }
  37. // Basically everything about this function is a special case.
  38. // I don't like it, but it is unique among every other bit of functionality.
  39. def initalize() = Action.async(parse.formUrlEncoded) {
  40. implicit request: Request[Map[String, Seq[String]]] =>
  41. // First verify that we haven't already been initialized
  42. db.withCollection(User) { (users) =>
  43. import org.mongodb.scala.model.Filters._
  44. import com.github.t3hnar.bcrypt.BCryptStrOps
  45. users.find(equal("isAdmin", true)).head().flatMap {
  46. case null => users.insertOne(User(
  47. new ObjectId,
  48. request.body("fname")(0),
  49. request.body("lname")(0),
  50. request.body("email")(0),
  51. request.body("password")(0).boundedBcrypt,
  52. isAdmin = true
  53. )).head()
  54. case existingAdmin => Future.successful(existingAdmin)
  55. }
  56. }.flatten.map({ (_) =>
  57. initialized = true;
  58. MovedPermanently(routes.ViewController.loader("").url)
  59. })
  60. }
  61. def loader(s: String) = Action.async { implicit request: Request[AnyContent] =>
  62. _is_initialized map {
  63. case true => Ok(views.html.viewLoader())
  64. case false => TemporaryRedirect(routes.ViewController.initalizer().url)
  65. }
  66. }
  67. }