mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
* Remove lots of refs to iron and funcy oracle etc.. * more ref replacements * Replacing more refs. Treeder * Use Fn not FN
144 lines
3.2 KiB
Markdown
144 lines
3.2 KiB
Markdown
# 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 |