packages feed

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)