diff --git a/config/settings.yml b/config/settings.yml index f3d4114..b90f685 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -36,7 +36,8 @@ tor-port: "_env:TOR_PORT:447" static-bin-dir: "_env:STATIC_BIN:/usr/local/bin/" error-log-root: "_env:ERROR_LOG_ROOT:/var/log/registry/" marketplace-name: "_env:MARKETPLACE_NAME:CHANGE ME" -max-eos-version: "_env:MAX_VERSION:0.3.3.0" +max-eos-version: "_env:MAX_VERSION:0.3.4.0" +min-eos-version: "_env:MIN_VERSION:0.3.4.0" run-migration: "_env:RUN_MIGRATION:false" database: diff --git a/src/Database/Queries.hs b/src/Database/Queries.hs index 93bf343..e5f52ad 100644 --- a/src/Database/Queries.hs +++ b/src/Database/Queries.hs @@ -31,7 +31,7 @@ import Startlude ( getCurrentTime, maybe, ($), - (.), Bool (True, False), + (.), Bool (False), ) import System.FilePath (takeExtension) import UnliftIO ( @@ -314,6 +314,7 @@ upsertPackageVersion PackageManifest{..} = do VersionRecord now (Just now) + Nothing pkgId packageManifestVersion packageManifestTitle diff --git a/src/Handler/Eos/V0/Latest.hs b/src/Handler/Eos/V0/Latest.hs index 8d44a14..3ad5480 100644 --- a/src/Handler/Eos/V0/Latest.hs +++ b/src/Handler/Eos/V0/Latest.hs @@ -26,7 +26,7 @@ import Orphans.Emver () import Startlude (Down (..), Eq, Generic, Maybe (..), Ord ((<)), Show, Text, filter, fst, head, pure, sortOn, ($), (&&&), (.), (<$>), (<&>), (<=)) import Yesod (ToContent (toContent), ToTypedContent (..), YesodPersist (runDB), getsYesod) import Yesod.Core.Types (JSONResponse (..)) -import Settings (AppSettings(maxEosVersion)) +import Settings (AppSettings(maxOsVersion)) import Lib.Types.Core (OsArch(RASPBERRYPI)) import Data.Maybe (fromMaybe) @@ -50,7 +50,7 @@ getEosVersionR :: Handler (JSONResponse (Maybe EosRes)) getEosVersionR = do currentEosVersion <- fromMaybe Version { unVersion = (0,3,0,0) } <$> queryParamAs "eos-version" parseVersion arch <- fromMaybe RASPBERRYPI <$> getArchQuery - maxVersion <- getsYesod $ maxEosVersion . appSettings + maxVersion <- getsYesod $ maxOsVersion . appSettings allEosVersions <- runDB $ select $ do vers <- from $ table @OsVersion diff --git a/src/Handler/Package/V0/Latest.hs b/src/Handler/Package/V0/Latest.hs index 102def0..06ff4fd 100644 --- a/src/Handler/Package/V0/Latest.hs +++ b/src/Handler/Package/V0/Latest.hs @@ -9,16 +9,18 @@ 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) +import Foundation (Handler, RegistryCtx (appSettings)) import Handler.Package.V1.Index (getOsVersionQuery) import Lib.Error (S9Error (..)) import Lib.Types.Core (PkgId) -import Lib.Types.Emver (Version, satisfies) +import Lib.Types.Emver (Version (..), satisfies) 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 (getArchQuery) +import Handler.Util (getArchQuery, filterDeprecatedVersions) +import Yesod.Core (getsYesod) +import Settings (AppSettings(minOsVersion)) newtype VersionLatestRes = VersionLatestRes (HashMap PkgId (Maybe Version)) @@ -38,6 +40,7 @@ getVersionLatestR = do Nothing -> const True Just v -> flip satisfies v osArch <- getArchQuery + minOsVersion <- getsYesod $ minOsVersion . appSettings do case lookup "ids" getParameters of Nothing -> sendResponseStatus status400 (InvalidParamsE "get:ids" "") @@ -54,6 +57,8 @@ getVersionLatestR = do .| collateVersions -- filter out versions of apps that are incompatible with the OS predicate .| mapC (second (filter (osPredicate' . versionRecordOsVersion))) + -- filter out deprecated service versions after a min os version + .| mapC (second (filterDeprecatedVersions minOsVersion osPredicate')) -- prune empty version sets .| concatMapC (\(pkgId, vs) -> (pkgId,) <$> nonEmpty vs) -- grab the latest matching version if it exists @@ -65,4 +70,4 @@ getVersionLatestR = do HM.union (HM.fromList $ filteredPackages) (HM.fromList packageList) where selectLatestVersion :: NonEmpty VersionRecord -> Version - selectLatestVersion vs = NE.head $ (versionRecordNumber <$>) $ NE.sortOn (Down . versionRecordNumber) $ vs + selectLatestVersion vs = NE.head $ (versionRecordNumber <$>) $ NE.sortOn (Down . versionRecordNumber) $ vs \ No newline at end of file diff --git a/src/Handler/Package/V1/Index.hs b/src/Handler/Package/V1/Index.hs index 772642d..8ae8c07 100644 --- a/src/Handler/Package/V1/Index.hs +++ b/src/Handler/Package/V1/Index.hs @@ -25,16 +25,16 @@ import Database.Queries ( getPkgDependencyData, serviceQuerySource, ) -import Foundation (Handler, Route (InstructionsR, LicenseR)) +import Foundation (Handler, Route (InstructionsR, LicenseR), RegistryCtx (appSettings)) import Handler.Package.Api (DependencyRes (..), PackageListRes (..), PackageRes (..)) import Handler.Types.Api (ApiVersion (..)) -import Handler.Util (basicRender, parseQueryParam, getArchQuery) +import Handler.Util (basicRender, parseQueryParam, getArchQuery, filterDeprecatedVersions) 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 (..), PkgRecord (pkgRecordHidden)) import Protolude.Unsafe (unsafeFromJust) -import Settings (AppSettings) +import Settings (AppSettings (minOsVersion)) import Startlude ( Applicative ((*>)), Bifunctor (..), @@ -88,8 +88,8 @@ import Yesod ( lookupGetParam, ) import Data.Tuple (fst) -import Data.Tuple.Extra (both) import Database.Persist.Postgresql (entityVal) +import Yesod.Core (getsYesod) data PackageReq = PackageReq { packageReqId :: !PkgId @@ -118,7 +118,8 @@ getPackageIndexR = do getOsVersionQuery <&> \case Nothing -> const True Just v -> flip satisfies v - osArch <- getArchQuery + osArch <- getArchQuery + minOsVersion <- getsYesod $ minOsVersion . appSettings do pkgIds <- getPkgIdsQuery category <- getCategoryQuery @@ -139,6 +140,8 @@ getPackageIndexR = do .| collateVersions -- filter out versions of apps that are incompatible with the OS predicate .| mapC (second (filter (osPredicate . versionRecordOsVersion))) + -- filter out deprecated service versions after a min os version + .| mapC (second (filterDeprecatedVersions minOsVersion osPredicate)) -- prune empty version sets .| concatMapC (\(pkgId, vs) -> (pkgId,) <$> nonEmpty vs) -- grab the latest matching version if it exists diff --git a/src/Handler/Util.hs b/src/Handler/Util.hs index c57e2c9..6cdf91e 100644 --- a/src/Handler/Util.hs +++ b/src/Handler/Util.hs @@ -25,13 +25,13 @@ import Lib.PkgRepository ( ) import Lib.Types.Core (PkgId, OsArch) import Lib.Types.Emver ( - Version, + Version (Version, unVersion), VersionRange, satisfies, parseVersion ) import Model ( UserActivity (..), - VersionRecord (versionRecordOsVersion), + VersionRecord (versionRecordOsVersion, versionRecordDeprecatedAt), ) import Network.HTTP.Types ( Status, @@ -79,6 +79,7 @@ import Yesod ( ) import Yesod.Core (addHeader, logWarn) import Lib.Error (S9Error (..)) +import Data.Maybe (isJust) orThrow :: MonadHandler m => m (Maybe a) -> m a -> m a orThrow action other = @@ -174,4 +175,10 @@ fetchCompatiblePkgVersions osVersion pkg = do Just v -> flip satisfies v getArchQuery :: Handler (Maybe OsArch) -getArchQuery = parseQueryParam "arch" ((flip $ note . mappend "Invalid 'arch': ") =<< readMaybe) \ No newline at end of file +getArchQuery = parseQueryParam "arch" ((flip $ note . mappend "Invalid 'arch': ") =<< readMaybe) + +filterDeprecatedVersions :: Version -> (Version -> Bool) -> [VersionRecord] -> [VersionRecord] +filterDeprecatedVersions minOsVersion osPredicate vrs = do + if (osPredicate minOsVersion) + then filter (\v -> not $ isJust $ versionRecordDeprecatedAt v) $ vrs + else vrs \ No newline at end of file diff --git a/src/Model.hs b/src/Model.hs index 4520e51..cb8f24c 100644 --- a/src/Model.hs +++ b/src/Model.hs @@ -54,6 +54,7 @@ PkgRecord VersionRecord sql=version createdAt UTCTime updatedAt UTCTime Maybe + deprecatedAt UTCTime Maybe pkgId PkgRecordId number Version title Text diff --git a/src/Settings.hs b/src/Settings.hs index b8278f0..02bf7e7 100644 --- a/src/Settings.hs +++ b/src/Settings.hs @@ -75,7 +75,8 @@ data AppSettings = AppSettings -- ^ Should all log messages be displayed? , errorLogRoot :: !FilePath , marketplaceName :: !Text - , maxEosVersion :: !Version + , maxOsVersion :: !Version + , minOsVersion :: !Version , registryHostname :: !Text , registryVersion :: !Version , resourcesDir :: !FilePath @@ -110,7 +111,8 @@ instance FromJSON AppSettings where appShouldLogAll <- o .:? "should-log-all" .!= False errorLogRoot <- o .: "error-log-root" marketplaceName <- o .: "marketplace-name" - maxEosVersion <- o .: "max-eos-version" + maxOsVersion <- o .: "max-eos-version" + minOsVersion <- o .: "min-eos-version" registryHostname <- o .: "registry-hostname" resourcesDir <- o .: "resources-path" needsMigration <- o .: "run-migration"