As part of out latest MVP build we need to present a user with some insights about their spending. We need to build a server that returns JSON formatted insights. A list of transactions for a user can be retrieved at GET https://jigsaw-transactions.herokuapp.com/transactions
. (Make sure you use https!!!). The server should fetch this list, then calculate the insights below, and return them in the body of the response with a 200 response code.
The api returns an array of transactions:
[
{
"id": 1,
"amount": 100,
"merchant": "Tescos Ltd",
"category": "food",
"paymentDate": "2019-01-27T14:24:48.960Z"
},
{
"id": 2,
"amount": 20,
"merchant": "TFL London",
"category": "transport",
"paymentDate": "2019-02-27T14:24:48.960Z"
}
]
From this list we'll need to build a server that exposes the following routes, which calculate different insights about a users spending depending on which route is called and publish the results to a queue:
GET /insights/categories
User Stories:
As a User
So that I can gain an understanding of my spending
I want to see a simple list of total spend by category
{
"food": 400, //accumulated total amount
"shopping": 200, //accumulated total amount
...
}
Then publish the results:
As a System
So that I can asynchronously process information
I want to publish the total spend by category so other services can process it
Publish the results of the aggregated total spend by category to the AWS SQS queue motive-test-queue
.
Please see the directory sqs_local
if you would like to run a local instance of sqs for testing. This is not essential.
In the directory sqs_local/local_helpers
there are helper functions to investigate the running queue (will need aws cli)
Whether using localstack or not it's worth considering testing strategy. You will want to stub SQS in a way that allows for asserting messages are being sent.
- https://www.npmjs.com/package/aws-sdk
- https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SQS.html
- https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-promises.html
Local config would look like:
{
endpoint: 'http://localhost:4566',
region: 'eu-west-1',
}
GET /insights/cashflow
User Story:
As a User
So that I can gain an understanding of if i will run out of money
I want to see a breakdown of my spending by month
returns a daily cashflow of all transactions grouped by day. For days on which there is no data return 0 for all fields.
{
"01/01/2019": {
"totalNumber": 10,
"totalValue": 400,
"averageValue": 40
},
"02/01/2019": {
"totalNumber": 10,
"totalValue": 400,
"averageValue": 40
},
}
- Stretch Goal, we will talk through this task together if you reach this point.
- All values are integer. Don't worry about dealing with floating point precisions, the front end can deal with the presentation logic.
- You can use any npm package you like, but only with good reason! This includes the testing framework which you can change :)
- We've provided some boilerplate code, but feel free to rearrange as you want...
- There's a little test script we've written which will start the server, run the tests and pull it down again. But feel free to orchestrate your tests however you want!
- Well tested code. Whatever framework you use, we like testing our code to have certainty it works
- Simple code. It shouldn't take a PHD to understand code. If it's that complicated, we've done something wrong.
- Code reuse. If there's an option to reuse some code, go for it!