From 81ed7962b3202bc9e1595d7e7f2a6fe89d1f0850 Mon Sep 17 00:00:00 2001 From: Lucy Cifferello <12953208+elvece@users.noreply.github.com> Date: Wed, 23 Nov 2022 14:12:55 -0700 Subject: [PATCH] persist eos version and arch for user activity --- src/Handler/Package/V1/Index.hs | 21 +-------------------- src/Handler/Util.hs | 33 ++++++++++++++++++++++++++------- src/Model.hs | 2 ++ 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/Handler/Package/V1/Index.hs b/src/Handler/Package/V1/Index.hs index e3ef78d..c16dca9 100644 --- a/src/Handler/Package/V1/Index.hs +++ b/src/Handler/Package/V1/Index.hs @@ -28,13 +28,11 @@ import Database.Queries ( import Foundation (Handler, Route (InstructionsR, LicenseR)) import Handler.Package.Api (DependencyRes (..), PackageListRes (..), PackageRes (..)) import Handler.Types.Api (ApiVersion (..)) -import Handler.Util (basicRender) -import Lib.Error (S9Error (..)) +import Handler.Util (basicRender, parseQueryParam) import Lib.PkgRepository (PkgRepo, getIcon, getManifest) import Lib.Types.Core (PkgId) import Lib.Types.Emver (Version, VersionRange (..), parseRange, satisfies, (<||)) import Model (Category (..), Key (..), PkgDependency (..), VersionRecord (..)) -import Network.HTTP.Types (status400) import Protolude.Unsafe (unsafeFromJust) import Settings (AppSettings) import Startlude ( @@ -44,7 +42,6 @@ import Startlude ( ByteString, ConvertText (toS), Down (..), - Either (..), Eq (..), Int, Maybe (..), @@ -80,7 +77,6 @@ import Startlude ( (.*), (<$>), (<&>), - (<>), (=<<), ) import UnliftIO (Concurrently (..), mapConcurrently) @@ -90,9 +86,7 @@ import Yesod ( MonadResource, YesodPersist (runDB), lookupGetParam, - sendResponseStatus, ) -import Yesod.Core (logWarn) data PackageReq = PackageReq @@ -155,19 +149,6 @@ getPackageIndexR = do pkgsWithDependencies <- runDB $ mapConcurrently (getPackageDependencies osPredicate) filteredPackages PackageListRes <$> runConcurrently (zipWithM (Concurrently .* constructPackageListApiRes) filteredPackages pkgsWithDependencies) - -parseQueryParam :: Text -> (Text -> Either Text a) -> Handler (Maybe a) -parseQueryParam param parser = do - lookupGetParam param >>= \case - Nothing -> pure Nothing - Just x -> case parser x of - Left e -> do - let err = InvalidParamsE ("get:" <> param) x - $logWarn e - sendResponseStatus status400 err - Right a -> pure (Just a) - - getPkgIdsQuery :: Handler (Maybe [PackageReq]) getPkgIdsQuery = parseQueryParam "ids" (first toS . eitherDecodeStrict . encodeUtf8) diff --git a/src/Handler/Util.hs b/src/Handler/Util.hs index 949e94a..06ae547 100644 --- a/src/Handler/Util.hs +++ b/src/Handler/Util.hs @@ -1,4 +1,5 @@ {-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE TemplateHaskell #-} module Handler.Util where @@ -26,7 +27,7 @@ import Lib.Types.Core (PkgId) import Lib.Types.Emver ( Version, VersionRange, - satisfies, + satisfies, parseVersion ) import Model ( UserActivity (..), @@ -60,7 +61,7 @@ import Startlude ( ($), (.), (<$>), - (>>=), + (>>=), note, (=<<) ) import UnliftIO (MonadUnliftIO) import Yesod ( @@ -76,8 +77,8 @@ import Yesod ( toContent, typePlain, ) -import Yesod.Core (addHeader) - +import Yesod.Core (addHeader, logWarn) +import Lib.Error (S9Error (..)) orThrow :: MonadHandler m => m (Maybe a) -> m a -> m a orThrow action other = @@ -111,7 +112,6 @@ getVersionFromQuery = do getHashFromQuery :: MonadHandler m => m (Maybe Text) getHashFromQuery = lookupGetParam "hash" - versionPriorityFromQueryIsMin :: MonadHandler m => m Bool versionPriorityFromQueryIsMin = do priorityString <- lookupGetParam "version-priority" @@ -140,14 +140,30 @@ queryParamAs k p = Left e -> sendResponseText status400 [i|Invalid Request! The query parameter '#{k}' failed to parse: #{e}|] Right a -> pure (Just a) +parseQueryParam :: Text -> (Text -> Either Text a) -> Handler (Maybe a) +parseQueryParam param parser = do + lookupGetParam param >>= \case + Nothing -> pure Nothing + Just x -> case parser x of + Left e -> do + let err = InvalidParamsE ("get:" <> param) x + $logWarn e + sendResponseStatus status400 err + Right a -> pure (Just a) tickleMAU :: Handler () tickleMAU = do lookupGetParam "server-id" >>= \case Nothing -> pure () Just sid -> do - now <- liftIO getCurrentTime - void $ liftHandler $ runDB $ insertRecord $ UserActivity now sid + queryParamAs "eos-version" parseVersion >>= \case + Nothing -> pure () + Just currentEosVersion -> do + getArchQuery >>= \case + Nothing -> pure () + Just arch -> do + now <- liftIO getCurrentTime + void $ liftHandler $ runDB $ insertRecord $ UserActivity now sid currentEosVersion arch fetchCompatiblePkgVersions :: Maybe VersionRange -> PkgId -> Handler [VersionRecord] @@ -160,3 +176,6 @@ fetchCompatiblePkgVersions osVersion pkg = do case osV of Nothing -> const True Just v -> flip satisfies v + +getArchQuery :: Handler (Maybe Text) +getArchQuery = parseQueryParam "arch" ((flip $ note . mappend "Invalid 'arch': ") =<< readMaybe) \ No newline at end of file diff --git a/src/Model.hs b/src/Model.hs index f31e140..0d7e4a5 100644 --- a/src/Model.hs +++ b/src/Model.hs @@ -128,6 +128,8 @@ PkgDependency UserActivity createdAt UTCTime serverId Text + osVersion Version + arch Text Admin Id Text