# Blog API Example A simple serverless blog API ## Requirements - Remote MongoDB instance (for example heroku) - Running Fn API ## Development ### Building image locally ``` # SET BELOW TO YOUR DOCKER HUB USERNAME USERNAME=YOUR_DOCKER_HUB_USERNAME # build it docker run --rm -v "$PWD":/go/src/github.com/fnproject/hello -w /go/src/github.com/fnproject/hello fnproject/go:dev go build -o function docker build -t $USERNAME/func-blog . ``` ### Publishing to DockerHub ``` # tagging docker run --rm -v "$PWD":/app treeder/bump patch docker tag $USERNAME/func-blog:latest $USERNAME/func-blog:`cat VERSION` # pushing to docker hub docker push $USERNAME/func-blog ``` ## Running it on Fn First you need a running Fn API ### First, let's define this environment variables ``` # Set your Function server address # Eg. 127.0.0.1:8080 FUNCAPI=YOUR_FUNCTIONS_ADDRESS # Set your mongoDB server address # Eg. 127.0.0.1:27017/blog MONGODB=YOUR_MONGODB_ADDRESS ``` ### Testing image ``` ./test.sh ``` ### Running with Fn With this command we are going to create an application with name `blog` and also defining the app configuration `DB`. ``` curl -X POST --data '{ "app": { "name": "blog", "config": { "DB": "'$MONGODB'" } } }' http://$FUNCAPI/v1/apps ``` Now, we can create our blog routes: - `/posts` - to create (authenticated) and list posts - `/posts/:id` - to read post - `/token` - to get a JWT ``` curl -X POST --data '{ "route": { "image": "'$USERNAME'/func-blog", "path": "/posts" } }' http://$FUNCAPI/v1/apps/blog/routes ``` ``` curl -X POST --data '{ "route": { "image": "'$USERNAME'/func-blog", "path": "/posts/:id" } }' http://$FUNCAPI/v1/apps/blog/routes ``` ``` curl -X POST --data '{ "route": { "image": "'$USERNAME'/func-blog", "path": "/token" } }' http://$FUNCAPI/v1/apps/blog/routes ``` #### Testing function Now that we created our Fn route, let's test our routes ``` curl -X POST http://$FUNCAPI/r/blog/posts ``` This command should return `{"error":"Invalid authentication"}` because we aren't sending any token. #### Authentication ##### Creating a blog user First let's create our blog user. In this example an user `test` with password `test`. ``` docker run --rm -e DB=$MONGODB -e NEWUSER='{ "username": "test", "password": "test" }' $USERNAME/functions-blog ``` ##### Getting authorization token Now, to get authorized to post in our Blog API endpoints we must request a new token with a valid user. ``` curl -X POST --data '{ "username": "test", "password": "test" }' http://$FUNCAPI/r/blog/token ``` This will output a token like this: ``` {"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyMDE2LTA5LTAxVDAwOjQzOjMxLjQwNjY5NTIxNy0wMzowMCIsInVzZXIiOiJ0ZXN0In0.aPKdH3QPauutFsFbSdQyF6q1hqTAas_BCbSYi5mFiSU"} ``` Let's save that token in the environment ``` BLOG_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyMDE2LTA5LTAxVDAwOjQzOjMxLjQwNjY5NTIxNy0wMzowMCIsInVzZXIiOiJ0ZXN0In0.aPKdH3QPauutFsFbSdQyF6q1hqTAas_BCbSYi5mFiSU ``` ##### Posting in your blog curl -X POST --header "Authorization: Bearer $BLOG_TOKEN" --data '{ "title": "My New Post", "body": "Hello world!", "user": "test" }' http://$FUNCAPI/r/blog/posts