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.
- Fork this repository to your own github profile
- Ensure
node (>=12)
andnpm
are installed - Run
npm install
- Run
npm test
- Run
npm start
- Hit the server to test health
curl localhost:8010/health
and expect a200
response
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
Please deliver documentation of the server that clearly explains the goals of this project and clarifies the API request and response that is expected. Feel free to use any open source documentation tools such as OpenAPI / Swagger.
-
- A pull request against
master
of your fork with a clear description of the change and purpose and merge it
- A pull request against
-
- [BONUS] Create an easy way to deploy and view the documentation in a web format and include instructions to do so - (Check below)
- Run
npm run docs
and access the documentation through http://localhost:3000 - For doc development, run
npm run watch:docs
and access through http://localhost:8080 to see live changes
Please implement the following tooling:
-
-
eslint
- for linting
-
-
-
nyc
- for code coverage
-
-
-
pre-push
- for git pre push hook running tests - (Usinghusky
instead)
-
-
-
winston
- for logging
-
-
- Create a pull request against
master
of your fork with the new tooling and merge it
-
-
eslint
should have an opinionated format
-
-
-
nyc
should aim for test coverage of80%
across lines, statements, and branches
-
-
-
pre-push
should run the tests before allowing pushing usinggit
-
-
-
winston
should be used to replace console logs and all errors should be logged as well. Logs should go to disk.
-
- Create a pull request against
-
- Ensure that tooling is connected to
npm test
- Ensure that tooling is connected to
-
- Ensure that tests covers possible positive and negative scenarios
-
- Create a separate pull request against
master
of your fork with the linter fixes and merge it
- Create a separate pull request against
-
- Create a separate pull request against
master
of your fork to increase code coverage to acceptable thresholds and merge it
- Create a separate pull request against
-
- [BONUS] Add integration to CI such as Travis or Circle - (CircleCI is being chosen here with Codecov integration)
-
- [BONUS] Add Typescript support
Please implement pagination to retrieve pages of the resource rides
.
-
- Create a pull request against
master
with your changes to theGET /rides
endpoint to support pagination including:
-
- Code changes
-
- Tests
-
- Documentation
- Create a pull request against
-
- Merge the pull request
Please implement the following refactors of the code:
-
- Convert callback style code to use
async/await
- Convert callback style code to use
-
- Reduce complexity at top level control flow logic and move logic down and test independently
-
- [BONUS] Split between functional and imperative function and test independently
-
- A pull request against
master
of your fork for each of the refactors above with:
-
- Code changes
-
- Tests covering positive and negative scenarios
- A pull request against
Please implement the following security controls for your system:
-
- Ensure the system is not vulnerable to SQL injection
-
- [BONUS] Implement an additional security improvement of your choice
- Added TypeORM in this project and no raw SQL query being called with
repo.query
where: { riderName: Like(
%${query.keyword}%) }
will not treatriderName
as a partial SQL syntax, but rather a prepared statements.
-
- [] A pull request against
master
of your fork with:
-
- Changes to the code
-
- Tests ensuring the vulnerability is addressed
- [] A pull request against
Please implement load testing to ensure your service can handle a high amount of traffic
-
- Implement load testing using
artillery
-
- Create a PR against
master
of your fork including artillery
- Create a PR against
-
- Ensure that load testing is able to be run using
npm test:load
. You can consider using a tool likeforever
to spin up a daemon and kill it after the load test has completed. - (Usingconcurrently
instead with--quiet
option. TODO: It doesn't properly exit. Need to manually exit for now)
- Ensure that load testing is able to be run using
-
- Test all endpoints under at least
100 rps
for30s
and ensure thatp99
is under50ms
- (Average is p99:30ms. Check out.artillery/summary.json.html
for summary report)
- Test all endpoints under at least
- Implement load testing using