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)