Skip to content

Commit e0c51c4

Browse files
committed
added API description and removed obsolte swagger models
1 parent d521623 commit e0c51c4

File tree

3 files changed

+30
-105
lines changed

3 files changed

+30
-105
lines changed

libs/wire-api/src/Wire/API/Swagger.hs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import qualified Wire.API.Team as Team
3535
import qualified Wire.API.Team.Conversation as Team.Conversation
3636
import qualified Wire.API.Team.Feature as Team.Feature
3737
import qualified Wire.API.Team.Invitation as Team.Invitation
38-
import qualified Wire.API.Team.Member as Team.Member
3938
import qualified Wire.API.Team.Permission as Team.Permission
4039
import qualified Wire.API.User as User
4140
import qualified Wire.API.User.Activation as User.Activation
@@ -93,8 +92,6 @@ models =
9392
Push.Token.modelPushTokenList,
9493
Team.modelTeam,
9594
Team.modelTeamList,
96-
Team.modelNewNonBindingTeam,
97-
Team.modelUpdateData,
9895
Team.modelTeamDelete,
9996
Team.Conversation.modelTeamConversation,
10097
Team.Conversation.modelTeamConversationList,
@@ -118,10 +115,6 @@ models =
118115
Team.Invitation.modelTeamInvitation,
119116
Team.Invitation.modelTeamInvitationList,
120117
Team.Invitation.modelTeamInvitationRequest,
121-
Team.Member.modelTeamMember,
122-
Team.Member.modelTeamMemberList,
123-
Team.Member.modelNewTeamMember,
124-
Team.Member.modelTeamMemberDelete,
125118
Team.Permission.modelPermissions,
126119
User.modelUserIdList,
127120
User.modelUser,

libs/wire-api/src/Wire/API/Team.hs

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,12 @@ module Wire.API.Team
6666
-- * Swagger
6767
modelTeam,
6868
modelTeamList,
69-
modelNewNonBindingTeam,
7069
modelUpdateData,
7170
modelTeamDelete,
7271
)
7372
where
7473

75-
import Control.Lens (makeLenses)
74+
import Control.Lens (makeLenses, (?~))
7675
import Data.Aeson (FromJSON, ToJSON, Value (..))
7776
import Data.Aeson.Types (Parser)
7877
import qualified Data.Attoparsec.ByteString as Atto (Parser, string)
@@ -90,7 +89,7 @@ import Imports
9089
import Test.QuickCheck.Gen (suchThat)
9190
import Wire.API.Arbitrary (Arbitrary (arbitrary), GenericUniform (..))
9291
import Wire.API.Asset (AssetKey)
93-
import Wire.API.Team.Member (TeamMember, modelTeamMember)
92+
import Wire.API.Team.Member (TeamMember)
9493

9594
--------------------------------------------------------------------------------
9695
-- Team
@@ -218,20 +217,6 @@ instance ToSchema NonBindingNewTeam where
218217
sch :: ValueSchema SwaggerDoc (Range 1 127 [TeamMember])
219218
sch = fromRange .= rangedSchema (array schema)
220219

221-
modelNewNonBindingTeam :: Doc.Model
222-
modelNewNonBindingTeam = Doc.defineModel "newNonBindingTeam" $ do
223-
Doc.description "Required data when creating new regular teams"
224-
Doc.property "name" Doc.string' $
225-
Doc.description "team name"
226-
Doc.property "icon" Doc.string' $
227-
Doc.description "team icon (asset ID)"
228-
Doc.property "icon_key" Doc.string' $ do
229-
Doc.description "team icon asset key"
230-
Doc.optional
231-
Doc.property "members" (Doc.unique $ Doc.array (Doc.ref modelTeamMember)) $ do
232-
Doc.description "initial team member ids (between 1 and 127)"
233-
Doc.optional
234-
235220
data NewTeam a = NewTeam
236221
{ _newTeamName :: Range 1 256 Text,
237222
_newTeamIcon :: Icon,
@@ -247,10 +232,10 @@ newNewTeam nme ico = NewTeam nme ico Nothing Nothing
247232
newTeamObjectSchema :: ValueSchema SwaggerDoc a -> ObjectSchema SwaggerDoc (NewTeam a)
248233
newTeamObjectSchema sch =
249234
NewTeam
250-
<$> _newTeamName .= field "name" schema
251-
<*> _newTeamIcon .= field "icon" schema
252-
<*> _newTeamIconKey .= maybe_ (optField "icon_key" schema)
253-
<*> _newTeamMembers .= maybe_ (optField "members" sch)
235+
<$> _newTeamName .= fieldWithDocModifier "name" (description ?~ "team name") schema
236+
<*> _newTeamIcon .= fieldWithDocModifier "icon" (description ?~ "team icon (asset ID)") schema
237+
<*> _newTeamIconKey .= maybe_ (optFieldWithDocModifier "icon_key" (description ?~ "team icon asset key") schema)
238+
<*> _newTeamMembers .= maybe_ (optFieldWithDocModifier "members" (description ?~ "initial team member ids (between 1 and 127)") sch)
254239

255240
--------------------------------------------------------------------------------
256241
-- TeamUpdateData

libs/wire-api/src/Wire/API/Team/Member.hs

Lines changed: 24 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,7 @@ module Wire.API.Team.Member
2828
invitation,
2929
legalHoldStatus,
3030
ntmNewTeamMember,
31-
32-
-- * TODO(leif): remove after servantification
3331
teamMemberJson,
34-
teamMemberListJson,
3532
setOptionalPerms,
3633
setOptionalPermsMany,
3734

@@ -60,29 +57,22 @@ module Wire.API.Team.Member
6057
TeamMemberDeleteData,
6158
newTeamMemberDeleteData,
6259
tmdAuthPassword,
63-
64-
-- * Swagger
65-
modelTeamMember,
66-
modelTeamMemberList,
67-
modelNewTeamMember,
68-
modelTeamMemberDelete,
6960
)
7061
where
7162

72-
import Control.Lens (Lens, Lens', makeLenses, (%~))
63+
import Control.Lens (Lens, Lens', makeLenses, (%~), (?~))
7364
import Data.Aeson (FromJSON (..), ToJSON (..), Value (..))
7465
import Data.Id (UserId)
7566
import Data.Json.Util
76-
import Data.LegalHold (UserLegalHoldStatus (..), defUserLegalHoldStatus, typeUserLegalHoldStatus)
67+
import Data.LegalHold (UserLegalHoldStatus (..), defUserLegalHoldStatus)
7768
import Data.Misc (PlainTextPassword (..))
7869
import Data.Proxy
7970
import Data.Schema
80-
import qualified Data.Swagger.Build.Api as Doc
8171
import qualified Data.Swagger.Schema as S
8272
import GHC.TypeLits
8373
import Imports
8474
import Wire.API.Arbitrary (Arbitrary, GenericUniform (..))
85-
import Wire.API.Team.Permission (Permissions, modelPermissions)
75+
import Wire.API.Team.Permission (Permissions)
8676

8777
data PermissionTag = Required | Optional
8878

@@ -147,42 +137,26 @@ instance ToSchema TeamMember where
147137
object "TeamMember" $
148138
TeamMember
149139
<$> _newTeamMember .= newTeamMemberSchema
150-
<*> _legalHoldStatus .= (fromMaybe defUserLegalHoldStatus <$> optField "legalhold_status" schema)
140+
<*> _legalHoldStatus .= (fromMaybe defUserLegalHoldStatus <$> optFieldWithDocModifier "legalhold_status" (description ?~ lhDesc) schema)
151141

152142
instance ToSchema (TeamMember' 'Optional) where
153143
schema =
154-
object "TeamMember" $
144+
objectWithDocModifier "TeamMember" (description ?~ "team member data") $
155145
TeamMember
156146
<$> _newTeamMember
157147
.= ( NewTeamMember
158-
<$> _nUserId .= field "user" schema
159-
<*> _nPermissions .= maybe_ (optField "permissions" schema)
148+
<$> _nUserId .= fieldWithDocModifier "user" (description ?~ "user ID") schema
149+
<*> _nPermissions .= maybe_ (optFieldWithDocModifier "permissions" (description ?~ permissionsDesc) schema)
160150
<*> _nInvitation .= invitedSchema'
161151
)
162-
<*> _legalHoldStatus .= (fromMaybe defUserLegalHoldStatus <$> optField "legalhold_status" schema)
163-
164-
modelTeamMember :: Doc.Model
165-
modelTeamMember = Doc.defineModel "TeamMember" $ do
166-
Doc.description "team member data"
167-
Doc.property "user" Doc.bytes' $
168-
Doc.description "user ID"
169-
Doc.property "permissions" (Doc.ref modelPermissions) $ do
170-
Doc.description
171-
"The permissions this user has in the given team \
172-
\ (only visible with permission `GetMemberPermissions`)."
173-
Doc.optional -- not optional in the type, but in the json instance. (in
174-
-- servant, we could probably just add a helper type for this.)
175-
-- TODO: even without servant, it would be nicer to introduce
176-
-- a type with optional permissions.
177-
Doc.property "created_at" Doc.dateTime' $ do
178-
Doc.description "Timestamp of invitation creation. Requires created_by."
179-
Doc.optional
180-
Doc.property "created_by" Doc.bytes' $ do
181-
Doc.description "ID of the inviting user. Requires created_at."
182-
Doc.optional
183-
Doc.property "legalhold_status" typeUserLegalHoldStatus $ do
184-
Doc.description "The state of Legal Hold compliance for the member"
185-
Doc.optional
152+
<*> _legalHoldStatus .= (fromMaybe defUserLegalHoldStatus <$> optFieldWithDocModifier "legalhold_status" (description ?~ lhDesc) schema)
153+
where
154+
permissionsDesc =
155+
"The permissions this user has in the given team \
156+
\ (only visible with permission `GetMemberPermissions`)."
157+
158+
lhDesc :: Text
159+
lhDesc = "The state of Legal Hold compliance for the member"
186160

187161
setPerm :: Bool -> Permissions -> Maybe Permissions
188162
setPerm True = Just
@@ -230,20 +204,12 @@ deriving via
230204
newTeamMemberList :: [TeamMember] -> ListType -> TeamMemberList
231205
newTeamMemberList = TeamMemberList
232206

233-
modelTeamMemberList :: Doc.Model
234-
modelTeamMemberList = Doc.defineModel "TeamMemberList" $ do
235-
Doc.description "list of team member"
236-
Doc.property "members" (Doc.unique $ Doc.array (Doc.ref modelTeamMember)) $
237-
Doc.description "the array of team members"
238-
Doc.property "hasMore" Doc.bool' $
239-
Doc.description "true if 'members' doesn't contain all team members"
240-
241207
instance ToSchema (TeamMember' tag) => ToSchema (TeamMemberList' tag) where
242208
schema =
243-
object "TeamMemberList" $
209+
objectWithDocModifier "TeamMemberList" (description ?~ "list of team member") $
244210
TeamMemberList
245-
<$> _teamMembers .= field "members" (array schema)
246-
<*> _teamMemberListType .= field "hasMore" schema
211+
<$> _teamMembers .= fieldWithDocModifier "members" (description ?~ "the array of team members") (array schema)
212+
<*> _teamMemberListType .= fieldWithDocModifier "hasMore" (description ?~ "true if 'members' doesn't contain all team members") schema
247213

248214
type HardTruncationLimit = (2000 :: Nat)
249215

@@ -338,8 +304,8 @@ newTeamMemberSchema =
338304

339305
invitedSchema :: ObjectSchemaP SwaggerDoc (Maybe (UserId, UTCTimeMillis)) (Maybe UserId, Maybe UTCTimeMillis)
340306
invitedSchema =
341-
(,) <$> fmap fst .= optField "created_by" (maybeWithDefault Null schema)
342-
<*> fmap snd .= optField "created_at" (maybeWithDefault Null schema)
307+
(,) <$> fmap fst .= optFieldWithDocModifier "created_by" (description ?~ "ID of the inviting user. Requires created_at.") (maybeWithDefault Null schema)
308+
<*> fmap snd .= optFieldWithDocModifier "created_at" (description ?~ "Timestamp of invitation creation. Requires created_by.") (maybeWithDefault Null schema)
343309

344310
invitedSchema' :: ObjectSchema SwaggerDoc (Maybe (UserId, UTCTimeMillis))
345311
invitedSchema' = withParser invitedSchema $ \(invby, invat) ->
@@ -350,14 +316,8 @@ invitedSchema' = withParser invitedSchema $ \(invby, invat) ->
350316

351317
instance ToSchema NewTeamMember where
352318
schema =
353-
object "NewTeamMember" $
354-
field "member" $ unnamed (object "Unnamed" newTeamMemberSchema)
355-
356-
modelNewTeamMember :: Doc.Model
357-
modelNewTeamMember = Doc.defineModel "NewTeamMember" $ do
358-
Doc.description "Required data when creating new team members"
359-
Doc.property "member" (Doc.ref modelTeamMember) $
360-
Doc.description "the team member to add (the legalhold_status field must be null or missing!)"
319+
objectWithDocModifier "NewTeamMember" (description ?~ "Required data when creating new team members") $
320+
fieldWithDocModifier "member" (description ?~ "the team member to add (the legalhold_status field must be null or missing!)") $ unnamed (object "Unnamed" newTeamMemberSchema)
361321

362322
--------------------------------------------------------------------------------
363323
-- TeamMemberDeleteData
@@ -371,19 +331,12 @@ newtype TeamMemberDeleteData = TeamMemberDeleteData
371331

372332
instance ToSchema TeamMemberDeleteData where
373333
schema =
374-
object "TeamMemberDeleteData" $
375-
TeamMemberDeleteData <$> _tmdAuthPassword .= optField "password" (maybeWithDefault Null schema)
334+
objectWithDocModifier "TeamMemberDeleteData" (description ?~ "Data for a team member deletion request in case of binding teams.") $
335+
TeamMemberDeleteData <$> _tmdAuthPassword .= optFieldWithDocModifier "password" (description ?~ "The account password to authorise the deletion.") (maybeWithDefault Null schema)
376336

377337
newTeamMemberDeleteData :: Maybe PlainTextPassword -> TeamMemberDeleteData
378338
newTeamMemberDeleteData = TeamMemberDeleteData
379339

380-
-- FUTUREWORK: fix name of model?
381-
modelTeamMemberDelete :: Doc.Model
382-
modelTeamMemberDelete = Doc.defineModel "teamDeleteData" $ do
383-
Doc.description "Data for a team member deletion request in case of binding teams."
384-
Doc.property "password" Doc.string' $
385-
Doc.description "The account password to authorise the deletion."
386-
387340
makeLenses ''TeamMember'
388341
makeLenses ''TeamMemberList'
389342
makeLenses ''NewTeamMember'
@@ -401,18 +354,12 @@ permissions = newTeamMember . nPermissions
401354
invitation :: Lens' TeamMember (Maybe (UserId, UTCTimeMillis))
402355
invitation = newTeamMember . nInvitation
403356

404-
-- JSON serialisation utilities (FUTUREWORK(leif): remove after servantification)
405-
406357
teamMemberJson :: (TeamMember -> Bool) -> TeamMember -> Value
407358
teamMemberJson withPerms = toJSON . setOptionalPerms withPerms
408359

409360
setOptionalPerms :: (TeamMember -> Bool) -> TeamMember -> TeamMember' 'Optional
410361
setOptionalPerms withPerms m = m & permissions %~ setPerm (withPerms m)
411362

412-
-- | Show a list of team members using 'teamMemberJson'.
413-
teamMemberListJson :: (TeamMember -> Bool) -> TeamMemberList -> Value
414-
teamMemberListJson withPerms = toJSON . setOptionalPermsMany withPerms
415-
416363
setOptionalPermsMany :: (TeamMember -> Bool) -> TeamMemberList -> TeamMemberList' 'Optional
417364
setOptionalPermsMany withPerms l =
418365
l {_teamMembers = map (setOptionalPerms withPerms) (_teamMembers l)}

0 commit comments

Comments
 (0)