I have prepared 2 repos to implement FakeBank using GraphQL:

1. JavaScript: https://github.com/muratyaman/fakebank-js

2. TypeScript: https://github.com/muratyaman/fakebank-ts

Architecture can be like this:

FakeBank uses:

* GraphQL
https://graphql.org/
– “GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data.”

* GraphQL-JS
https://github.com/graphql/graphql-js
– “A reference implementation of GraphQL for JavaScript”

* Apollo Server
https://github.com/apollographql/apollo-server/tree/master/packages/apollo-server
– “Apollo Server is an open-source, spec-compliant GraphQL server that’s compatible with any GraphQL client”

* Apollo Federation
https://github.com/apollographql/apollo-server/tree/master/packages/apollo-federation
– “… expose a single data graph that provides a unified interface for querying all of your backing data sources”

* Apollo REST Data Source
https://github.com/apollographql/apollo-server/tree/master/packages/apollo-datasource-rest
– “This package exports a (RESTDataSource) class which is used for fetching data from a REST API and exposing it via GraphQL within Apollo Server.”

* Apollo Gateway
https://github.com/apollographql/apollo-server/tree/master/packages/apollo-gateway
– sits above other GraphQL services

* GraphQL DataLoader
https://github.com/graphql/dataloader
– “DataLoader is a generic utility to be used as part of your application’s data fetching layer to provide a consistent API over various backends and reduce requests to those backends via batching and caching.”
– improves performance of GraphQL service

* Express
https://github.com/expressjs/express/
– “Fast, unopinionated, minimalist web framework for node”
– helps create an HTTP service quickly

* Faker
https://github.com/marak/Faker.js/
– “generate massive amounts of realistic fake data in Node.js and the browser”
– helps create random/mock data

* Lerna
https://github.com/lerna/lerna
– “A tool for managing JavaScript projects with multiple packages.”

## List of core REST services

* rest-auth
– http://localhost:10111
– manages login actions, user records

* rest-accounts
– http://localhost:10222
– manages bank accounts and transactions

* rest-payments
– http://localhost:10333
– manages money transfers

## List of GraphQL services using Core REST services

* gql-fed-auth
– http://localhost:20111
– uses rest-auth

* gql-fed-accounts
– http://localhost:20222
– uses rest-accounts

* gql-fed-payments
– http://localhost:20333
– uses rest-payments

## Standard GraphQL service using Core REST services

* gql-standard
– http://localhost:30111
– uses rest-auth
– uses rest-accounts
– uses rest-payments

## GraphQL Gateway service

* gql-gateway
– http://localhost:40111
– uses gql-fed-auth
– uses gql-fed-accounts
– uses gql-fed-payments

## Sequence diagrams

To see the diagrams, use https://sequencediagram.org/

### A. GraphQL Standard


title Fake Bank APIs with GraphQL Standard
app->api-gateway: request
api-gateway->gql-standard: request
gql-standard --> rest-X: request a
rest-X -> db-X: select data a
rest-X <- db-X: records a gql-standard <- rest-X: response a gql-standard --> rest-Y: request b
rest-Y -> db-Y: select data b
rest-Y <- db-Y: records b gql-standard <- rest-Y: response b api-gateway <- gql-standard: response app <- api-gateway: response

### B. GraphQL Gateway


title Fake Bank APIs with GrapQL Gateway

app->api-gateway: request
api-gateway->gql-gateway: request

gql-gateway --> gql-fed-X: request a
gql-fed-X -> rest-X: request a
rest-X -> db-X: select data a
rest-X <- db-X: records a gql-fed-X <- rest-X: response a gql-gateway <- gql-fed-X: response a gql-gateway --> gql-fed-Y: request b
gql-fed-Y -> rest-Y: request b
rest-Y -> db-Y: select data b
rest-Y <- db-Y: records b gql-fed-Y <- rest-Y: response b gql-gateway <- gql-fed-Y: response b api-gateway <- gql-gateway: response app <- api-gateway: response

## Installation

Install yarn and lerna globally


npm i -g yarn lerna

Install dependencies for all packages in this codebase.


lerna bootstrap

## Build


lerna run build

## Start in production mode

Run these in separate terminals in this order:

## Core REST services

Random/fake data is generated at runtime


lerna run start:prod --scope=@fakebank/rest-auth
lerna run start:prod --scope=@fakebank/rest-accounts
lerna run start:prod --scope=@fakebank/rest-payments

## GraphQL Services

These services are used by GraphQL Gateway


lerna run start:prod --scope=@fakebank/gql-fed-auth
lerna run start:prod --scope=@fakebank/gql-fed-accounts
lerna run start:prod --scope=@fakebank/gql-fed-payments
lerna run start:prod --scope=@fakebank/gql-gateway

## Standard GrapQL service

We can use RESTful services directly


lerna run start --scope=@fakebank/gql-standard

Note: Another way to run a service:


cd packages/core-auth
yarn start:prod

On the next post, I will discuss the details of GraphQL federation: Federation of GraphQL Services using Apollo Gateway