Setup commit, play around with Req, Aeson and Scotty

This commit is contained in:
Paul Brinkmeier 2022-08-02 23:56:13 +02:00
commit 3afe4b5ff9
11 changed files with 330 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.stack-work/
*~

5
README.md Normal file
View File

@ -0,0 +1,5 @@
# lisa
> lightweight squeak access
Webserver that offers an HTML-only interface to Squeak.

2
Setup.hs Normal file
View File

@ -0,0 +1,2 @@
import Distribution.Simple
main = defaultMain

8
app/Main.hs Normal file
View File

@ -0,0 +1,8 @@
module Main where
import Web.Scotty (scotty)
import Lisa (app)
main :: IO ()
main = scotty 8080 app

76
lisa.cabal Normal file
View File

@ -0,0 +1,76 @@
cabal-version: 1.12
-- This file has been generated from package.yaml by hpack version 0.34.4.
--
-- see: https://github.com/sol/hpack
name: lisa
version: 0.1.0.0
description: Please see the README on GitHub at <https://github.com/pbrinkmeier/lisa#readme>
homepage: https://github.com/pbrinkmeier/lisa#readme
bug-reports: https://github.com/pbrinkmeier/lisa/issues
author: Paul Brinkmeier
maintainer: hallo@pbrinkmeier.de
copyright: Paul Brinkmeier (c) 2021
license: BSD3
license-file: LICENSE
build-type: Simple
extra-source-files:
README.md
ChangeLog.md
source-repository head
type: git
location: https://github.com/pbrinkmeier/lisa
library
exposed-modules:
Lisa
Lisa.Squeak
other-modules:
Paths_lisa
hs-source-dirs:
src
build-depends:
aeson >=2.0
, base >=4.7 && <5
, req >=3.10
, scotty >=0.12
, text >=1.0
, time
default-language: Haskell2010
executable lisa-exe
main-is: Main.hs
other-modules:
Paths_lisa
hs-source-dirs:
app
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends:
aeson >=2.0
, base >=4.7 && <5
, lisa
, req >=3.10
, scotty >=0.12
, text >=1.0
, time
default-language: Haskell2010
test-suite lisa-test
type: exitcode-stdio-1.0
main-is: Spec.hs
other-modules:
Paths_lisa
hs-source-dirs:
test
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends:
aeson >=2.0
, base >=4.7 && <5
, lisa
, req >=3.10
, scotty >=0.12
, text >=1.0
, time
default-language: Haskell2010

54
package.yaml Normal file
View File

@ -0,0 +1,54 @@
name: lisa
version: 0.1.0.0
github: "pbrinkmeier/lisa"
license: BSD3
author: "Paul Brinkmeier"
maintainer: "hallo@pbrinkmeier.de"
copyright: "Paul Brinkmeier (c) 2021"
extra-source-files:
- README.md
- ChangeLog.md
# Metadata used when publishing your package
# synopsis: Short description of your package
# category: Web
# To avoid duplicated efforts in documentation and dealing with the
# complications of embedding Haddock markup inside cabal files, it is
# common to point users to the README.md file.
description: Please see the README on GitHub at <https://github.com/pbrinkmeier/lisa#readme>
dependencies:
- base >= 4.7 && < 5
- aeson >= 2.0
- req >= 3.10
- scotty >= 0.12
- text >= 1.0
- time
library:
source-dirs: src
executables:
lisa-exe:
main: Main.hs
source-dirs: app
ghc-options:
- -threaded
- -rtsopts
- -with-rtsopts=-N
dependencies:
- lisa
- scotty >= 0.12
tests:
lisa-test:
main: Spec.hs
source-dirs: test
ghc-options:
- -threaded
- -rtsopts
- -with-rtsopts=-N
dependencies:
- lisa

11
src/Lisa.hs Normal file
View File

@ -0,0 +1,11 @@
{-# LANGUAGE OverloadedStrings #-}
module Lisa
( app
) where
import Web.Scotty (ScottyM, get, html)
app :: ScottyM ()
app = get "/" $ do
html "<h1>It works!</h1>"

90
src/Lisa/Squeak.hs Normal file
View File

@ -0,0 +1,90 @@
{-# 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 } } } }"

67
stack.yaml Normal file
View File

@ -0,0 +1,67 @@
# This file was automatically generated by 'stack init'
#
# Some commonly used options have been documented as comments in this file.
# For advanced use and comprehensive documentation of the format, please see:
# https://docs.haskellstack.org/en/stable/yaml_configuration/
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
# A snapshot resolver dictates the compiler version and the set of packages
# to be used for project dependencies. For example:
#
# resolver: lts-3.5
# resolver: nightly-2015-09-21
# resolver: ghc-7.10.2
#
# The location of a snapshot can be provided as a file or url. Stack assumes
# a snapshot provided as a file might change, whereas a url resource does not.
#
# resolver: ./custom-snapshot.yaml
# resolver: https://example.com/snapshots/2018-01-01.yaml
resolver:
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/19/17.yaml
# User packages to be built.
# Various formats can be used as shown in the example below.
#
# packages:
# - some-directory
# - https://example.com/foo/bar/baz-0.0.2.tar.gz
# subdirs:
# - auto-update
# - wai
packages:
- .
# Dependency packages to be pulled from upstream that are not in the resolver.
# These entries can reference officially published versions as well as
# forks / in-progress versions pinned to a git hash. For example:
#
# extra-deps:
# - acme-missiles-0.3
# - git: https://github.com/commercialhaskell/stack.git
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
#
# extra-deps: []
# Override default flag values for local packages and extra-deps
# flags: {}
# Extra package databases containing global packages
# extra-package-dbs: []
# Control whether we use the GHC we find on the path
# system-ghc: true
#
# Require a specific version of stack, using version ranges
# require-stack-version: -any # Default
# require-stack-version: ">=2.7"
#
# Override the architecture used by stack, especially useful on Windows
# arch: i386
# arch: x86_64
#
# Extra directories used by stack for building
# extra-include-dirs: [/path/to/dir]
# extra-lib-dirs: [/path/to/dir]
#
# Allow a newer minor version of GHC than the snapshot specifies
# compiler-check: newer-minor

13
stack.yaml.lock Normal file
View File

@ -0,0 +1,13 @@
# This file was autogenerated by Stack.
# You should not edit this file by hand.
# For more information, please see the documentation at:
# https://docs.haskellstack.org/en/stable/lock_files
packages: []
snapshots:
- completed:
size: 619161
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/19/17.yaml
sha256: 7f47507fd037228a8d23cf830f5844e1f006221acebdd7cb49f2f5fb561e0546
original:
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/19/17.yaml

2
test/Spec.hs Normal file
View File

@ -0,0 +1,2 @@
main :: IO ()
main = putStrLn "Test suite not yet implemented"