{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeSynonymInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module ChatWork.Types.Base ( Room(..) , Account(..) , IconPreset(..) , TaskStatus (..) , AccountId ) where import ChatWork.Utils (strLength) import Data.Aeson (FromJSON (..), ToJSON (..), genericParseJSON, genericToJSON) import Data.Aeson.Casing (aesonDrop, snakeCase) import Data.Either (partitionEithers) import Data.Text (Text, pack, split) import GHC.Generics (Generic) import Web.HttpApiData data Room = Room { roomToRoomId :: Int , roomToName :: Text , roomToIconPath :: Text } deriving (Eq, Show, Generic) instance ToJSON Room where toJSON = genericToJSON $ aesonDrop (strLength "roomTo") snakeCase instance FromJSON Room where parseJSON = genericParseJSON $ aesonDrop (strLength "roomTo") snakeCase data Account = Account { accountToAccountId :: Int , accountToName :: Text , accountToAvatarImageUrl :: Text } deriving (Eq, Show, Generic) instance ToJSON Account where toJSON = genericToJSON $ aesonDrop (strLength "accountTo") snakeCase instance FromJSON Account where parseJSON = genericParseJSON $ aesonDrop (strLength "accountTo") snakeCase -- | -- use create new room -- see : data IconPreset = Group | Check | Document | Meeting | Event | Project | Business | Study | Security | Star | Idea | Heart | Magcup | Beer | Music | Sports | Travel deriving (Bounded, Enum, Eq) instance Show IconPreset where show Group = "group" show Check = "check" show Document = "document" show Meeting = "meeting" show Event = "event" show Project = "project" show Business = "business" show Study = "study" show Security = "security" show Star = "star" show Idea = "idea" show Heart = "heart" show Magcup = "magcup" show Beer = "beer" show Music = "music" show Sports = "sports" show Travel = "travel" instance ToHttpApiData IconPreset where toUrlPiece = pack . show instance FromHttpApiData IconPreset where parseUrlPiece = parseBoundedUrlPiece -- | -- use get tasks on room -- see: data TaskStatus = Open | Done deriving (Bounded, Enum, Eq) instance Show TaskStatus where show Open = "open" show Done = "done" instance ToHttpApiData TaskStatus where toUrlPiece = pack . show instance FromHttpApiData TaskStatus where parseUrlPiece = parseBoundedUrlPiece -- | -- use get files on room -- see: type AccountId = Int instance (FromHttpApiData a) => FromHttpApiData [a] where parseUrlPiece txt = if null es then Right xs else Left "abc" where (es, xs) = partitionEithers . fmap parseUrlPiece $ split (== ',') txt