ViewController.scala 2.2 KB

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