module Wire.API.Routes.Public.Galley.TeamMember where
import Data.Id
import Data.Int
import Data.Range
import GHC.Generics
import Generics.SOP qualified as GSOP
import Servant
import Servant.OpenApi.Internal.Orphans ()
import Wire.API.Error
import Wire.API.Error.Galley
import Wire.API.Routes.CSV
import Wire.API.Routes.LowLevelStream
import Wire.API.Routes.MultiVerb
import Wire.API.Routes.Named
import Wire.API.Routes.Public
import Wire.API.Routes.Version
import Wire.API.Team.Member
import Wire.API.User qualified as User
type TeamMemberAPI =
Named
"get-team-members"
( Summary "Get team members"
:> CanThrow 'NotATeamMember
:> ZLocalUser
:> "teams"
:> Capture "tid" TeamId
:> "members"
:> QueryParam'
[ Optional,
Strict,
Description "Maximum results to be returned"
]
"maxResults"
(Range 1 HardTruncationLimit Int32)
:> QueryParam'
[ Optional,
Strict,
Description
"Optional, when not specified, the first page will be returned.\
\Every returned page contains a `pagingState`, this should be supplied to retrieve the next page."
]
"pagingState"
TeamMembersPagingState
:> Get '[JSON] TeamMembersPage
)
:<|> Named
"get-team-member"
( Summary "Get single team member"
:> CanThrow 'NotATeamMember
:> CanThrow 'TeamMemberNotFound
:> ZLocalUser
:> "teams"
:> Capture "tid" TeamId
:> "members"
:> Capture "uid" UserId
:> Get '[JSON] TeamMemberOptPerms
)
:<|> Named
"get-team-members-by-ids"
( Summary "Get team members by user id list"
:> Description "The `has_more` field in the response body is always `false`."
:> CanThrow 'NotATeamMember
:> CanThrow 'BulkGetMemberLimitExceeded
:> ZLocalUser
:> "teams"
:> Capture "tid" TeamId
:> "get-members-by-ids-using-post"
:> QueryParam'
[ Optional,
Strict,
Description "Maximum results to be returned"
]
"maxResults"
(Range 1 HardTruncationLimit Int32)
:> ReqBody '[JSON] User.UserIdList
:> Post '[JSON] TeamMemberListOptPerms
)
:<|> Named
"add-team-member"
( Summary "Add a new team member"
:> Until 'V4
:> CanThrow 'InvalidPermissions
:> CanThrow 'NoAddToBinding
:> CanThrow 'NotATeamMember
:> CanThrow 'NotConnected
:> CanThrow OperationDenied
:> CanThrow 'TeamNotFound
:> CanThrow 'TooManyTeamMembers
:> CanThrow 'TooManyTeamAdmins
:> CanThrow 'UserBindingExists
:> CanThrow 'TooManyTeamMembersOnTeamWithLegalhold
:> ZLocalUser
:> ZConn
:> "teams"
:> Capture "tid" TeamId
:> "members"
:> ReqBody '[JSON] NewTeamMember
:> MultiVerb1
'POST
'[JSON]
(RespondEmpty 200 "")
)
:<|> Named
"delete-team-member"
( Summary "Remove an existing team member"
:> CanThrow AuthenticationError
:> CanThrow 'AccessDenied
:> CanThrow 'TeamMemberNotFound
:> CanThrow 'TeamNotFound
:> CanThrow 'NotATeamMember
:> CanThrow OperationDenied
:> ZLocalUser
:> ZConn
:> "teams"
:> Capture "tid" TeamId
:> "members"
:> Capture "uid" UserId
:> ReqBody '[JSON] TeamMemberDeleteData
:> MultiVerb
'DELETE
'[JSON]
TeamMemberDeleteResultResponseType
TeamMemberDeleteResult
)
:<|> Named
"delete-non-binding-team-member"
( Summary "Remove an existing team member"
:> Until 'V4
:> CanThrow AuthenticationError
:> CanThrow 'AccessDenied
:> CanThrow 'TeamMemberNotFound
:> CanThrow 'TeamNotFound
:> CanThrow 'NotATeamMember
:> CanThrow OperationDenied
:> ZLocalUser
:> ZConn
:> "teams"
:> Capture "tid" TeamId
:> "members"
:> Capture "uid" UserId
:> MultiVerb
'DELETE
'[JSON]
TeamMemberDeleteResultResponseType
TeamMemberDeleteResult
)
:<|> Named
"update-team-member"
( Summary "Update an existing team member"
:> CanThrow 'AccessDenied
:> CanThrow 'InvalidPermissions
:> CanThrow 'TeamNotFound
:> CanThrow 'TeamMemberNotFound
:> CanThrow 'TooManyTeamAdmins
:> CanThrow 'NotATeamMember
:> CanThrow OperationDenied
:> ZLocalUser
:> ZConn
:> "teams"
:> Capture "tid" TeamId
:> "members"
:> ReqBody '[JSON] NewTeamMember
:> MultiVerb1
'PUT
'[JSON]
(RespondEmpty 200 "")
)
:<|> Named
"get-team-members-csv"
( Summary "Get all members of the team as a CSV file"
:> CanThrow 'AccessDenied
:> Description
"The endpoint returns data in chunked transfer encoding.\
\ Internal server errors might result in a failed transfer\
\ instead of a 500 response."
:> ZLocalUser
:> "teams"
:> Capture "tid" TeamId
:> "members"
:> "csv"
:> LowLevelStream
'GET
200
'[ '( "Content-Disposition",
"attachment; filename=\"wire_team_members.csv\""
)
]
"CSV of team members"
CSV
)
type TeamMemberDeleteResultResponseType =
'[ RespondEmpty 202 "Team member scheduled for deletion",
RespondEmpty 200 ""
]
data TeamMemberDeleteResult
= TeamMemberDeleteAccepted
| TeamMemberDeleteCompleted
deriving ((forall x. TeamMemberDeleteResult -> Rep TeamMemberDeleteResult x)
-> (forall x.
Rep TeamMemberDeleteResult x -> TeamMemberDeleteResult)
-> Generic TeamMemberDeleteResult
forall x. Rep TeamMemberDeleteResult x -> TeamMemberDeleteResult
forall x. TeamMemberDeleteResult -> Rep TeamMemberDeleteResult x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TeamMemberDeleteResult -> Rep TeamMemberDeleteResult x
from :: forall x. TeamMemberDeleteResult -> Rep TeamMemberDeleteResult x
$cto :: forall x. Rep TeamMemberDeleteResult x -> TeamMemberDeleteResult
to :: forall x. Rep TeamMemberDeleteResult x -> TeamMemberDeleteResult
Generic)
deriving (AsUnion TeamMemberDeleteResultResponseType) via GenericAsUnion TeamMemberDeleteResultResponseType TeamMemberDeleteResult
instance GSOP.Generic TeamMemberDeleteResult