@@ -57,10 +57,10 @@ import Data.Function (on)
5757import Data.Nullable (notNull , null )
5858import Data.Nullable as Nullable
5959import Data.UUID.Random as UUID
60- import Effect.Uncurried (EffectFn1 , EffectFn2 , EffectFn3 , EffectFn4 )
60+ import Effect.Uncurried (EffectFn1 , EffectFn2 , EffectFn5 , EffectFn6 )
6161import Effect.Uncurried as Uncurried
6262import Record as Record
63- import Registry.API.V1 (Job (..), JobId (..), LogLevel (..), LogLine )
63+ import Registry.API.V1 (Job (..), JobId (..), LogLevel (..), LogLine , SortOrder (..) )
6464import Registry.API.V1 as API.V1
6565import Registry.API.V1 as V1
6666import Registry.Internal.Codec as Internal.Codec
@@ -193,13 +193,15 @@ toSuccess success = case success of
193193type SelectJobRequest =
194194 { level :: Maybe LogLevel
195195 , since :: DateTime
196+ , until :: DateTime
197+ , order :: SortOrder
196198 , jobId :: JobId
197199 }
198200
199201selectJob :: SQLite -> SelectJobRequest -> Effect { unreadableLogs :: Array String , job :: Either String (Maybe Job ) }
200- selectJob db { level: maybeLogLevel, since, jobId: JobId jobId } = do
202+ selectJob db { level: maybeLogLevel, since, until, order, jobId: JobId jobId } = do
201203 let logLevel = fromMaybe Info maybeLogLevel
202- { fail: unreadableLogs, success: logs } <- selectLogsByJob db (JobId jobId) logLevel since
204+ { fail: unreadableLogs, success: logs } <- selectLogsByJob db (JobId jobId) logLevel since until order
203205 -- Failing to decode a log should not prevent us from returning a job, so we pass
204206 -- failures through to be handled by application code
205207 job <- runExceptT $ firstJust
@@ -263,11 +265,13 @@ selectJob db { level: maybeLogLevel, since, jobId: JobId jobId } = do
263265
264266type SelectJobsRequest =
265267 { since :: DateTime
268+ , until :: DateTime
269+ , order :: SortOrder
266270 , includeCompleted :: Boolean
267271 }
268272
269273selectJobs :: SQLite -> SelectJobsRequest -> Effect { failed :: Array String , jobs :: Array Job }
270- selectJobs db { since, includeCompleted } = do
274+ selectJobs db { since, until, order, includeCompleted } = do
271275 publishJobs <- selectPublishJobs
272276 unpublishJobs <- selectUnpublishJobs
273277 transferJobs <- selectTransferJobs
@@ -276,27 +280,34 @@ selectJobs db { since, includeCompleted } = do
276280 let
277281 { fail: failedJobs, success: allJobs } = partitionEithers
278282 (publishJobs <> unpublishJobs <> transferJobs <> matrixJobs <> packageSetJobs)
279- pure { failed: failedJobs, jobs: take 100 $ sortBy (compare `on` (V1 .jobInfo >>> _.createdAt)) allJobs }
283+ cmp = case order of
284+ ASC -> compare `on` (V1 .jobInfo >>> _.createdAt)
285+ DESC -> flip compare `on` (V1 .jobInfo >>> _.createdAt)
286+ pure { failed: failedJobs, jobs: take 100 $ sortBy cmp allJobs }
280287
281288 where
289+ sinceStr = DateTime .format Internal.Format .iso8601DateTime since
290+ untilStr = DateTime .format Internal.Format .iso8601DateTime until
291+ orderStr = V1 .printSortOrder order
292+
282293 selectPublishJobs = do
283- jobs <- Uncurried .runEffectFn3 selectPublishJobsImpl db ( DateTime .format Internal.Format .iso8601DateTime since) includeCompleted
294+ jobs <- Uncurried .runEffectFn5 selectPublishJobsImpl db sinceStr untilStr includeCompleted orderStr
284295 pure $ map (map (PublishJob <<< Record .merge { logs: [] , jobType: Proxy :: _ " publish" }) <<< publishJobDetailsFromJSRep ) jobs
285296
286297 selectUnpublishJobs = do
287- jobs <- Uncurried .runEffectFn3 selectUnpublishJobsImpl db ( DateTime .format Internal.Format .iso8601DateTime since) includeCompleted
298+ jobs <- Uncurried .runEffectFn5 selectUnpublishJobsImpl db sinceStr untilStr includeCompleted orderStr
288299 pure $ map (map (UnpublishJob <<< Record .merge { logs: [] , jobType: Proxy :: _ " unpublish" }) <<< unpublishJobDetailsFromJSRep ) jobs
289300
290301 selectTransferJobs = do
291- jobs <- Uncurried .runEffectFn3 selectTransferJobsImpl db ( DateTime .format Internal.Format .iso8601DateTime since) includeCompleted
302+ jobs <- Uncurried .runEffectFn5 selectTransferJobsImpl db sinceStr untilStr includeCompleted orderStr
292303 pure $ map (map (TransferJob <<< Record .merge { logs: [] , jobType: Proxy :: _ " transfer" }) <<< transferJobDetailsFromJSRep ) jobs
293304
294305 selectMatrixJobs = do
295- jobs <- Uncurried .runEffectFn3 selectMatrixJobsImpl db ( DateTime .format Internal.Format .iso8601DateTime since) includeCompleted
306+ jobs <- Uncurried .runEffectFn5 selectMatrixJobsImpl db sinceStr untilStr includeCompleted orderStr
296307 pure $ map (map (MatrixJob <<< Record .merge { logs: [] , jobType: Proxy :: _ " matrix" }) <<< matrixJobDetailsFromJSRep ) jobs
297308
298309 selectPackageSetJobs = do
299- jobs <- Uncurried .runEffectFn3 selectPackageSetJobsImpl db ( DateTime .format Internal.Format .iso8601DateTime since) includeCompleted
310+ jobs <- Uncurried .runEffectFn5 selectPackageSetJobsImpl db sinceStr untilStr includeCompleted orderStr
300311 pure $ map (map (PackageSetJob <<< Record .merge { logs: [] , jobType: Proxy :: _ " packageset" }) <<< packageSetJobDetailsFromJSRep ) jobs
301312
302313-- ------------------------------------------------------------------------------
@@ -352,7 +363,7 @@ type SelectPublishParams =
352363
353364foreign import selectPublishJobImpl :: EffectFn2 SQLite SelectPublishParams (Nullable JSPublishJobDetails )
354365
355- foreign import selectPublishJobsImpl :: EffectFn3 SQLite String Boolean (Array JSPublishJobDetails )
366+ foreign import selectPublishJobsImpl :: EffectFn5 SQLite String String Boolean String (Array JSPublishJobDetails )
356367
357368selectNextPublishJob :: SQLite -> Effect (Either String (Maybe PublishJobDetails ))
358369selectNextPublishJob db = do
@@ -452,7 +463,7 @@ type SelectUnpublishParams =
452463
453464foreign import selectUnpublishJobImpl :: EffectFn2 SQLite SelectUnpublishParams (Nullable JSUnpublishJobDetails )
454465
455- foreign import selectUnpublishJobsImpl :: EffectFn3 SQLite String Boolean (Array JSUnpublishJobDetails )
466+ foreign import selectUnpublishJobsImpl :: EffectFn5 SQLite String String Boolean String (Array JSUnpublishJobDetails )
456467
457468selectNextUnpublishJob :: SQLite -> Effect (Either String (Maybe UnpublishJobDetails ))
458469selectNextUnpublishJob db = do
@@ -550,7 +561,7 @@ type SelectTransferParams = { jobId :: Nullable String, packageName :: Nullable
550561
551562foreign import selectTransferJobImpl :: EffectFn2 SQLite SelectTransferParams (Nullable JSTransferJobDetails )
552563
553- foreign import selectTransferJobsImpl :: EffectFn3 SQLite String Boolean (Array JSTransferJobDetails )
564+ foreign import selectTransferJobsImpl :: EffectFn5 SQLite String String Boolean String (Array JSTransferJobDetails )
554565
555566selectNextTransferJob :: SQLite -> Effect (Either String (Maybe TransferJobDetails ))
556567selectNextTransferJob db = do
@@ -686,7 +697,7 @@ matrixJobDetailsFromJSRep { jobId, packageName, packageVersion, compilerVersion,
686697
687698foreign import selectMatrixJobImpl :: EffectFn2 SQLite (Nullable String ) (Nullable JSMatrixJobDetails )
688699
689- foreign import selectMatrixJobsImpl :: EffectFn3 SQLite String Boolean (Array JSMatrixJobDetails )
700+ foreign import selectMatrixJobsImpl :: EffectFn5 SQLite String String Boolean String (Array JSMatrixJobDetails )
690701
691702selectNextMatrixJob :: SQLite -> Effect (Either String (Maybe MatrixJobDetails ))
692703selectNextMatrixJob db = do
@@ -734,7 +745,7 @@ foreign import selectPackageSetJobImpl :: EffectFn2 SQLite (Nullable String) (Nu
734745
735746foreign import selectPackageSetJobByPayloadImpl :: EffectFn2 SQLite String (Nullable JSPackageSetJobDetails )
736747
737- foreign import selectPackageSetJobsImpl :: EffectFn3 SQLite String Boolean (Array JSPackageSetJobDetails )
748+ foreign import selectPackageSetJobsImpl :: EffectFn5 SQLite String String Boolean String (Array JSPackageSetJobDetails )
738749
739750selectNextPackageSetJob :: SQLite -> Effect (Either String (Maybe PackageSetJobDetails ))
740751selectNextPackageSetJob db = do
@@ -814,18 +825,22 @@ foreign import insertLogLineImpl :: EffectFn2 SQLite JSLogLine Unit
814825insertLogLine :: SQLite -> LogLine -> Effect Unit
815826insertLogLine db = Uncurried .runEffectFn2 insertLogLineImpl db <<< logLineToJSRep
816827
817- foreign import selectLogsByJobImpl :: EffectFn4 SQLite String Int String (Array JSLogLine )
828+ foreign import selectLogsByJobImpl :: EffectFn6 SQLite String Int String String String (Array JSLogLine )
818829
819830-- | Select all logs for a given job at or above the indicated log level. To get all
820- -- | logs, pass the DEBUG log level.
821- selectLogsByJob :: SQLite -> JobId -> LogLevel -> DateTime -> Effect { fail :: Array String , success :: Array LogLine }
822- selectLogsByJob db jobId level since = do
823- let timestamp = DateTime .format Internal.Format .iso8601DateTime since
831+ -- | logs, pass the DEBUG log level. The since and until parameters define a
832+ -- | half-open [since, until) time window.
833+ selectLogsByJob :: SQLite -> JobId -> LogLevel -> DateTime -> DateTime -> SortOrder -> Effect { fail :: Array String , success :: Array LogLine }
834+ selectLogsByJob db jobId level since until order = do
835+ let sinceTimestamp = DateTime .format Internal.Format .iso8601DateTime since
836+ let untilTimestamp = DateTime .format Internal.Format .iso8601DateTime until
824837 jsLogLines <-
825- Uncurried .runEffectFn4
838+ Uncurried .runEffectFn6
826839 selectLogsByJobImpl
827840 db
828841 (un JobId jobId)
829842 (API.V1 .logLevelToPriority level)
830- timestamp
843+ sinceTimestamp
844+ untilTimestamp
845+ (V1 .printSortOrder order)
831846 pure $ partitionEithers $ map logLineFromJSRep jsLogLines
0 commit comments