2J37EVJMX255K3XEJHTZGRPEIRMAQ62JQWOA7JU3YTZUB6PUPWVQC OUR4PAOTXXKXQPMAR5TIYX7MBRRJS2WVTZS7SN4SOGML7SPJIJGQC SFWL5626TREXK42DULCXFKKXRCYYGCPAELRZGIRLUMZBNZRAYW7QC RSF6UAJKG7CEKILSVXI6C4YZXY7PIYZM2EMA2IXKQ7SADKNVSH7QC QU5FW67RGCWOWT2YFM4NYMJFFHWIRPQANQBBAHBKZUY7UYMCSIMQC JXG3FCXYBDKMUD77DOM7RCIJYKB7BILC43OHHDZBE7YQRGAMUCCAC QMEYU4MWLTSWPWEEOFRLK2IKE64BY3V5X73323WPLCGPP3TPDYGAC BFZN4SUAGYNFFYVAP36BAX32DMO622PK4EPEVQQEAGC2IHTEAAPQC RPAJLHMTUJU4AYNBOHVGHGGB4NY2NLY3BVPYN5FMWB3ZIMAUQHCQC B6HWAPDPXIWH7CHK5VLMWLL6EQN6NOFZEFYO47BPUY2ZO4SL7VDAC IZEVQF627FA7VV25KJAWYWGGC35LZUUBBQRPN5ZAINTQLPEDRTEAC EFSXYZPOGA5M4DN65IEIDO7JK6U34DMQELAPHOIL2UAT6HRC66BAC IPG33FAWXGEQ2PO6OXRT2PWWXHRNMPVUKKADL6UKKN5GD2CNZ25AC 73NDXDEZRMK672GHSTC3CI6YHXFZ2GGJI5IKQGHKFDZKTNSQXLLQC A6HKMINBNGQLLX4QJMYWKQ4JAEHVJ4HIRVDKPPDI3FJUO2AAB7OQC 64C6AWH66FDKU6UE6Z6JPX2J2GBM2JOPTH2GL6LHKAIUBGNGDZ5AC HMDM3B557TO5RYP2IGFFC2C2VN6HYZTDQ47CJY2O37BW55DSMFZAC O5FVTOM6YFBLEPF3S576K6IMT6ZZ5VQCSB3YVXNS4CKBITKCRZ7AC QMRKFEPGFBCEWAIXPEIG5ILKAJ2JH5L3TOITHR4HNJXK5FN3KXBQC Z7KS5XHHC6PAMTVBHXY7KUSS3BWAOU6FSYIITUCFOOJZU4OUJHBAC EQXRXRZDYCM7BDAVBOXQYPG6C7IJT3OFGNIXCDAHJJBRKAXNGL7AC SCXG6TJWYIPRUMT27KGKIIF6FYKTUTY74UNZ2FQTT63XZ6HIF3AAC NEDDHXUK3GNFMOFO3KLU7NRIHCTYNWBT3D6HTKZAOXFDE6HMDZ6AC 7XN3I3QJHYMKU2DCUXX34WQMSJ4ZJOWW7FME34EANO3E5W4Q632AC PBD7LZYQHXAA3KLH2ZUX5GW4UFML6BQ32KXZF4KZ6OYFASUYFJ5QC BROSTG5KP3NUNLSYPVQID254TE47E5RKQAKLPIY7PGWETE6JNMTAC GCVQD44VRPQVKPZEPIC4AOIXLJIG2ZMV3QI2Y7KALUT6NVUBSGSAC ADMKQQGCGVSHHIMVQ4XFRDCG544SBJCYALSKZV45CQQBZ4ACUH2AC Before t -> ["before=" <> t]During (Interval x) -> ["after=" <> x.start, "before=" <> x.end]After t -> ["after=" <> t]
Before t -> ["before=" <> t, "limit=100"]During (Interval x) -> ["after=" <> x.start, "before=" <> x.end, "limit=100"]After t -> ["after=" <> t, "limit=100"]
apiLatestEvent :: ProjectId -> Aff (Either TimelineError (Maybe Event))apiLatestEvent pid = doresponse <- get RF.json ("/api/user/projects/" <> pidStr pid <> "/events")liftEffect<<< runExceptT<<< map head<<< map decompose<<< withExceptT LogFailure$ parseDatedResponse response
H.modify_ (_ { selectedProject = Just p, history = hist })
latestEventResponse <- lift $ caps.getLatestEvent (unwrap p).projectIdnow <- lift $ system.nowactive <- lift $ case latestEventResponse ofLeft err ->(system.log $ "Error occurred retrieving the latest event: " <> show err) *>pure NothingRight latestEvent -> dolet activeInterval :: TL.Event -> m (Maybe Interval)activeInterval ev = case ev ofTL.StartEvent i ->(system.log $ "Project has an open active interval starting " <> show i) *>(Just <<< interval i <$> system.now)TL.StopEvent _ ->pure Nothingjoin <$> traverse activeInterval latestEvent
WHERE project_id = ? AND user_id = ? AND event_time <= ? |](pid, uid, fromThyme e)q (During s e) = pquery
WHERE project_id = ? AND user_id = ? AND event_time <= ?ORDER BY event_time DESCLIMIT ?|](pid, uid, fromThyme e, limit)(During s e) -> pquery
AND event_time >= ? AND event_time <= ? |](pid, uid, fromThyme s, fromThyme e)q (After s) = pquery
AND event_time >= ? AND event_time <= ?ORDER BY event_time DESCLIMIT ?|](pid, uid, fromThyme s, fromThyme e, limit)(After s) -> pquery
WHERE project_id = ? AND user_id = ? AND event_time >= ? |](pid, uid, fromThyme s)q ivalpgEval (FindLatestEvents (ProjectId pid) (UserId uid) i) = domode <- askNetworkModepquery(logEntryParser mode)[sql| SELECT credit_to_type,credit_to_network, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time, event_metadataFROM work_eventsWHERE project_id = ?AND user_id = ?ORDER BY event_time DESCLIMIT ?|](pid, uid, i)
WHERE project_id = ? AND user_id = ? AND event_time >= ?ORDER BY event_time DESCLIMIT ?|](pid, uid, fromThyme s, limit)(Always) -> pquery(logEntryParser mode)[sql| SELECT credit_to_type,credit_to_network, credit_to_address, credit_to_user_id, credit_to_project_id,event_type, event_time,event_metadataFROM work_eventsWHERE project_id = ? AND user_id = ?ORDER BY event_time DESCLIMIT ?|](pid, uid, limit)
FindEvents ::ProjectId -> UserId -> Interval' -> DBOp [LogEntry BTCNet]FindLatestEvents ::ProjectId -> UserId -> Int -> DBOp [LogEntry BTCNet]
FindEvents ::ProjectId -> UserId -> RangeQuery -> Word32 -> DBOp [LogEntry BTCNet]
:: (MonadDB m) => ProjectId -> UserId -> Interval' -> m [LogEntry BTCNet]findEvents p u i = liftdb $ FindEvents p u i
:: (MonadDB m) => ProjectId -> UserId -> RangeQuery -> Word32 -> m [LogEntry BTCNet]findEvents p u i l = liftdb $ FindEvents p u i l
data Interval' = Before { _end' :: C.UTCTime }| During { _start' :: C.UTCTime, _end' :: C.UTCTime }| After { _start' :: C.UTCTime }makeLenses ''IntervalmakeLenses ''Interval'
data RangeQuery= Before { _end' :: C.UTCTime }| During { _start' :: C.UTCTime, _end' :: C.UTCTime }| After { _start' :: C.UTCTime }| AlwaysmakeLenses ''RangeQuery
#!/bin/bashif [ -f ".env" ]; thensource .envfiif [ -z "${AFTOK_HOST}" ]; thenAFTOK_HOST="aftok.com"fiif [ -z "${USER}" ]; thenread -p "Username: " USERechofiif [ -z "${PID}" ]; thenread -p "Project UUID: " PIDechoficurl --verbose --insecure --user $USER \--request GET \"https://$AFTOK_HOST/api/projects/$PID/events?after=2020-01-01T00:00:00Z"
ival <- case endpoints of(Just s , Just e ) -> pure $ During s e(Nothing, Just e ) -> pure $ Before e(Just s , Nothing) -> pure $ After s(Nothing, Nothing) -> snapError400"You must specify at least one of the \"after\" or \"before\" query parameters"snapEval $ findEvents pid uid ivaluserLatestEntries :: S.Handler App App [LogEntry (NetworkId, Address)]userLatestEntries = douid <- requireUserIdpid <- requireProjectId
let ival = case endpoints of(Just s , Just e ) -> During s e(Nothing, Just e ) -> Before e(Just s , Nothing) -> After s(Nothing, Nothing) -> Always