For a deep dive into the architecture decisions (why GraphQL, why serverless, etc.) check out Margins Architecture Overview
├── graphql-api
│ ├── __generated__
│ ├── db
│ ├── docker-compose.yml
│ ├── graphql
│ ├── graphql.schema.json
│ ├── nginx
│ ├── node_modules
│ ├── package.json
│ ├── production.yml
│ ├── self-signed-jwt
│ ├── terraform
│ ├── tests
│ ├── yarn-error.log
│ └── yarn.lock
├── lambdas
│ ├── README.md
│ ├── add-cognito-user-to-group.js
│ ├── babel.config.js
│ ├── events
│ ├── node_modules
│ ├── package.json
│ ├── samconfig.toml
│ ├── src
│ ├── cognito-post-confirm
│ ├── parse-kindle-email
│ └── reject-unregistered-emails
│ ├── template.yaml
│ ├── tsconfig.json
│ ├── webpack.config.js
│ └── yarn.lock
├── terraform-uploads
│ ├── main.tf
│ ├── outputs.tf
│ ├── terraform.tfstate
│ ├── terraform.tfstate.backup
│ └── variables.tf
└── utils
├── cognito-tokens
├── compare-annotations
├── data-mappers
└── kindle-html-converter
docker-compose.yml
andproduction.yml
: Docker compose files for development and production. Main differences are that development also spins up a PostgreSQL container for fast database iteration, and production yml has certbot for SSL certificates./db
: Source of truth for PostgreSQL database schema at./db/init/00-schema.sql
. Should figure out a better naming convention../graphql
: Code for Express server that runs PostGraphile, also verifies requests have either a Cognito JWT or a self-signed JWT../nginx
: Nginx config and Docker file../self-signed-jwt
: All the fancy JWKs and PEMs that I generated using CLI commands copy and pasted from StackOverflow. Also where I test my self-signed JWT../terraform
: All the Infrastructure-as-Code to deploy the full API, currently in onemain.tf
file, should modularize. Also contains the Terraform dependency graph visualization tool blastradius.
All lambdas deployed with AWS SAM. 100% TypeScript, built using webpack and aws-sam-webpack-plugin instead of the painfully slow SAM build process.
./events
: Where I keep AWS event examplestemplate.yaml
: SAM config, which is basically CloudFormation../src
: Where all the code for each Lambda lives.
Folder for S3 infrastructure that handles Kindle emails. Should probably reorganize to make it clearer that it's part of the Email Handling service.
./cognito-tokens
: Scripts to programatically retrieve Cognito tokens./compare-annotations
: Library to determine that annotation objects are unique./data-mappers
: Library to convert Javascript objects into GraphQL API calls./kindle-html-converter
: Library to parse emails containing Kindle note HTML exports into Javascript objects.