flowdock-api-0.1.0.0: src/Flowdock/REST/Organization.hs
module Flowdock.REST.Organization
( Organization(..)
, Subscription(..)
, OrganizationUser(..)
, Organizations(..)
, OrgNameUpdate(..)
-- * API Calls
, listOrganizations
, getOrganization
, getOrganizationByID
, updateOrganization
) where
import Control.Monad
import Data.Aeson
import Data.Aeson.TH
import Data.Aeson.Types
import Data.Text (Text, pack)
-- import Data.Time.Clock (UTCTime)
import Data.Vector (toList)
import GHC.Generics
import Network.Http.Client (Method(..))
import Flowdock.REST
import Flowdock.Internal
-- -----------------------------------------------------------------------------
-- Deserialized Types
data Subscription = Subscription
{ trial :: !Bool
, trialEnds :: !Text -- TODO: UTCTime
} deriving (Eq, Show, Generic)
instance FromJSON Subscription where
parseJSON = genericParseJSON $ defaultOptions { fieldLabelModifier = underscoreCase }
data OrganizationUser = OrganizationUser
{ userID :: !Int
, userName :: !Text
, userEmail :: !Text
, isAdmin :: !Bool
} deriving (Eq, Show)
instance FromJSON OrganizationUser where
parseJSON (Object o) = do
uid <- o .: "id"
name <- o .: "name"
email <- o .: "email"
isAdmin <- o .: "admin"
return $ OrganizationUser uid name email isAdmin
parseJSON _ = mzero
data Organization = Organization
{ orgID :: !Int
, paramaterizedName :: !Text
, orgName :: !Text
, orgUserLimit :: !Int
, orgUserCount :: !Int
, orgIsActive :: !Bool
, orgURL :: !Text
, orgSubscription :: !Subscription
, orgUsers :: ![OrganizationUser]
} deriving (Eq, Show)
instance FromJSON Organization where
parseJSON (Object o) = do
oid <- o .: "id"
paramaterizedName <- o .: "parameterized_name"
name <- o .: "name"
userLimit <- o .: "user_limit"
userCount <- o .: "user_count"
isActive <- o .: "active"
url <- o .: "url"
subscription <- o .: "subscription"
users <- o .: "users"
return $ Organization oid paramaterizedName name userLimit userCount isActive url subscription users
parseJSON _ = mzero
newtype Organizations = Organizations { organizations :: [Organization] } deriving(Show, Eq)
instance FromJSON Organizations where
parseJSON (Array as) = do
organizations <- mapM parseJSON $ toList as :: Parser [Organization]
return $ Organizations organizations
parseJSON _ = mzero
-- -----------------------------------------------------------------------------
-- Serialized Types
data OrgNameUpdate = OrgNameUpdate
{ displayName :: !Text
} deriving (Eq, Show)
$(deriveToJSON defaultOptions{fieldLabelModifier = underscoreCase . drop 7} ''OrgNameUpdate)
-- -----------------------------------------------------------------------------
-- API Calls
listOrganizations :: RestAPI (Either Error Organizations)
listOrganizations =
request GET ["organizations"] [] Nothing
getOrganization :: Text -- ^ The paramaterized organization name
-> RestAPI (Either Error Organization)
getOrganization organization =
request GET ["organizations", organization] [] Nothing
getOrganizationByID :: Int -- ^ The organization ID
-> RestAPI (Either Error Organization)
getOrganizationByID oid =
request GET ["organizations", "find"] [("id", pack $ show oid)] Nothing
updateOrganization :: Text -- ^ The paramaterized organization name
-> OrgNameUpdate -- ^ The name to update it to.
-> RestAPI (Either Error Organization)
updateOrganization organization update =
request PUT ["organizations", organization] [] (Just $ encode update)