Skip to content

Commit

Permalink
[#500] Trails: Clean up file ordering and spacing.
Browse files Browse the repository at this point in the history
  • Loading branch information
a-stacey committed Aug 21, 2019
1 parent 4b1f335 commit e04f651
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 41 deletions.
80 changes: 39 additions & 41 deletions projects/trails/src/Mirza/Trails/Handlers/Trails.hs
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,30 @@ import Data.Maybe
import Data.List (nub)



getTrailByEventId :: ( Member context '[HasEnvType, HasConnPool, HasKatipContext, HasKatipLogEnv]
, Member err '[AsTrailsServiceError, AsSqlError])
=> EventId -> AppM context err [TrailEntry]
getTrailByEventId eventId = do
runDb $ (getTrailByEventIdQuery eventId)


getTrailBySignature :: ( Member context '[HasEnvType, HasConnPool, HasKatipContext, HasKatipLogEnv]
, Member err '[AsTrailsServiceError, AsSqlError])
=> SignaturePlaceholder -> AppM context err [TrailEntry]
getTrailBySignature sig = do
runDb $ (getTrailBySignatureQuery [] sig)


addTrail :: ( Member context '[HasEnvType, HasConnPool, HasKatipContext, HasKatipLogEnv]
, Member err '[AsTrailsServiceError, AsSqlError])
=> [TrailEntry] -> AppM context err NoContent
addTrail trail = do
_ <- runDb $ (addEntryQuery trail)
pure NoContent



getTrailByEventIdQuery :: (AsTrailsServiceError err)
=> EventId -> DB context err [TrailEntry]
getTrailByEventIdQuery eventId = do
Expand All @@ -48,13 +65,6 @@ getTrailByEventIdQuery eventId = do
entry -> build getTrailBySignatureQuery [] (entries_signature <$> entry)


getTrailBySignature :: ( Member context '[HasEnvType, HasConnPool, HasKatipContext, HasKatipLogEnv]
, Member err '[AsTrailsServiceError, AsSqlError])
=> SignaturePlaceholder -> AppM context err [TrailEntry]
getTrailBySignature sig = do
runDb $ (getTrailBySignatureQuery [] sig)


-- Algorithm is basically get a node (TrailEntry), get all of the previous and following entries, if we haven't seen
-- them before then recurse (if we have seen them before ignore them). We need to do this in a statefull way so that we
-- can handle loop cases (cases where the trail meets in a loop). I realised after I had a working implementation that a
Expand All @@ -67,18 +77,6 @@ getTrailBySignatureQuery discovered searchSignature = do
getNextEntriesBySignatureQuery previousEntries searchSignature


getNextEntriesBySignatureQuery :: (AsTrailsServiceError err)
=> [TrailEntry] -> SignaturePlaceholder -> DB context err [TrailEntry]
getNextEntriesBySignatureQuery discovered searchSignature = do
followingSignatures <- pg $ runSelectReturningList $ select $ do
previous <- all_ (_previous trailsDB)
guard_ (previous_previous_signature previous ==. val_ searchSignature)
pure $ (previous_entry_signature previous)

let newFollowingSignatures = filter (isNotPresentIn discovered) (entriesPrimaryKeyToSignature <$> followingSignatures)
build getTrailBySignatureQuery discovered newFollowingSignatures


getThisAndPreviousEntriesBySignatureQuery :: (AsTrailsServiceError err)
=> [TrailEntry] -> SignaturePlaceholder -> DB context err [TrailEntry]
getThisAndPreviousEntriesBySignatureQuery discovered searchSignature = do
Expand All @@ -91,9 +89,17 @@ getThisAndPreviousEntriesBySignatureQuery discovered searchSignature = do
pure discovered


getEntriesBySignature :: (AsTrailsServiceError err)
=> SignaturePlaceholder -> DB context err [TrailEntry]
getEntriesBySignature searchSignature = pure <$> (getEntryBySignature searchSignature)
getNextEntriesBySignatureQuery :: (AsTrailsServiceError err)
=> [TrailEntry] -> SignaturePlaceholder -> DB context err [TrailEntry]
getNextEntriesBySignatureQuery discovered searchSignature = do
followingSignatures <- pg $ runSelectReturningList $ select $ do
previous <- all_ (_previous trailsDB)
guard_ (previous_previous_signature previous ==. val_ searchSignature)
pure $ (previous_entry_signature previous)

let newFollowingSignatures = filter (isNotPresentIn discovered) (entriesPrimaryKeyToSignature <$> followingSignatures)
build getTrailBySignatureQuery discovered newFollowingSignatures


getEntryBySignature :: (AsTrailsServiceError err)
=> SignaturePlaceholder -> DB context err TrailEntry
Expand All @@ -112,6 +118,10 @@ getEntryBySignature searchSignature = do
pure $ buildTrailEntry entry previous


isNotPresentIn :: [TrailEntry] -> SignaturePlaceholder -> Bool
isNotPresentIn discovered element = not $ elem element $ trailEntrySignature <$> discovered


-- I'm sure that there is a nicer "implemenentation" of this function, something like foldl >>=, but I can't find it right now so this will do and can always refactor this later.
build :: (Monad m) => ([a] -> b -> m [a]) -> [a] -> [b] -> m [a]
build _ discovered [] = pure discovered
Expand All @@ -120,10 +130,6 @@ build fn discovered (sig : rest) = do
build fn thisEntry rest


isNotPresentIn :: [TrailEntry] -> SignaturePlaceholder -> Bool
isNotPresentIn discovered element = not $ elem element $ trailEntrySignature <$> discovered


buildTrailEntry :: Entries -> [Previous] -> TrailEntry
buildTrailEntry entries previous = TrailEntry 1
(onLocalTime EntryTime $ entries_timestamp entries)
Expand All @@ -133,21 +139,6 @@ buildTrailEntry entries previous = TrailEntry 1
(entries_signature entries)


addTrail :: ( Member context '[HasEnvType, HasConnPool, HasKatipContext, HasKatipLogEnv]
, Member err '[AsTrailsServiceError, AsSqlError])
=> [TrailEntry] -> AppM context err NoContent
addTrail trail = do
_ <- runDb $ (addEntryQuery trail)
pure NoContent


throwing_If :: MonadError e m => Control.Lens.Type.AReview e () -> Bool -> m ()
throwing_If x result = if result then
throwing_ x
else
pure ()


addEntryQuery :: (AsTrailsServiceError err)
=> [TrailEntry] -> DB context err ()
addEntryQuery entriesRaw = do
Expand Down Expand Up @@ -181,6 +172,13 @@ addEntryQuery entriesRaw = do
pure ()


throwing_If :: MonadError e m => Control.Lens.Type.AReview e () -> Bool -> m ()
throwing_If x result = if result then
throwing_ x
else
pure ()


validPrevious :: [TrailEntry] -> DB context err Bool
validPrevious entries = do
let searchPrevious sig = pg $ runSelectReturningOne $ select $ do
Expand Down
5 changes: 5 additions & 0 deletions projects/trails/src/Mirza/Trails/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,12 @@ data TrailEntry = TrailEntry
} deriving (Show, Generic, Eq)
instance ToSchema TrailEntry


instance Ord TrailEntry where
compare :: TrailEntry -> TrailEntry -> Ordering
compare a b = compare (trailEntrySignature a) (trailEntrySignature b)


instance ToJSON TrailEntry where
toJSON (TrailEntry version timestamp org eventId previousSignatures eventSignature) = object
[ trailEntryJSONFieldVersion .= version
Expand All @@ -106,6 +108,8 @@ instance ToJSON TrailEntry where
, trailEntryJSONFieldPreviousSignatures .= previousSignatures
, trailEntryJSONFieldSignature .= eventSignature
]


instance FromJSON TrailEntry where
parseJSON = withObject "TrailEntry" $ \o -> TrailEntry
<$> o .: trailEntryJSONFieldVersion
Expand All @@ -115,6 +119,7 @@ instance FromJSON TrailEntry where
<*> o .: trailEntryJSONFieldPreviousSignatures
<*> o .: trailEntryJSONFieldSignature


trailEntryJSONFieldVersion :: Text
trailEntryJSONFieldVersion = "version"
trailEntryJSONFieldTimestamp :: Text
Expand Down

0 comments on commit e04f651

Please sign in to comment.