Commit c6dce6df authored by Leonardo Menezes's avatar Leonardo Menezes
Browse files

created data access object for rest requests

parent 1ceac1aa
Loading
Loading
Loading
Loading
+58 −0
Original line number Diff line number Diff line
package dao

import java.util.Date

import com.google.inject.{ImplementedBy, Inject}
import play.api.db.slick.DatabaseConfigProvider
import slick.driver.JdbcProfile
import slick.driver.SQLiteDriver.api._
import slick.lifted.TableQuery

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scala.util.control.NonFatal


@ImplementedBy(classOf[RestHistoryDAOImpl])
trait RestHistoryDAO {

  def all(username: String): Future[Seq[RestRequest]]

  def save(entry: RestRequest): Future[Option[String]]

  def clear(username: String): Future[Int]

}

class RestHistoryDAOImpl @Inject()(dbConfigProvider: DatabaseConfigProvider) extends RestHistoryDAO {

  val dbConfig = dbConfigProvider.get[JdbcProfile]

  val requests = TableQuery[RestRequests]

  def all(username: String): Future[Seq[RestRequest]] = {
    dbConfig.db.run(requests.filter(_.username === username).result).map { reqs =>
      reqs.map { r => RestRequest(r.path, r.method, r.body, r.username, new Date(r.createdAt)) }
    }
  }

  def save(req: RestRequest): Future[Option[String]] = {
    val previous = dbConfig.db.run(requests.filter(_.md5 === req.md5).result.headOption)
    previous.flatMap {
      case Some(p) =>
        val q = for { r <- requests if r.md5 === p.md5 } yield r.createdAt
        val action = q.update(req.createdAt.getTime)
        dbConfig.db.run(action).map { _ => Some(p.md5) }.recover { case NonFatal(e) => e.printStackTrace(); None }

      case None =>
        val newReq = HashedRestRequest(req.path, req.method, req.body, req.username, req.createdAt.getTime, req.md5)
        val action = requests returning requests.map(_.id) += newReq
        dbConfig.db.run(action).map { _ => Some(newReq.md5) }.recover { case NonFatal(e) => e.printStackTrace; None }
    }
  }

  def clear(username: String): Future[Int] = {
    dbConfig.db.run(requests.filter(_.username === username).delete)
  }

}
+45 −0
Original line number Diff line number Diff line
package dao

import java.security.MessageDigest
import java.util.Date

import slick.driver.SQLiteDriver.api._
import slick.lifted.Tag

case class HashedRestRequest(path: String, method: String, body: String, username: String, createdAt: Long, md5: String)

case class RestRequest(path: String, method: String, body: String, username: String, createdAt: Date) {

  val md5 = MessageDigest.getInstance("MD5").digest(
    (path + method + body + username).getBytes
  ).map("%02x".format(_)).mkString

}

object RestRequest {

  def apply(request: HashedRestRequest): RestRequest = {
    RestRequest(request.path, request.method, request.body, request.username, new Date(request.createdAt))
  }

}

class RestRequests(tag: Tag) extends Table[HashedRestRequest](tag, "rest_requests") {

  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)

  def username = column[String]("username")

  def path = column[String]("path")

  def method = column[String]("method")

  def body = column[String]("body")

  def md5 = column[String]("md5")

  def createdAt = column[Long]("created_at")

  def * = (path, method, body, username, createdAt, md5) <> (HashedRestRequest.tupled, HashedRestRequest.unapply)

}
+5 −2
Original line number Diff line number Diff line
@@ -7,6 +7,9 @@ scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
  "com.typesafe.play" %% "play"                    % "2.5.10",
  "com.typesafe.play" %% "play-ws"                 % "2.5.10",
  "com.typesafe.play" %% "play-slick"              % "2.0.2",
  "com.typesafe.play" %% "play-slick-evolutions"   % "2.0.2",
  "org.xerial"        %  "sqlite-jdbc"             % "3.16.1",
  "org.specs2"        %% "specs2-junit"  % "3.8.4" % "test",
  "org.specs2"        %% "specs2-core"   % "3.8.4" % "test",
  "org.specs2"        %% "specs2-mock"   % "3.8.4" % "test"
+5 −0
Original line number Diff line number Diff line
@@ -43,3 +43,8 @@ auth {
//    password = "1234"
//  }
}

slick.dbs.default.driver="slick.driver.SQLiteDriver$"
slick.dbs.default.db.driver=org.sqlite.JDBC
slick.dbs.default.db.url="jdbc:sqlite:./cerebro.db"
play.evolutions.db.default.autoApply = true
+17 −0
Original line number Diff line number Diff line
# --- !Ups
CREATE TABLE rest_requests (
    id INTEGER PRIMARY KEY,
    username TEXT,
    path TEXT NOT NULL,
    method TEXT NOT NULL,
    body TEXT NOT NULL,
    md5 TEXT NOT NULL,
    created_at INTEGER
);

CREATE INDEX username_idx ON rest_requests(username);

CREATE UNIQUE INDEX md5_idx ON rest_requests(md5);

# --- !Downs
DROP TABLE rest_requests;
Loading