Skip to content

Commit c43d7e4

Browse files
authored
Merge pull request #1375 from haskell/add-uploader-username-to-package-json-api
Add uploader's username to package json API
2 parents 4e2b5c6 + d292789 commit c43d7e4

File tree

4 files changed

+30
-16
lines changed

4 files changed

+30
-16
lines changed

src/Distribution/Server/Features.hs

+1
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ initHackageFeatures env@ServerEnv{serverVerbosity = verbosity} = do
379379
packageInfoJSONFeature <- mkPackageJSONFeature
380380
coreFeature
381381
versionsFeature
382+
usersFeature
382383

383384
#endif
384385

src/Distribution/Server/Features/PackageInfoJSON.hs

+15-8
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ import Data.Foldable (toList)
5454
import Data.Traversable (for)
5555
import qualified Data.List as List
5656
import Data.Time (UTCTime)
57+
import Distribution.Server.Users.Types (UserName, UserInfo(..))
58+
import Distribution.Server.Features.Users (UserFeature(lookupUserInfo))
5759

5860

5961
data PackageInfoJSONFeature = PackageInfoJSONFeature {
@@ -79,10 +81,10 @@ data PackageInfoJSONResource = PackageInfoJSONResource {
7981
-- line for a package when it changes
8082
initPackageInfoJSONFeature
8183
:: Framework.ServerEnv
82-
-> IO (CoreFeature -> Preferred.VersionsFeature -> IO PackageInfoJSONFeature)
84+
-> IO (CoreFeature -> Preferred.VersionsFeature -> UserFeature -> IO PackageInfoJSONFeature)
8385
initPackageInfoJSONFeature env = do
8486
packageInfoState <- packageInfoStateComponent False (Framework.serverStateDir env)
85-
return $ \core preferred -> do
87+
return $ \core preferred userFeature -> do
8688

8789
let coreR = coreResource core
8890
info = "Get basic package information: \
@@ -94,13 +96,13 @@ initPackageInfoJSONFeature env = do
9496
(Framework.extendResource (corePackagePage coreR)) {
9597
Framework.resourceDesc = [(Framework.GET, info)]
9698
, Framework.resourceGet =
97-
[("json", servePackageBasicDescription coreR
99+
[("json", servePackageBasicDescription coreR userFeature
98100
preferred packageInfoState)]
99101
}
100102
, (Framework.extendResource (coreCabalFileRev coreR)) {
101103
Framework.resourceDesc = [(Framework.GET, vInfo)]
102104
, Framework.resourceGet =
103-
[("json", servePackageBasicDescription coreR
105+
[("json", servePackageBasicDescription coreR userFeature
104106
preferred packageInfoState)]
105107
}
106108
]
@@ -133,14 +135,15 @@ initPackageInfoJSONFeature env = do
133135

134136
-- | Pure function for extracting basic package info from a Cabal file
135137
getBasicDescription
136-
:: UTCTime
138+
:: UserName
139+
-> UTCTime
137140
-- ^ Time of upload
138141
-> CabalFileText
139142
-> Int
140143
-- ^ Metadata revision. This will be added to the resulting
141144
-- @PackageBasicDescription@
142145
-> Either String PackageBasicDescription
143-
getBasicDescription uploadedAt (CabalFileText cf) metadataRev =
146+
getBasicDescription uploader uploadedAt (CabalFileText cf) metadataRev =
144147
let parseResult = PkgDescr.parseGenericPackageDescription (BS.toStrict cf)
145148
in case PkgDescr.runParseResult parseResult of
146149
(_, Right pkg) -> let
@@ -154,6 +157,7 @@ getBasicDescription uploadedAt (CabalFileText cf) metadataRev =
154157
pbd_homepage = T.pack . fromShortText $ PkgDescr.homepage pkgd
155158
pbd_metadata_revision = metadataRev
156159
pbd_uploaded_at = uploadedAt
160+
pbd_uploader = uploader
157161
in
158162
return $ PackageBasicDescription {..}
159163
(_, Left (_, perrs)) ->
@@ -168,12 +172,13 @@ getBasicDescription uploadedAt (CabalFileText cf) metadataRev =
168172
-- A listing of versions and their deprecation states
169173
servePackageBasicDescription
170174
:: CoreResource
175+
-> UserFeature
171176
-> Preferred.VersionsFeature
172177
-> Framework.StateComponent Framework.AcidState PackageInfoState
173178
-> Framework.DynamicPath
174179
-- ^ URI specifying a package and version `e.g. lens or lens-4.11`
175180
-> Framework.ServerPartE Framework.Response
176-
servePackageBasicDescription resource preferred packageInfoState dpath = do
181+
servePackageBasicDescription resource userFeature preferred packageInfoState dpath = do
177182

178183
let metadataRev :: Maybe Int = lookup "revision" dpath >>= Framework.fromReqURI
179184

@@ -220,7 +225,9 @@ servePackageBasicDescription resource preferred packageInfoState dpath = do
220225

221226
let cabalFile = metadataRevs Vector.! metadataInd
222227
uploadedAt = fst $ uploadInfos Vector.! metadataInd
223-
pkgDescr = getBasicDescription uploadedAt cabalFile metadataInd
228+
uploaderId = snd $ uploadInfos Vector.! metadataInd
229+
uploader <- userName <$> lookupUserInfo userFeature uploaderId
230+
let pkgDescr = getBasicDescription uploader uploadedAt cabalFile metadataInd
224231
case pkgDescr of
225232
Left e -> Framework.errInternalError [Framework.MText e]
226233
Right d -> return d

src/Distribution/Server/Features/PackageInfoJSON/State.hs

+10-6
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ import qualified Distribution.Parsec as Parsec
4141

4242
import qualified Distribution.Server.Features.PreferredVersions as Preferred
4343
import Distribution.Server.Framework.MemSize (MemSize,
44-
memSize, memSize8)
44+
memSize, memSize9)
45+
import Distribution.Server.Users.Types (UserName)
4546

4647

4748
-- | Basic information about a package. These values are
@@ -55,6 +56,7 @@ data PackageBasicDescription = PackageBasicDescription
5556
, pbd_homepage :: !T.Text
5657
, pbd_metadata_revision :: !Int
5758
, pbd_uploaded_at :: !UTCTime
59+
, pbd_uploader :: !UserName
5860
} deriving (Eq, Show, Generic)
5961

6062
instance SafeCopy PackageBasicDescription where
@@ -67,6 +69,7 @@ instance SafeCopy PackageBasicDescription where
6769
put $ T.encodeUtf8 pbd_homepage
6870
put pbd_metadata_revision
6971
safePut pbd_uploaded_at
72+
safePut pbd_uploader
7073

7174
getCopy = contain $ do
7275
licenseStr <- get
@@ -80,6 +83,7 @@ instance SafeCopy PackageBasicDescription where
8083
pbd_homepage <- T.decodeUtf8 <$> get
8184
pbd_metadata_revision <- get
8285
pbd_uploaded_at <- safeGet
86+
pbd_uploader <- safeGet
8387
return PackageBasicDescription{..}
8488

8589

@@ -96,9 +100,9 @@ instance Aeson.ToJSON PackageBasicDescription where
96100
, Key.fromString "homepage" .= pbd_homepage
97101
, Key.fromString "metadata_revision" .= pbd_metadata_revision
98102
, Key.fromString "uploaded_at" .= pbd_uploaded_at
103+
, Key.fromString "uploader" .= pbd_uploader
99104
]
100105

101-
102106
instance Aeson.FromJSON PackageBasicDescription where
103107
parseJSON = Aeson.withObject "PackageBasicDescription" $ \obj -> do
104108
pbd_version' <- obj .: Key.fromString "license"
@@ -114,8 +118,8 @@ instance Aeson.FromJSON PackageBasicDescription where
114118
pbd_homepage <- obj .: Key.fromString "homepage"
115119
pbd_metadata_revision <- obj .: Key.fromString "metadata_revision"
116120
pbd_uploaded_at <- obj .: Key.fromString "uploaded_at"
117-
return $
118-
PackageBasicDescription {..}
121+
pbd_uploader <- obj .: Key.fromString "uploader"
122+
return $ PackageBasicDescription {..}
119123

120124
-- | An index of versions for one Hackage package
121125
-- and their preferred/deprecated status
@@ -229,8 +233,8 @@ deriveSafeCopy 0 'base ''PackageInfoState
229233

230234
instance MemSize PackageBasicDescription where
231235
memSize PackageBasicDescription{..} =
232-
memSize8 (Pretty.prettyShow pbd_license) pbd_copyright pbd_synopsis
233-
pbd_description pbd_author pbd_homepage pbd_metadata_revision pbd_uploaded_at
236+
memSize9 (Pretty.prettyShow pbd_license) pbd_copyright pbd_synopsis
237+
pbd_description pbd_author pbd_homepage pbd_metadata_revision pbd_uploaded_at pbd_uploader
234238

235239
instance MemSize PackageVersions where
236240
memSize (PackageVersions ps) = getSum $

src/Distribution/Server/Users/Types.hs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving, TemplateHaskell #-}
22
{-# LANGUAGE TypeFamilies #-}
3+
{-# LANGUAGE DerivingStrategies #-}
34
module Distribution.Server.Users.Types (
45
module Distribution.Server.Users.Types,
56
module Distribution.Server.Users.AuthToken,
@@ -26,13 +27,14 @@ import Data.Aeson (ToJSON, FromJSON)
2627
import Data.SafeCopy (base, extension, deriveSafeCopy, Migrate(..))
2728
import Data.Typeable (Typeable)
2829
import Data.Hashable
30+
import Data.Serialize (Serialize)
2931

3032

3133
newtype UserId = UserId Int
32-
deriving (Eq, Ord, Read, Show, Typeable, MemSize, ToJSON, FromJSON, Pretty)
34+
deriving newtype (Eq, Ord, Read, Show, Typeable, MemSize, ToJSON, FromJSON, Pretty)
3335

3436
newtype UserName = UserName String
35-
deriving (Eq, Ord, Read, Show, Typeable, MemSize, ToJSON, FromJSON, Hashable)
37+
deriving newtype (Eq, Ord, Read, Show, Typeable, MemSize, ToJSON, FromJSON, Hashable, Serialize)
3638

3739
data UserInfo = UserInfo {
3840
userName :: !UserName,

0 commit comments

Comments
 (0)