ViewController.scala 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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 initalized = false
  21. def initalizer() = Action.async { implicit request: Request[AnyContent] =>
  22. db.withCollection(User) { users =>
  23. import org.mongodb.scala.model.Filters._
  24. users.find(equal("isAdmin", true)).head()
  25. }.flatten.map {
  26. case null => Ok(views.html.initalizer())
  27. case _ =>
  28. initalized = true;
  29. MovedPermanently(routes.ViewController.loader("").url)
  30. }
  31. }
  32. // Basically everything about this function is a special case.
  33. // I don't like it, but it is unique among every other bit of functionality.
  34. def initalize() = Action.async(parse.formUrlEncoded) {
  35. implicit request: Request[Map[String, Seq[String]]] =>
  36. db.withCollection(User) { users =>
  37. import org.mongodb.scala.model.Filters._
  38. import com.github.t3hnar.bcrypt.BCryptStrOps
  39. users.find(equal("isAdmin", true)).head().flatMap {
  40. case null => users.insertOne(User(
  41. new ObjectId,
  42. request.body("fname")(0),
  43. request.body("lname")(0),
  44. request.body("email")(0),
  45. request.body("password")(0).boundedBcrypt,
  46. isAdmin = true
  47. )).head()
  48. case existingAdmin => Future.successful(existingAdmin)
  49. }
  50. }.flatten.map({ _ =>
  51. initalized = true;
  52. MovedPermanently(routes.ViewController.loader("").url)
  53. })
  54. }
  55. def loader(s: String) = Action { implicit request: Request[AnyContent] =>
  56. if (initalized)
  57. Ok(views.html.viewLoader())
  58. else
  59. TemporaryRedirect(routes.ViewController.initalizer().url)
  60. }
  61. }