module Ecluse.Core.Registry.Npm.Request (
MetadataForm (..),
npmArtifactHosts,
metadataRequest,
artifactRequestByFile,
artifactRequestByUrl,
artifactFileUrl,
packageUrl,
jsonPutRequest,
withToken,
) where
import Network.HTTP.Client (
Request (decompress, method, requestBody, requestHeaders),
RequestBody (RequestBodyBS),
)
import Network.HTTP.Types.Header (hAccept, hAcceptEncoding, hContentType)
import Ecluse.Core.Credential (ClientCredential)
import Ecluse.Core.Package (PackageName, pkgNamespace, renderPackageName, unScope, unscopedName)
import Ecluse.Core.Registry (UrlFormationError)
import Ecluse.Core.Registry.Npm.Credential (npmCredential)
import Ecluse.Core.Registry.Request (attachCredential, joinPath, parseRequestEither)
import Ecluse.Core.Registry.Request qualified as Request
import Ecluse.Core.Server.Path (encodeComponent)
data MetadataForm
=
Abbreviated
|
Full
deriving stock (MetadataForm -> MetadataForm -> Bool
(MetadataForm -> MetadataForm -> Bool)
-> (MetadataForm -> MetadataForm -> Bool) -> Eq MetadataForm
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MetadataForm -> MetadataForm -> Bool
== :: MetadataForm -> MetadataForm -> Bool
$c/= :: MetadataForm -> MetadataForm -> Bool
/= :: MetadataForm -> MetadataForm -> Bool
Eq, Int -> MetadataForm -> ShowS
[MetadataForm] -> ShowS
MetadataForm -> String
(Int -> MetadataForm -> ShowS)
-> (MetadataForm -> String)
-> ([MetadataForm] -> ShowS)
-> Show MetadataForm
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MetadataForm -> ShowS
showsPrec :: Int -> MetadataForm -> ShowS
$cshow :: MetadataForm -> String
show :: MetadataForm -> String
$cshowList :: [MetadataForm] -> ShowS
showList :: [MetadataForm] -> ShowS
Show)
metadataAccept :: MetadataForm -> ByteString
metadataAccept :: MetadataForm -> Method
metadataAccept = \case
MetadataForm
Abbreviated -> Method
"application/vnd.npm.install-v1+json"
MetadataForm
Full -> Method
"application/json"
npmArtifactHosts :: [Text]
npmArtifactHosts :: [Text]
npmArtifactHosts = []
metadataRequest ::
Text ->
Maybe ClientCredential ->
MetadataForm ->
PackageName ->
Either UrlFormationError Request
metadataRequest :: Text
-> Maybe ClientCredential
-> MetadataForm
-> PackageName
-> Either UrlFormationError Request
metadataRequest Text
baseUrl Maybe ClientCredential
token MetadataForm
form PackageName
name = do
url <- Text -> PackageName -> Either UrlFormationError Text
packageUrl Text
baseUrl PackageName
name
base <- parseRequestEither url
pure
. withToken token
$ base
{ requestHeaders =
(hAccept, metadataAccept form)
: (hAcceptEncoding, "gzip")
: requestHeaders base
}
artifactRequestByFile ::
Text ->
Maybe ClientCredential ->
PackageName ->
Text ->
Either UrlFormationError Request
artifactRequestByFile :: Text
-> Maybe ClientCredential
-> PackageName
-> Text
-> Either UrlFormationError Request
artifactRequestByFile Text
baseUrl Maybe ClientCredential
token PackageName
name Text
filename = do
url <- Text -> PackageName -> Text -> Either UrlFormationError Text
artifactFileUrl Text
baseUrl PackageName
name Text
filename
base <- parseRequestEither url
pure
. withToken token
$ base
{
decompress = const False
}
artifactRequestByUrl ::
Maybe ClientCredential ->
Text ->
Either UrlFormationError Request
artifactRequestByUrl :: Maybe ClientCredential -> Text -> Either UrlFormationError Request
artifactRequestByUrl = CredentialMapping
-> Maybe ClientCredential
-> Text
-> Either UrlFormationError Request
Request.artifactRequestByUrl CredentialMapping
npmCredential
packageUrl :: Text -> PackageName -> Either UrlFormationError Text
packageUrl :: Text -> PackageName -> Either UrlFormationError Text
packageUrl Text
baseUrl PackageName
name =
Text -> Text -> Either UrlFormationError Text
joinPath Text
baseUrl (PackageName -> Text
encodePackagePath PackageName
name)
artifactFileUrl :: Text -> PackageName -> Text -> Either UrlFormationError Text
artifactFileUrl :: Text -> PackageName -> Text -> Either UrlFormationError Text
artifactFileUrl Text
baseUrl PackageName
name Text
filename =
Text -> Text -> Either UrlFormationError Text
joinPath Text
baseUrl (PackageName -> Text
encodePackagePath PackageName
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/-/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Text
encodeComponent Text
filename)
encodePackagePath :: PackageName -> Text
encodePackagePath :: PackageName -> Text
encodePackagePath PackageName
name = case PackageName -> Maybe Scope
pkgNamespace PackageName
name of
Just Scope
scope -> Text
"@" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Text
encodeComponent (Scope -> Text
unScope Scope
scope) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"%2F" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Text
encodeComponent (PackageName -> Text
unscopedName PackageName
name)
Maybe Scope
Nothing -> Text -> Text
encodeComponent (PackageName -> Text
renderPackageName PackageName
name)
jsonPutRequest :: Maybe ClientCredential -> Text -> ByteString -> Either UrlFormationError Request
jsonPutRequest :: Maybe ClientCredential
-> Text -> Method -> Either UrlFormationError Request
jsonPutRequest Maybe ClientCredential
credential Text
url Method
document = do
base <- Text -> Either UrlFormationError Request
parseRequestEither Text
url
pure
. withToken credential
$ base
{ method = "PUT"
, requestBody = RequestBodyBS document
, requestHeaders =
(hContentType, "application/json")
: (hAccept, "application/json")
: requestHeaders base
}
withToken :: Maybe ClientCredential -> Request -> Request
withToken :: Maybe ClientCredential -> Request -> Request
withToken = CredentialMapping -> Maybe ClientCredential -> Request -> Request
attachCredential CredentialMapping
npmCredential