server endpoint for tag unsubscription
This commit is contained in:
parent
7280f251b5
commit
89706f688a
|
@ -251,8 +251,14 @@ tagSubscribe serv hashtag origin = do
|
||||||
|
|
||||||
|
|
||||||
tagUnsubscribe :: PostService d -> Txt.Text -> Maybe Txt.Text -> Handler Txt.Text
|
tagUnsubscribe :: PostService d -> Txt.Text -> Maybe Txt.Text -> Handler Txt.Text
|
||||||
tagUnsubscribe serv hashtag origin = pure $ "Here be a dragon unsubscription from " <> fromMaybe "Nothing" origin <> " to " <> hashtag
|
tagUnsubscribe serv hashtag origin = do
|
||||||
|
originURL <- maybe
|
||||||
|
(throwError $ err400 { errBody = "Missing Origin header" })
|
||||||
|
pure
|
||||||
|
origin
|
||||||
|
req <- HTTP.parseUrlThrow (Txt.unpack originURL)
|
||||||
|
liftIO . atomically $ deleteSubscription (subscribers serv) hashtag (BSU.toString $ HTTP.host req, HTTP.port req)
|
||||||
|
pure "bye bye"
|
||||||
|
|
||||||
-- ======= data structure manipulations =========
|
-- ======= data structure manipulations =========
|
||||||
|
|
||||||
|
@ -297,6 +303,25 @@ setupSubscriberChannel tagMapSTM tag subscriber leaseTime = do
|
||||||
Just (tagOutChan, _) -> pure tagOutChan
|
Just (tagOutChan, _) -> pure tagOutChan
|
||||||
|
|
||||||
|
|
||||||
|
-- | deletes a subscription from the passed subscriber map
|
||||||
|
deleteSubscription :: TVar RelayTags -> Hashtag -> (String, Int) -> STM ()
|
||||||
|
deleteSubscription tagMapSTM tag subscriber = do
|
||||||
|
tagMap <- readTVar tagMapSTM
|
||||||
|
case lookupTagSubscriptions tag tagMap of
|
||||||
|
-- no subscribers to that tag, just return
|
||||||
|
Nothing -> pure ()
|
||||||
|
Just (foundSubMapSTM, _, _) -> do
|
||||||
|
foundSubMap <- readTVar foundSubMapSTM
|
||||||
|
let newSubMap = HMap.delete subscriber foundSubMap
|
||||||
|
-- if there are no subscriptions for the tag anymore, remove its
|
||||||
|
-- data sttructure altogether
|
||||||
|
if HMap.null newSubMap
|
||||||
|
then writeTVar tagMapSTM $ deleteRMapEntry (genKeyID . Txt.unpack $ tag) tagMap
|
||||||
|
-- otherwise just remove the subscription of that node
|
||||||
|
else writeTVar foundSubMapSTM newSubMap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- | returns the broadcast channel of a hashtag if there are any subscribers to it
|
-- | returns the broadcast channel of a hashtag if there are any subscribers to it
|
||||||
getTagBroadcastChannel :: PostService d -> Hashtag -> STM (Maybe (TChan PostID))
|
getTagBroadcastChannel :: PostService d -> Hashtag -> STM (Maybe (TChan PostID))
|
||||||
getTagBroadcastChannel serv tag = do
|
getTagBroadcastChannel serv tag = do
|
||||||
|
|
Loading…
Reference in a new issue