-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2022 Wire Swiss GmbH <opensource@wire.com>
--
-- This program is free software: you can redistribute it and/or modify it under
-- the terms of the GNU Affero General Public License as published by the Free
-- Software Foundation, either version 3 of the License, or (at your option) any
-- later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
-- details.
--
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Galley.Intra.Spar
  ( deleteTeam,
    lookupScimUserInfos,
  )
where

import Bilge
import Data.ByteString.Conversion
import Data.Id
import Data.Set qualified as Set
import Galley.Intra.Util
import Galley.Monad
import Imports
import Network.HTTP.Types.Method
import Wire.API.User (ScimUserInfo, UserSet (..), scimUserInfos)

-- | Notify Spar that a team is being deleted.
deleteTeam :: TeamId -> App ()
deleteTeam :: TeamId -> App ()
deleteTeam TeamId
tid = do
  App (Response (Maybe ByteString)) -> App ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (App (Response (Maybe ByteString)) -> App ())
-> ((Request -> Request) -> App (Response (Maybe ByteString)))
-> (Request -> Request)
-> App ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntraComponent
-> (Request -> Request) -> App (Response (Maybe ByteString))
call IntraComponent
Spar ((Request -> Request) -> App ()) -> (Request -> Request) -> App ()
forall a b. (a -> b) -> a -> b
$
    StdMethod -> Request -> Request
method StdMethod
DELETE
      (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid]
      (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

-- | Get the SCIM user info for a user.
lookupScimUserInfos :: [UserId] -> App [ScimUserInfo]
lookupScimUserInfos :: [UserId] -> App [ScimUserInfo]
lookupScimUserInfos [UserId]
uids = do
  Response (Maybe ByteString)
response <-
    IntraComponent
-> (Request -> Request) -> App (Response (Maybe ByteString))
call IntraComponent
Spar ((Request -> Request) -> App (Response (Maybe ByteString)))
-> (Request -> Request) -> App (Response (Maybe ByteString))
forall a b. (a -> b) -> a -> b
$
      StdMethod -> Request -> Request
method StdMethod
POST
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"scim", ByteString
"userinfos"]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserSet -> Request -> Request
forall a. ToJSON a => a -> Request -> Request
json (Set UserId -> UserSet
UserSet (Set UserId -> UserSet) -> Set UserId -> UserSet
forall a b. (a -> b) -> a -> b
$ [UserId] -> Set UserId
forall a. Ord a => [a] -> Set a
Set.fromList [UserId]
uids)
  [ScimUserInfo] -> App [ScimUserInfo]
forall a. a -> App a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([ScimUserInfo] -> App [ScimUserInfo])
-> [ScimUserInfo] -> App [ScimUserInfo]
forall a b. (a -> b) -> a -> b
$ (ScimUserInfos -> [ScimUserInfo])
-> Maybe ScimUserInfos -> [ScimUserInfo]
forall m a. Monoid m => (a -> m) -> Maybe a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap ScimUserInfos -> [ScimUserInfo]
scimUserInfos (Maybe ScimUserInfos -> [ScimUserInfo])
-> Maybe ScimUserInfos -> [ScimUserInfo]
forall a b. (a -> b) -> a -> b
$ Response (Maybe ByteString) -> Maybe ScimUserInfos
forall a.
(HasCallStack, Typeable a, FromJSON a) =>
Response (Maybe ByteString) -> Maybe a
responseJsonMaybe Response (Maybe ByteString)
response