module Web.Harvest.API.Type
( Credentials (..)
, UserId (..)
, User (..)
, TimeEntryId (..)
, TimeEntries (..)
, TimeEntry (..) )
where
import Data.Aeson
import Data.ByteString (ByteString)
import Data.Text (Text)
import Data.Time (UTCTime, Day)
import Servant.API
data Credentials = Credentials
{ credentialsUsername :: ByteString
, credentialsPassword :: ByteString
, credentialsAccount :: ByteString
} deriving (Eq, Ord, Show)
newtype UserId = UserId { unUserId :: Word }
deriving (Eq, Ord, Show, FromJSON, ToHttpApiData)
data User = User
{ userId :: UserId
, userEmail :: Text
, userCreatedAt :: UTCTime
, userIsAdmin :: Bool
, userFirstName :: Text
, userLastName :: Text
, userTimeZone :: Text
, userIsContractor :: Bool
, userTelephone :: Text
, userIsActive :: Bool
, userAccessFuture :: Bool
, userDefaultHourlyRate :: Word
, userDepartment :: Maybe Text
, userWantsNewsletter :: Bool
, userUpdatedAt :: UTCTime
, userCostRate :: Maybe Word
, userIdentityAccountId :: Maybe Word
, userIdentityUserId :: Maybe Word
} deriving (Eq, Ord, Show)
instance FromJSON User where
parseJSON = withObject "User" $ \o -> do
u <- o .: "user"
userId <- u .: "id"
userEmail <- u .: "email"
userCreatedAt <- u .: "created_at"
userIsAdmin <- u .: "is_admin"
userFirstName <- u .: "first_name"
userLastName <- u .: "last_name"
userTimeZone <- u .: "timezone"
userIsContractor <- u .: "is_contractor"
userTelephone <- u .: "telephone"
userIsActive <- u .: "is_active"
userAccessFuture <- u .: "has_access_to_all_future_projects"
userDefaultHourlyRate <- u .: "default_hourly_rate"
userDepartment <- u .: "department"
userWantsNewsletter <- u .: "wants_newsletter"
userUpdatedAt <- u .: "updated_at"
userCostRate <- u .: "cost_rate"
userIdentityAccountId <- u .:? "identity_account_id"
userIdentityUserId <- u .:? "identity_user_id"
return User {..}
data TimeEntries = TimeEntries
{ teForDay :: Day
, teDayEntries :: [TimeEntry]
} deriving (Eq, Ord, Show)
instance FromJSON TimeEntries where
parseJSON = withObject "TimeEntries" $ \o -> do
teDayEntries <- o .: "day_entries"
teForDay <- o .: "for_day"
return TimeEntries {..}
newtype TimeEntryId = TimeEntryId
{ unTimeEntryId :: Word }
deriving (Eq, Ord, Show, FromJSON)
data TimeEntry = TimeEntry
{ teProjectId :: Text
, teProject :: Text
, teUserId :: UserId
, teSpentAt :: Day
, teTaskId :: Text
, teTask :: Text
, teClient :: Text
, teId :: TimeEntryId
, teNotes :: Maybe Text
, teTimerStartedAt :: Maybe UTCTime
, teCreatedAt :: UTCTime
, teUpdatedAt :: UTCTime
, teHoursWithoutTimer :: Double
, teHours :: Double
} deriving (Eq, Ord, Show)
instance FromJSON TimeEntry where
parseJSON = withObject "TimeEntry" $ \o -> do
teProjectId <- o .: "project_id"
teProject <- o .: "project"
teUserId <- o .: "user_id"
teSpentAt <- o .: "spent_at"
teTaskId <- o .: "task_id"
teTask <- o .: "task"
teClient <- o .: "client"
teId <- o .: "id"
teNotes <- o .: "notes"
teTimerStartedAt <- o .:? "timer_started_at"
teCreatedAt <- o .: "created_at"
teUpdatedAt <- o .: "updated_at"
teHoursWithoutTimer <- o .: "hours_without_timer"
teHours <- o .: "hours"
return TimeEntry {..}