My Todo App

This sample app lets you manage a Todo list. It lets you create a new todo list as well as check off existing todo items.

Design Overview

Here’s the REST API:

  • GET - /todos/ - Gets a list of all todo items

  • POST - /todos/ - Creates a new Todo item

  • GET - /todos/{id} - Gets a specific todo item

  • DELETE - /todos/{id} - Deletes a specific todo item

  • PUT - /todos/{id} - Updates the state of a todo item

A todo item has this schema:

{
  "description": {"type": "str"},
  "uid": {"type: "str"},
  "state": {"type: "str", "enum": ["unstarted", "started", "completed"]},
  "metadata": {
    "type": "object"
  }
}

Dev Guide

To run the tests:

$ pip install ./requirements-dev.txt
$ pip install ./requirements.txt
$ py.test tests/

To run the integration tests (which will make calls to dynamodb):

$ RUN_INTEG_TESTS=yes py.test tests/test_db.py

To run the app with dynamodb, there’s a script that creates the table and adds it to .chalice/config.json:

$ python createtable.py
$ chalice local

Working With Users

If you want to mess around with users, you need to create the Users dynamodb table and create some test users. You can use the users.py script to help with this:

# Create Users table and save it to config.json
$ python createtable.py --table-type users --stage dev

# Create a test user:
$ python users.py --create-user
Username: myusername
Password:

# To test that password verification works:
$ python users.py -t
Username: myusername
Password:
Password verified.

Testing Authentication

First POST to /login:

$ echo '{"username": "james", "password": "mypassword"}' | \
    http POST localhost:8000/login
{
    "token": "...some long JWT token...",
}

Now use that token as the Authorization header in subsequent requests:

$ http GET localhost:8000/todos 'Authorization: ...some long JWT token...'

Deploying

Once you’ve created your users and app table you can deploy your app with the deploy command:

$ chalice deploy
Creating deployment package.
Updating policy for IAM role: mytodo-dev-api_handler
Updating lambda function: mytodo-dev
Updating policy for IAM role: mytodo-dev-jwt_auth
Updating lambda function: mytodo-dev-jwt_auth
Updating rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:us-west-2:12345:function:mytodo-dev
  - Lambda ARN: arn:aws:lambda:us-west-2:12345:function:mytodo-dev-jwt_auth
  - Rest API URL: https://abcd.execute-api.us-west-2.amazonaws.com/api/

You can now use the “Rest API URL” isntead of “localhost:8000” to test your app.