persist eos version and arch for user activity

This commit is contained in:
Lucy Cifferello
2022-11-23 14:12:55 -07:00
parent b29aed6a90
commit 81ed7962b3
3 changed files with 29 additions and 27 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -128,6 +128,8 @@ PkgDependency
UserActivity
createdAt UTCTime
serverId Text
osVersion Version
arch Text
Admin
Id Text