diff --git a/src/Database/Queries.hs b/src/Database/Queries.hs index fcba3ff..d3e12b3 100644 --- a/src/Database/Queries.hs +++ b/src/Database/Queries.hs @@ -299,9 +299,11 @@ upsertPackageVersionPlatform :: (MonadUnliftIO m) => (Maybe [OsArch]) -> Package upsertPackageVersionPlatform maybeArches PackageManifest{..} = do now <- liftIO getCurrentTime let pkgId = PkgRecordKey packageManifestId - let arches = case maybeArches of + let arches = case packageHardwareArch of Just a -> a - Nothing -> [X86_64 .. AARCH64] + Nothing -> case maybeArches of + Just a -> a + Nothing -> [X86_64, AARCH64] let records = createVersionPlatformRecord now pkgId packageManifestVersion packageHardwareRam packageHardwareDevice <$> arches repsertMany records where diff --git a/src/Handler/Package/V0/Latest.hs b/src/Handler/Package/V0/Latest.hs index 20ca18f..350763e 100644 --- a/src/Handler/Package/V0/Latest.hs +++ b/src/Handler/Package/V0/Latest.hs @@ -16,7 +16,7 @@ import Lib.Types.Core (PkgId) 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, ($), (.), (<$>), (<&>), (>>=), fst, traceM, show) +import Startlude (Bool (True), Down (Down), Either (..), Generic, Maybe (..), NonEmpty, Show, const, encodeUtf8, filter, flip, nonEmpty, pure, ($), (.), (<$>), (<&>), fst) import Yesod (ToContent (..), ToTypedContent (..), YesodPersist (runDB), YesodRequest (reqGetParams), getRequest, sendResponseStatus) import Handler.Util (filterDeprecatedVersions, getPkgArch, filterDevices) import Yesod.Core (getsYesod) @@ -39,9 +39,7 @@ getVersionLatestR = do getOsVersionCompat <&> \case Nothing -> const True Just v -> flip satisfies v - pkgArch <- getPkgArch >>= \case - Nothing -> pure [] - Just a -> pure a + pkgArch <- getPkgArch ram <- getRamQuery hardwareDevices <- getHardwareDevicesQuery communityServiceDeprecationVersion <- getsYesod $ communityVersion . appSettings diff --git a/src/Handler/Package/V1/Index.hs b/src/Handler/Package/V1/Index.hs index 5001f33..ae5cec2 100644 --- a/src/Handler/Package/V1/Index.hs +++ b/src/Handler/Package/V1/Index.hs @@ -123,9 +123,7 @@ getPackageIndexR = do getOsVersionCompat <&> \case Nothing -> const True Just v -> flip satisfies v - pkgArch <- getPkgArch >>= \case - Nothing -> pure [] - Just a -> pure a + pkgArch <- getPkgArch ram <- getRamQuery hardwareDevices <- getHardwareDevicesQuery communityVersion <- getsYesod $ communityVersion . appSettings diff --git a/src/Handler/Util.hs b/src/Handler/Util.hs index 2cfb320..79fca04 100644 --- a/src/Handler/Util.hs +++ b/src/Handler/Util.hs @@ -208,20 +208,21 @@ getOsVersion = do Nothing -> getOsVersionLegacy pure osVersion -getPkgArch :: Handler (Maybe [OsArch]) +getPkgArch :: Handler [OsArch] getPkgArch = do - arch <- parseQueryParam "hardware.arch" parseArch >>= \case - Just a -> pure $ Just a + arch <- parseQueryParam "hardware.arch" ((flip $ note . mappend "Invalid 'hardware.arch': ") =<< readMaybe) + case arch of + Just a -> pure [a] Nothing -> do getOsArch >>= \case - Just a -> pure $ Just [a] - Nothing -> pure $ Just [] - pure arch - --- >>> parseArch "[\"aarch64\"]" --- Right [aarch64] -parseArch :: Text -> Either Text [OsArch] -parseArch = first toS . eitherDecodeStrict . encodeUtf8 + Just a -> pure [matchLegacyArch a] + Nothing -> pure [X86_64, AARCH64] + where + matchLegacyArch X86_64 = X86_64 + matchLegacyArch AARCH64 = AARCH64 + matchLegacyArch RASPBERRYPI = AARCH64 + matchLegacyArch X86_64_NONFREE = X86_64 + matchLegacyArch AARCH64_NONFREE = AARCH64 filterDeprecatedVersions :: Version -> (Version -> Bool) -> [VersionRecord] -> [VersionRecord] filterDeprecatedVersions communityVersion osPredicate vrs = do diff --git a/src/Lib/Types/Manifest.hs b/src/Lib/Types/Manifest.hs index cdec626..d092e17 100644 --- a/src/Lib/Types/Manifest.hs +++ b/src/Lib/Types/Manifest.hs @@ -9,7 +9,7 @@ import Data.HashMap.Internal.Strict (HashMap) import Data.HashMap.Strict qualified as HM import Data.String.Interpolate.IsString (i) import Data.Text qualified as T -import Lib.Types.Core (PkgId) +import Lib.Types.Core (PkgId, OsArch) import Lib.Types.Emver (Version (..), VersionRange) import Startlude (ByteString, Eq, Generic, Hashable, Maybe (..), Monad ((>>=)), Read, Show, Text, for, pure, readMaybe, ($), Int, (.), (<>)) import Data.Aeson @@ -34,6 +34,7 @@ data PackageManifest = PackageManifest , packageManifestEosVersion :: !Version , packageHardwareDevice :: !(Maybe PackageDevice) , packageHardwareRam :: !(Maybe Int) + , packageHardwareArch :: !(Maybe [OsArch]) } deriving (Show) instance FromJSON PackageManifest where @@ -57,6 +58,7 @@ instance FromJSON PackageManifest where packageManifestEosVersion <- o .: "eos-version" packageHardwareDevice <- o .: "hardware-requirements" >>= (.: "device") packageHardwareRam <- o .: "hardware-requirements" >>= (.: "ram") + packageHardwareArch <- o .: "hardware-requirements" >>= (.: "arch") pure PackageManifest{..} @@ -114,7 +116,8 @@ testManifest = "processor": "^[A-Za-z0-9]+$", "display": "^[A-Za-z0-9]+$" }, - "ram": "8000000000" + "ram": "8000000000", + "arch": ["aarch64", "x86_64"] } "assets": { "license": "LICENSE",