diff --git a/src/Database/Queries.hs b/src/Database/Queries.hs index 4576e39..4c40db8 100644 --- a/src/Database/Queries.hs +++ b/src/Database/Queries.hs @@ -168,12 +168,13 @@ queryInMetadata query service = ||. (service ^. VersionRecordTitle `ilike` (%) ++. val query ++. (%)) -getPkgDataSource :: (MonadResource m, MonadIO m) => [PkgId] -> [OsArch] -> ConduitT () (Entity VersionRecord) (ReaderT SqlBackend m) () -getPkgDataSource pkgs arches = selectSource $ do +getPkgDataSource :: (MonadResource m, MonadIO m) => [PkgId] -> [OsArch] -> Maybe Int -> ConduitT () (Entity VersionRecord) (ReaderT SqlBackend m) () +getPkgDataSource pkgs arches mRam = selectSource $ do (pkgData :& vp) <- from $ table @VersionRecord `innerJoin` table @VersionPlatform `on` (\(service :& vp) -> (VersionPlatformPkgId === VersionRecordPkgId) (vp :& service)) where_ (pkgData ^. VersionRecordNumber ==. vp ^. VersionPlatformVersionNumber) where_ (vp ^. VersionPlatformArch `in_` (valList $ Just <$> arches)) + where_ (vp ^. VersionPlatformRam ==. val mRam) where_ (pkgData ^. VersionRecordPkgId `in_` valList (PkgRecordKey <$> pkgs)) pure pkgData diff --git a/src/Handler/Package/V0/Latest.hs b/src/Handler/Package/V0/Latest.hs index c2fd4ed..9d0386c 100644 --- a/src/Handler/Package/V0/Latest.hs +++ b/src/Handler/Package/V0/Latest.hs @@ -1,6 +1,6 @@ module Handler.Package.V0.Latest where -import Conduit (concatMapC, mapC, runConduit, sinkList, (.|)) +import Conduit (concatMapC, mapC, runConduit, sinkList, (.|), mapMC) import Data.Aeson (ToJSON (..), eitherDecode) import Data.ByteString.Lazy qualified as LBS import Data.HashMap.Strict (HashMap) @@ -9,8 +9,8 @@ import Data.List (lookup) import Data.List.NonEmpty.Extra qualified as NE import Data.Tuple.Extra (second) import Database.Queries (collateVersions, getPkgDataSource) -import Foundation (Handler, RegistryCtx (appSettings)) -import Handler.Package.V1.Index (getOsVersionCompat) +import Foundation (Handler, RegistryCtx (appSettings, appConnPool)) +import Handler.Package.V1.Index (getOsVersionCompat, getRamQuery, getHardwareDevicesQuery) import Lib.Error (S9Error (..)) import Lib.Types.Core (PkgId) import Lib.Types.Emver (Version (..), satisfies) @@ -18,7 +18,7 @@ import Model (VersionRecord (..)) import Network.HTTP.Types (status400) import Startlude (Bool (True), Down (Down), Either (..), Generic, Maybe (..), NonEmpty, Show, const, encodeUtf8, filter, flip, nonEmpty, pure, ($), (.), (<$>), (<&>), (>>=)) import Yesod (ToContent (..), ToTypedContent (..), YesodPersist (runDB), YesodRequest (reqGetParams), getRequest, sendResponseStatus) -import Handler.Util (filterDeprecatedVersions, getPkgArch) +import Handler.Util (filterDeprecatedVersions, getPkgArch, filterDevices) import Yesod.Core (getsYesod) import Settings (AppSettings(communityVersion)) @@ -42,7 +42,10 @@ getVersionLatestR = do pkgArch <- getPkgArch >>= \case Nothing -> pure [] Just a -> pure a + ram <- getRamQuery + hardwareDevices <- getHardwareDevicesQuery communityServiceDeprecationVersion <- getsYesod $ communityVersion . appSettings + pool <- getsYesod appConnPool do case lookup "ids" getParameters of Nothing -> sendResponseStatus status400 (InvalidParamsE "get:ids" "") @@ -50,7 +53,7 @@ getVersionLatestR = do Left _ -> sendResponseStatus status400 (InvalidParamsE "get:ids" packages) Right p -> do let packageList = (,Nothing) <$> p - let source = getPkgDataSource p pkgArch + let source = getPkgDataSource p pkgArch ram filteredPackages <- runDB $ runConduit $ @@ -61,6 +64,11 @@ getVersionLatestR = do .| mapC (second (filter (osPredicate' . versionRecordOsVersion))) -- filter out deprecated service versions after community registry release .| mapC (second (filterDeprecatedVersions communityServiceDeprecationVersion osPredicate')) + -- filter hardware device compatability + .| mapMC (\(b,c) -> do + l <- filterDevices pool hardwareDevices pkgArch c + pure (b, l) + ) -- prune empty version sets .| concatMapC (\(pkgId, vs) -> (pkgId,) <$> nonEmpty vs) -- grab the latest matching version if it exists diff --git a/src/Handler/Package/V1/Index.hs b/src/Handler/Package/V1/Index.hs index 80149c7..280a1ee 100644 --- a/src/Handler/Package/V1/Index.hs +++ b/src/Handler/Package/V1/Index.hs @@ -138,7 +138,7 @@ getPackageIndexR = do let (source, packageRanges) = case pkgIds of Nothing -> (serviceQuerySource category query pkgArch ram, const Any) Just packages -> - let s = getPkgDataSource (packageReqId <$> packages) pkgArch + let s = getPkgDataSource (packageReqId <$> packages) pkgArch ram r = fromMaybe None . (flip lookup $ (packageReqId &&& packageReqVersion) <$> packages) in (s, r) filteredPackages <-