Advertisement
Guest User

Untitled

a guest
Oct 6th, 2015
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.03 KB | None | 0 0
  1. package models
  2.  
  3. import play.api.libs.json.Json
  4.  
  5. case class Music(id: Long, title: String, lyrics: String, year: Int)
  6.  
  7. object Music {
  8. implicit val musicFormat = Json.format[Music]
  9. }
  10.  
  11. package controllers
  12.  
  13. import javax.inject.Inject
  14.  
  15. import dal.MusicRepository
  16. import models.Music
  17. import play.api.data.Form
  18. import play.api.data.Forms._
  19. import play.api.data.validation.Constraints._
  20. import play.api.i18n.{I18nSupport, MessagesApi}
  21. import play.api.libs.json.Json
  22. import play.api.mvc._
  23.  
  24. import scala.concurrent.{Future, ExecutionContext}
  25.  
  26. class MusicController @Inject()(repo: MusicRepository, val messagesApi: MessagesApi)
  27. (implicit ec: ExecutionContext) extends Controller with I18nSupport {
  28.  
  29. def index = Action {
  30. Ok(views.html.musics.index(musicForm))
  31. }
  32.  
  33. def show(id: Long) = Action {
  34. Music.findById(id).map { music =>
  35. Ok(views.html.musics.show(music))
  36. }.getOrElse(NotFound)
  37. }
  38.  
  39. val musicForm: Form[CreateMusicForm] = Form {
  40. mapping(
  41. "title" -> nonEmptyText,
  42. "lyrics" -> nonEmptyText,
  43. "year" -> number.verifying(min(0))
  44. )(CreateMusicForm.apply)(CreateMusicForm.unapply)
  45. }
  46.  
  47. def addMusic = Action.async { implicit request =>
  48. musicForm.bindFromRequest.fold(
  49. errorForm => {
  50. Future.successful(Ok(views.html.musics.index(errorForm)))
  51. },
  52. music => {
  53. repo.create(music.title, music.lyrics, music.year).map { _ =>
  54. Redirect(routes.MusicController.index)
  55. }
  56. }
  57. )
  58. }
  59.  
  60. def getMusics = Action.async {
  61. repo.list().map { musics =>
  62. Ok(Json.toJson(musics))
  63. }
  64. }
  65.  
  66. }
  67.  
  68. case class CreateMusicForm(title: String, lyrics: String, year: Int)
  69.  
  70. package dal
  71.  
  72. import javax.inject.Inject
  73.  
  74. import models.Music
  75. import play.api.db.slick.DatabaseConfigProvider
  76. import slick.driver.JdbcProfile
  77.  
  78. import scala.concurrent.{Future, ExecutionContext}
  79.  
  80. class MusicRepository @Inject()(dbConfigProvider: DatabaseConfigProvider)
  81. (implicit ec: ExecutionContext) {
  82.  
  83. private val dbConfig = dbConfigProvider.get[JdbcProfile]
  84.  
  85. import dbConfig._
  86. import driver.api._
  87.  
  88. private class MusicsTable(tag: Tag) extends Table[Music](tag, "musics") {
  89. def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  90.  
  91. def title = column[String]("title")
  92.  
  93. def lyrics = column[String]("lyrics")
  94.  
  95. def year = column[Int]("year")
  96.  
  97. def * = (id, title, lyrics, year) <>((Music.apply _).tupled, Music.unapply)
  98. }
  99.  
  100. private val musics = TableQuery[MusicsTable]
  101.  
  102. def create(title: String, lyrics: String, year: Int): Future[Music] = db.run {
  103. (musics.map(m => (m.title, m.lyrics, m.year))
  104. returning musics.map(_.id)
  105.  
  106. into ((stuff, id) => Music(id, stuff._1, stuff._2, stuff._3))
  107.  
  108. ) +=(title, lyrics, year)
  109. }
  110.  
  111. def list(): Future[Seq[Music]] = db.run {
  112. musics.result
  113. }
  114.  
  115. }
  116.  
  117. def show(id: Long) = Action.async { implicit request =>
  118. repo.findById(id).map { music =>
  119. Ok(views.html.musics.show(music))
  120. }
  121. }
  122.  
  123. def findById(id: Long): Future[Music] = db.run {
  124. musics.filter(_.id === id).result.head
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement