{"id":26964337,"url":"https://github.com/mimani68/bixie-api-test","last_synced_at":"2026-04-15T10:35:41.196Z","repository":{"id":133774661,"uuid":"382025550","full_name":"mimani68/bixie-api-test","owner":"mimani68","description":null,"archived":false,"fork":false,"pushed_at":"2021-07-02T05:32:22.000Z","size":319,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-07T02:42:49.542Z","etag":null,"topics":["api","api-rest","docker","docker-compose","docker-swarm","expressjs","heroku","javascript","nodejs"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mimani68.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-01T12:28:17.000Z","updated_at":"2021-07-05T17:41:33.000Z","dependencies_parsed_at":null,"dependency_job_id":"dfce6df6-355d-461f-9276-a2a8b71b614b","html_url":"https://github.com/mimani68/bixie-api-test","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mimani68/bixie-api-test","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mimani68%2Fbixie-api-test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mimani68%2Fbixie-api-test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mimani68%2Fbixie-api-test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mimani68%2Fbixie-api-test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mimani68","download_url":"https://codeload.github.com/mimani68/bixie-api-test/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mimani68%2Fbixie-api-test/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31837423,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T10:26:52.245Z","status":"ssl_error","status_checked_at":"2026-04-15T10:26:51.649Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","api-rest","docker","docker-compose","docker-swarm","expressjs","heroku","javascript","nodejs"],"created_at":"2025-04-03T06:30:37.380Z","updated_at":"2026-04-15T10:35:41.177Z","avatar_url":"https://github.com/mimani68.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Technical Interview Tests\n\nThis is the Bixie technical task, for aspiring Bixie engineers. These tasks will test your technical knowledge, and are the second step (after resume screening) in the Bixie hiring process. The goal of these technical tasks is to prove your technical knowledge and problem solving ability. They should be completed on your own, with no external help. They should take no longer than 2-3 hours to complete.\nWe're looking for:\n\n`Technical abilities`: you should be able to build software that works. Coding standards: your submission should adhere to some kind of consistent coding standards, in terms of formatting, naming (files, variables and functions) and comments/annotations.\n\n`Problem solving skills`: the tasks are non-trivial, with multiple solutions. Use your experience and skills of judgement to choose the best.\n\n\n# Node.js Backend Challenge\n\n[Indego](https://www.rideindego.com) is Philadelphia's bike-sharing program, with many bike stations in the city.\n\nThe [Indego GeoJSON station status API](https://www.rideindego.com/stations/json/) provides a real time snapshot of the number of bikes available, number of open docks available (not currently containing a bike), and total number of docks at every station. This API is free and requires no API key.\n\nThe [Open Weather Map API](https://openweathermap.org/current#name) provides a real time snapshot of the current weather in a given city. Since Philadelphia is a small geographical area it is sufficient to obtain the weather for a geographical location central to Philadelphia. This API has a free plan, you will need to sign up for an API key.\n\nUsing Postgresql, Node.js, Express, [Bluebird](https://npmjs.org/package/bluebird), Lodash and the Linux, Node.js and MongoDB hosting of your choice (see below for hosting details including free options), create a new API server which accumulates data over time and provides access to historical data for both weather and Indego bike availability, supporting the following queries at minimum. Note that it is sufficient to store data at hourly intervals.\n\n\u003e Please note: historical CSV data downloads are available from Indego, however you should not rely on them.* Instead you should build your own node application that downloads fresh data at least once per hour, stores it and implements the API described below.\n\n\n### A) Snapshot of all stations at a specified time\n\nData for all stations as of 11am Universal Coordinated Time on November 1st, 2017:\n\n`/api/v1/stations?at=2017-11-01T11:00:00`\n\nThis API should respond as follows, with the actual time of the first snapshot of data on or after the requested time and the data:\n\n```javascript\n{\n  at: '2017-11-01:T11:00:01',\n  stations: { /* As per the Indego API */ },\n  weather: { /* as per the Open Weather Map API response for Philadelphia */ }\n}\n```\n\nIf no suitable data is available a 404 status code should be given.\n\n### B) Snapshot of one station at a specific time\n\nData for a specific station (by its `kioskId`) at a specific time:\n\n`/api/v1/stations/KIOSKIDGOESHERE?at=2017-11-01T11:00:00`\n\nThe response should be the first available on or after the given time, and should look like:\n\n```javascript\n{\n  at: '2017-11-01:T11:00:01',\n  station: { /* Data just for this one station as per the Indego API */ },\n  weather: { /* as per the Open Weather Map API response for Philadelphia */ }\n}\n```\n\nInclude an `at` property in the same format indicating the actual time of the snapshot.\n\nIf no suitable data is available a 404 status code should be given.\n\n\n### C) Snapshots of one station over a range of times\n\nAll historical data for a specific station between two timestamps:\n\n`/api/v1/stations/KIOSKIDGOESHERE?from=2017-11-01T11:00:00\u0026to=2017-12-01T11:00:00\u0026frequency=daily`\n\nFor this last response, the returned JSON value should be an array of values in ascending chronological order. **Each element in the array** should look like:\n\n```javascript\n{\n  at: '2017-11-02T10:00:00',\n  station: { /* snapshot in the same format as the other APIs */ },\n  weather: { /* as per the Open Weather Map API response for Philadelphia */ }\n}\n```\n\nThe `frequency` query parameter, if present, may be `hourly` or `daily`. The API should respond with only one entry from each hour or day. For `hourly` this should be the first entry on or after the top of the hour. For `daily` it should be the first entry on or after noon, Philadelphia time. If `frequency` is absent, `hourly` is the default.\n\n\n## Unit tests\n\nAll of the APIs should have unit test coverage; invoking `npm test` should test your package. We suggest [mocha](https://npmjs.org/package/mocha) but other frameworks are fine.\n\n## Hosting details\n\nYou'll need to make your API available on a server that we can communicate with from the office, not just on your laptop. Although this is not a system administration job, we're interested in seeing that you are comfortable with the fundamentals of installing services on Linux and/or working with cloud providers like Heroku.\n\nYou might wish to use Digital Ocean or AWS and install both Node and Postgresql on a VPS yourself. Alternatively you might use a combination of Heroku and MLab, both of which have free tiers available.\n \n\n## Criteria\n\nYour work will be evaluated primarily on:\n\n* Consistency of coding style (ideally in harmony with our [JavaScript style guide](https://github.com/punkave/best-practices/blob/master/javascript.md))\n* Idiomatic use of `express`, `postgresql`, `bluebird` and `lodash`\n* Correct use of promises, including proper error handling. async/await may be used\n* Absence of \"callback hell\"\n* Efficient postgresql queries\n* Correct and complete unit test coverage\n* General quality of code and technical communication.\n\n## How to submit your work\n\nFork this project on github. When you're finished, send us the URL of your public repository and the URL of your running instance of the API. *Consider using `.gitignore` to avoid putting any deployment credentials or API key in your public repository.*\n\n## Extra credit\n\n* A simple front end flutter or react application, and/or Express-powered webpage, offering a visualization of all or part of the data utilizing the API you have built as a back end.\n* Import the [historical data available from Indego](https://www.rideindego.com/about/data/) so that it is available via the queries above. Note that this is in addition to, not an alternative to, downloading live data periodically and adding it to your own historical database.\n* Anything else you think is cool, relevant, and consistent with the other requirements.\n\n## Result\n\n```bash\ncurl --header 'Host:app.io' 130.185.120.237/ping\ncurl --header 'Host:app.io' 130.185.120.237/api/v1/stations\ncurl --header 'Host:app.io' 130.185.120.237/api/v1/stations?at=2013-12-01T10:00:00\ncurl --header 'Host:app.io' 130.185.120.237/api/v1/stations/3004?at=2013-12-01T10:00:00\ncurl --header 'Host:app.io' 130.185.120.237/api/v1/stations/3004?from=2013-12-01T10:00:00\u0026to=2021-12-01T10:00:00\u0026frequency=daily\n```\nAdminer for database managment\n```bash\ncurl --header 'Host:db.app.io' 130.185.120.237/adminer\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmimani68%2Fbixie-api-test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmimani68%2Fbixie-api-test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmimani68%2Fbixie-api-test/lists"}