Repository files navigation

http-notification

Technologies

Docker, Node/Express, Mocha and chai etc

Installation Guide

Docker setup recommended

  • Ensure that docker is installed on your local machine
  • Git pull this project into your local machine
  • cd into http-notification directory and Run
    docker-compose up
    
  • This will take a while as it will build all the services in the docker compose
  • When this is done, It will start three servers
  • Publisher server at port 8000
  • subscriber1 server at port 9000
  • subscriber2 server at port 5000

Publiser

  • To get into publisher server container terminal, run
    docker exec -it http-notification_publisher_1 bash
    
  • To view logs in only publisher server
    docker logs -f http-notification_publisher_1
    

Subscriber1

  • To get into Subscriber1 server container terminal, run
    docker exec -it http-notification_subscriber1_1 bash
    
  • To view logs in only Subscriber1 server
    docker logs -f http-notification_subscriber1_1
    

Subscriber2

  • To get into Subscriber2 server container terminal, run
    docker exec -it http-notification_subscriber2_1 bash
    
  • To view logs in only Subscriber2 server
    docker logs -f http-notification_subscriber2_1
    

Run Test

  • Get into publisher container terminal with this command
    docker exec -it http-notification_publisher_1 bash
    
  • Within the container terminal, run npm test

Manual setup

Publisher

  • cd into publisher

  • Ensure you have node version 14 installed on your machine. run

    node -v
    
  • create .env file, copy all the variable in .env.sample file into the .env and replace variable where necssary

  • run npm install

  • run migrations

    sequelize db:migrate
    
  • start dev server with

    npm run start-dev
    
  • run test with npm test

Subscriber1 or subscriber2

  • cd into subscriber1 or subscriber2

  • run npm install

  • start dev server with

    npm run start-dev
    

Documentation

Account

  • Create an account: Accounts and requests are created and made on publisher server

    Request

    POST http://localhost:8000/api/v1/account/create
    {
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "email": "andela.account@andela.com",
    "name": "andela",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "createdAt": "2021-05-02T19:40:59.270Z"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NDU5fQ.jio-ndSWBWbZfKhUc2XHphhMWYeJNaHJn4ALF6I-rgQ",
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4"
    }
    
  • Login to account

    Request

    POST http://localhost:8000/api/v1/account/login
    {
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "createdAt": "2021-05-02T19:40:59.270Z",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "accessKeys": [
    {
    "id": 2,
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4",
    "createdAt": "2021-05-02T19:40:59.352Z",
    "updatedAt": "2021-05-02T19:40:59.352Z",
    "accountId": 2
    }
    ]
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NzUxfQ.DtC_Z8dIgw7Koj_y0epuGHcel1vR1aXkSYtbGKTMqUU"
    }
    

Topic

  • Create Topic

    Request

    Grab the token from the account login

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    {
    "name": "Test topic"
    }
    

    Response

    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    
  • List of topic

    Request

    Grab the token from the account login

    GET
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    

    Response

    [
    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    ]
    

Subscription

  • List of available endpoint for subscription on subscriber1 server

    http://localhost:9000/api/v1/test1
    http://localhost:9000/api/v1/test2
    or http://127.0.0.1:9000/api/v1/test1
    http://127.0.0.1:9000/api/v1/test2
    
  • List of available endpoint/url for subscription on subscriber2 server

    http://localhost:5000/api/v1/test1
    http://localhost:5000/api/v1/test2
    or http://127.0.0.1:5000/api/v1/test1
    http://127.0.0.1:5000/api/v1/test2
    
  • Create Subscription

    Request

    Grab the token from the account login

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/subscribe/<topicId>
    {
    "url": "http://localhost:5000/api/v1/test1"
    }
    

    Response

    {
    "url": "http://localhost:5000/api/v1/test1",
    "topic": "Test topic"
    }
    

Publish to topic

  • Publish to topic

    Request

    Grab the token from the account login.

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/publish/<topicId>
    {
    "message": "new data published"
    }
    

    Response

    [
    {
    "url": "http://localhost:5000/api/v1/test1",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    {
    "url": "http://localhost:5000/api/v1/test2",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    ...
    ]
    
  • Confirm that the subscriber servers logs the data published to them in the console.

  • The subscriber servers also logs the data received from the publisher in this directory

    logs/combined.log
    

Aditional Recommendation or features

  • The communications between publisher and subscribers should be encripted for security in the case of a very sensitive information. One way to do this is to encript the data in the publisher before sending it and allow subscriber to decript the data. This involves sharing of secrete key between publisher and subsctriber.

  • in the case of a less sensitive data, an initial handshake between publisher and subscriber could be established before subscriber begin to receive data.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 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

http-notification

Technologies

Docker, Node/Express, Mocha and chai etc

Installation Guide

Docker setup recommended

  • Ensure that docker is installed on your local machine
  • Git pull this project into your local machine
  • cd into http-notification directory and Run
    docker-compose up
    
  • This will take a while as it will build all the services in the docker compose
  • When this is done, It will start three servers
  • Publisher server at port 8000
  • subscriber1 server at port 9000
  • subscriber2 server at port 5000

Publiser

  • To get into publisher server container terminal, run
    docker exec -it http-notification_publisher_1 bash
    
  • To view logs in only publisher server
    docker logs -f http-notification_publisher_1
    

Subscriber1

  • To get into Subscriber1 server container terminal, run
    docker exec -it http-notification_subscriber1_1 bash
    
  • To view logs in only Subscriber1 server
    docker logs -f http-notification_subscriber1_1
    

Subscriber2

  • To get into Subscriber2 server container terminal, run
    docker exec -it http-notification_subscriber2_1 bash
    
  • To view logs in only Subscriber2 server
    docker logs -f http-notification_subscriber2_1
    

Run Test

  • Get into publisher container terminal with this command
    docker exec -it http-notification_publisher_1 bash
    
  • Within the container terminal, run npm test

Manual setup

Publisher

  • cd into publisher

  • Ensure you have node version 14 installed on your machine. run

    node -v
    
  • create .env file, copy all the variable in .env.sample file into the .env and replace variable where necssary

  • run npm install

  • run migrations

    sequelize db:migrate
    
  • start dev server with

    npm run start-dev
    
  • run test with npm test

Subscriber1 or subscriber2

  • cd into subscriber1 or subscriber2

  • run npm install

  • start dev server with

    npm run start-dev
    

Documentation

Account

  • Create an account: Accounts and requests are created and made on publisher server

    Request

    POST http://localhost:8000/api/v1/account/create
    {
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "email": "andela.account@andela.com",
    "name": "andela",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "createdAt": "2021-05-02T19:40:59.270Z"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NDU5fQ.jio-ndSWBWbZfKhUc2XHphhMWYeJNaHJn4ALF6I-rgQ",
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4"
    }
    
  • Login to account

    Request

    POST http://localhost:8000/api/v1/account/login
    {
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "createdAt": "2021-05-02T19:40:59.270Z",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "accessKeys": [
    {
    "id": 2,
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4",
    "createdAt": "2021-05-02T19:40:59.352Z",
    "updatedAt": "2021-05-02T19:40:59.352Z",
    "accountId": 2
    }
    ]
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NzUxfQ.DtC_Z8dIgw7Koj_y0epuGHcel1vR1aXkSYtbGKTMqUU"
    }
    

Topic

  • Create Topic

    Request

    Grab the token from the account login

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    {
    "name": "Test topic"
    }
    

    Response

    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    
  • List of topic

    Request

    Grab the token from the account login

    GET
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    

    Response

    [
    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    ]
    

Subscription

  • List of available endpoint for subscription on subscriber1 server

    http://localhost:9000/api/v1/test1
    http://localhost:9000/api/v1/test2
    or http://127.0.0.1:9000/api/v1/test1
    http://127.0.0.1:9000/api/v1/test2
    
  • List of available endpoint/url for subscription on subscriber2 server

    http://localhost:5000/api/v1/test1
    http://localhost:5000/api/v1/test2
    or http://127.0.0.1:5000/api/v1/test1
    http://127.0.0.1:5000/api/v1/test2
    
  • Create Subscription

    Request

    Grab the token from the account login

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/subscribe/<topicId>
    {
    "url": "http://localhost:5000/api/v1/test1"
    }
    

    Response

    {
    "url": "http://localhost:5000/api/v1/test1",
    "topic": "Test topic"
    }
    

Publish to topic

  • Publish to topic

    Request

    Grab the token from the account login.

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/publish/<topicId>
    {
    "message": "new data published"
    }
    

    Response

    [
    {
    "url": "http://localhost:5000/api/v1/test1",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    {
    "url": "http://localhost:5000/api/v1/test2",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    ...
    ]
    
  • Confirm that the subscriber servers logs the data published to them in the console.

  • The subscriber servers also logs the data received from the publisher in this directory

    logs/combined.log
    

Aditional Recommendation or features

  • The communications between publisher and subscribers should be encripted for security in the case of a very sensitive information. One way to do this is to encript the data in the publisher before sending it and allow subscriber to decript the data. This involves sharing of secrete key between publisher and subsctriber.

  • in the case of a less sensitive data, an initial handshake between publisher and subscriber could be established before subscriber begin to receive data.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 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

http-notification

Technologies

Docker, Node/Express, Mocha and chai etc

Installation Guide

Docker setup recommended

  • Ensure that docker is installed on your local machine
  • Git pull this project into your local machine
  • cd into http-notification directory and Run
    docker-compose up
    
  • This will take a while as it will build all the services in the docker compose
  • When this is done, It will start three servers
  • Publisher server at port 8000
  • subscriber1 server at port 9000
  • subscriber2 server at port 5000

Publiser

  • To get into publisher server container terminal, run
    docker exec -it http-notification_publisher_1 bash
    
  • To view logs in only publisher server
    docker logs -f http-notification_publisher_1
    

Subscriber1

  • To get into Subscriber1 server container terminal, run
    docker exec -it http-notification_subscriber1_1 bash
    
  • To view logs in only Subscriber1 server
    docker logs -f http-notification_subscriber1_1
    

Subscriber2

  • To get into Subscriber2 server container terminal, run
    docker exec -it http-notification_subscriber2_1 bash
    
  • To view logs in only Subscriber2 server
    docker logs -f http-notification_subscriber2_1
    

Run Test

  • Get into publisher container terminal with this command
    docker exec -it http-notification_publisher_1 bash
    
  • Within the container terminal, run npm test

Manual setup

Publisher

  • cd into publisher

  • Ensure you have node version 14 installed on your machine. run

    node -v
    
  • create .env file, copy all the variable in .env.sample file into the .env and replace variable where necssary

  • run npm install

  • run migrations

    sequelize db:migrate
    
  • start dev server with

    npm run start-dev
    
  • run test with npm test

Subscriber1 or subscriber2

  • cd into subscriber1 or subscriber2

  • run npm install

  • start dev server with

    npm run start-dev
    

Documentation

Account

  • Create an account: Accounts and requests are created and made on publisher server

    Request

    POST http://localhost:8000/api/v1/account/create
    {
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "email": "andela.account@andela.com",
    "name": "andela",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "createdAt": "2021-05-02T19:40:59.270Z"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NDU5fQ.jio-ndSWBWbZfKhUc2XHphhMWYeJNaHJn4ALF6I-rgQ",
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4"
    }
    
  • Login to account

    Request

    POST http://localhost:8000/api/v1/account/login
    {
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "createdAt": "2021-05-02T19:40:59.270Z",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "accessKeys": [
    {
    "id": 2,
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4",
    "createdAt": "2021-05-02T19:40:59.352Z",
    "updatedAt": "2021-05-02T19:40:59.352Z",
    "accountId": 2
    }
    ]
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NzUxfQ.DtC_Z8dIgw7Koj_y0epuGHcel1vR1aXkSYtbGKTMqUU"
    }
    

Topic

  • Create Topic

    Request

    Grab the token from the account login

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    {
    "name": "Test topic"
    }
    

    Response

    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    
  • List of topic

    Request

    Grab the token from the account login

    GET
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    

    Response

    [
    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    ]
    

Subscription

  • List of available endpoint for subscription on subscriber1 server

    http://localhost:9000/api/v1/test1
    http://localhost:9000/api/v1/test2
    or http://127.0.0.1:9000/api/v1/test1
    http://127.0.0.1:9000/api/v1/test2
    
  • List of available endpoint/url for subscription on subscriber2 server

    http://localhost:5000/api/v1/test1
    http://localhost:5000/api/v1/test2
    or http://127.0.0.1:5000/api/v1/test1
    http://127.0.0.1:5000/api/v1/test2
    
  • Create Subscription

    Request

    Grab the token from the account login

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/subscribe/<topicId>
    {
    "url": "http://localhost:5000/api/v1/test1"
    }
    

    Response

    {
    "url": "http://localhost:5000/api/v1/test1",
    "topic": "Test topic"
    }
    

Publish to topic

  • Publish to topic

    Request

    Grab the token from the account login.

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/publish/<topicId>
    {
    "message": "new data published"
    }
    

    Response

    [
    {
    "url": "http://localhost:5000/api/v1/test1",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    {
    "url": "http://localhost:5000/api/v1/test2",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    ...
    ]
    
  • Confirm that the subscriber servers logs the data published to them in the console.

  • The subscriber servers also logs the data received from the publisher in this directory

    logs/combined.log
    

Aditional Recommendation or features

  • The communications between publisher and subscribers should be encripted for security in the case of a very sensitive information. One way to do this is to encript the data in the publisher before sending it and allow subscriber to decript the data. This involves sharing of secrete key between publisher and subsctriber.

  • in the case of a less sensitive data, an initial handshake between publisher and subscriber could be established before subscriber begin to receive data.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 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

http-notification

Technologies

Docker, Node/Express, Mocha and chai etc

Installation Guide

Docker setup recommended

  • Ensure that docker is installed on your local machine
  • Git pull this project into your local machine
  • cd into http-notification directory and Run
    docker-compose up
    
  • This will take a while as it will build all the services in the docker compose
  • When this is done, It will start three servers
  • Publisher server at port 8000
  • subscriber1 server at port 9000
  • subscriber2 server at port 5000

Publiser

  • To get into publisher server container terminal, run
    docker exec -it http-notification_publisher_1 bash
    
  • To view logs in only publisher server
    docker logs -f http-notification_publisher_1
    

Subscriber1

  • To get into Subscriber1 server container terminal, run
    docker exec -it http-notification_subscriber1_1 bash
    
  • To view logs in only Subscriber1 server
    docker logs -f http-notification_subscriber1_1
    

Subscriber2

  • To get into Subscriber2 server container terminal, run
    docker exec -it http-notification_subscriber2_1 bash
    
  • To view logs in only Subscriber2 server
    docker logs -f http-notification_subscriber2_1
    

Run Test

  • Get into publisher container terminal with this command
    docker exec -it http-notification_publisher_1 bash
    
  • Within the container terminal, run npm test

Manual setup

Publisher

  • cd into publisher

  • Ensure you have node version 14 installed on your machine. run

    node -v
    
  • create .env file, copy all the variable in .env.sample file into the .env and replace variable where necssary

  • run npm install

  • run migrations

    sequelize db:migrate
    
  • start dev server with

    npm run start-dev
    
  • run test with npm test

Subscriber1 or subscriber2

  • cd into subscriber1 or subscriber2

  • run npm install

  • start dev server with

    npm run start-dev
    

Documentation

Account

  • Create an account: Accounts and requests are created and made on publisher server

    Request

    POST http://localhost:8000/api/v1/account/create
    {
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "email": "andela.account@andela.com",
    "name": "andela",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "createdAt": "2021-05-02T19:40:59.270Z"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NDU5fQ.jio-ndSWBWbZfKhUc2XHphhMWYeJNaHJn4ALF6I-rgQ",
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4"
    }
    
  • Login to account

    Request

    POST http://localhost:8000/api/v1/account/login
    {
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "createdAt": "2021-05-02T19:40:59.270Z",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "accessKeys": [
    {
    "id": 2,
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4",
    "createdAt": "2021-05-02T19:40:59.352Z",
    "updatedAt": "2021-05-02T19:40:59.352Z",
    "accountId": 2
    }
    ]
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NzUxfQ.DtC_Z8dIgw7Koj_y0epuGHcel1vR1aXkSYtbGKTMqUU"
    }
    

Topic

  • Create Topic

    Request

    Grab the token from the account login

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    {
    "name": "Test topic"
    }
    

    Response

    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    
  • List of topic

    Request

    Grab the token from the account login

    GET
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    

    Response

    [
    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    ]
    

Subscription

  • List of available endpoint for subscription on subscriber1 server

    http://localhost:9000/api/v1/test1
    http://localhost:9000/api/v1/test2
    or http://127.0.0.1:9000/api/v1/test1
    http://127.0.0.1:9000/api/v1/test2
    
  • List of available endpoint/url for subscription on subscriber2 server

    http://localhost:5000/api/v1/test1
    http://localhost:5000/api/v1/test2
    or http://127.0.0.1:5000/api/v1/test1
    http://127.0.0.1:5000/api/v1/test2
    
  • Create Subscription

    Request

    Grab the token from the account login

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/subscribe/<topicId>
    {
    "url": "http://localhost:5000/api/v1/test1"
    }
    

    Response

    {
    "url": "http://localhost:5000/api/v1/test1",
    "topic": "Test topic"
    }
    

Publish to topic

  • Publish to topic

    Request

    Grab the token from the account login.

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/publish/<topicId>
    {
    "message": "new data published"
    }
    

    Response

    [
    {
    "url": "http://localhost:5000/api/v1/test1",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    {
    "url": "http://localhost:5000/api/v1/test2",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    ...
    ]
    
  • Confirm that the subscriber servers logs the data published to them in the console.

  • The subscriber servers also logs the data received from the publisher in this directory

    logs/combined.log
    

Aditional Recommendation or features

  • The communications between publisher and subscribers should be encripted for security in the case of a very sensitive information. One way to do this is to encript the data in the publisher before sending it and allow subscriber to decript the data. This involves sharing of secrete key between publisher and subsctriber.

  • in the case of a less sensitive data, an initial handshake between publisher and subscriber could be established before subscriber begin to receive data.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 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

http-notification

Technologies

Docker, Node/Express, Mocha and chai etc

Installation Guide

Docker setup recommended

  • Ensure that docker is installed on your local machine
  • Git pull this project into your local machine
  • cd into http-notification directory and Run
    docker-compose up
    
  • This will take a while as it will build all the services in the docker compose
  • When this is done, It will start three servers
  • Publisher server at port 8000
  • subscriber1 server at port 9000
  • subscriber2 server at port 5000

Publiser

  • To get into publisher server container terminal, run
    docker exec -it http-notification_publisher_1 bash
    
  • To view logs in only publisher server
    docker logs -f http-notification_publisher_1
    

Subscriber1

  • To get into Subscriber1 server container terminal, run
    docker exec -it http-notification_subscriber1_1 bash
    
  • To view logs in only Subscriber1 server
    docker logs -f http-notification_subscriber1_1
    

Subscriber2

  • To get into Subscriber2 server container terminal, run
    docker exec -it http-notification_subscriber2_1 bash
    
  • To view logs in only Subscriber2 server
    docker logs -f http-notification_subscriber2_1
    

Run Test

  • Get into publisher container terminal with this command
    docker exec -it http-notification_publisher_1 bash
    
  • Within the container terminal, run npm test

Manual setup

Publisher

  • cd into publisher

  • Ensure you have node version 14 installed on your machine. run

    node -v
    
  • create .env file, copy all the variable in .env.sample file into the .env and replace variable where necssary

  • run npm install

  • run migrations

    sequelize db:migrate
    
  • start dev server with

    npm run start-dev
    
  • run test with npm test

Subscriber1 or subscriber2

  • cd into subscriber1 or subscriber2

  • run npm install

  • start dev server with

    npm run start-dev
    

Documentation

Account

  • Create an account: Accounts and requests are created and made on publisher server

    Request

    POST http://localhost:8000/api/v1/account/create
    {
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "email": "andela.account@andela.com",
    "name": "andela",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "createdAt": "2021-05-02T19:40:59.270Z"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NDU5fQ.jio-ndSWBWbZfKhUc2XHphhMWYeJNaHJn4ALF6I-rgQ",
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4"
    }
    
  • Login to account

    Request

    POST http://localhost:8000/api/v1/account/login
    {
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "createdAt": "2021-05-02T19:40:59.270Z",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "accessKeys": [
    {
    "id": 2,
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4",
    "createdAt": "2021-05-02T19:40:59.352Z",
    "updatedAt": "2021-05-02T19:40:59.352Z",
    "accountId": 2
    }
    ]
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NzUxfQ.DtC_Z8dIgw7Koj_y0epuGHcel1vR1aXkSYtbGKTMqUU"
    }
    

Topic

  • Create Topic

    Request

    Grab the token from the account login

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    {
    "name": "Test topic"
    }
    

    Response

    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    
  • List of topic

    Request

    Grab the token from the account login

    GET
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    

    Response

    [
    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    ]
    

Subscription

  • List of available endpoint for subscription on subscriber1 server

    http://localhost:9000/api/v1/test1
    http://localhost:9000/api/v1/test2
    or http://127.0.0.1:9000/api/v1/test1
    http://127.0.0.1:9000/api/v1/test2
    
  • List of available endpoint/url for subscription on subscriber2 server

    http://localhost:5000/api/v1/test1
    http://localhost:5000/api/v1/test2
    or http://127.0.0.1:5000/api/v1/test1
    http://127.0.0.1:5000/api/v1/test2
    
  • Create Subscription

    Request

    Grab the token from the account login

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/subscribe/<topicId>
    {
    "url": "http://localhost:5000/api/v1/test1"
    }
    

    Response

    {
    "url": "http://localhost:5000/api/v1/test1",
    "topic": "Test topic"
    }
    

Publish to topic

  • Publish to topic

    Request

    Grab the token from the account login.

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/publish/<topicId>
    {
    "message": "new data published"
    }
    

    Response

    [
    {
    "url": "http://localhost:5000/api/v1/test1",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    {
    "url": "http://localhost:5000/api/v1/test2",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    ...
    ]
    
  • Confirm that the subscriber servers logs the data published to them in the console.

  • The subscriber servers also logs the data received from the publisher in this directory

    logs/combined.log
    

Aditional Recommendation or features

  • The communications between publisher and subscribers should be encripted for security in the case of a very sensitive information. One way to do this is to encript the data in the publisher before sending it and allow subscriber to decript the data. This involves sharing of secrete key between publisher and subsctriber.

  • in the case of a less sensitive data, an initial handshake between publisher and subscriber could be established before subscriber begin to receive data.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 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

http-notification

Technologies

Docker, Node/Express, Mocha and chai etc

Installation Guide

Docker setup recommended

  • Ensure that docker is installed on your local machine
  • Git pull this project into your local machine
  • cd into http-notification directory and Run
    docker-compose up
    
  • This will take a while as it will build all the services in the docker compose
  • When this is done, It will start three servers
  • Publisher server at port 8000
  • subscriber1 server at port 9000
  • subscriber2 server at port 5000

Publiser

  • To get into publisher server container terminal, run
    docker exec -it http-notification_publisher_1 bash
    
  • To view logs in only publisher server
    docker logs -f http-notification_publisher_1
    

Subscriber1

  • To get into Subscriber1 server container terminal, run
    docker exec -it http-notification_subscriber1_1 bash
    
  • To view logs in only Subscriber1 server
    docker logs -f http-notification_subscriber1_1
    

Subscriber2

  • To get into Subscriber2 server container terminal, run
    docker exec -it http-notification_subscriber2_1 bash
    
  • To view logs in only Subscriber2 server
    docker logs -f http-notification_subscriber2_1
    

Run Test

  • Get into publisher container terminal with this command
    docker exec -it http-notification_publisher_1 bash
    
  • Within the container terminal, run npm test

Manual setup

Publisher

  • cd into publisher

  • Ensure you have node version 14 installed on your machine. run

    node -v
    
  • create .env file, copy all the variable in .env.sample file into the .env and replace variable where necssary

  • run npm install

  • run migrations

    sequelize db:migrate
    
  • start dev server with

    npm run start-dev
    
  • run test with npm test

Subscriber1 or subscriber2

  • cd into subscriber1 or subscriber2

  • run npm install

  • start dev server with

    npm run start-dev
    

Documentation

Account

  • Create an account: Accounts and requests are created and made on publisher server

    Request

    POST http://localhost:8000/api/v1/account/create
    {
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "email": "andela.account@andela.com",
    "name": "andela",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "createdAt": "2021-05-02T19:40:59.270Z"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NDU5fQ.jio-ndSWBWbZfKhUc2XHphhMWYeJNaHJn4ALF6I-rgQ",
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4"
    }
    
  • Login to account

    Request

    POST http://localhost:8000/api/v1/account/login
    {
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "createdAt": "2021-05-02T19:40:59.270Z",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "accessKeys": [
    {
    "id": 2,
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4",
    "createdAt": "2021-05-02T19:40:59.352Z",
    "updatedAt": "2021-05-02T19:40:59.352Z",
    "accountId": 2
    }
    ]
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NzUxfQ.DtC_Z8dIgw7Koj_y0epuGHcel1vR1aXkSYtbGKTMqUU"
    }
    

Topic

  • Create Topic

    Request

    Grab the token from the account login

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    {
    "name": "Test topic"
    }
    

    Response

    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    
  • List of topic

    Request

    Grab the token from the account login

    GET
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    

    Response

    [
    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    ]
    

Subscription

  • List of available endpoint for subscription on subscriber1 server

    http://localhost:9000/api/v1/test1
    http://localhost:9000/api/v1/test2
    or http://127.0.0.1:9000/api/v1/test1
    http://127.0.0.1:9000/api/v1/test2
    
  • List of available endpoint/url for subscription on subscriber2 server

    http://localhost:5000/api/v1/test1
    http://localhost:5000/api/v1/test2
    or http://127.0.0.1:5000/api/v1/test1
    http://127.0.0.1:5000/api/v1/test2
    
  • Create Subscription

    Request

    Grab the token from the account login

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/subscribe/<topicId>
    {
    "url": "http://localhost:5000/api/v1/test1"
    }
    

    Response

    {
    "url": "http://localhost:5000/api/v1/test1",
    "topic": "Test topic"
    }
    

Publish to topic

  • Publish to topic

    Request

    Grab the token from the account login.

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/publish/<topicId>
    {
    "message": "new data published"
    }
    

    Response

    [
    {
    "url": "http://localhost:5000/api/v1/test1",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    {
    "url": "http://localhost:5000/api/v1/test2",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    ...
    ]
    
  • Confirm that the subscriber servers logs the data published to them in the console.

  • The subscriber servers also logs the data received from the publisher in this directory

    logs/combined.log
    

Aditional Recommendation or features

  • The communications between publisher and subscribers should be encripted for security in the case of a very sensitive information. One way to do this is to encript the data in the publisher before sending it and allow subscriber to decript the data. This involves sharing of secrete key between publisher and subsctriber.

  • in the case of a less sensitive data, an initial handshake between publisher and subscriber could be established before subscriber begin to receive data.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 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

http-notification

Technologies

Docker, Node/Express, Mocha and chai etc

Installation Guide

Docker setup recommended

  • Ensure that docker is installed on your local machine
  • Git pull this project into your local machine
  • cd into http-notification directory and Run
    docker-compose up
    
  • This will take a while as it will build all the services in the docker compose
  • When this is done, It will start three servers
  • Publisher server at port 8000
  • subscriber1 server at port 9000
  • subscriber2 server at port 5000

Publiser

  • To get into publisher server container terminal, run
    docker exec -it http-notification_publisher_1 bash
    
  • To view logs in only publisher server
    docker logs -f http-notification_publisher_1
    

Subscriber1

  • To get into Subscriber1 server container terminal, run
    docker exec -it http-notification_subscriber1_1 bash
    
  • To view logs in only Subscriber1 server
    docker logs -f http-notification_subscriber1_1
    

Subscriber2

  • To get into Subscriber2 server container terminal, run
    docker exec -it http-notification_subscriber2_1 bash
    
  • To view logs in only Subscriber2 server
    docker logs -f http-notification_subscriber2_1
    

Run Test

  • Get into publisher container terminal with this command
    docker exec -it http-notification_publisher_1 bash
    
  • Within the container terminal, run npm test

Manual setup

Publisher

  • cd into publisher

  • Ensure you have node version 14 installed on your machine. run

    node -v
    
  • create .env file, copy all the variable in .env.sample file into the .env and replace variable where necssary

  • run npm install

  • run migrations

    sequelize db:migrate
    
  • start dev server with

    npm run start-dev
    
  • run test with npm test

Subscriber1 or subscriber2

  • cd into subscriber1 or subscriber2

  • run npm install

  • start dev server with

    npm run start-dev
    

Documentation

Account

  • Create an account: Accounts and requests are created and made on publisher server

    Request

    POST http://localhost:8000/api/v1/account/create
    {
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "email": "andela.account@andela.com",
    "name": "andela",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "createdAt": "2021-05-02T19:40:59.270Z"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NDU5fQ.jio-ndSWBWbZfKhUc2XHphhMWYeJNaHJn4ALF6I-rgQ",
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4"
    }
    
  • Login to account

    Request

    POST http://localhost:8000/api/v1/account/login
    {
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "createdAt": "2021-05-02T19:40:59.270Z",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "accessKeys": [
    {
    "id": 2,
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4",
    "createdAt": "2021-05-02T19:40:59.352Z",
    "updatedAt": "2021-05-02T19:40:59.352Z",
    "accountId": 2
    }
    ]
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NzUxfQ.DtC_Z8dIgw7Koj_y0epuGHcel1vR1aXkSYtbGKTMqUU"
    }
    

Topic

  • Create Topic

    Request

    Grab the token from the account login

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    {
    "name": "Test topic"
    }
    

    Response

    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    
  • List of topic

    Request

    Grab the token from the account login

    GET
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    

    Response

    [
    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    ]
    

Subscription

  • List of available endpoint for subscription on subscriber1 server

    http://localhost:9000/api/v1/test1
    http://localhost:9000/api/v1/test2
    or http://127.0.0.1:9000/api/v1/test1
    http://127.0.0.1:9000/api/v1/test2
    
  • List of available endpoint/url for subscription on subscriber2 server

    http://localhost:5000/api/v1/test1
    http://localhost:5000/api/v1/test2
    or http://127.0.0.1:5000/api/v1/test1
    http://127.0.0.1:5000/api/v1/test2
    
  • Create Subscription

    Request

    Grab the token from the account login

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/subscribe/<topicId>
    {
    "url": "http://localhost:5000/api/v1/test1"
    }
    

    Response

    {
    "url": "http://localhost:5000/api/v1/test1",
    "topic": "Test topic"
    }
    

Publish to topic

  • Publish to topic

    Request

    Grab the token from the account login.

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/publish/<topicId>
    {
    "message": "new data published"
    }
    

    Response

    [
    {
    "url": "http://localhost:5000/api/v1/test1",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    {
    "url": "http://localhost:5000/api/v1/test2",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    ...
    ]
    
  • Confirm that the subscriber servers logs the data published to them in the console.

  • The subscriber servers also logs the data received from the publisher in this directory

    logs/combined.log
    

Aditional Recommendation or features

  • The communications between publisher and subscribers should be encripted for security in the case of a very sensitive information. One way to do this is to encript the data in the publisher before sending it and allow subscriber to decript the data. This involves sharing of secrete key between publisher and subsctriber.

  • in the case of a less sensitive data, an initial handshake between publisher and subscriber could be established before subscriber begin to receive data.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 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

http-notification

Technologies

Docker, Node/Express, Mocha and chai etc

Installation Guide

Docker setup recommended

  • Ensure that docker is installed on your local machine
  • Git pull this project into your local machine
  • cd into http-notification directory and Run
    docker-compose up
    
  • This will take a while as it will build all the services in the docker compose
  • When this is done, It will start three servers
  • Publisher server at port 8000
  • subscriber1 server at port 9000
  • subscriber2 server at port 5000

Publiser

  • To get into publisher server container terminal, run
    docker exec -it http-notification_publisher_1 bash
    
  • To view logs in only publisher server
    docker logs -f http-notification_publisher_1
    

Subscriber1

  • To get into Subscriber1 server container terminal, run
    docker exec -it http-notification_subscriber1_1 bash
    
  • To view logs in only Subscriber1 server
    docker logs -f http-notification_subscriber1_1
    

Subscriber2

  • To get into Subscriber2 server container terminal, run
    docker exec -it http-notification_subscriber2_1 bash
    
  • To view logs in only Subscriber2 server
    docker logs -f http-notification_subscriber2_1
    

Run Test

  • Get into publisher container terminal with this command
    docker exec -it http-notification_publisher_1 bash
    
  • Within the container terminal, run npm test

Manual setup

Publisher

  • cd into publisher

  • Ensure you have node version 14 installed on your machine. run

    node -v
    
  • create .env file, copy all the variable in .env.sample file into the .env and replace variable where necssary

  • run npm install

  • run migrations

    sequelize db:migrate
    
  • start dev server with

    npm run start-dev
    
  • run test with npm test

Subscriber1 or subscriber2

  • cd into subscriber1 or subscriber2

  • run npm install

  • start dev server with

    npm run start-dev
    

Documentation

Account

  • Create an account: Accounts and requests are created and made on publisher server

    Request

    POST http://localhost:8000/api/v1/account/create
    {
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "email": "andela.account@andela.com",
    "name": "andela",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "createdAt": "2021-05-02T19:40:59.270Z"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NDU5fQ.jio-ndSWBWbZfKhUc2XHphhMWYeJNaHJn4ALF6I-rgQ",
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4"
    }
    
  • Login to account

    Request

    POST http://localhost:8000/api/v1/account/login
    {
    "email": "andela.account@andela.com",
    "password": "andelaaccount"
    } 

    Response

    {
    "account": {
    "id": 2,
    "name": "andela",
    "email": "andela.account@andela.com",
    "password": "$2a$08$..d6XcPtnzQlOmh4z/ViqOWsNSImrc/tj7n3M3Lu9ocIxj.E5MDby",
    "createdAt": "2021-05-02T19:40:59.270Z",
    "updatedAt": "2021-05-02T19:40:59.270Z",
    "accessKeys": [
    {
    "id": 2,
    "secreteKey": "e1fad4c7befe99d423bf7e1ecebd95876393b2e4",
    "createdAt": "2021-05-02T19:40:59.352Z",
    "updatedAt": "2021-05-02T19:40:59.352Z",
    "accountId": 2
    }
    ]
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJhbmRlbGEuYWNjb3VudEBhbmRlbGEuY29tIiwiaWF0IjoxNjE5OTg0NzUxfQ.DtC_Z8dIgw7Koj_y0epuGHcel1vR1aXkSYtbGKTMqUU"
    }
    

Topic

  • Create Topic

    Request

    Grab the token from the account login

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    {
    "name": "Test topic"
    }
    

    Response

    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    
  • List of topic

    Request

    Grab the token from the account login

    GET
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/topic
    

    Response

    [
    {
    "id": 4,
    "name": "Test topic",
    "createdAt": "2021-05-02T20:01:58.528Z",
    "updatedAt": "2021-05-02T20:01:58.528Z",
    "accountId": 2
    }
    ]
    

Subscription

  • List of available endpoint for subscription on subscriber1 server

    http://localhost:9000/api/v1/test1
    http://localhost:9000/api/v1/test2
    or http://127.0.0.1:9000/api/v1/test1
    http://127.0.0.1:9000/api/v1/test2
    
  • List of available endpoint/url for subscription on subscriber2 server

    http://localhost:5000/api/v1/test1
    http://localhost:5000/api/v1/test2
    or http://127.0.0.1:5000/api/v1/test1
    http://127.0.0.1:5000/api/v1/test2
    
  • Create Subscription

    Request

    Grab the token from the account login

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/subscribe/<topicId>
    {
    "url": "http://localhost:5000/api/v1/test1"
    }
    

    Response

    {
    "url": "http://localhost:5000/api/v1/test1",
    "topic": "Test topic"
    }
    

Publish to topic

  • Publish to topic

    Request

    Grab the token from the account login.

    Grab topic id from the list of topics above

    POST
    headers = { authorization: 'Bearer <token>'}
    http://localhost:8000/api/v1/publish/<topicId>
    {
    "message": "new data published"
    }
    

    Response

    [
    {
    "url": "http://localhost:5000/api/v1/test1",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    {
    "url": "http://localhost:5000/api/v1/test2",
    "message": "Success",
    "status": 201,
    "topic": "Test topic"
    },
    ...
    ]
    
  • Confirm that the subscriber servers logs the data published to them in the console.

  • The subscriber servers also logs the data received from the publisher in this directory

    logs/combined.log
    

Aditional Recommendation or features

  • The communications between publisher and subscribers should be encripted for security in the case of a very sensitive information. One way to do this is to encript the data in the publisher before sending it and allow subscriber to decript the data. This involves sharing of secrete key between publisher and subsctriber.

  • in the case of a less sensitive data, an initial handshake between publisher and subscriber could be established before subscriber begin to receive data.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages