{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} module Data.Connect.BaseTypes ( Key(..) , PluginKey(..) , Timeout(..) , Vendor(..) , Authentication(..) , AuthType(..) , IconDetails(..) , Name(..) , I18nText(..) , simpleText , URLBean(..) , toUrl , Length(..) ) where import Data.Aeson import Data.Aeson.Types import Data.Connect.AesonHelpers import Data.Connect.OrphanInstances () import Data.Text import qualified Data.Time.Units as DTU import GHC.Generics import qualified Network.URI as NU -- | This data type represents a Key for a particular data type. data Key t a = Key t deriving (Show, Eq, Generic) -- | This data type represents an Atlassian Connect Add-on key. data PluginKey = PluginKey Text deriving (Show, Eq, Generic) instance ToJSON PluginKey -- | Represents a timeout in seconds. newtype Timeout = Timeout DTU.Second deriving (Show, Eq, Enum, Num, Ord, Real, Integral) -- | Represents the Vendor of the add-on; which will be you. Put your details in this structure. data Vendor = Vendor { vendorName :: Name Vendor -- ^ Your name as a Vendor. Might be your personal name or your business name. , vendorUrl :: NU.URI -- ^ A URL to a website that represents you as a vendor. } deriving (Show, Eq, Generic) -- | If your Atlassian Connect addon wants to perform any server side communication with the host product then you will -- need to use authentication. Otherwise you should specify that you don't need authentication. data Authentication = Authentication { authType :: AuthType -- ^ The authentication type that you wish to use. } deriving (Show, Eq, Generic) -- | The authentication type that you wish to use in your Add-on. data AuthType = Jwt -- ^ If you need to communicate with the host product then you will want to request JWT authentication. | None -- ^ If you do not need to communicate the host product then you should request None for authentication. deriving (Show, Eq, Generic) -- | Represents an arbitrary icon. Potentially for an Atlassian Connect module or for the entire add-on itself. data IconDetails = IconDetails { iconUrl :: Text -- ^ The URI to the icon. , iconWidth :: Maybe Integer -- ^ The width of the icon. , iconHeight :: Maybe Integer -- ^ The height of the icon. } deriving (Show, Generic) -- | Atlassian Connect descriptors contain many names: module names, add-on names, vendor names etc. We want to make sure -- that these names don't get put in places that they do not belong. Or, if they do get moved around, they get moved around -- specifically. We are just adding type saefty to names. data Name a = Name Text deriving (Show, Eq, Generic) -- | Represents a standard text type in the descriptor than may be Internationalised in the future. However, currently -- there is no I18n support: data I18nText = I18nText { dValue :: Text -- ^ The raw text value that will show. , dI18n :: Maybe Text -- ^ The potential i18n key that will be used when we eventually have I18n support: } deriving (Show, Generic) instance ToJSON I18nText where toJSON = genericToJSON baseOptions { fieldLabelModifier = stripFieldNamePrefix "d" } -- | Since there is currently no I18n support () we have this helper method to quickly create an 'I18nText' from a standard -- 'Text' object. simpleText :: Text -> I18nText simpleText t = I18nText { dValue = t, dI18n = Nothing } -- | This represents a URL wrapped as an object instead of as a plain text element. data URLBean = URLBean { ubUrl :: Text -- ^ The raw URL. } deriving (Show, Generic) instance ToJSON URLBean where toJSON = genericToJSON baseOptions { fieldLabelModifier = stripFieldNamePrefix "ub" } -- | Wrap a regular 'Text' based URL inside a URLBean. toUrl :: Text -> URLBean toUrl = URLBean instance ToJSON (Name PluginKey) instance ToJSON (Name Vendor) instance ToJSON IconDetails where toJSON = genericToJSON baseOptions { fieldLabelModifier = stripFieldNamePrefix "icon" } instance ToJSON Vendor where toJSON = genericToJSON baseOptions { fieldLabelModifier = stripFieldNamePrefix "vendor" } instance ToJSON Authentication where toJSON = genericToJSON baseOptions { fieldLabelModifier = stripFieldNamePrefix "auth" } instance ToJSON AuthType where toJSON Jwt = "jwt" toJSON None = "none" -- | A basic length type for HTML elements. Useful for 'WebPanel's and other modules that may require length specifications. data Length = Pixels Integer -- ^ Specify a length in pixels | Percentage Integer -- ^ Specify a length as a percentage in the range [0-100]. deriving (Show, Generic) instance ToJSON Length where toJSON (Pixels x) = String . pack $ (show x ++ "px") toJSON (Percentage x) = String . pack $ (show x ++ "%")