https://github.com/jomendez/serverless-todo
https://github.com/jomendez/serverless-todo
Last synced: 5 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/jomendez/serverless-todo
- Owner: jomendez
- Created: 2020-05-13T00:50:37.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2023-01-07T18:09:50.000Z (almost 3 years ago)
- Last Synced: 2025-07-19T14:06:03.232Z (3 months ago)
- Language: TypeScript
- Size: 1.91 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Serverless TODO
To implement this project you need to implement a simple TODO application using AWS Lambda and Serverless framework. Search for all the `TODO:` comments in the code to find the placeholders that you need to implement.
# Functionality of the application
This appliation will allow to create/remove/update/get TODO items. Each TODO item can optionally have an attachment image. Each user only has access to TODO items that he/she has created.
# Functions to be implemented
To implement this project you need to implement the following functions and configure them in the `serverless.yml` file:
* `Auth` - this function should implement a custom authorizer for API Gateway that should be added to all other functions.
* `GetTodos` - should return all TODOs for a current user.
* `CreateTodo` - should create a new TODO for a current user. A shape of data send by a client application to this function can be found in the `CreateTodoRequest.ts` file
* `UpdateTodo` - should update a TODO item created by a current user. A shape of data send by a client application to this function can be found in the `UpdateTodoRequest.ts` file
* `DeleteTodo` - should delete a TODO item created by a current user. Expects an id of a TODO item to remove.
* `GenerateUploadUrl` - returns a presigned url that can be used to upload an attachment file for a TODO item.
All functions are already connected to appriate events from API gateway
An id of a user can be extracted from a JWT token passed by a client
You also need to add any necessary resources to the `resources` section of the `serverless.yml` file such as DynamoDB table and and S3 bucket.
# Frontend
The `client` folder contains a web application that can use the API that should be developed in the project.
To use it please edit the `config.ts` file in the `client` folder:
```ts
const apiId = '...' API Gateway id
export const apiEndpoint = `https://${apiId}.execute-api.us-east-1.amazonaws.com/dev`
export const authConfig = {
domain: '...', // Domain from Auth0
clientId: '...', // Client id from an Auth0 application
callbackUrl: 'http://localhost:3000/callback'
}
```
# Best practices
To complete this exercise please follow the best practices from the 6th lesson of this course.
# Suggestions
To store TODO items you might want to use a DynamoDB table with local secondary index(es). A create a local secondary index you need to a create a DynamoDB resource like this:
```yml
TodosTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: partitionKey
AttributeType: S
- AttributeName: sortKey
AttributeType: S
- AttributeName: indexKey
AttributeType: S
KeySchema:
- AttributeName: partitionKey
KeyType: HASH
- AttributeName: sortKey
KeyType: RANGE
BillingMode: PAY_PER_REQUEST
TableName: ${self:provider.environment.TODOS_TABLE}
LocalSecondaryIndexes:
- IndexName: ${self:provider.environment.INDEX_NAME}
KeySchema:
- AttributeName: partitionKey
KeyType: HASH
- AttributeName: indexKey
KeyType: RANGE
Projection:
ProjectionType: ALL # What attributes will be copied to an index
```
To query an index you need to use the `query()` method like:
```ts
await this.dynamoDBClient
.query({
TableName: 'table-name',
IndexName: 'index-name',
KeyConditionExpression: 'paritionKey = :paritionKey',
ExpressionAttributeValues: {
':paritionKey': partitionKeyValue
}
})
.promise()
```
# How to run the application
## Backend
To deploy an application run the following commands:
```
cd backend
npm install
sls deploy -v
```
## Frontend
To run a client application first edit the `client/src/config.ts` file to set correct parameters. And then run the following commands
```
cd client
npm install
npm run start
```
This should start a development server with the React application that will interact with the serverless TODO application.
# Remove serverless App
`serverless remove --stage dev --region us-east-1`
# Postman collection
An alternative way to test your API you can use the Postman collection that contains sample requests. You can find a Postman collection in this project. To import this collection do the following.
Click on the import button:

Click on the "Choose Files":

Select a file to import:

Right click on the imported collection to set variables for the collection:

Provide variables for the collection (similarly to how this was done in the course):
