Adds create user handler.
This commit is contained in:
parent
140a213555
commit
e13d03bb24
38
package-lock.json
generated
38
package-lock.json
generated
@ -18,11 +18,33 @@
|
|||||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||||
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
||||||
},
|
},
|
||||||
|
"body-parser": {
|
||||||
|
"version": "1.18.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.0.tgz",
|
||||||
|
"integrity": "sha1-07Ik1Gf6LOjUNYnAJFBDJnwJNjQ=",
|
||||||
|
"requires": {
|
||||||
|
"bytes": "3.0.0",
|
||||||
|
"content-type": "1.0.2",
|
||||||
|
"debug": "2.6.8",
|
||||||
|
"depd": "1.1.1",
|
||||||
|
"http-errors": "1.6.2",
|
||||||
|
"iconv-lite": "0.4.18",
|
||||||
|
"on-finished": "2.3.0",
|
||||||
|
"qs": "6.5.0",
|
||||||
|
"raw-body": "2.3.1",
|
||||||
|
"type-is": "1.6.15"
|
||||||
|
}
|
||||||
|
},
|
||||||
"buffer-writer": {
|
"buffer-writer": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz",
|
||||||
"integrity": "sha1-Iqk2kB4wKa/NdUfrRIfOtpejvwg="
|
"integrity": "sha1-Iqk2kB4wKa/NdUfrRIfOtpejvwg="
|
||||||
},
|
},
|
||||||
|
"bytes": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
|
||||||
|
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
|
||||||
|
},
|
||||||
"content-disposition": {
|
"content-disposition": {
|
||||||
"version": "0.5.2",
|
"version": "0.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
||||||
@ -156,6 +178,11 @@
|
|||||||
"statuses": "1.3.1"
|
"statuses": "1.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"iconv-lite": {
|
||||||
|
"version": "0.4.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz",
|
||||||
|
"integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA=="
|
||||||
|
},
|
||||||
"inherits": {
|
"inherits": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||||
@ -326,6 +353,17 @@
|
|||||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
|
||||||
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
|
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
|
||||||
},
|
},
|
||||||
|
"raw-body": {
|
||||||
|
"version": "2.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.1.tgz",
|
||||||
|
"integrity": "sha512-sxkd1uqaSj41SG5Vet9sNAxBMCMsmZ3LVhRkDlK8SbCpelTUB7JiMGHG70AZS6cFiCRgfNQhU2eLnTHYRFf7LA==",
|
||||||
|
"requires": {
|
||||||
|
"bytes": "3.0.0",
|
||||||
|
"http-errors": "1.6.2",
|
||||||
|
"iconv-lite": "0.4.18",
|
||||||
|
"unpipe": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"semver": {
|
"semver": {
|
||||||
"version": "4.3.2",
|
"version": "4.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz",
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"body-parser": "^1.18.0",
|
||||||
"express": "^4.15.4",
|
"express": "^4.15.4",
|
||||||
"pg": "^6.4.0"
|
"pg": "^6.4.0"
|
||||||
}
|
}
|
||||||
|
@ -3,14 +3,18 @@ module SimpleService.Handler where
|
|||||||
import Prelude
|
import Prelude
|
||||||
|
|
||||||
import Control.Monad.Aff.Class (liftAff)
|
import Control.Monad.Aff.Class (liftAff)
|
||||||
|
import Data.Either (Either(..))
|
||||||
|
import Data.Foldable (intercalate)
|
||||||
|
import Data.Foreign (renderForeignError)
|
||||||
import Data.Foreign.Class (encode)
|
import Data.Foreign.Class (encode)
|
||||||
import Data.Int (fromString)
|
import Data.Int (fromString)
|
||||||
import Data.Maybe (Maybe(..))
|
import Data.Maybe (Maybe(..))
|
||||||
import Database.PostgreSQL as PG
|
import Database.PostgreSQL as PG
|
||||||
import Node.Express.Handler (Handler)
|
import Node.Express.Handler (Handler)
|
||||||
import Node.Express.Request (getRouteParam)
|
import Node.Express.Request (getBody, getRouteParam)
|
||||||
import Node.Express.Response (sendJson, setStatus)
|
import Node.Express.Response (end, sendJson, setStatus)
|
||||||
import SimpleServer.Persistence as P
|
import SimpleServer.Persistence as P
|
||||||
|
import SimpleServer.Types (User(..))
|
||||||
|
|
||||||
getUser :: forall eff. PG.Pool -> Handler (postgreSQL :: PG.POSTGRESQL | eff)
|
getUser :: forall eff. PG.Pool -> Handler (postgreSQL :: PG.POSTGRESQL | eff)
|
||||||
getUser pool = getRouteParam "id" >>= case _ of
|
getUser pool = getRouteParam "id" >>= case _ of
|
||||||
@ -34,10 +38,27 @@ deleteUser pool = getRouteParam "id" >>= case _ of
|
|||||||
P.deleteUser conn userId
|
P.deleteUser conn userId
|
||||||
pure true
|
pure true
|
||||||
if found
|
if found
|
||||||
then respond 204 {}
|
then respondNoContent 204
|
||||||
else respond 404 { error: "User not found with id: " <> sUserId }
|
else respond 404 { error: "User not found with id: " <> sUserId }
|
||||||
|
|
||||||
|
createUser :: forall eff. PG.Pool -> Handler (postgreSQL :: PG.POSTGRESQL | eff)
|
||||||
|
createUser pool = getBody >>= case _ of
|
||||||
|
Left errs -> respond 422 { error: intercalate ", " $ map renderForeignError errs}
|
||||||
|
Right u@(User user) ->
|
||||||
|
if user.id <= 0
|
||||||
|
then respond 422 { error: "User ID must be more than 0: " <> show user.id}
|
||||||
|
else if user.name == ""
|
||||||
|
then respond 422 { error: "User name must not be empty" }
|
||||||
|
else do
|
||||||
|
liftAff (PG.withConnection pool $ flip P.insertUser u)
|
||||||
|
respondNoContent 201
|
||||||
|
|
||||||
respond :: forall eff a. Int -> a -> Handler eff
|
respond :: forall eff a. Int -> a -> Handler eff
|
||||||
respond status body = do
|
respond status body = do
|
||||||
setStatus status
|
setStatus status
|
||||||
sendJson body
|
sendJson body
|
||||||
|
|
||||||
|
respondNoContent :: forall eff a. Int -> Handler eff
|
||||||
|
respondNoContent status = do
|
||||||
|
setStatus status
|
||||||
|
end
|
||||||
|
7
src/SimpleService/Middleware/BodyParser.js
Normal file
7
src/SimpleService/Middleware/BodyParser.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
var bodyParser = require("body-parser");
|
||||||
|
|
||||||
|
exports.jsonBodyParser = bodyParser.json({
|
||||||
|
limit: "5mb"
|
||||||
|
});
|
7
src/SimpleService/Middleware/BodyParser.purs
Normal file
7
src/SimpleService/Middleware/BodyParser.purs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
module SimpleService.Middleware.BodyParser where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
import Data.Function.Uncurried (Fn3)
|
||||||
|
import Node.Express.Types (ExpressM, Response, Request)
|
||||||
|
|
||||||
|
foreign import jsonBodyParser :: forall e. Fn3 Request Response (ExpressM e Unit) (ExpressM e Unit)
|
@ -8,14 +8,18 @@ import Control.Monad.Eff.Class (liftEff)
|
|||||||
import Control.Monad.Eff.Console (CONSOLE, log, logShow)
|
import Control.Monad.Eff.Console (CONSOLE, log, logShow)
|
||||||
import Control.Monad.Eff.Exception (catchException)
|
import Control.Monad.Eff.Exception (catchException)
|
||||||
import Database.PostgreSQL as PG
|
import Database.PostgreSQL as PG
|
||||||
import Node.Express.App (App, delete, get, listenHttp)
|
import Node.Express.App (App, delete, get, listenHttp, post, useExternal)
|
||||||
import Node.Express.Types (EXPRESS)
|
import Node.Express.Types (EXPRESS)
|
||||||
import SimpleService.Handler (deleteUser, getUser)
|
import SimpleService.Handler (createUser, deleteUser, getUser)
|
||||||
|
import SimpleService.Middleware.BodyParser (jsonBodyParser)
|
||||||
|
|
||||||
app :: forall eff. PG.Pool -> App (postgreSQL :: PG.POSTGRESQL | eff)
|
app :: forall eff. PG.Pool -> App (postgreSQL :: PG.POSTGRESQL | eff)
|
||||||
app pool = do
|
app pool = do
|
||||||
|
useExternal jsonBodyParser
|
||||||
|
|
||||||
get "/v1/user/:id" $ getUser pool
|
get "/v1/user/:id" $ getUser pool
|
||||||
delete "/v1/user/:id" $ deleteUser pool
|
delete "/v1/user/:id" $ deleteUser pool
|
||||||
|
post "/v1/users" $ createUser pool
|
||||||
|
|
||||||
runServer :: forall eff.
|
runServer :: forall eff.
|
||||||
Int
|
Int
|
||||||
|
Loading…
Reference in New Issue
Block a user