91 lines
2.5 KiB
Haskell
91 lines
2.5 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module Lisa.Squeak where
|
|
|
|
import Data.Aeson (FromJSON(parseJSON), ToJSON(toJSON), Value, (.:), (.:?), (.=), object, withObject)
|
|
import Data.Text (Text)
|
|
import Data.Time.Calendar (Day)
|
|
import Network.HTTP.Req (POST(..), ReqBodyJson(..), Req, https, jsonResponse, responseBody, req)
|
|
|
|
data GQLQuery = GQLQuery
|
|
{ gqlQueryQuery :: Text
|
|
}
|
|
deriving (Show)
|
|
|
|
instance ToJSON GQLQuery where
|
|
toJSON (GQLQuery q) = object ["query" .= q]
|
|
|
|
data GQLReply a = GQLReply
|
|
{ gqlReplyData :: Maybe a
|
|
, gqlReplyErrors :: Maybe [GQLError]
|
|
}
|
|
deriving (Show)
|
|
|
|
instance FromJSON a => FromJSON (GQLReply a) where
|
|
parseJSON = withObject "GQLReply" $ \v -> GQLReply
|
|
<$> v .: "data"
|
|
<*> v .:? "errors"
|
|
|
|
data GQLError = GQLError
|
|
{ gqlErrorMessage :: Text
|
|
}
|
|
deriving (Show)
|
|
|
|
instance FromJSON GQLError where
|
|
parseJSON = withObject "GQLError" $ \v -> GQLError
|
|
<$> v .: "message"
|
|
|
|
data Documents = Documents { getDocuments :: [Document] }
|
|
deriving (Show)
|
|
|
|
instance FromJSON Documents where
|
|
parseJSON = withObject "Documents" $ \v -> Documents
|
|
<$> ((v .: "documents") >>= (.: "results"))
|
|
|
|
data Document = Document
|
|
{ documentId :: Text
|
|
, documentDate :: Day
|
|
, documentSemester :: Text
|
|
, documentPublicComment :: Maybe Text
|
|
, documentFaculty :: Faculty
|
|
, documentLectures :: [Lecture]
|
|
}
|
|
deriving (Show)
|
|
|
|
instance FromJSON Document where
|
|
parseJSON = withObject "Document" $ \v -> Document
|
|
<$> v .: "id"
|
|
<*> v .: "date"
|
|
<*> v .: "semester"
|
|
<*> v .: "publicComment"
|
|
<*> v .: "faculty"
|
|
<*> v .: "lectures"
|
|
|
|
data Faculty = Faculty
|
|
{ facultyId :: Text
|
|
, facultyDisplayName :: Text
|
|
}
|
|
deriving (Show)
|
|
|
|
instance FromJSON Faculty where
|
|
parseJSON = withObject "Faculty" $ \v -> Faculty
|
|
<$> v .: "id"
|
|
<*> v .: "displayName"
|
|
|
|
data Lecture = Lecture
|
|
{ lectureId :: Text
|
|
, lectureDisplayName :: Text
|
|
}
|
|
deriving (Show)
|
|
|
|
instance FromJSON Lecture where
|
|
parseJSON = withObject "Lecture" $ \v -> Lecture
|
|
<$> v .: "id"
|
|
<*> v .: "displayName"
|
|
|
|
serverUrl = https "api.squeak-test.fsmi.uni-karlsruhe.de"
|
|
|
|
getLectures :: Req (GQLReply Documents)
|
|
getLectures = responseBody <$> req POST serverUrl (ReqBodyJson $ GQLQuery q) jsonResponse mempty
|
|
where q = "{ documents(filters: []) { results { id date semester publicComment faculty { id displayName } lectures { id displayName } } } }"
|