- Add GraphQL Api
- Update name to
Trades Api
- Update schema location to
trades/schema.graphql
- Paste the following schema:
type Mutation { createTrade(type: TransactionType!, symbol: String!): Trade } type Price { symbol: String! price: Float! } type Query { getPrice(symbol: String!): Price getTrade(id: ID!): [Trade] listTrades(limit: Int, nextToken: String): TradesConnection } type Subscription { onCreateTrade( id: ID, symbol: String, timestamp: AWSDateTime, price: Float, type: String ): Trade @aws_subscribe(mutations: ["createTrade"]) } type Trade { id: ID! type: TransactionType! symbol: String! timestamp: AWSDateTime! } type TradesConnection { items: [Trade] nextToken: String } enum TransactionType { BUY SELL }
- Attach resolvers to:
- Query getPrice
- Query getTrade
- Query listTrades
- Mutation createTrade
- Update name to
- Add an HTTP Proxy Endpoint
- Connect the Query getPrice resolver to the HTTP Proxy Endpoint
- Update the HTTP Proxy Endpoint Host to
https://www.alphavantage.co
- Add a DynamoDB Table
- Connect the rest of the resolvers to it
- Update the DynamoDB Table Logical ID to
Trades
- Edit Query getPrice resolver
- Request Template:
{ "version": "2018-05-29", "method": "GET", "resourcePath": "/query", "params":{ "query": { "function": "GLOBAL_QUOTE", "symbol": $util.toJson($ctx.args.symbol), "apikey": "demo" } } }
- Response Template:
#if($ctx.error) $util.error($ctx.error.message, $ctx.error.type) #end #if($ctx.result.statusCode == 200) { "symbol": $util.toJson($ctx.args.symbol), "price": $util.parseJson($ctx.result.body)["Global Quote"]["05. price"] } #else $utils.appendError($ctx.result.body, $ctx.result.statusCode) #end
- Request Template:
- Edit Mutation createTrade
- Request Template:
{ "version" : "2017-02-28", "operation" : "PutItem", "key" : { ## If object "id" should come from GraphQL arguments, change to $util.dynamodb.toDynamoDBJson($ctx.args.id) "id": $util.dynamodb.toDynamoDBJson($util.autoId()), }, "attributeValues" : { "type": $util.dynamodb.toDynamoDBJson($ctx.args.type), "symbol": $util.dynamodb.toDynamoDBJson($context.arguments.symbol), "timestamp": $util.dynamodb.toDynamoDBJson($util.time.nowISO8601()) } }
- Request Template:
- Edit Query getTrade
- Request Template:
{ "version": "2017-02-28", "operation": "GetItem", "key": { "id": $util.dynamodb.toDynamoDBJson($ctx.args.id), } }
- Request Template:
- Edit Query listTrades
- Request Template:
{ "version": "2017-02-28", "operation": "Scan", "limit": $util.defaultIfNull($ctx.args.limit, 20), "nextToken": $util.toJson($util.defaultIfNullOrEmpty($ctx.args.nextToken, null)), }
- Request Template:
- Deploy!
- Get Price
query getPrice { getPrice(symbol: "AMZN") { symbol price } }
- Trade Subscription (in separate window)
subscription onCreateTrade { onCreateTrade { id timestamp type symbol } }
- Create Trade
mutation createTrade { createTrade(type: BUY, symbol: "AMZN") { id timestamp type symbol } }
- List Trades
query listTrades { listTrades { items { id timestamp type symbol } } }