@@ -1,4 +1,3 @@
1−{-# LANGUAGE EmptyCase #-}
2{-# LANGUAGE FlexibleContexts #-}
1{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
4{-# LANGUAGE LambdaCase #-}
3{-# LANGUAGE LambdaCase #-}
@@ -6,6 +5,14 @@
6{-# LANGUAGE TypeFamilies #-}
5{-# LANGUAGE TypeFamilies #-}
7module Backend where
6module Backend where
8+import Control.Monad.IO.Class
10+import Data.ByteString.Lazy
11+import Database.PostgreSQL.Simple
12+import Database.Id.Class
13+import Data.Text (Text)
14+import qualified Data.Aeson as A
9import Prelude hiding (id)
16import Prelude hiding (id)
10import Common.Route
17import Common.Route
11import Obelisk.Backend
18import Obelisk.Backend
@@ -13,22 +20,46 @@ import Obelisk.Route
13import Snap.Core
20import Snap.Core
14import Gargoyle.PostgreSQL.Connect
21import Gargoyle.PostgreSQL.Connect
27+migration = "CREATE TABLE IF NOT EXISTS urls\
28+ \ (id SERIAL PRIMARY KEY, url VARCHAR(?) NOT NULL);"
16backend :: Backend BackendRoute FrontendRoute
30backend :: Backend BackendRoute FrontendRoute
17backend = Backend
31backend = Backend
18 { _backend_run = \serve -> do
32 { _backend_run = \serve -> do
19− withDb "db" $ \pool ->
33+ withDb "db" $ \pool -> do
34+ _ <- withResource pool $ \dbcon -> execute dbcon migration [maxUrlSize]
20 serve $ \case
35 serve $ \case
21− BackendRoute_Missing :/ () -> do
36+
37+ BackendRoute_Get_Url :/ id -> do
38+ result <- liftIO $ withResource pool $ \dbcon ->
39+ query dbcon "SELECT (url) FROM urls WHERE id = ?;" [unId id]
41+ [[url]] -> redirect url
22− modifyResponse $ setResponseStatus 400 "Malformed Request"
43+ modifyResponse $ setResponseStatus 404 "Not Found"
23− writeBS "400 Malformed Request"
44+ writeText "That shortlink wasn't found ¯\\_(ツ)_/¯"
24− r <- getResponse
45+ r <- getResponse
25− finishWith r
46+ finishWith r
26 BackendRoute_Shorten :/ () -> do
48 BackendRoute_Shorten :/ () -> do
49+ Just url <- A.decode <$> readRequestBody maxUrlSize
50+ [[id]] <- liftIO $ withResource pool $ \dbcon -> do
51+ _ <- execute dbcon "INSERT INTO urls (url) values (?);" [url :: Text]
52+ query_ dbcon "SELECT last_value FROM urls_id_seq;"
27 modifyResponse $ setResponseStatus 200 "OK"
53 modifyResponse $ setResponseStatus 200 "OK"
28− writeBS $ "\"OK\""
54+ writeBS $ toStrict $ A.encode $ ("/s/" <>) $ show (id :: Int)
59+ modifyResponse $ setResponseStatus 400 "Malformed Request"
60+ writeBS "400 Malformed Request"
29 r <- getResponse
61 r <- getResponse
30 finishWith r
62 finishWith r
33 , _backend_routeEncoder = fullRouteEncoder
64 , _backend_routeEncoder = fullRouteEncoder