Repository files navigation

Flypay

A technical test for FlyPay. The following demonstrates a basic GET / POST microservice, allowing consumers to register their apps and store dummy payment data.

Pre-Requisites

The below assumes docker is installed on the local machine. If not, visit https://docs.docker.com/engine/installation/ and follow the instructions.

Docker has been used locally for the following.

  • Composer
  • PHP 7.x
  • MySQL 5.7

Use the following commands to install and run containers.

Note: docker-compose has not been utilized.

Composer

We're going to pull composer/composer for the moment, and we'll use this container to install ours deps.

docker pull composer/composer

MySQL 5.7

We'll pull the 5.7 version of the MySQL docker container. The container hasn't been modifided (unlike php:7.0), so we'll run the container as a daemon, passing our chosen root password (modify YOUR_ROOT_PASSWORD).

docker pull mysql:5.7
docker run --name flypay-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=YOUR_ROOT_PASSWORD -d mysql:5.7

PHP 7.0

We've customized the php:7.0 container by installing pdo and xdebug by default. Build the container and run with the following commands.

docker build -t flypay .
docker run --name flypay -p:8881:8881 -v $(pwd):/app -w /app --link flypay-db:mysql -d flypay php -S 0.0.0.0:8881 -t public

Docker should now show 2 running containers, flypay and flypay-db.

Getting Started

First off, we'll need to clone the repository.

git clone https://github.com/steadweb/FlyPay.git

Next, install depending with composer, using the docker container we pulled earlier.

docker run -i --rm -v ~/.ssh:/root/.ssh -v $(pwd):/app composer/composer install

In order to setup the DB, you'll need to setup your .env and create the database. The .env file should be located within the root of the project, and should contain the following values:

Note: Find the IP of the flypay-db container using docker inspect <container_id>.

DB_HOST=IP_ADDRESS_OF_THE_MYSQL_CONTAINER
DB_NAME=flypay_steadweb
DB_USER=root
DB_PASS=YOUR_ROOT_PASSWORD

Note: I understand it's bad practice using the root user, but this is for a technical task / development purposes, hence the usage of .env.

You will need to create the database, migrations won't do this for you. Create a database, using docker, with the following command:

docker run -it --link flypay-db:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "create database flypay_steadweb;"'

Once the database has been created, run the migrations.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/doctrine-migrations migrations:migrate --configuration configuration.yml

The microserivce has now been installed with demo data.

Authentication

The microservice leverages JWT to auth an app against the API. Out of the box, 1 app is registered, but it's suggested for an app to register it's own public_key using the /client/register endpoint.

Without relying on this micoservice to provide a JWT, it's put the reliance on the application itself, storing the public_key and validating the signature within middleware.

You can use the following JWT when testing the app.

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

The following JSON object is the correct payload for the /client/register endpoint. You'll notice the public_key is base64 encoded, this is required and the endpoint will fail if it detects a malformed public_key.

{
"domain" : "https://your.domain.tld",
"public_key" : base64_encode($your_public_key)
}

The response should be the uuid of the entity which has been created. You don't have to note this down, it's just confirmation the public_key was registered correctly.

{
"id" : "randomly_generated_uuid"
}

Basic Example

You can request data from any of the endpoints mentioned below. Out of the box, the microservice supplies demo data. The JWT needs to be set as a header for each request (apart from registering a client).

Request

GET /api/v1/payments
Host: http://localhost:8881
Content-Type: application/json
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

Response

[
{
"id": "f3a50212-d35d-11e6-872b-0242ac110002",
"amount": 9000,
"gratuity": null,
"reference": "ADS67dgftyt5fytsdTYF",
"card": {
"id": "d18d7f82-d35d-11e6-872b-0242ac110002",
"last4": "6482",
"type": "AMEX"
},
"tables": [
{
"id": "d63cc628-d35d-11e6-872b-0242ac110002",
"seats": 4
}
],
"location": {
"id": "d8e62678-d35d-11e6-872b-0242ac110002",
"title": "Foo",
"address": "1 Bar Road, Baz Town",
"latitude": "12318297812712",
"longitude": "-12735162537123"
},
"created": {
"date": "2017-01-05 15:45:15.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"updated": null
}
]

Endpoints

All endpoints can be found here.

Tests

Unit tests are run using phpunit via the php:7.0 container.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/phpunit tests -c phpunit.xml.dist

About

A technical test for FlyPay

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Flypay

A technical test for FlyPay. The following demonstrates a basic GET / POST microservice, allowing consumers to register their apps and store dummy payment data.

Pre-Requisites

The below assumes docker is installed on the local machine. If not, visit https://docs.docker.com/engine/installation/ and follow the instructions.

Docker has been used locally for the following.

  • Composer
  • PHP 7.x
  • MySQL 5.7

Use the following commands to install and run containers.

Note: docker-compose has not been utilized.

Composer

We're going to pull composer/composer for the moment, and we'll use this container to install ours deps.

docker pull composer/composer

MySQL 5.7

We'll pull the 5.7 version of the MySQL docker container. The container hasn't been modifided (unlike php:7.0), so we'll run the container as a daemon, passing our chosen root password (modify YOUR_ROOT_PASSWORD).

docker pull mysql:5.7
docker run --name flypay-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=YOUR_ROOT_PASSWORD -d mysql:5.7

PHP 7.0

We've customized the php:7.0 container by installing pdo and xdebug by default. Build the container and run with the following commands.

docker build -t flypay .
docker run --name flypay -p:8881:8881 -v $(pwd):/app -w /app --link flypay-db:mysql -d flypay php -S 0.0.0.0:8881 -t public

Docker should now show 2 running containers, flypay and flypay-db.

Getting Started

First off, we'll need to clone the repository.

git clone https://github.com/steadweb/FlyPay.git

Next, install depending with composer, using the docker container we pulled earlier.

docker run -i --rm -v ~/.ssh:/root/.ssh -v $(pwd):/app composer/composer install

In order to setup the DB, you'll need to setup your .env and create the database. The .env file should be located within the root of the project, and should contain the following values:

Note: Find the IP of the flypay-db container using docker inspect <container_id>.

DB_HOST=IP_ADDRESS_OF_THE_MYSQL_CONTAINER
DB_NAME=flypay_steadweb
DB_USER=root
DB_PASS=YOUR_ROOT_PASSWORD

Note: I understand it's bad practice using the root user, but this is for a technical task / development purposes, hence the usage of .env.

You will need to create the database, migrations won't do this for you. Create a database, using docker, with the following command:

docker run -it --link flypay-db:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "create database flypay_steadweb;"'

Once the database has been created, run the migrations.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/doctrine-migrations migrations:migrate --configuration configuration.yml

The microserivce has now been installed with demo data.

Authentication

The microservice leverages JWT to auth an app against the API. Out of the box, 1 app is registered, but it's suggested for an app to register it's own public_key using the /client/register endpoint.

Without relying on this micoservice to provide a JWT, it's put the reliance on the application itself, storing the public_key and validating the signature within middleware.

You can use the following JWT when testing the app.

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

The following JSON object is the correct payload for the /client/register endpoint. You'll notice the public_key is base64 encoded, this is required and the endpoint will fail if it detects a malformed public_key.

{
"domain" : "https://your.domain.tld",
"public_key" : base64_encode($your_public_key)
}

The response should be the uuid of the entity which has been created. You don't have to note this down, it's just confirmation the public_key was registered correctly.

{
"id" : "randomly_generated_uuid"
}

Basic Example

You can request data from any of the endpoints mentioned below. Out of the box, the microservice supplies demo data. The JWT needs to be set as a header for each request (apart from registering a client).

Request

GET /api/v1/payments
Host: http://localhost:8881
Content-Type: application/json
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

Response

[
{
"id": "f3a50212-d35d-11e6-872b-0242ac110002",
"amount": 9000,
"gratuity": null,
"reference": "ADS67dgftyt5fytsdTYF",
"card": {
"id": "d18d7f82-d35d-11e6-872b-0242ac110002",
"last4": "6482",
"type": "AMEX"
},
"tables": [
{
"id": "d63cc628-d35d-11e6-872b-0242ac110002",
"seats": 4
}
],
"location": {
"id": "d8e62678-d35d-11e6-872b-0242ac110002",
"title": "Foo",
"address": "1 Bar Road, Baz Town",
"latitude": "12318297812712",
"longitude": "-12735162537123"
},
"created": {
"date": "2017-01-05 15:45:15.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"updated": null
}
]

Endpoints

All endpoints can be found here.

Tests

Unit tests are run using phpunit via the php:7.0 container.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/phpunit tests -c phpunit.xml.dist

About

A technical test for FlyPay

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Flypay

A technical test for FlyPay. The following demonstrates a basic GET / POST microservice, allowing consumers to register their apps and store dummy payment data.

Pre-Requisites

The below assumes docker is installed on the local machine. If not, visit https://docs.docker.com/engine/installation/ and follow the instructions.

Docker has been used locally for the following.

  • Composer
  • PHP 7.x
  • MySQL 5.7

Use the following commands to install and run containers.

Note: docker-compose has not been utilized.

Composer

We're going to pull composer/composer for the moment, and we'll use this container to install ours deps.

docker pull composer/composer

MySQL 5.7

We'll pull the 5.7 version of the MySQL docker container. The container hasn't been modifided (unlike php:7.0), so we'll run the container as a daemon, passing our chosen root password (modify YOUR_ROOT_PASSWORD).

docker pull mysql:5.7
docker run --name flypay-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=YOUR_ROOT_PASSWORD -d mysql:5.7

PHP 7.0

We've customized the php:7.0 container by installing pdo and xdebug by default. Build the container and run with the following commands.

docker build -t flypay .
docker run --name flypay -p:8881:8881 -v $(pwd):/app -w /app --link flypay-db:mysql -d flypay php -S 0.0.0.0:8881 -t public

Docker should now show 2 running containers, flypay and flypay-db.

Getting Started

First off, we'll need to clone the repository.

git clone https://github.com/steadweb/FlyPay.git

Next, install depending with composer, using the docker container we pulled earlier.

docker run -i --rm -v ~/.ssh:/root/.ssh -v $(pwd):/app composer/composer install

In order to setup the DB, you'll need to setup your .env and create the database. The .env file should be located within the root of the project, and should contain the following values:

Note: Find the IP of the flypay-db container using docker inspect <container_id>.

DB_HOST=IP_ADDRESS_OF_THE_MYSQL_CONTAINER
DB_NAME=flypay_steadweb
DB_USER=root
DB_PASS=YOUR_ROOT_PASSWORD

Note: I understand it's bad practice using the root user, but this is for a technical task / development purposes, hence the usage of .env.

You will need to create the database, migrations won't do this for you. Create a database, using docker, with the following command:

docker run -it --link flypay-db:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "create database flypay_steadweb;"'

Once the database has been created, run the migrations.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/doctrine-migrations migrations:migrate --configuration configuration.yml

The microserivce has now been installed with demo data.

Authentication

The microservice leverages JWT to auth an app against the API. Out of the box, 1 app is registered, but it's suggested for an app to register it's own public_key using the /client/register endpoint.

Without relying on this micoservice to provide a JWT, it's put the reliance on the application itself, storing the public_key and validating the signature within middleware.

You can use the following JWT when testing the app.

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

The following JSON object is the correct payload for the /client/register endpoint. You'll notice the public_key is base64 encoded, this is required and the endpoint will fail if it detects a malformed public_key.

{
"domain" : "https://your.domain.tld",
"public_key" : base64_encode($your_public_key)
}

The response should be the uuid of the entity which has been created. You don't have to note this down, it's just confirmation the public_key was registered correctly.

{
"id" : "randomly_generated_uuid"
}

Basic Example

You can request data from any of the endpoints mentioned below. Out of the box, the microservice supplies demo data. The JWT needs to be set as a header for each request (apart from registering a client).

Request

GET /api/v1/payments
Host: http://localhost:8881
Content-Type: application/json
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

Response

[
{
"id": "f3a50212-d35d-11e6-872b-0242ac110002",
"amount": 9000,
"gratuity": null,
"reference": "ADS67dgftyt5fytsdTYF",
"card": {
"id": "d18d7f82-d35d-11e6-872b-0242ac110002",
"last4": "6482",
"type": "AMEX"
},
"tables": [
{
"id": "d63cc628-d35d-11e6-872b-0242ac110002",
"seats": 4
}
],
"location": {
"id": "d8e62678-d35d-11e6-872b-0242ac110002",
"title": "Foo",
"address": "1 Bar Road, Baz Town",
"latitude": "12318297812712",
"longitude": "-12735162537123"
},
"created": {
"date": "2017-01-05 15:45:15.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"updated": null
}
]

Endpoints

All endpoints can be found here.

Tests

Unit tests are run using phpunit via the php:7.0 container.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/phpunit tests -c phpunit.xml.dist

About

A technical test for FlyPay

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Flypay

A technical test for FlyPay. The following demonstrates a basic GET / POST microservice, allowing consumers to register their apps and store dummy payment data.

Pre-Requisites

The below assumes docker is installed on the local machine. If not, visit https://docs.docker.com/engine/installation/ and follow the instructions.

Docker has been used locally for the following.

  • Composer
  • PHP 7.x
  • MySQL 5.7

Use the following commands to install and run containers.

Note: docker-compose has not been utilized.

Composer

We're going to pull composer/composer for the moment, and we'll use this container to install ours deps.

docker pull composer/composer

MySQL 5.7

We'll pull the 5.7 version of the MySQL docker container. The container hasn't been modifided (unlike php:7.0), so we'll run the container as a daemon, passing our chosen root password (modify YOUR_ROOT_PASSWORD).

docker pull mysql:5.7
docker run --name flypay-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=YOUR_ROOT_PASSWORD -d mysql:5.7

PHP 7.0

We've customized the php:7.0 container by installing pdo and xdebug by default. Build the container and run with the following commands.

docker build -t flypay .
docker run --name flypay -p:8881:8881 -v $(pwd):/app -w /app --link flypay-db:mysql -d flypay php -S 0.0.0.0:8881 -t public

Docker should now show 2 running containers, flypay and flypay-db.

Getting Started

First off, we'll need to clone the repository.

git clone https://github.com/steadweb/FlyPay.git

Next, install depending with composer, using the docker container we pulled earlier.

docker run -i --rm -v ~/.ssh:/root/.ssh -v $(pwd):/app composer/composer install

In order to setup the DB, you'll need to setup your .env and create the database. The .env file should be located within the root of the project, and should contain the following values:

Note: Find the IP of the flypay-db container using docker inspect <container_id>.

DB_HOST=IP_ADDRESS_OF_THE_MYSQL_CONTAINER
DB_NAME=flypay_steadweb
DB_USER=root
DB_PASS=YOUR_ROOT_PASSWORD

Note: I understand it's bad practice using the root user, but this is for a technical task / development purposes, hence the usage of .env.

You will need to create the database, migrations won't do this for you. Create a database, using docker, with the following command:

docker run -it --link flypay-db:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "create database flypay_steadweb;"'

Once the database has been created, run the migrations.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/doctrine-migrations migrations:migrate --configuration configuration.yml

The microserivce has now been installed with demo data.

Authentication

The microservice leverages JWT to auth an app against the API. Out of the box, 1 app is registered, but it's suggested for an app to register it's own public_key using the /client/register endpoint.

Without relying on this micoservice to provide a JWT, it's put the reliance on the application itself, storing the public_key and validating the signature within middleware.

You can use the following JWT when testing the app.

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

The following JSON object is the correct payload for the /client/register endpoint. You'll notice the public_key is base64 encoded, this is required and the endpoint will fail if it detects a malformed public_key.

{
"domain" : "https://your.domain.tld",
"public_key" : base64_encode($your_public_key)
}

The response should be the uuid of the entity which has been created. You don't have to note this down, it's just confirmation the public_key was registered correctly.

{
"id" : "randomly_generated_uuid"
}

Basic Example

You can request data from any of the endpoints mentioned below. Out of the box, the microservice supplies demo data. The JWT needs to be set as a header for each request (apart from registering a client).

Request

GET /api/v1/payments
Host: http://localhost:8881
Content-Type: application/json
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

Response

[
{
"id": "f3a50212-d35d-11e6-872b-0242ac110002",
"amount": 9000,
"gratuity": null,
"reference": "ADS67dgftyt5fytsdTYF",
"card": {
"id": "d18d7f82-d35d-11e6-872b-0242ac110002",
"last4": "6482",
"type": "AMEX"
},
"tables": [
{
"id": "d63cc628-d35d-11e6-872b-0242ac110002",
"seats": 4
}
],
"location": {
"id": "d8e62678-d35d-11e6-872b-0242ac110002",
"title": "Foo",
"address": "1 Bar Road, Baz Town",
"latitude": "12318297812712",
"longitude": "-12735162537123"
},
"created": {
"date": "2017-01-05 15:45:15.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"updated": null
}
]

Endpoints

All endpoints can be found here.

Tests

Unit tests are run using phpunit via the php:7.0 container.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/phpunit tests -c phpunit.xml.dist

About

A technical test for FlyPay

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Flypay

A technical test for FlyPay. The following demonstrates a basic GET / POST microservice, allowing consumers to register their apps and store dummy payment data.

Pre-Requisites

The below assumes docker is installed on the local machine. If not, visit https://docs.docker.com/engine/installation/ and follow the instructions.

Docker has been used locally for the following.

  • Composer
  • PHP 7.x
  • MySQL 5.7

Use the following commands to install and run containers.

Note: docker-compose has not been utilized.

Composer

We're going to pull composer/composer for the moment, and we'll use this container to install ours deps.

docker pull composer/composer

MySQL 5.7

We'll pull the 5.7 version of the MySQL docker container. The container hasn't been modifided (unlike php:7.0), so we'll run the container as a daemon, passing our chosen root password (modify YOUR_ROOT_PASSWORD).

docker pull mysql:5.7
docker run --name flypay-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=YOUR_ROOT_PASSWORD -d mysql:5.7

PHP 7.0

We've customized the php:7.0 container by installing pdo and xdebug by default. Build the container and run with the following commands.

docker build -t flypay .
docker run --name flypay -p:8881:8881 -v $(pwd):/app -w /app --link flypay-db:mysql -d flypay php -S 0.0.0.0:8881 -t public

Docker should now show 2 running containers, flypay and flypay-db.

Getting Started

First off, we'll need to clone the repository.

git clone https://github.com/steadweb/FlyPay.git

Next, install depending with composer, using the docker container we pulled earlier.

docker run -i --rm -v ~/.ssh:/root/.ssh -v $(pwd):/app composer/composer install

In order to setup the DB, you'll need to setup your .env and create the database. The .env file should be located within the root of the project, and should contain the following values:

Note: Find the IP of the flypay-db container using docker inspect <container_id>.

DB_HOST=IP_ADDRESS_OF_THE_MYSQL_CONTAINER
DB_NAME=flypay_steadweb
DB_USER=root
DB_PASS=YOUR_ROOT_PASSWORD

Note: I understand it's bad practice using the root user, but this is for a technical task / development purposes, hence the usage of .env.

You will need to create the database, migrations won't do this for you. Create a database, using docker, with the following command:

docker run -it --link flypay-db:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "create database flypay_steadweb;"'

Once the database has been created, run the migrations.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/doctrine-migrations migrations:migrate --configuration configuration.yml

The microserivce has now been installed with demo data.

Authentication

The microservice leverages JWT to auth an app against the API. Out of the box, 1 app is registered, but it's suggested for an app to register it's own public_key using the /client/register endpoint.

Without relying on this micoservice to provide a JWT, it's put the reliance on the application itself, storing the public_key and validating the signature within middleware.

You can use the following JWT when testing the app.

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

The following JSON object is the correct payload for the /client/register endpoint. You'll notice the public_key is base64 encoded, this is required and the endpoint will fail if it detects a malformed public_key.

{
"domain" : "https://your.domain.tld",
"public_key" : base64_encode($your_public_key)
}

The response should be the uuid of the entity which has been created. You don't have to note this down, it's just confirmation the public_key was registered correctly.

{
"id" : "randomly_generated_uuid"
}

Basic Example

You can request data from any of the endpoints mentioned below. Out of the box, the microservice supplies demo data. The JWT needs to be set as a header for each request (apart from registering a client).

Request

GET /api/v1/payments
Host: http://localhost:8881
Content-Type: application/json
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

Response

[
{
"id": "f3a50212-d35d-11e6-872b-0242ac110002",
"amount": 9000,
"gratuity": null,
"reference": "ADS67dgftyt5fytsdTYF",
"card": {
"id": "d18d7f82-d35d-11e6-872b-0242ac110002",
"last4": "6482",
"type": "AMEX"
},
"tables": [
{
"id": "d63cc628-d35d-11e6-872b-0242ac110002",
"seats": 4
}
],
"location": {
"id": "d8e62678-d35d-11e6-872b-0242ac110002",
"title": "Foo",
"address": "1 Bar Road, Baz Town",
"latitude": "12318297812712",
"longitude": "-12735162537123"
},
"created": {
"date": "2017-01-05 15:45:15.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"updated": null
}
]

Endpoints

All endpoints can be found here.

Tests

Unit tests are run using phpunit via the php:7.0 container.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/phpunit tests -c phpunit.xml.dist

About

A technical test for FlyPay

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Flypay

A technical test for FlyPay. The following demonstrates a basic GET / POST microservice, allowing consumers to register their apps and store dummy payment data.

Pre-Requisites

The below assumes docker is installed on the local machine. If not, visit https://docs.docker.com/engine/installation/ and follow the instructions.

Docker has been used locally for the following.

  • Composer
  • PHP 7.x
  • MySQL 5.7

Use the following commands to install and run containers.

Note: docker-compose has not been utilized.

Composer

We're going to pull composer/composer for the moment, and we'll use this container to install ours deps.

docker pull composer/composer

MySQL 5.7

We'll pull the 5.7 version of the MySQL docker container. The container hasn't been modifided (unlike php:7.0), so we'll run the container as a daemon, passing our chosen root password (modify YOUR_ROOT_PASSWORD).

docker pull mysql:5.7
docker run --name flypay-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=YOUR_ROOT_PASSWORD -d mysql:5.7

PHP 7.0

We've customized the php:7.0 container by installing pdo and xdebug by default. Build the container and run with the following commands.

docker build -t flypay .
docker run --name flypay -p:8881:8881 -v $(pwd):/app -w /app --link flypay-db:mysql -d flypay php -S 0.0.0.0:8881 -t public

Docker should now show 2 running containers, flypay and flypay-db.

Getting Started

First off, we'll need to clone the repository.

git clone https://github.com/steadweb/FlyPay.git

Next, install depending with composer, using the docker container we pulled earlier.

docker run -i --rm -v ~/.ssh:/root/.ssh -v $(pwd):/app composer/composer install

In order to setup the DB, you'll need to setup your .env and create the database. The .env file should be located within the root of the project, and should contain the following values:

Note: Find the IP of the flypay-db container using docker inspect <container_id>.

DB_HOST=IP_ADDRESS_OF_THE_MYSQL_CONTAINER
DB_NAME=flypay_steadweb
DB_USER=root
DB_PASS=YOUR_ROOT_PASSWORD

Note: I understand it's bad practice using the root user, but this is for a technical task / development purposes, hence the usage of .env.

You will need to create the database, migrations won't do this for you. Create a database, using docker, with the following command:

docker run -it --link flypay-db:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "create database flypay_steadweb;"'

Once the database has been created, run the migrations.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/doctrine-migrations migrations:migrate --configuration configuration.yml

The microserivce has now been installed with demo data.

Authentication

The microservice leverages JWT to auth an app against the API. Out of the box, 1 app is registered, but it's suggested for an app to register it's own public_key using the /client/register endpoint.

Without relying on this micoservice to provide a JWT, it's put the reliance on the application itself, storing the public_key and validating the signature within middleware.

You can use the following JWT when testing the app.

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

The following JSON object is the correct payload for the /client/register endpoint. You'll notice the public_key is base64 encoded, this is required and the endpoint will fail if it detects a malformed public_key.

{
"domain" : "https://your.domain.tld",
"public_key" : base64_encode($your_public_key)
}

The response should be the uuid of the entity which has been created. You don't have to note this down, it's just confirmation the public_key was registered correctly.

{
"id" : "randomly_generated_uuid"
}

Basic Example

You can request data from any of the endpoints mentioned below. Out of the box, the microservice supplies demo data. The JWT needs to be set as a header for each request (apart from registering a client).

Request

GET /api/v1/payments
Host: http://localhost:8881
Content-Type: application/json
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

Response

[
{
"id": "f3a50212-d35d-11e6-872b-0242ac110002",
"amount": 9000,
"gratuity": null,
"reference": "ADS67dgftyt5fytsdTYF",
"card": {
"id": "d18d7f82-d35d-11e6-872b-0242ac110002",
"last4": "6482",
"type": "AMEX"
},
"tables": [
{
"id": "d63cc628-d35d-11e6-872b-0242ac110002",
"seats": 4
}
],
"location": {
"id": "d8e62678-d35d-11e6-872b-0242ac110002",
"title": "Foo",
"address": "1 Bar Road, Baz Town",
"latitude": "12318297812712",
"longitude": "-12735162537123"
},
"created": {
"date": "2017-01-05 15:45:15.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"updated": null
}
]

Endpoints

All endpoints can be found here.

Tests

Unit tests are run using phpunit via the php:7.0 container.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/phpunit tests -c phpunit.xml.dist

About

A technical test for FlyPay

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Flypay

A technical test for FlyPay. The following demonstrates a basic GET / POST microservice, allowing consumers to register their apps and store dummy payment data.

Pre-Requisites

The below assumes docker is installed on the local machine. If not, visit https://docs.docker.com/engine/installation/ and follow the instructions.

Docker has been used locally for the following.

  • Composer
  • PHP 7.x
  • MySQL 5.7

Use the following commands to install and run containers.

Note: docker-compose has not been utilized.

Composer

We're going to pull composer/composer for the moment, and we'll use this container to install ours deps.

docker pull composer/composer

MySQL 5.7

We'll pull the 5.7 version of the MySQL docker container. The container hasn't been modifided (unlike php:7.0), so we'll run the container as a daemon, passing our chosen root password (modify YOUR_ROOT_PASSWORD).

docker pull mysql:5.7
docker run --name flypay-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=YOUR_ROOT_PASSWORD -d mysql:5.7

PHP 7.0

We've customized the php:7.0 container by installing pdo and xdebug by default. Build the container and run with the following commands.

docker build -t flypay .
docker run --name flypay -p:8881:8881 -v $(pwd):/app -w /app --link flypay-db:mysql -d flypay php -S 0.0.0.0:8881 -t public

Docker should now show 2 running containers, flypay and flypay-db.

Getting Started

First off, we'll need to clone the repository.

git clone https://github.com/steadweb/FlyPay.git

Next, install depending with composer, using the docker container we pulled earlier.

docker run -i --rm -v ~/.ssh:/root/.ssh -v $(pwd):/app composer/composer install

In order to setup the DB, you'll need to setup your .env and create the database. The .env file should be located within the root of the project, and should contain the following values:

Note: Find the IP of the flypay-db container using docker inspect <container_id>.

DB_HOST=IP_ADDRESS_OF_THE_MYSQL_CONTAINER
DB_NAME=flypay_steadweb
DB_USER=root
DB_PASS=YOUR_ROOT_PASSWORD

Note: I understand it's bad practice using the root user, but this is for a technical task / development purposes, hence the usage of .env.

You will need to create the database, migrations won't do this for you. Create a database, using docker, with the following command:

docker run -it --link flypay-db:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "create database flypay_steadweb;"'

Once the database has been created, run the migrations.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/doctrine-migrations migrations:migrate --configuration configuration.yml

The microserivce has now been installed with demo data.

Authentication

The microservice leverages JWT to auth an app against the API. Out of the box, 1 app is registered, but it's suggested for an app to register it's own public_key using the /client/register endpoint.

Without relying on this micoservice to provide a JWT, it's put the reliance on the application itself, storing the public_key and validating the signature within middleware.

You can use the following JWT when testing the app.

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

The following JSON object is the correct payload for the /client/register endpoint. You'll notice the public_key is base64 encoded, this is required and the endpoint will fail if it detects a malformed public_key.

{
"domain" : "https://your.domain.tld",
"public_key" : base64_encode($your_public_key)
}

The response should be the uuid of the entity which has been created. You don't have to note this down, it's just confirmation the public_key was registered correctly.

{
"id" : "randomly_generated_uuid"
}

Basic Example

You can request data from any of the endpoints mentioned below. Out of the box, the microservice supplies demo data. The JWT needs to be set as a header for each request (apart from registering a client).

Request

GET /api/v1/payments
Host: http://localhost:8881
Content-Type: application/json
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

Response

[
{
"id": "f3a50212-d35d-11e6-872b-0242ac110002",
"amount": 9000,
"gratuity": null,
"reference": "ADS67dgftyt5fytsdTYF",
"card": {
"id": "d18d7f82-d35d-11e6-872b-0242ac110002",
"last4": "6482",
"type": "AMEX"
},
"tables": [
{
"id": "d63cc628-d35d-11e6-872b-0242ac110002",
"seats": 4
}
],
"location": {
"id": "d8e62678-d35d-11e6-872b-0242ac110002",
"title": "Foo",
"address": "1 Bar Road, Baz Town",
"latitude": "12318297812712",
"longitude": "-12735162537123"
},
"created": {
"date": "2017-01-05 15:45:15.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"updated": null
}
]

Endpoints

All endpoints can be found here.

Tests

Unit tests are run using phpunit via the php:7.0 container.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/phpunit tests -c phpunit.xml.dist

About

A technical test for FlyPay

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Flypay

A technical test for FlyPay. The following demonstrates a basic GET / POST microservice, allowing consumers to register their apps and store dummy payment data.

Pre-Requisites

The below assumes docker is installed on the local machine. If not, visit https://docs.docker.com/engine/installation/ and follow the instructions.

Docker has been used locally for the following.

  • Composer
  • PHP 7.x
  • MySQL 5.7

Use the following commands to install and run containers.

Note: docker-compose has not been utilized.

Composer

We're going to pull composer/composer for the moment, and we'll use this container to install ours deps.

docker pull composer/composer

MySQL 5.7

We'll pull the 5.7 version of the MySQL docker container. The container hasn't been modifided (unlike php:7.0), so we'll run the container as a daemon, passing our chosen root password (modify YOUR_ROOT_PASSWORD).

docker pull mysql:5.7
docker run --name flypay-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=YOUR_ROOT_PASSWORD -d mysql:5.7

PHP 7.0

We've customized the php:7.0 container by installing pdo and xdebug by default. Build the container and run with the following commands.

docker build -t flypay .
docker run --name flypay -p:8881:8881 -v $(pwd):/app -w /app --link flypay-db:mysql -d flypay php -S 0.0.0.0:8881 -t public

Docker should now show 2 running containers, flypay and flypay-db.

Getting Started

First off, we'll need to clone the repository.

git clone https://github.com/steadweb/FlyPay.git

Next, install depending with composer, using the docker container we pulled earlier.

docker run -i --rm -v ~/.ssh:/root/.ssh -v $(pwd):/app composer/composer install

In order to setup the DB, you'll need to setup your .env and create the database. The .env file should be located within the root of the project, and should contain the following values:

Note: Find the IP of the flypay-db container using docker inspect <container_id>.

DB_HOST=IP_ADDRESS_OF_THE_MYSQL_CONTAINER
DB_NAME=flypay_steadweb
DB_USER=root
DB_PASS=YOUR_ROOT_PASSWORD

Note: I understand it's bad practice using the root user, but this is for a technical task / development purposes, hence the usage of .env.

You will need to create the database, migrations won't do this for you. Create a database, using docker, with the following command:

docker run -it --link flypay-db:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "create database flypay_steadweb;"'

Once the database has been created, run the migrations.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/doctrine-migrations migrations:migrate --configuration configuration.yml

The microserivce has now been installed with demo data.

Authentication

The microservice leverages JWT to auth an app against the API. Out of the box, 1 app is registered, but it's suggested for an app to register it's own public_key using the /client/register endpoint.

Without relying on this micoservice to provide a JWT, it's put the reliance on the application itself, storing the public_key and validating the signature within middleware.

You can use the following JWT when testing the app.

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

The following JSON object is the correct payload for the /client/register endpoint. You'll notice the public_key is base64 encoded, this is required and the endpoint will fail if it detects a malformed public_key.

{
"domain" : "https://your.domain.tld",
"public_key" : base64_encode($your_public_key)
}

The response should be the uuid of the entity which has been created. You don't have to note this down, it's just confirmation the public_key was registered correctly.

{
"id" : "randomly_generated_uuid"
}

Basic Example

You can request data from any of the endpoints mentioned below. Out of the box, the microservice supplies demo data. The JWT needs to be set as a header for each request (apart from registering a client).

Request

GET /api/v1/payments
Host: http://localhost:8881
Content-Type: application/json
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmx5cGF5LnN0ZWFkd2ViLmNvbSIsImF1ZCI6Imh0dHBzOlwvXC9mbHlwYXkuc3RlYWR3ZWIuY29tIn0.J6yRvezHHJwM-9_nyHd-2PmcRDIAtqmJlHKcgEEuWxP1A6--A5K7bvm0Khy_527QlC3-0NpuEfev_yRt2MIxOVgoSsn_jDt2Ny3wDUNFWdaAWwme6TeTm5TVtszTcj1hI1JXoFfxbkY1kIzafKQCZFLIKNh08HoKjk2PHrZV2J6k7PUTnzxoZ-Fv6UpsbbV9_e4XbPbjVtrY23-OlYeM8gldQif2EMaFTY8SIDuN6OtBVDJoGG--rsHOFfI1nGjzBDnFAvfLJixGZLPT_DC4YhRK--H2kJLwcLUOzxKB63b5gWHHdCddSWADLgQ-nOZsA8LyHQcCJqY7C1QumhBhLQ

Response

[
{
"id": "f3a50212-d35d-11e6-872b-0242ac110002",
"amount": 9000,
"gratuity": null,
"reference": "ADS67dgftyt5fytsdTYF",
"card": {
"id": "d18d7f82-d35d-11e6-872b-0242ac110002",
"last4": "6482",
"type": "AMEX"
},
"tables": [
{
"id": "d63cc628-d35d-11e6-872b-0242ac110002",
"seats": 4
}
],
"location": {
"id": "d8e62678-d35d-11e6-872b-0242ac110002",
"title": "Foo",
"address": "1 Bar Road, Baz Town",
"latitude": "12318297812712",
"longitude": "-12735162537123"
},
"created": {
"date": "2017-01-05 15:45:15.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"updated": null
}
]

Endpoints

All endpoints can be found here.

Tests

Unit tests are run using phpunit via the php:7.0 container.

docker run --rm -v $(pwd):/app -w /app --link flypay-db:mysql flypay php vendor/bin/phpunit tests -c phpunit.xml.dist

About

A technical test for FlyPay

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages