Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. {-# LANGUAGE DataKinds #-}
  2. {-# LANGUAGE DeriveGeneric #-}
  3. {-# LANGUAGE OverloadedStrings #-}
  4. {-# LANGUAGE PolyKinds #-}
  5. {-# LANGUAGE TypeFamilies #-}
  6. {-# LANGUAGE TypeOperators #-}
  7.  
  8. import Control.Applicative
  9. import Control.Monad.IO.Class
  10. import Data.Aeson
  11. import Data.Proxy
  12. import Data.Text (Text)
  13. import Database.PostgreSQL.Simple
  14. import Database.PostgreSQL.Simple.FromRow
  15. import Database.PostgreSQL.Simple.ToField
  16. import Database.PostgreSQL.Simple.ToRow
  17. import GHC.Generics
  18. import Network.Wai.Handler.Warp hiding (Connection)
  19.  
  20. import Servant
  21.  
  22. data Book = Book
  23. { title :: Text
  24. , author :: Text
  25. } deriving Generic
  26.  
  27. -- JSON instances
  28. instance FromJSON Book
  29. instance ToJSON Book
  30.  
  31. -- PostgreSQL instances
  32. instance FromRow Book where
  33. fromRow = Book <$> field <*> field
  34.  
  35. instance ToRow Book where
  36. toRow book = [ toField (title book)
  37. , toField (author book)]
  38.  
  39. -- we explicitly say we expect a request body, of type Book
  40. type BookApi = "books" :> ReqBody Book :> Post Book -- POST /books
  41. :<|> "books" :> Get [Book] -- GET /books
  42.  
  43.  
  44. server :: Connection -> Server BookApi
  45. server conn = postBook
  46. :<|> getBooks
  47. where
  48. -- the aforementioned 'ReqBody' automatically makes this handler
  49. -- receive a Book argument
  50. postBook book = liftIO $ execute conn "insert into books values (?, ?)" book >> return book
  51. getBooks = liftIO $ query_ conn "select * from books"
  52.  
  53. bookApi :: Proxy BookApi
  54. bookApi = Proxy
  55.  
  56. main :: IO ()
  57. main = do
  58. conn <- connectPostgreSQL "host=localhost user=qubit dbname=bookstore"
  59. run 8080 (serve bookApi $ server conn)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement