diff --git a/src/Handler/Marketplace.hs b/src/Handler/Marketplace.hs index eac72e1..69d7e56 100644 --- a/src/Handler/Marketplace.hs +++ b/src/Handler/Marketplace.hs @@ -313,10 +313,10 @@ getPackageListR = do $ searchServices category query .| collateVersions .| zipCategories - -- empty list since there are no requested packages in this case - .| filterLatestVersionFromSpec [] .| filterPkgOsCompatible osPredicate - -- pages start at 1 for some reason. TODO: make pages start at 0 + -- empty list since there are no requested packages in this case + .| filterLatestVersionFromSpec [] + -- pages start at 1 for some reason. TODO: make pages start at 0 .| (dropC (limit' * (page - 1)) *> takeC limit') .| sinkList Just packages' -> do @@ -328,8 +328,8 @@ getPackageListR = do $ getPkgData (packageReqId <$> packages') .| collateVersions .| zipCategories - .| filterLatestVersionFromSpec vMap .| filterPkgOsCompatible osPredicate + .| filterLatestVersionFromSpec vMap .| sinkList -- NOTE: if a package's dependencies do not meet the system requirements, it is currently omitted from the list pkgsWithDependencies <- runDB $ mapConcurrently (getPackageDependencies osPredicate) filteredPackages diff --git a/src/Handler/Types/Marketplace.hs b/src/Handler/Types/Marketplace.hs index 729be94..aab148f 100644 --- a/src/Handler/Types/Marketplace.hs +++ b/src/Handler/Types/Marketplace.hs @@ -155,6 +155,12 @@ data PackageMetadata = PackageMetadata , packageMetadataPkgVersion :: !Version } deriving (Eq, Show) +data PackageMetadataIntermediary = PackageMetadataIntermediary + { packageMetadataIntermediaryPkgId :: !PkgId + , packageMetadataIntermediaryPkgVersionRecords :: ![Entity VersionRecord] + , packageMetadataIntermediaryPkgCategories :: ![Entity Category] + } + deriving (Eq, Show) data PackageDependencyMetadata = PackageDependencyMetadata { packageDependencyMetadataPkgDependencyRecord :: !(Entity PkgDependency) , packageDependencyMetadataDepPkgRecord :: !(Entity PkgRecord) diff --git a/src/Util/Shared.hs b/src/Util/Shared.hs index 5901e2f..8fb2722 100644 --- a/src/Util/Shared.hs +++ b/src/Util/Shared.hs @@ -44,6 +44,7 @@ import Foundation ( Handler ) import GHC.List ( lookup ) import Handler.Types.Marketplace ( PackageDependencyMetadata(..) , PackageMetadata(..) + , PackageMetadataIntermediary(..) ) import Lib.PkgRepository ( PkgRepo , getHash @@ -110,17 +111,17 @@ orThrow action other = action >>= \case Nothing -> other Just x -> pure x -filterPkgOsCompatible :: Monad m => (Version -> Bool) -> ConduitT PackageMetadata PackageMetadata m () +filterPkgOsCompatible :: Monad m => (Version -> Bool) -> ConduitT (PkgId, [Entity VersionRecord], [Entity Category]) PackageMetadataIntermediary m () filterPkgOsCompatible p = awaitForever - $ \PackageMetadata { packageMetadataPkgId = pkg, packageMetadataPkgVersionRecords = versions, packageMetadataPkgCategories = cats, packageMetadataPkgVersion = requestedVersion } -> + $ \(pkgId, vs, cats) -> do - let compatible = filter (p . versionRecordOsVersion . entityVal) versions - unless (null compatible) $ yield PackageMetadata { packageMetadataPkgId = pkg - , packageMetadataPkgVersionRecords = compatible - , packageMetadataPkgCategories = cats - , packageMetadataPkgVersion = requestedVersion - } + let compatible = filter (p . versionRecordOsVersion . entityVal) vs + unless (null compatible) $ yield PackageMetadataIntermediary + { packageMetadataIntermediaryPkgId = pkgId + , packageMetadataIntermediaryPkgVersionRecords = compatible + , packageMetadataIntermediaryPkgCategories = cats + } filterDependencyOsCompatible :: (Version -> Bool) -> PackageDependencyMetadata -> PackageDependencyMetadata filterDependencyOsCompatible p PackageDependencyMetadata { packageDependencyMetadataPkgDependencyRecord = pkgDeps, packageDependencyMetadataDepPkgRecord = pkg, packageDependencyMetadataDepVersions = depVersions } @@ -133,14 +134,14 @@ filterDependencyOsCompatible p PackageDependencyMetadata { packageDependencyMeta filterLatestVersionFromSpec :: (Monad m, MonadLogger m) => [(PkgId, VersionRange)] - -> ConduitT (PkgId, [Entity VersionRecord], [Entity Category]) PackageMetadata m () -filterLatestVersionFromSpec versionMap = awaitForever $ \(pkgId, vs, cats) -> do + -> ConduitT PackageMetadataIntermediary PackageMetadata m () +filterLatestVersionFromSpec versionMap = awaitForever $ \PackageMetadataIntermediary { packageMetadataIntermediaryPkgId = pkg, packageMetadataIntermediaryPkgVersionRecords = versions, packageMetadataIntermediaryPkgCategories = cats } -> do -- if no packages are specified, the VersionRange is implicitly `*` - let spec = fromMaybe Any $ lookup pkgId versionMap - case headMay . sortOn Down $ filter (`satisfies` spec) $ fmap (versionRecordNumber . entityVal) vs of - Nothing -> $logInfo [i|No version for #{pkgId} satisfying #{spec}|] - Just v -> yield $ PackageMetadata { packageMetadataPkgId = pkgId - , packageMetadataPkgVersionRecords = vs + let spec = fromMaybe Any $ lookup pkg versionMap + case headMay . sortOn Down $ filter (`satisfies` spec) $ fmap (versionRecordNumber . entityVal) versions of + Nothing -> $logInfo [i|No version for #{pkg} satisfying #{spec}|] + Just v -> yield $ PackageMetadata { packageMetadataPkgId = pkg + , packageMetadataPkgVersionRecords = versions , packageMetadataPkgCategories = cats , packageMetadataPkgVersion = v }