on master help sign in
Added channel count limit.
aa80912iko
denis/src/Data/Query.hs+10−1
@@ -60,7 +60,8 @@ module Data.Query (
60 searchTags,
60 searchTags,
61 updateUser,
61 updateUser,
62 UserUpdateRow(..),
62 UserUpdateRow(..),
63− killAllTokens
63+ killAllTokens,
64+ channelCountForUser
64 ) where
65 ) where
65
66
66import Squeal.PostgreSQL
67import Squeal.PostgreSQL
@@ -337,6 +338,11 @@ createNamedChannelQ = insertRow #channels
337 OnConflictDoRaise
338 OnConflictDoRaise
338 (Returning $ #namedChannelFullId `as` #fromOnly)
339 (Returning $ #namedChannelFullId `as` #fromOnly)
339
340
341+countChannelsQ :: Query Schema (TuplePG (Only UserId)) (RowPG (Only Int64))
342+countChannelsQ = select (countStar `as` #fromOnly) (from (table #channels) &
343+ where_ (#namedChannelFullOwner .== param @1) &
344+ groupBy #namedChannelFullOwner)
345+
340deleteNamedChannelQ :: Manipulation Schema (TuplePG (Only NamedChannelId)) '[]
346deleteNamedChannelQ :: Manipulation Schema (TuplePG (Only NamedChannelId)) '[]
341deleteNamedChannelQ = deleteFrom_ #channels (#namedChannelFullId .== param @1)
347deleteNamedChannelQ = deleteFrom_ #channels (#namedChannelFullId .== param @1)
342
348
@@ -897,6 +903,9 @@ createNewChannel uId req = commitedTransactionallyUpdate $ do
897 cId <- manipulateParams createNamedChannelQ (addUserToChannelCreate uId (req {namedChannelCreationRequestPeopleIds = fromList uIds})) >>= firstRow
903 cId <- manipulateParams createNamedChannelQ (addUserToChannelCreate uId (req {namedChannelCreationRequestPeopleIds = fromList uIds})) >>= firstRow
898 return $ fmap fromOnly cId
904 return $ fmap fromOnly cId
899
905
906+channelCountForUser :: UserId -> StaticPQ Int64
907+channelCountForUser uId = (fromMaybe 0 . fmap fromOnly) <$> (runQueryParams countChannelsQ (Only uId) >>= firstRow)
908+
900updateChannel :: UserId -> NamedChannel UserId -> StaticPQ ()
909updateChannel :: UserId -> NamedChannel UserId -> StaticPQ ()
901updateChannel uId req = commitedTransactionallyUpdate $ do
910updateChannel uId req = commitedTransactionallyUpdate $ do
902 uIds <- fmap fromList . verifiedUsers . toList $ namedChannelPeopleIds req
911 uIds <- fmap fromList . verifiedUsers . toList $ namedChannelPeopleIds req
denis/src/Server/API/Channels.hs+12−2
@@ -21,6 +21,8 @@ import Data.Channel.NamedChannel
21import Data.Channel.AnonymousChannel
21import Data.Channel.AnonymousChannel
22import qualified Data.Post as P
22import qualified Data.Post as P
23import Server.Query.Pagination
23import Server.Query.Pagination
24+import Data.Int
25+import Server.Error
24
26
25-- MARK: Implementation
27-- MARK: Implementation
26
28
@@ -47,7 +49,11 @@ getChannel uId (PaginatingRequest pId lim (Just cId) dir) = runQnotFound $ getCh
47getChannel _ (PaginatingRequest pId lim Nothing dir) = maybeNotFound . runQnotFound $ getLastPosts pId lim dir
49getChannel _ (PaginatingRequest pId lim Nothing dir) = maybeNotFound . runQnotFound $ getLastPosts pId lim dir
48
50
49createChannelApi :: UserId -> NamedChannelCreationRequest -> App NamedChannelId
51createChannelApi :: UserId -> NamedChannelCreationRequest -> App NamedChannelId
52+createChannelApi uId req = do
53+ cCount <- runQerror $ channelCountForUser uId
54+ if cCount >= channelCountLimit
55+ then throwError $ limitExceeded "You have exceeded the number of channels you can create."
50−createChannelApi uId req = maybeNotFound . runQnotFound $ createNewChannel uId req
56+ else maybeNotFound . runQerror $ createNewChannel uId req
51
57
52updateChannelApi :: UserId -> NamedChannel UserId -> App NoContent
58updateChannelApi :: UserId -> NamedChannel UserId -> App NoContent
53updateChannelApi uId req = do
59updateChannelApi uId req = do
@@ -57,4 +63,8 @@ updateChannelApi uId req = do
57deleteChannelApi :: UserId -> NamedChannelId -> App NoContent
63deleteChannelApi :: UserId -> NamedChannelId -> App NoContent
58deleteChannelApi uId cId = do
64deleteChannelApi uId cId = do
59 runQnotFound $ deleteNamedChannel uId cId
65 runQnotFound $ deleteNamedChannel uId cId
60− return NoContent
66+ return NoContent
67+
68+-- TODO: Increase
69+channelCountLimit :: Int64
70+channelCountLimit = 5
denis/src/Server/Error.hs+10−2
@@ -1,15 +1,23 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2
2
3module Server.Error (
3module Server.Error (
4− invalidToken
4+ invalidToken,
5+ limitExceeded,
6+ throwError
5) where
7) where
6
8
7import Servant.Server
9import Servant.Server
10+import Control.Monad.Except
8
11
9invalidToken :: ServantErr
12invalidToken :: ServantErr
10invalidToken = ServantErr {
13invalidToken = ServantErr {
11 errHTTPCode = 498,
14 errHTTPCode = 498,
12 errReasonPhrase = "Invalid Token",
15 errReasonPhrase = "Invalid Token",
13− errBody = "The supplied token is invalid",
16+ errBody = "",
14 errHeaders = []
17 errHeaders = []
15}
18}
19+
20+limitExceeded :: String -> ServantErr
21+limitExceeded msg = err406 {
22+ errReasonPhrase = msg
23+}