mirror of
https://github.com/Start9Labs/registry.git
synced 2026-03-26 02:11:53 +00:00
56 lines
1.4 KiB
Haskell
56 lines
1.4 KiB
Haskell
{-# LANGUAGE QuasiQuotes #-}
|
|
|
|
module Handler.Package.V0.Manifest where
|
|
|
|
import Conduit (
|
|
awaitForever,
|
|
(.|),
|
|
)
|
|
import Data.String.Interpolate.IsString (
|
|
i,
|
|
)
|
|
import Foundation (Handler)
|
|
import Handler.Package.V1.Index (getOsVersionCompat)
|
|
import Handler.Util (
|
|
addPackageHeader,
|
|
fetchCompatiblePkgVersions,
|
|
getVersionSpecFromQuery,
|
|
orThrow,
|
|
versionPriorityFromQueryIsMin,
|
|
)
|
|
import Lib.Error (S9Error (..))
|
|
import Lib.PkgRepository (
|
|
getBestVersion,
|
|
getManifest,
|
|
)
|
|
import Lib.Types.Core (PkgId)
|
|
import Network.HTTP.Types (status404)
|
|
import Startlude (
|
|
pure,
|
|
show,
|
|
($),
|
|
)
|
|
import Yesod (
|
|
TypedContent,
|
|
addHeader,
|
|
respondSource,
|
|
sendChunkBS,
|
|
sendResponseStatus,
|
|
typeJson,
|
|
)
|
|
|
|
|
|
getAppManifestR :: PkgId -> Handler TypedContent
|
|
getAppManifestR pkg = do
|
|
osVersion <- getOsVersionCompat
|
|
osCompatibleVersions <- fetchCompatiblePkgVersions osVersion pkg
|
|
versionSpec <- getVersionSpecFromQuery
|
|
preferMin <- versionPriorityFromQueryIsMin
|
|
version <-
|
|
(pure $ getBestVersion versionSpec preferMin osCompatibleVersions)
|
|
`orThrow` sendResponseStatus status404 (NotFoundE [i|#{pkg} satisfying #{versionSpec}|])
|
|
addPackageHeader pkg version
|
|
(len, src) <- getManifest pkg version
|
|
addHeader "Content-Length" (show len)
|
|
respondSource typeJson $ src .| awaitForever sendChunkBS
|