Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #15948: Event log page must only load one day back of logs by default #2528

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -376,7 +376,7 @@ trait EventLogRepository {

def getEventLogById(id : Long) : IOResult[EventLog]

def getEventLogCount: IOResult[Long]
def getEventLogCount(criteria : Option[String]): IOResult[Long]

def getEventLogByChangeRequest(
changeRequest : ChangeRequestId
Expand Down
Expand Up @@ -200,8 +200,8 @@ class EventLogJdbcRepository(
}).transact(xa))
}

def getEventLogCount: IOResult[Long] = {
val q ="SELECT count(*) FROM eventlog"
def getEventLogCount(criteria : Option[String]): IOResult[Long] = {
val q =s"SELECT count(*) FROM eventlog where ${criteria.getOrElse("1 = 1")}"
//sql"SELECT count(*) FROM eventlog".query[Long].option.transact(xa).unsafeRunSync
transactIOResult(s"Error when retrieving event logs count with request: ${q}")(xa => (for {
entries <- query[Long](q).unique
Expand Down
Expand Up @@ -48,6 +48,9 @@ import net.liftweb.http.rest.RestHelper
import net.liftweb.http.{JsonResponse, LiftResponse, Req, S}
import net.liftweb.json.JValue
import net.liftweb.json.JsonDSL._
import net.liftweb.util.Helpers.tryo
import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat

class EventLogAPI (
repos: EventLogRepository
Expand Down Expand Up @@ -83,28 +86,53 @@ class EventLogAPI (
)
}

def getEventLogBySlice(start: Int, nbelement: Int, criteria : Option[String], optLimit:Option[Int] = None, orderBy:Option[String]): Box[(Int,Seq[EventLog])] = {
repos.getEventLogByCriteria(criteria, optLimit, orderBy).toBox match {
case Full(events) => Full((events.size, events.slice(start,start+nbelement)))
case eb: EmptyBox => eb ?~! s"Error when trying fetch eventlogs from database for page ${(start/nbelement)+1}"
def getEventLogBySlice(start: Int, criteria : Option[String], optLimit:Option[Int], orderBy:String): Box[Seq[EventLog]] = {
repos.getEventLogByCriteria(Some( s"${criteria.getOrElse("1 = 1")} order by ${orderBy} offset ${start}" ), optLimit, None).toBox match {
case Full(events) => Full( events)
case eb: EmptyBox => eb ?~! s"Error when trying fetch eventlogs from database for page ${(start/optLimit.getOrElse(1))+1}"
}
}

def requestDispatch: PartialFunction[Req, () => Box[LiftResponse]] = {
case Get(Nil, req) =>

def extractDateTimeOpt(i : String) = {
val format = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss")

if (i == "") {
Full(None)
} else {
tryo(Some(DateTime.parse(i, format)))
}
}
(for {
optDraw <- restExtractor.extractInt("draw")(req)(i => Full(i.toInt))
draw <- Box(optDraw) ?~! "Missing 'draw' field from datatable's request"
optStart <- restExtractor.extractInt("start")(req)(i => Full(i.toInt))
start <- Box(optStart) ?~! "Missing 'start' field from datatable's request"
optLength <- restExtractor.extractInt("length")(req)(i => Full(i.toInt))
length <- Box(optLength) ?~! "Missing 'start' field from datatable's request"
(totalFiltered, events) <- getEventLogBySlice(start, length, None, None, Some("id DESC"))
totalRecord <- repos.getEventLogCount.toBox
length <- Box(optLength) ?~! "Missing 'length' field from datatable's request"

optStartDate <- restExtractor.extractString("startDate")(req)(extractDateTimeOpt).map(_.flatten)
optEndDate <- restExtractor.extractString("endDate")(req)(extractDateTimeOpt).map(_.flatten)

dateCriteria = {
(optStartDate,optEndDate) match {
case (None,None) => None
case (Some(start), None) => Some(s" creationDate >= '${start}'")
case (None, Some(end)) => Some(s" creationDate <= '${end}'")
case (Some(start), Some(end)) if end.isBefore(start) => Some(s" creationDate >= '${end}' and creationDate <= '${start}'")
case (Some(start), Some(end)) => Some(s" creationDate >= '${start}' and creationDate <= '${end}'")
}
}
optLength <- restExtractor.extractInt("length")(req)(i => Full(i.toInt))
length <- Box(optLength) ?~! "Missing 'length' field from datatable's request"

events <- getEventLogBySlice(start, dateCriteria, Some(length), "id DESC")
totalRecord <- repos.getEventLogCount(None).toBox
totalFilter <- repos.getEventLogCount(dateCriteria).toBox
} yield {
responseFormater(draw, totalRecord, totalFiltered.toLong, events)
responseFormater(draw, totalRecord, totalFilter, events)
}) match {
case Full(resp) =>
JsonResponse(resp)
Expand Down
Expand Up @@ -1370,6 +1370,10 @@ function createEventLogTable(gridId, data, contextPath, refresh) {
, "ajax" : {
"type" : "GET"
, "url" : contextPath + "/secure/api/eventlog"
, "data" : function (d) {
d.startDate = $(".pickStartInput").val()
d.endDate = $(".pickEndInput").val()
}
}
, "bPaginate" : true
, "bLengthChange": true
Expand Down