Skip to content

Commit

Permalink
NewTeam types refactoring (wireapp#4257)
Browse files Browse the repository at this point in the history
* Separate BindingNewTeam for NonBindingNewTeam

* Rename BindingNewTeam → NewTeam

* Remove NewTeam lenses
  • Loading branch information
pcapriotti authored Sep 20, 2024
1 parent ef612ba commit 7ef9d8f
Show file tree
Hide file tree
Showing 43 changed files with 409 additions and 534 deletions.
1 change: 1 addition & 0 deletions changelog.d/5-internal/new-team-types-refactoring
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Simplify NewTeam and related types and remove lenses
2 changes: 1 addition & 1 deletion libs/wire-api/src/Wire/API/Routes/Internal/Galley.hs
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ type ITeamsAPIBase =
:<|> Named
"create-binding-team"
( ZUser
:> ReqBody '[JSON] BindingNewTeam
:> ReqBody '[JSON] NewTeam
:> MultiVerb1
'PUT
'[JSON]
Expand Down
37 changes: 35 additions & 2 deletions libs/wire-api/src/Wire/API/Routes/Public/Galley/Team.hs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,12 @@

module Wire.API.Routes.Public.Galley.Team where

import Control.Lens ((?~))
import Data.Aeson (FromJSON (..), ToJSON (..))
import Data.Id
import Data.OpenApi.Schema qualified as S
import Data.Range
import Data.Schema
import Imports
import Servant
import Servant.OpenApi.Internal.Orphans ()
Expand All @@ -28,17 +33,45 @@ import Wire.API.Routes.Named
import Wire.API.Routes.Public
import Wire.API.Routes.Version
import Wire.API.Team
import Wire.API.Team.Member
import Wire.API.Team.Permission

-- | FUTUREWORK: remove when the create-non-binding-team endpoint is deleted
data NonBindingNewTeam = NonBindingNewTeam
{ teamName :: Range 1 256 Text,
teamIcon :: Icon,
teamIconKey :: Maybe (Range 1 256 Text),
teamMembers :: Maybe (Range 1 127 [TeamMember])
}
deriving stock (Eq, Show)
deriving (FromJSON, ToJSON, S.ToSchema) via (Schema NonBindingNewTeam)

instance ToSchema NonBindingNewTeam where
schema =
object "NonBindingNewTeam" $
NonBindingNewTeam
<$> (.teamName) .= fieldWithDocModifier "name" (description ?~ "team name") schema
<*> (.teamIcon) .= fieldWithDocModifier "icon" (description ?~ "team icon (asset ID)") schema
<*> (.teamIconKey) .= maybe_ (optFieldWithDocModifier "icon_key" (description ?~ "team icon asset key") schema)
<*> (.teamMembers)
.= maybe_
( optFieldWithDocModifier
"members"
(description ?~ "initial team member ids (between 1 and 127)")
sch
)
where
sch :: ValueSchema SwaggerDoc (Range 1 127 [TeamMember])
sch = fromRange .= rangedSchema (array schema)

type TeamAPI =
Named
"create-non-binding-team"
( Summary "Create a new non binding team"
:> Until 'V4
:> ZUser
:> ZConn
:> CanThrow 'NotConnected
:> CanThrow 'UserBindingExists
:> CanThrow InvalidAction
:> "teams"
:> ReqBody '[Servant.JSON] NonBindingNewTeam
:> MultiVerb
Expand Down
79 changes: 18 additions & 61 deletions libs/wire-api/src/Wire/API/Team.hs
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,9 @@ module Wire.API.Team
teamListHasMore,

-- * NewTeam
BindingNewTeam (..),
bindingNewTeamObjectSchema,
NonBindingNewTeam (..),
NewTeam (..),
newTeamObjectSchema,
newNewTeam,
newTeamName,
newTeamIcon,
newTeamIconKey,
newTeamMembers,

-- * TeamUpdateData
TeamUpdateData (..),
Expand Down Expand Up @@ -84,7 +78,6 @@ import Data.Text.Encoding qualified as T
import Imports
import Test.QuickCheck.Gen (suchThat)
import Wire.API.Asset (AssetKey)
import Wire.API.Team.Member (TeamMember)
import Wire.Arbitrary (Arbitrary (arbitrary), GenericUniform (..))

--------------------------------------------------------------------------------
Expand Down Expand Up @@ -177,62 +170,27 @@ instance ToSchema TeamList where
--------------------------------------------------------------------------------
-- NewTeam

newtype BindingNewTeam = BindingNewTeam {bntTeam :: NewTeam ()}
deriving stock (Eq, Show, Generic)
deriving (ToJSON, FromJSON, S.ToSchema) via (Schema BindingNewTeam)

instance ToSchema BindingNewTeam where
schema = object "BindingNewTeam" bindingNewTeamObjectSchema

bindingNewTeamObjectSchema :: ObjectSchema SwaggerDoc BindingNewTeam
bindingNewTeamObjectSchema =
BindingNewTeam <$> unwrap .= newTeamObjectSchema null_
where
unwrap (BindingNewTeam nt) = nt

-- FUTUREWORK: since new team members do not get serialized, we zero them here.
-- it may be worth looking into how this can be solved in the types.
instance Arbitrary BindingNewTeam where
arbitrary =
BindingNewTeam . zeroTeamMembers <$> arbitrary @(NewTeam ())
where
zeroTeamMembers tms = tms {_newTeamMembers = Nothing}

-- | FUTUREWORK: this is dead code! remove!
newtype NonBindingNewTeam = NonBindingNewTeam (NewTeam (Range 1 127 [TeamMember]))
deriving stock (Eq, Show, Generic)
deriving (FromJSON, ToJSON, S.ToSchema) via (Schema NonBindingNewTeam)

instance ToSchema NonBindingNewTeam where
schema =
object "NonBindingNewTeam" $
NonBindingNewTeam
<$> unwrap .= newTeamObjectSchema sch
where
unwrap (NonBindingNewTeam nt) = nt

sch :: ValueSchema SwaggerDoc (Range 1 127 [TeamMember])
sch = fromRange .= rangedSchema (array schema)

data NewTeam a = NewTeam
{ _newTeamName :: Range 1 256 Text,
_newTeamIcon :: Icon,
_newTeamIconKey :: Maybe (Range 1 256 Text),
_newTeamMembers :: Maybe a
data NewTeam = NewTeam
{ newTeamName :: Range 1 256 Text,
newTeamIcon :: Icon,
newTeamIconKey :: Maybe (Range 1 256 Text)
}
deriving stock (Eq, Show, Generic)
deriving (Arbitrary) via (GenericUniform (NewTeam a))
deriving (ToJSON, FromJSON, S.ToSchema) via (Schema NewTeam)
deriving (Arbitrary) via (GenericUniform NewTeam)

newNewTeam :: Range 1 256 Text -> Icon -> NewTeam a
newNewTeam nme ico = NewTeam nme ico Nothing Nothing

newTeamObjectSchema :: ValueSchema SwaggerDoc a -> ObjectSchema SwaggerDoc (NewTeam a)
newTeamObjectSchema sch =
newTeamObjectSchema :: ObjectSchema SwaggerDoc NewTeam
newTeamObjectSchema =
NewTeam
<$> _newTeamName .= fieldWithDocModifier "name" (description ?~ "team name") schema
<*> _newTeamIcon .= fieldWithDocModifier "icon" (description ?~ "team icon (asset ID)") schema
<*> _newTeamIconKey .= maybe_ (optFieldWithDocModifier "icon_key" (description ?~ "team icon asset key") schema)
<*> _newTeamMembers .= maybe_ (optFieldWithDocModifier "members" (description ?~ "initial team member ids (between 1 and 127)") sch)
<$> newTeamName .= fieldWithDocModifier "name" (description ?~ "team name") schema
<*> newTeamIcon .= fieldWithDocModifier "icon" (description ?~ "team icon (asset ID)") schema
<*> newTeamIconKey .= maybe_ (optFieldWithDocModifier "icon_key" (description ?~ "team icon asset key") schema)

instance ToSchema NewTeam where
schema = object "NewTeam" newTeamObjectSchema

newNewTeam :: Range 1 256 Text -> Icon -> NewTeam
newNewTeam nme ico = NewTeam nme ico Nothing

--------------------------------------------------------------------------------
-- TeamUpdateData
Expand Down Expand Up @@ -322,6 +280,5 @@ instance ToSchema TeamDeleteData where

makeLenses ''Team
makeLenses ''TeamList
makeLenses ''NewTeam
makeLenses ''TeamUpdateData
makeLenses ''TeamDeleteData
6 changes: 3 additions & 3 deletions libs/wire-api/src/Wire/API/User.hs
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ import Wire.API.Error.Brig qualified as E
import Wire.API.Locale
import Wire.API.Provider.Service (ServiceRef)
import Wire.API.Routes.MultiVerb
import Wire.API.Team (BindingNewTeam, bindingNewTeamObjectSchema)
import Wire.API.Team
import Wire.API.Team.Member (TeamMember)
import Wire.API.Team.Member qualified as TeamMember
import Wire.API.Team.Role
Expand Down Expand Up @@ -1305,7 +1305,7 @@ newTeamUserTeamId = \case
NewTeamMemberSSO tid -> Just tid

data BindingNewTeamUser = BindingNewTeamUser
{ bnuTeam :: BindingNewTeam,
{ bnuTeam :: NewTeam,
bnuCurrency :: Maybe Currency.Alpha
-- FUTUREWORK:
-- Remove Currency selection once billing supports currency changes after team creation
Expand All @@ -1319,7 +1319,7 @@ instance ToSchema BindingNewTeamUser where
object "BindingNewTeamUser" $
BindingNewTeamUser
<$> bnuTeam
.= bindingNewTeamObjectSchema
.= newTeamObjectSchema
<*> bnuCurrency
.= maybe_ (optField "currency" genericToSchema)

Expand Down
4 changes: 2 additions & 2 deletions libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import Test.Wire.API.Golden.Generated.AssetSize_user qualified
import Test.Wire.API.Golden.Generated.AssetToken_user qualified
import Test.Wire.API.Golden.Generated.Asset_asset qualified
import Test.Wire.API.Golden.Generated.BindingNewTeamUser_user qualified
import Test.Wire.API.Golden.Generated.BindingNewTeam_team qualified
import Test.Wire.API.Golden.Generated.BotConvView_provider qualified
import Test.Wire.API.Golden.Generated.BotUserView_provider qualified
import Test.Wire.API.Golden.Generated.CheckHandles_user qualified
Expand Down Expand Up @@ -125,6 +124,7 @@ import Test.Wire.API.Golden.Generated.NewProvider_provider qualified
import Test.Wire.API.Golden.Generated.NewServiceResponse_provider qualified
import Test.Wire.API.Golden.Generated.NewService_provider qualified
import Test.Wire.API.Golden.Generated.NewTeamMember_team qualified
import Test.Wire.API.Golden.Generated.NewTeam_team qualified
import Test.Wire.API.Golden.Generated.NewUserPublic_user qualified
import Test.Wire.API.Golden.Generated.NewUser_user qualified
import Test.Wire.API.Golden.Generated.OtherMemberUpdate_user qualified
Expand Down Expand Up @@ -1156,7 +1156,7 @@ tests =
testGroup "Golden: ServiceTagList_provider" $
testObjects [(Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_1, "testObject_ServiceTagList_provider_1.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_2, "testObject_ServiceTagList_provider_2.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_3, "testObject_ServiceTagList_provider_3.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_4, "testObject_ServiceTagList_provider_4.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_5, "testObject_ServiceTagList_provider_5.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_6, "testObject_ServiceTagList_provider_6.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_7, "testObject_ServiceTagList_provider_7.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_8, "testObject_ServiceTagList_provider_8.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_9, "testObject_ServiceTagList_provider_9.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_10, "testObject_ServiceTagList_provider_10.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_11, "testObject_ServiceTagList_provider_11.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_12, "testObject_ServiceTagList_provider_12.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_13, "testObject_ServiceTagList_provider_13.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_14, "testObject_ServiceTagList_provider_14.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_15, "testObject_ServiceTagList_provider_15.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_16, "testObject_ServiceTagList_provider_16.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_17, "testObject_ServiceTagList_provider_17.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_18, "testObject_ServiceTagList_provider_18.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_19, "testObject_ServiceTagList_provider_19.json"), (Test.Wire.API.Golden.Generated.ServiceTagList_provider.testObject_ServiceTagList_provider_20, "testObject_ServiceTagList_provider_20.json")],
testGroup "Golden: BindingNewTeam_team" $
testObjects [(Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_1, "testObject_BindingNewTeam_team_1.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_2, "testObject_BindingNewTeam_team_2.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_3, "testObject_BindingNewTeam_team_3.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_4, "testObject_BindingNewTeam_team_4.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_5, "testObject_BindingNewTeam_team_5.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_6, "testObject_BindingNewTeam_team_6.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_7, "testObject_BindingNewTeam_team_7.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_8, "testObject_BindingNewTeam_team_8.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_9, "testObject_BindingNewTeam_team_9.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_10, "testObject_BindingNewTeam_team_10.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_11, "testObject_BindingNewTeam_team_11.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_12, "testObject_BindingNewTeam_team_12.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_13, "testObject_BindingNewTeam_team_13.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_14, "testObject_BindingNewTeam_team_14.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_15, "testObject_BindingNewTeam_team_15.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_16, "testObject_BindingNewTeam_team_16.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_17, "testObject_BindingNewTeam_team_17.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_18, "testObject_BindingNewTeam_team_18.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_19, "testObject_BindingNewTeam_team_19.json"), (Test.Wire.API.Golden.Generated.BindingNewTeam_team.testObject_BindingNewTeam_team_20, "testObject_BindingNewTeam_team_20.json")],
testObjects [(Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_1, "testObject_NewTeam_team_1.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_2, "testObject_NewTeam_team_2.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_3, "testObject_NewTeam_team_3.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_4, "testObject_NewTeam_team_4.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_5, "testObject_NewTeam_team_5.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_6, "testObject_NewTeam_team_6.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_7, "testObject_NewTeam_team_7.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_8, "testObject_NewTeam_team_8.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_9, "testObject_NewTeam_team_9.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_10, "testObject_NewTeam_team_10.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_11, "testObject_NewTeam_team_11.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_12, "testObject_NewTeam_team_12.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_13, "testObject_NewTeam_team_13.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_14, "testObject_NewTeam_team_14.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_15, "testObject_NewTeam_team_15.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_16, "testObject_NewTeam_team_16.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_17, "testObject_NewTeam_team_17.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_18, "testObject_NewTeam_team_18.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_19, "testObject_NewTeam_team_19.json"), (Test.Wire.API.Golden.Generated.NewTeam_team.testObject_NewTeam_team_20, "testObject_NewTeam_team_20.json")],
testGroup "Golden: TeamBinding_team" $
testObjects [(Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_1, "testObject_TeamBinding_team_1.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_2, "testObject_TeamBinding_team_2.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_3, "testObject_TeamBinding_team_3.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_4, "testObject_TeamBinding_team_4.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_5, "testObject_TeamBinding_team_5.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_6, "testObject_TeamBinding_team_6.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_7, "testObject_TeamBinding_team_7.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_8, "testObject_TeamBinding_team_8.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_9, "testObject_TeamBinding_team_9.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_10, "testObject_TeamBinding_team_10.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_11, "testObject_TeamBinding_team_11.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_12, "testObject_TeamBinding_team_12.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_13, "testObject_TeamBinding_team_13.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_14, "testObject_TeamBinding_team_14.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_15, "testObject_TeamBinding_team_15.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_16, "testObject_TeamBinding_team_16.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_17, "testObject_TeamBinding_team_17.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_18, "testObject_TeamBinding_team_18.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_19, "testObject_TeamBinding_team_19.json"), (Test.Wire.API.Golden.Generated.TeamBinding_team.testObject_TeamBinding_team_20, "testObject_TeamBinding_team_20.json")],
testGroup "Golden: Team_team" $
Expand Down
Loading

0 comments on commit 7ef9d8f

Please sign in to comment.