Skip to content

android71Francis/backend-coding-test

Repository files navigation

Xendit Coding Exercise

The goal of these exercises are to assess your proficiency in software engineering that is related to the daily work that we do at Xendit. Please follow the instructions below to complete the assessment.

Setup

  1. Create a new repository in your own github profile named backend-coding-test and commit the contents of this folder
  2. Ensure node (>8.6 and <= 10) and npm are installed
  3. Run npm install
  4. Run npm test
  5. Run npm start
  6. Hit the server to test health curl localhost:8010/health and expect a 200 response

Tasks

Below will be your set of tasks to accomplish. Please work on each of these tasks in order. Success criteria will be defined clearly for each task

  1. Documentation
  2. Implement Tooling
  3. Implement Pagination
  4. Refactoring
  5. Security
  6. Load Testing

Documentation

Please deliver documentation of the server that clearly explains the goals of this project and clarifies the API response that is expected.

Answer:

  • Used node 10.0.0 and added .nvmrc prevent using other node version.
  • Added dependecies for documentation npm i swagger-ui-express yamljs -S
  • Added docs folder under src where the yaml file for documentations.
  • Added /api-docs rotues for the API documentation and accessible only in development/staging.
  • Added nodemon for development changes reload/restart.
  • Updated some status code accordingly.

Success Criteria

  1. A pull request against master of your fork with a clear description of the change and purpose and merge it
  2. [BONUS] Create an easy way to deploy and view the documentation in a web format and include instructions to do so

Implement Tooling

Please implement the following tooling:

  1. eslint - for linting
  2. nyc - for code coverage
  3. pre-push - for git pre push hook running tests
  4. winston - for logging

Answer:

  • Added dependecies for logging npm i winston -S.
  • Added dev dependecies for logging npm i eslint eslint-config-airbnb-base eslint-plugin-import nyc pre-push chai sinon -SD.
  • Added eslint standard config.
  • Added threshold for test coverage 80%.
  • Added pre-push to run lint and test converage.
  • Fix some eslint issues.
  • Added test coverage.

Success Criteria

  1. Create a pull request against master of your fork with the new tooling and merge it
    1. eslint should have an opinionated format
    2. nyc should aim for test coverage of 80% across lines, statements, and branches
    3. pre-push should run the tests before allowing pushing using git
    4. winston should be used to replace console logs and all errors should be logged as well. Logs should go to disk.
  2. Ensure that tooling is connected to npm test
  3. Create a separate pull request against master of your fork with the linter fixes and merge it
  4. Create a separate pull request against master of your fork to increase code coverage to acceptable thresholds and merge it
  5. [BONUS] Add integration to CI such as Travis or Circle
  6. [BONUS] Add Typescript support

Implement Pagination

Please implement pagination to retrieve pages of the resource rides.

Answer:

  • Updated GET /rides to add pagination
  • Added query paramaters to add page and size
  • Updated unit tesing.
  • Updated documentation.
  1. Create a pull request against master with your changes to the GET /rides endpoint to support pagination including:
    1. Code changes
    2. Tests
    3. Documentation
  2. Merge the pull request

Refactoring

Please implement the following refactors of the code:

Answer:

  • Refactor API calls divide logic flow
  • Refactor index.js and app for readable format
  • Added unit testing
  • [Security] Updated issue on sql injection
  • Updated test coverage
  • Updated npm test include test coverage
  1. Convert callback style code to use async/await
  2. Reduce complexity at top level control flow logic and move logic down and test independently
  3. [BONUS] Split between functional and imperative function and test independently

Success Criteria

  1. A pull request against master of your fork for each of the refactors above with:
    1. Code changes
    2. Tests

Security

Please implement the following security controls for your system:

Answer :

  • Solved issue on GetRidesById query, id was append on the sql
  • Added Helmet for the additional security with standard security features.
  1. Ensure the system is not vulnerable to SQL injection
  2. [BONUS] Implement an additional security improvement of your choice

Success Criteria

  1. A pull request against master of your fork with:
    1. Changes to the code
    2. Tests ensuring the vulnerability is addressed

Load Testing

Please implement load testing to ensure your service can handle a high amount of traffic

Answer :

  • Added artillery in dev dependecies
  • Added npm test:load in npm scripts
  • Added integration/api.yaml for the load scripts
  • Added rides.csv for the load scripts data

Success Criteria

  1. Implement load testing using artillery
    1. Create a PR against master of your fork including artillery
    2. Ensure that load testing is able to be run using npm test:load. You can consider using a tool like forever to spin up a daemon and kill it after the load test has completed.
    3. Test all endpoints under at least 100 rps for 30s and ensure that p99 is under 50ms

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published