Skip to content
This repository has been archived by the owner on Jan 15, 2021. It is now read-only.

Commit

Permalink
Merge pull request #49 from Glimpse/NicoleIntegrationFinal
Browse files Browse the repository at this point in the history
Connected client to api gateway; auth and checkout service working E2E
  • Loading branch information
nicolehaugen authored May 17, 2017
2 parents 292f15d + fc16ff5 commit c88ad17
Show file tree
Hide file tree
Showing 41 changed files with 1,013 additions and 180 deletions.
13 changes: 13 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@
"Launch Chrome",
"Launch Sticker App"
]
},
{
"name": "Client-Server Gateway",
"configurations": [
"Launch Chrome",
"Launch Sticker App Gateway"
]
}
],
"configurations": [
Expand Down Expand Up @@ -43,6 +50,12 @@
"request": "launch",
"name": "Launch Sticker App",
"program": "${workspaceRoot}/server/index.js"
},
{
"type": "node",
"request": "launch",
"name": "Launch Sticker App Gateway",
"program": "${workspaceRoot}/apigateway/app.js"
}
]
}
9 changes: 9 additions & 0 deletions apigateway/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM node:latest
LABEL Name=stickerapp-apigateway Version=0.1.0
COPY package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /usr/src/app && mv /tmp/node_modules /usr/src
WORKDIR /usr/src/app
COPY . /usr/src/app
EXPOSE 3000
CMD npm start
58 changes: 40 additions & 18 deletions apigateway/app.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,29 @@
'use strict';

var express = require('express');
var session = require('express-session');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var passport = require('passport');
var authService = require('./services/auth');
var serverConnection = require('./config/database-config').serverConnection;

var index = require('./routes/index');
var users = require('./routes/users');
var profile = require('./routes/profile');
var app = express();
const logger = require('morgan');
const cookieParser = require('cookie-parser');
const passport = require('passport');
const authService = require('./services/auth');
const serverConnection = require('./config/database-config').serverConnection;

const users = require('./routes/users');
const browse = require('./routes/browse');
const cart = require('./routes/cart');
const feedback = require('./routes/feedback');
const create = require('./routes/create');
const checkout = require('./routes/checkout');

const app = express();

//TODO: Need to update this to correct path; need to take into account docker as well here
const PROJECT_ROOT = path.join(__dirname, '..');
app.set('etag', false);
app.set('views', path.join(PROJECT_ROOT, 'apigateway', 'templates'));
app.set('view engine', 'pug');
app.use(express.static(path.join(PROJECT_ROOT, 'client', 'dist')));

require('./strategy/aad-b2c')();
require('./strategy/passport')();
Expand All @@ -23,21 +35,31 @@ app.use(session({
}));

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(passport.initialize());
app.use(passport.session());

app.use('/', index);
app.use('/users', users);
app.use('/profile', profile);

// setup the auth's datastore where authenticated user\profile data is stored
authService.setupAuthDataStore();

//All routes that do NOT require auth should be added here (prior to authService.verifyUserLoggedIn being added as a route)
app.use('/users', users);
app.use('/browse', browse);
app.use('/cart', cart); //TODO: Will require auth
app.use('/create', create); //TODO: Will require auth

app.get('/', function stickerRootRedirection(req, res) {
console.log('app.js: redirecting to browse');
res.redirect('/browse');
});

//Ensures that the user is authenticated prior to calling into routes
//All routes requiring auth should be added after authService.verifyUserLoggedIn
app.use(authService.verifyUserLoggedIn);
app.use('/checkout', checkout);
app.use('/feedback', feedback);

const server = app.listen(serverConnection.port, () => {
console.log(`Sticker server running on port ${server.address().port}`);
});
Expand Down
5 changes: 0 additions & 5 deletions apigateway/config/database-config.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@

//TODO: Need to get the connection URL from env variable to support when deployed
//e.g. process.env.DB_URL or something equivalent

//TODO: Add info in instructions that the MySQL db needs to be created by the user first
exports.dbSettings = {
URI: process.env.DB_URL || 'mysql://root:Admin_007@localhost/StickerDemoApp'
};
Expand Down
6 changes: 6 additions & 0 deletions apigateway/config/services-config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = {

//Default URL for the checkout service which provides Feedback and Order CRUD operations
checkoutServiceUrl: 'http://localhost:5000'
};

11 changes: 9 additions & 2 deletions apigateway/package.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
{
"name": "apigateway",
"version": "0.0.0",
"private": true,
Expand All @@ -8,13 +8,20 @@
"dependencies": {
"body-parser": "~1.16.0",
"cookie-parser": "~1.4.3",
"debug": "~2.6.0",
"express": "~4.14.1",
"express-session": "^1.15.2",
"guid": "0.0.12",
"morgan": "~1.7.0",
"mysql": "^2.13.0",
"passport": "^0.3.2",
"passport-azure-ad": "^3.0.6",
"pug": "^2.0.0-rc.1",
"request": "^2.81.0",
"sequelize": "^3.30.4"
},
"devDependencies": {
"gulp": "^3.9.1",
"gulp-eslint": "^3.0.1",
"lodash": "^4.17.4"
}
}
39 changes: 39 additions & 0 deletions apigateway/routes/browse.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
'use strict';

//TODO: This functionality is temporary until integated with the new cart microservice; note that this currently calls into the "dummy" data access layer
const express = require('express');
const bodyParser = require('body-parser');
const router = express.Router();

const dataAccess = require('../temp/db/data-access');

router.use(bodyParser.json());

router.get('/', function stickerRouteBrowse(req, res) {
const renderData = { pageTitle: 'Browse', entry: 'browse' };

console.log('Render values: ', renderData);

res.render('index', renderData);
});

router.get('/api/items', function stickerRouteApiBrowse(req, res) {
// Do things with req.query.tags
let tags;
if (req.query.tags) {
tags = req.query.tags.split(',');
}

dataAccess.getStickers(tags, (items) => {
console.info('%d stickers found', items.length);
if (tags) {
console.log('Tags used in filter: ', tags);
}

res.send({
items
});
});
});

module.exports = router;
65 changes: 65 additions & 0 deletions apigateway/routes/cart.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
'use strict';

//TODO: This functionality is temporary until integated with the new cart microservice; note that this currently calls into the "dummy" data access layer
const express = require('express');
const bodyParser = require('body-parser');
const dataAccess = require('../temp/db/data-access');

const router = express.Router();
router.use(bodyParser.json());

router.get('/', function stickerRouteCart(req, res) {
res.render('index', { pageTitle: 'Cart', entry: 'cart' });
});

function sendItems(token, res) {
dataAccess.getCart(token, (items) => {
dataAccess.getStickers(null, (stickers) => {
res.send({
items: items.map((id) => stickers.filter((sticker) => sticker.id.toString() === id)[0])
});
});
});
}

router.get('/api/items', (req, res) => {
if (!req.query.token) {
res.status(401).send('Unauthorized');
return;
}
sendItems(req.query.token, res);
});

router.put('/api/items/:item_id', (req, res) => {
if (!req.body.token) {
res.status(401).send('Unauthorized');
return;
}

console.log('Item targetted %s', req.params.item_id);

dataAccess.addToCart(req.body.token, req.params.item_id, () => {
dataAccess.getSticker(req.params.item_id, (item) => {
if (!item) {
dataAccess.addStickers([ req.body.item ], () => sendItems(req.body.token, res));
} else {
sendItems(req.body.token, res);
}
});
});
});

router.delete('/api/items/:item_id', (req, res) => {
if (!req.body.token) {
res.status(401).send('Unauthorized');
return;
}

console.log('Item targetted', req.params.item_id);

dataAccess.removeFromCart(req.body.token, req.params.item_id, () => {
sendItems(req.body.token, res);
});
});

module.exports = router;
50 changes: 50 additions & 0 deletions apigateway/routes/checkout.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@

'use strict';

//TODO: This is temporary using the "dummy" data access layer in order to interact with the cart; this will be removed when integrated with new cart microservice
const dataAccess = require('../temp/db/data-access');

const express = require('express');
const request = require('request');
const guid = require('guid');

//This route calls into the ASP.NET Core checkout microservice
const checkoutServiceUrl = require('../config/services-config').checkoutServiceUrl; //TODO: add env url lookup

const router = express.Router();
const bodyParser = require('body-parser');
router.use(bodyParser.urlencoded({ extended: true }));

router.post('/', function stickerRouteCheckout(req, res) {

var orderJson = {
Id: guid.raw(),
FullName : req.body['checkout-name'],
Email : req.body['checkout-email'],
Items : req.body['checkout-items']
};

request({
url: checkoutServiceUrl + '/api/order/',
method: 'POST',
json: true,
body: orderJson,
headers: {
//Pass the current authenticated user's id to the checkout microservice
'stickerUserId': req.user.id
}},
function finishAddOrder(error){
if (error) {
console.log('Adding Order failed: ' + error);
} else {
console.log('Order added');
}

//TODO: Need to update this when the new cart microservice is integrated; for now, calls into the "dummy" data access layer
dataAccess.clearCart(req.body.token, () => {
res.render('index', { pageTitle: 'Checkout', entry: 'checkout' });
});
});
});

module.exports = router;
Loading

0 comments on commit c88ad17

Please sign in to comment.