-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2023 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 Wire.API.Federation.API.Util where

import Imports
import Wire.API.Federation.API.Galley.Notifications
import Wire.API.Federation.BackendNotifications
import Wire.API.Federation.Component

makeConversationUpdateBundle ::
  ConversationUpdate ->
  FedQueueClient 'Galley (PayloadBundle 'Galley)
makeConversationUpdateBundle :: ConversationUpdate
-> FedQueueClient 'Galley (PayloadBundle 'Galley)
makeConversationUpdateBundle ConversationUpdate
update =
  PayloadBundle 'Galley
-> PayloadBundle 'Galley -> PayloadBundle 'Galley
forall a. Semigroup a => a -> a -> a
(<>) (PayloadBundle 'Galley
 -> PayloadBundle 'Galley -> PayloadBundle 'Galley)
-> FedQueueClient 'Galley (PayloadBundle 'Galley)
-> FedQueueClient
     'Galley (PayloadBundle 'Galley -> PayloadBundle 'Galley)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Payload 'OnConversationUpdatedTag
-> FedQueueClient 'Galley (PayloadBundle 'Galley)
forall {k} (tag :: k) (c :: Component).
(HasFedPath tag, HasVersionRange tag,
 KnownComponent (NotificationComponent k), ToJSON (Payload tag),
 c ~ NotificationComponent k) =>
Payload tag -> FedQueueClient c (PayloadBundle c)
makeBundle Payload 'OnConversationUpdatedTag
ConversationUpdate
update FedQueueClient
  'Galley (PayloadBundle 'Galley -> PayloadBundle 'Galley)
-> FedQueueClient 'Galley (PayloadBundle 'Galley)
-> FedQueueClient 'Galley (PayloadBundle 'Galley)
forall a b.
FedQueueClient 'Galley (a -> b)
-> FedQueueClient 'Galley a -> FedQueueClient 'Galley b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Payload 'OnConversationUpdatedTagV0
-> FedQueueClient 'Galley (PayloadBundle 'Galley)
forall {k} (tag :: k) (c :: Component).
(HasFedPath tag, HasVersionRange tag,
 KnownComponent (NotificationComponent k), ToJSON (Payload tag),
 c ~ NotificationComponent k) =>
Payload tag -> FedQueueClient c (PayloadBundle c)
makeBundle (ConversationUpdate -> ConversationUpdateV0
conversationUpdateToV0 ConversationUpdate
update)