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",
|
||||
"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": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz",
|
||||
"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": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
||||
@ -156,6 +178,11 @@
|
||||
"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": {
|
||||
"version": "2.0.3",
|
||||
"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",
|
||||
"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": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz",
|
||||
|
@ -13,6 +13,7 @@
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"body-parser": "^1.18.0",
|
||||
"express": "^4.15.4",
|
||||
"pg": "^6.4.0"
|
||||
}
|
||||
|
@ -3,14 +3,18 @@ module SimpleService.Handler where
|
||||
import Prelude
|
||||
|
||||
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.Int (fromString)
|
||||
import Data.Maybe (Maybe(..))
|
||||
import Database.PostgreSQL as PG
|
||||
import Node.Express.Handler (Handler)
|
||||
import Node.Express.Request (getRouteParam)
|
||||
import Node.Express.Response (sendJson, setStatus)
|
||||
import Node.Express.Request (getBody, getRouteParam)
|
||||
import Node.Express.Response (end, sendJson, setStatus)
|
||||
import SimpleServer.Persistence as P
|
||||
import SimpleServer.Types (User(..))
|
||||
|
||||
getUser :: forall eff. PG.Pool -> Handler (postgreSQL :: PG.POSTGRESQL | eff)
|
||||
getUser pool = getRouteParam "id" >>= case _ of
|
||||
@ -34,10 +38,27 @@ deleteUser pool = getRouteParam "id" >>= case _ of
|
||||
P.deleteUser conn userId
|
||||
pure true
|
||||
if found
|
||||
then respond 204 {}
|
||||
then respondNoContent 204
|
||||
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 status body = do
|
||||
setStatus status
|
||||
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.Exception (catchException)
|
||||
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 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 pool = do
|
||||
useExternal jsonBodyParser
|
||||
|
||||
get "/v1/user/:id" $ getUser pool
|
||||
delete "/v1/user/:id" $ deleteUser pool
|
||||
post "/v1/users" $ createUser pool
|
||||
|
||||
runServer :: forall eff.
|
||||
Int
|
||||
|
Loading…
Reference in New Issue
Block a user