diff --git a/backend/node_modules/cors/.eslintrc b/backend/node_modules/cors/.eslintrc new file mode 100644 index 0000000..51a7893 --- /dev/null +++ b/backend/node_modules/cors/.eslintrc @@ -0,0 +1,9 @@ +{ + "env": { + "node": true + }, + "rules": { + "indent": [2, 2], + "quotes": "single" + } +} diff --git a/backend/node_modules/cors/.npmignore b/backend/node_modules/cors/.npmignore new file mode 100644 index 0000000..84a4863 --- /dev/null +++ b/backend/node_modules/cors/.npmignore @@ -0,0 +1,4 @@ +coverage +node_modules +npm-debug.log +package-lock.json diff --git a/backend/node_modules/cors/.travis.yml b/backend/node_modules/cors/.travis.yml new file mode 100644 index 0000000..d3aa9ca --- /dev/null +++ b/backend/node_modules/cors/.travis.yml @@ -0,0 +1,19 @@ +language: node_js +node_js: + - "0.10" + - "4.8" + - "6.11" + - "8.1" +sudo: false +cache: + directories: + - node_modules +before_install: + # Skip updating shrinkwrap / lock + - "npm config set shrinkwrap false" + # Update Node.js modules + - "test ! -d node_modules || npm prune" + - "test ! -d node_modules || npm rebuild" +after_script: + # Report coverage + - "test -e ./coverage/lcov.info && npm install coveralls@2 && cat ./coverage/lcov.info | coveralls" diff --git a/backend/node_modules/cors/CONTRIBUTING.md b/backend/node_modules/cors/CONTRIBUTING.md new file mode 100644 index 0000000..591b09a --- /dev/null +++ b/backend/node_modules/cors/CONTRIBUTING.md @@ -0,0 +1,33 @@ +# contributing to `cors` + +CORS is a node.js package for providing a [connect](http://www.senchalabs.org/connect/)/[express](http://expressjs.com/) middleware that can be used to enable [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) with various options. Learn more about the project in [the README](README.md). + +## The CORS Spec + +[http://www.w3.org/TR/cors/](http://www.w3.org/TR/cors/) + +## Pull Requests Welcome + +* Include `'use strict';` in every javascript file. +* 2 space indentation. +* Please run the testing steps below before submitting. + +## Testing + +```bash +$ npm install +$ npm test +``` + +## Interactive Testing Harness + +[http://node-cors-client.herokuapp.com](http://node-cors-client.herokuapp.com) + +Related git repositories: + +* [https://github.com/TroyGoode/node-cors-server](https://github.com/TroyGoode/node-cors-server) +* [https://github.com/TroyGoode/node-cors-client](https://github.com/TroyGoode/node-cors-client) + +## License + +[MIT License](http://www.opensource.org/licenses/mit-license.php) diff --git a/backend/node_modules/cors/HISTORY.md b/backend/node_modules/cors/HISTORY.md new file mode 100644 index 0000000..9e1e29c --- /dev/null +++ b/backend/node_modules/cors/HISTORY.md @@ -0,0 +1,53 @@ +2.8.4 / 2017-07-12 +================== + + * Work-around Safari bug in default pre-flight response + +2.8.3 / 2017-03-29 +================== + + * Fix error when options delegate missing `methods` option + +2.8.2 / 2017-03-28 +================== + + * Fix error when frozen options are passed + * Send "Vary: Origin" when using regular expressions + * Send "Vary: Access-Control-Request-Headers" when dynamic `allowedHeaders` + +2.8.1 / 2016-09-08 +================== + +This release only changed documentation. + +2.8.0 / 2016-08-23 +================== + + * Add `optionsSucccessCode` option + +2.7.2 / 2016-08-23 +================== + + * Fix error when Node.js running in strict mode + +2.7.1 / 2015-05-28 +================== + + * Move module into expressjs organization + +2.7.0 / 2015-05-28 +================== + + * Allow array of matching condition as `origin` option + * Allow regular expression as `origin` option + +2.6.1 / 2015-05-28 +================== + + * Update `license` in pacakge.json + +2.6.0 / 2015-04-27 +================== + + * Add `preflightContinue` option + * Fix "Vary: Origin" header added for "*" diff --git a/backend/node_modules/cors/LICENSE b/backend/node_modules/cors/LICENSE new file mode 100644 index 0000000..a01c3f3 --- /dev/null +++ b/backend/node_modules/cors/LICENSE @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2013 Troy Goode + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/backend/node_modules/cors/README.md b/backend/node_modules/cors/README.md new file mode 100644 index 0000000..3c6bfdd --- /dev/null +++ b/backend/node_modules/cors/README.md @@ -0,0 +1,228 @@ +# cors + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +CORS is a node.js package for providing a [Connect](http://www.senchalabs.org/connect/)/[Express](http://expressjs.com/) middleware that can be used to enable [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) with various options. + +**[Follow me (@troygoode) on Twitter!](https://twitter.com/intent/user?screen_name=troygoode)** + +* [Installation](#installation) +* [Usage](#usage) + * [Simple Usage](#simple-usage-enable-all-cors-requests) + * [Enable CORS for a Single Route](#enable-cors-for-a-single-route) + * [Configuring CORS](#configuring-cors) + * [Configuring CORS Asynchronously](#configuring-cors-asynchronously) + * [Enabling CORS Pre-Flight](#enabling-cors-pre-flight) +* [Configuration Options](#configuration-options) +* [Demo](#demo) +* [License](#license) +* [Author](#author) + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install cors +``` + +## Usage + +### Simple Usage (Enable *All* CORS Requests) + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +app.use(cors()) + +app.get('/products/:id', function (req, res, next) { + res.json({msg: 'This is CORS-enabled for all origins!'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +### Enable CORS for a Single Route + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +app.get('/products/:id', cors(), function (req, res, next) { + res.json({msg: 'This is CORS-enabled for a Single Route'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +### Configuring CORS + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +var corsOptions = { + origin: 'http://example.com', + optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204 +} + +app.get('/products/:id', cors(corsOptions), function (req, res, next) { + res.json({msg: 'This is CORS-enabled for only example.com.'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +### Configuring CORS w/ Dynamic Origin + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +var whitelist = ['http://example1.com', 'http://example2.com'] +var corsOptions = { + origin: function (origin, callback) { + if (whitelist.indexOf(origin) !== -1) { + callback(null, true) + } else { + callback(new Error('Not allowed by CORS')) + } + } +} + +app.get('/products/:id', cors(corsOptions), function (req, res, next) { + res.json({msg: 'This is CORS-enabled for a whitelisted domain.'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +### Enabling CORS Pre-Flight + +Certain CORS requests are considered 'complex' and require an initial +`OPTIONS` request (called the "pre-flight request"). An example of a +'complex' CORS request is one that uses an HTTP verb other than +GET/HEAD/POST (such as DELETE) or that uses custom headers. To enable +pre-flighting, you must add a new OPTIONS handler for the route you want +to support: + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +app.options('/products/:id', cors()) // enable pre-flight request for DELETE request +app.del('/products/:id', cors(), function (req, res, next) { + res.json({msg: 'This is CORS-enabled for all origins!'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +You can also enable pre-flight across-the-board like so: + +```javascript +app.options('*', cors()) // include before other routes +``` + +### Configuring CORS Asynchronously + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +var whitelist = ['http://example1.com', 'http://example2.com'] +var corsOptionsDelegate = function (req, callback) { + var corsOptions; + if (whitelist.indexOf(req.header('Origin')) !== -1) { + corsOptions = { origin: true } // reflect (enable) the requested origin in the CORS response + }else{ + corsOptions = { origin: false } // disable CORS for this request + } + callback(null, corsOptions) // callback expects two parameters: error and options +} + +app.get('/products/:id', cors(corsOptionsDelegate), function (req, res, next) { + res.json({msg: 'This is CORS-enabled for a whitelisted domain.'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +## Configuration Options + +* `origin`: Configures the **Access-Control-Allow-Origin** CORS header. Possible values: + - `Boolean` - set `origin` to `true` to reflect the [request origin](http://tools.ietf.org/html/draft-abarth-origin-09), as defined by `req.header('Origin')`, or set it to `false` to disable CORS. + - `String` - set `origin` to a specific origin. For example if you set it to `"http://example.com"` only requests from "http://example.com" will be allowed. + - `RegExp` - set `origin` to a regular expression pattern which will be used to test the request origin. If it's a match, the request origin will be reflected. For example the pattern `/example\.com$/` will reflect any request that is coming from an origin ending with "example.com". + - `Array` - set `origin` to an array of valid origins. Each origin can be a `String` or a `RegExp`. For example `["http://example1.com", /\.example2\.com$/]` will accept any request from "http://example1.com" or from a subdomain of "example2.com". + - `Function` - set `origin` to a function implementing some custom logic. The function takes the request origin as the first parameter and a callback (which expects the signature `err [object], allow [bool]`) as the second. +* `methods`: Configures the **Access-Control-Allow-Methods** CORS header. Expects a comma-delimited string (ex: 'GET,PUT,POST') or an array (ex: `['GET', 'PUT', 'POST']`). +* `allowedHeaders`: Configures the **Access-Control-Allow-Headers** CORS header. Expects a comma-delimited string (ex: 'Content-Type,Authorization') or an array (ex: `['Content-Type', 'Authorization']`). If not specified, defaults to reflecting the headers specified in the request's **Access-Control-Request-Headers** header. +* `exposedHeaders`: Configures the **Access-Control-Expose-Headers** CORS header. Expects a comma-delimited string (ex: 'Content-Range,X-Content-Range') or an array (ex: `['Content-Range', 'X-Content-Range']`). If not specified, no custom headers are exposed. +* `credentials`: Configures the **Access-Control-Allow-Credentials** CORS header. Set to `true` to pass the header, otherwise it is omitted. +* `maxAge`: Configures the **Access-Control-Max-Age** CORS header. Set to an integer to pass the header, otherwise it is omitted. +* `preflightContinue`: Pass the CORS preflight response to the next handler. +* `optionsSuccessStatus`: Provides a status code to use for successful `OPTIONS` requests, since some legacy browsers (IE11, various SmartTVs) choke on `204`. + +The default configuration is the equivalent of: + +```json +{ + "origin": "*", + "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", + "preflightContinue": false, + "optionsSuccessStatus": 204 +} +``` + +For details on the effect of each CORS header, read [this](http://www.html5rocks.com/en/tutorials/cors/) article on HTML5 Rocks. + +## Demo + +A demo that illustrates CORS working (and not working) using jQuery is available here: [http://node-cors-client.herokuapp.com/](http://node-cors-client.herokuapp.com/) + +Code for that demo can be found here: + +* Client: [https://github.com/TroyGoode/node-cors-client](https://github.com/TroyGoode/node-cors-client) +* Server: [https://github.com/TroyGoode/node-cors-server](https://github.com/TroyGoode/node-cors-server) + +## License + +[MIT License](http://www.opensource.org/licenses/mit-license.php) + +## Author + +[Troy Goode](https://github.com/TroyGoode) ([troygoode@gmail.com](mailto:troygoode@gmail.com)) + +[coveralls-image]: https://img.shields.io/coveralls/expressjs/cors/master.svg +[coveralls-url]: https://coveralls.io/r/expressjs/cors?branch=master +[downloads-image]: https://img.shields.io/npm/dm/cors.svg +[downloads-url]: https://npmjs.org/package/cors +[npm-image]: https://img.shields.io/npm/v/cors.svg +[npm-url]: https://npmjs.org/package/cors +[travis-image]: https://img.shields.io/travis/expressjs/cors/master.svg +[travis-url]: https://travis-ci.org/expressjs/cors diff --git a/backend/node_modules/cors/lib/index.js b/backend/node_modules/cors/lib/index.js new file mode 100644 index 0000000..013469c --- /dev/null +++ b/backend/node_modules/cors/lib/index.js @@ -0,0 +1,238 @@ +(function () { + + 'use strict'; + + var assign = require('object-assign'); + var vary = require('vary'); + + var defaults = { + origin: '*', + methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', + preflightContinue: false, + optionsSuccessStatus: 204 + }; + + function isString(s) { + return typeof s === 'string' || s instanceof String; + } + + function isOriginAllowed(origin, allowedOrigin) { + if (Array.isArray(allowedOrigin)) { + for (var i = 0; i < allowedOrigin.length; ++i) { + if (isOriginAllowed(origin, allowedOrigin[i])) { + return true; + } + } + return false; + } else if (isString(allowedOrigin)) { + return origin === allowedOrigin; + } else if (allowedOrigin instanceof RegExp) { + return allowedOrigin.test(origin); + } else { + return !!allowedOrigin; + } + } + + function configureOrigin(options, req) { + var requestOrigin = req.headers.origin, + headers = [], + isAllowed; + + if (!options.origin || options.origin === '*') { + // allow any origin + headers.push([{ + key: 'Access-Control-Allow-Origin', + value: '*' + }]); + } else if (isString(options.origin)) { + // fixed origin + headers.push([{ + key: 'Access-Control-Allow-Origin', + value: options.origin + }]); + headers.push([{ + key: 'Vary', + value: 'Origin' + }]); + } else { + isAllowed = isOriginAllowed(requestOrigin, options.origin); + // reflect origin + headers.push([{ + key: 'Access-Control-Allow-Origin', + value: isAllowed ? requestOrigin : false + }]); + headers.push([{ + key: 'Vary', + value: 'Origin' + }]); + } + + return headers; + } + + function configureMethods(options) { + var methods = options.methods; + if (methods.join) { + methods = options.methods.join(','); // .methods is an array, so turn it into a string + } + return { + key: 'Access-Control-Allow-Methods', + value: methods + }; + } + + function configureCredentials(options) { + if (options.credentials === true) { + return { + key: 'Access-Control-Allow-Credentials', + value: 'true' + }; + } + return null; + } + + function configureAllowedHeaders(options, req) { + var allowedHeaders = options.allowedHeaders || options.headers; + var headers = []; + + if (!allowedHeaders) { + allowedHeaders = req.headers['access-control-request-headers']; // .headers wasn't specified, so reflect the request headers + headers.push([{ + key: 'Vary', + value: 'Access-Control-Request-Headers' + }]); + } else if (allowedHeaders.join) { + allowedHeaders = allowedHeaders.join(','); // .headers is an array, so turn it into a string + } + if (allowedHeaders && allowedHeaders.length) { + headers.push([{ + key: 'Access-Control-Allow-Headers', + value: allowedHeaders + }]); + } + + return headers; + } + + function configureExposedHeaders(options) { + var headers = options.exposedHeaders; + if (!headers) { + return null; + } else if (headers.join) { + headers = headers.join(','); // .headers is an array, so turn it into a string + } + if (headers && headers.length) { + return { + key: 'Access-Control-Expose-Headers', + value: headers + }; + } + return null; + } + + function configureMaxAge(options) { + var maxAge = options.maxAge && options.maxAge.toString(); + if (maxAge && maxAge.length) { + return { + key: 'Access-Control-Max-Age', + value: maxAge + }; + } + return null; + } + + function applyHeaders(headers, res) { + for (var i = 0, n = headers.length; i < n; i++) { + var header = headers[i]; + if (header) { + if (Array.isArray(header)) { + applyHeaders(header, res); + } else if (header.key === 'Vary' && header.value) { + vary(res, header.value); + } else if (header.value) { + res.setHeader(header.key, header.value); + } + } + } + } + + function cors(options, req, res, next) { + var headers = [], + method = req.method && req.method.toUpperCase && req.method.toUpperCase(); + + if (method === 'OPTIONS') { + // preflight + headers.push(configureOrigin(options, req)); + headers.push(configureCredentials(options, req)); + headers.push(configureMethods(options, req)); + headers.push(configureAllowedHeaders(options, req)); + headers.push(configureMaxAge(options, req)); + headers.push(configureExposedHeaders(options, req)); + applyHeaders(headers, res); + + if (options.preflightContinue ) { + next(); + } else { + // Safari (and potentially other browsers) need content-length 0, + // for 204 or they just hang waiting for a body + res.statusCode = options.optionsSuccessStatus || defaults.optionsSuccessStatus; + res.setHeader('Content-Length', '0'); + res.end(); + } + } else { + // actual response + headers.push(configureOrigin(options, req)); + headers.push(configureCredentials(options, req)); + headers.push(configureExposedHeaders(options, req)); + applyHeaders(headers, res); + next(); + } + } + + function middlewareWrapper(o) { + // if options are static (either via defaults or custom options passed in), wrap in a function + var optionsCallback = null; + if (typeof o === 'function') { + optionsCallback = o; + } else { + optionsCallback = function (req, cb) { + cb(null, o); + }; + } + + return function corsMiddleware(req, res, next) { + optionsCallback(req, function (err, options) { + if (err) { + next(err); + } else { + var corsOptions = assign({}, defaults, options); + var originCallback = null; + if (corsOptions.origin && typeof corsOptions.origin === 'function') { + originCallback = corsOptions.origin; + } else if (corsOptions.origin) { + originCallback = function (origin, cb) { + cb(null, corsOptions.origin); + }; + } + + if (originCallback) { + originCallback(req.headers.origin, function (err2, origin) { + if (err2 || !origin) { + next(err2); + } else { + corsOptions.origin = origin; + cors(corsOptions, req, res, next); + } + }); + } else { + next(); + } + } + }); + }; + } + + // can pass either an options hash, an options delegate, or nothing + module.exports = middlewareWrapper; + +}()); diff --git a/backend/node_modules/cors/package.json b/backend/node_modules/cors/package.json new file mode 100644 index 0000000..fabd42b --- /dev/null +++ b/backend/node_modules/cors/package.json @@ -0,0 +1,112 @@ +{ + "_args": [ + [ + { + "raw": "cors@^2.8.4", + "scope": null, + "escapedName": "cors", + "name": "cors", + "rawSpec": "^2.8.4", + "spec": ">=2.8.4 <3.0.0", + "type": "range" + }, + "C:\\Users\\Dell\\Desktop\\sid backup\\sprint3 new v1\\sprint3 new\\sprint3 new\\gator-meetup\\backend" + ] + ], + "_from": "cors@>=2.8.4 <3.0.0", + "_id": "cors@2.8.4", + "_inCache": true, + "_location": "/cors", + "_nodeVersion": "6.10.3", + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/cors-2.8.4.tgz_1499914217936_0.6064511660952121" + }, + "_npmUser": { + "name": "dougwilson", + "email": "doug@somethingdoug.com" + }, + "_npmVersion": "3.10.10", + "_phantomChildren": {}, + "_requested": { + "raw": "cors@^2.8.4", + "scope": null, + "escapedName": "cors", + "name": "cors", + "rawSpec": "^2.8.4", + "spec": ">=2.8.4 <3.0.0", + "type": "range" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "_shasum": "2bd381f2eb201020105cd50ea59da63090694686", + "_shrinkwrap": null, + "_spec": "cors@^2.8.4", + "_where": "C:\\Users\\Dell\\Desktop\\sid backup\\sprint3 new v1\\sprint3 new\\sprint3 new\\gator-meetup\\backend", + "author": { + "name": "Troy Goode", + "email": "troygoode@gmail.com", + "url": "https://github.com/troygoode/" + }, + "bugs": { + "url": "https://github.com/expressjs/cors/issues" + }, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "description": "Node.js CORS middleware", + "devDependencies": { + "basic-auth-connect": "^1.0.0", + "body-parser": "^1.12.4", + "eslint": "^0.21.2", + "express": "^4.12.4", + "istanbul": "^0.4.5", + "mocha": "3.4.2", + "should": "11.2.1", + "supertest": "3.0.0" + }, + "directories": {}, + "dist": { + "shasum": "2bd381f2eb201020105cd50ea59da63090694686", + "tarball": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "gitHead": "c6ed038edc4a483096ded79ad9a0629e4ff79000", + "homepage": "https://github.com/expressjs/cors#readme", + "keywords": [ + "cors", + "express", + "connect", + "middleware" + ], + "license": "MIT", + "main": "./lib/index.js", + "maintainers": [ + { + "name": "dougwilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "troygoode", + "email": "troygoode@gmail.com" + } + ], + "name": "cors", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/expressjs/cors.git" + }, + "scripts": { + "lint": "eslint lib test", + "test": "npm run lint && istanbul cover node_modules/mocha/bin/_mocha" + }, + "version": "2.8.4" +} diff --git a/backend/node_modules/cors/test/basic-auth.js b/backend/node_modules/cors/test/basic-auth.js new file mode 100644 index 0000000..1323f42 --- /dev/null +++ b/backend/node_modules/cors/test/basic-auth.js @@ -0,0 +1,40 @@ +(function () { + /*global describe, it*/ + + 'use strict'; + + var should = require('should'), + express = require('express'), + supertest = require('supertest'), + basicAuth = require('basic-auth-connect'), + cors = require('../lib'); + + var app; + + /* -------------------------------------------------------------------------- */ + + app = express(); + app.use(basicAuth('username', 'password')); + app.use(cors()); + app.post('/', function (req, res) { + res.send('hello world'); + }); + + /* -------------------------------------------------------------------------- */ + + describe('basic auth', function () { + it('POST works', function (done) { + supertest(app) + .post('/') + .auth('username', 'password') + .expect(200) + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + res.text.should.eql('hello world'); + done(); + }); + }); + }); + +}()); diff --git a/backend/node_modules/cors/test/body-events.js b/backend/node_modules/cors/test/body-events.js new file mode 100644 index 0000000..99d582b --- /dev/null +++ b/backend/node_modules/cors/test/body-events.js @@ -0,0 +1,81 @@ +(function () { + /*global describe, it*/ + + 'use strict'; + + var should = require('should'), + express = require('express'), + supertest = require('supertest'), + bodyParser = require('body-parser'), + cors = require('../lib'); + + var dynamicOrigin, + app1, + app2, + text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed justo turpis, tempor id sem fringilla, cursus tristique purus. Mauris a sollicitudin magna. Etiam dui lacus, vehicula non dictum at, cursus vitae libero. Curabitur lorem nulla, sollicitudin id enim ut, vehicula rhoncus felis. Ut nec iaculis velit. Vivamus at augue nulla. Fusce at molestie arcu. Duis at dui at tellus mattis tincidunt. Vestibulum sit amet dictum metus. Curabitur nec pretium ante. Proin vulputate elit ac lorem gravida, sit amet placerat lorem fringilla. Mauris fermentum, diam et volutpat auctor, ante enim imperdiet purus, sit amet tincidunt ipsum nulla nec est. Fusce id ipsum in sem malesuada laoreet vitae non magna. Praesent commodo turpis in nulla egestas, eu posuere magna venenatis. Integer in aliquam sem. Fusce quis lorem tincidunt eros rutrum lobortis.\n\nNam aliquam cursus ipsum, a hendrerit purus. Cras ultrices viverra nunc ac lacinia. Sed sed diam orci. Vestibulum ut orci a nibh scelerisque pretium. Sed suscipit vestibulum metus, ac ultricies leo sodales a. Aliquam erat volutpat. Vestibulum mauris massa, luctus et libero vel, cursus suscipit nulla. Cras sed erat quis massa fermentum congue. Mauris ultrices sem ligula, id malesuada lectus tincidunt eget. Donec sed nisl elit. Aenean ac lobortis massa. Phasellus felis nisl, dictum a dui volutpat, dictum sagittis diam. Vestibulum lacinia tellus vel commodo consequat.\n\nNulla at varius nibh, non posuere enim. Curabitur urna est, ultrices vel sem nec, consequat molestie nisi. Aliquam sed augue sit amet ante viverra pretium. Cras aliquam turpis vitae eros gravida egestas. Etiam quis dolor non quam suscipit iaculis. Sed euismod est libero, ac ullamcorper elit hendrerit vitae. Vivamus sollicitudin nulla dolor, vitae porta lacus suscipit ac.\n\nSed volutpat, magna in scelerisque dapibus, eros ante volutpat nisi, ac condimentum diam sem sed justo. Aenean justo risus, bibendum vitae blandit ac, mattis quis nunc. Quisque non felis nec justo auctor accumsan non id odio. Mauris vel dui feugiat dolor dapibus convallis in et neque. Phasellus fermentum sollicitudin tortor ac pretium. Proin tristique accumsan nulla eu venenatis. Cras porta lorem ac arcu accumsan pulvinar. Sed dignissim leo augue, a pretium ante viverra id. Phasellus blandit at purus a malesuada. Nam et cursus mauris. Vivamus accumsan augue laoreet lectus lacinia eleifend. Fusce sit amet felis nunc. Pellentesque eu turpis nisl.\n\nPellentesque vitae quam feugiat, volutpat lectus et, faucibus massa. Maecenas consectetur quis nisi eu aliquam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam laoreet condimentum laoreet. Praesent sit amet massa sit amet dui porta condimentum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed volutpat massa nec risus malesuada hendrerit.'; + + /* -------------------------------------------------------------------------- */ + + dynamicOrigin = function (origin, cb) { + setTimeout(function () { + cb(null, true); + }, 200); + }; + + /* -------------------------------------------------------------------------- */ + + app1 = express(); + app1.use(cors({origin: dynamicOrigin})); + app1.use(bodyParser.json()); + app1.post('/', function (req, res) { + res.send(req.body); + }); + + /* -------------------------------------------------------------------------- */ + + app2 = express(); + app2.use(bodyParser.json()); + app2.use(cors({origin: dynamicOrigin})); + app2.post('/', function (req, res) { + res.send(req.body); + }); + + /* -------------------------------------------------------------------------- */ + + describe('body-parser-events', function () { + describe('app1 (cors before bodyparser)', function () { + it('POST works', function (done) { + var body = { + example: text + }; + supertest(app1) + .post('/') + .send(body) + .expect(200) + .end(function (err, res) { + should.not.exist(err); + res.body.should.eql(body); + done(); + }); + }); + }); + + describe('app2 (bodyparser before cors)', function () { + it('POST works', function (done) { + var body = { + example: text + }; + supertest(app2) + .post('/') + .send(body) + .expect(200) + .end(function (err, res) { + should.not.exist(err); + res.body.should.eql(body); + done(); + }); + }); + }); + }); + +}()); diff --git a/backend/node_modules/cors/test/cors.js b/backend/node_modules/cors/test/cors.js new file mode 100644 index 0000000..755f685 --- /dev/null +++ b/backend/node_modules/cors/test/cors.js @@ -0,0 +1,747 @@ +(function () { + /*global describe, it*/ + + 'use strict'; + + var should = require('should'), + cors = require('../lib'); + + var fakeRequest = function (headers) { + return { + headers: headers || { + 'origin': 'request.com', + 'access-control-request-headers': 'requestedHeader1,requestedHeader2' + }, + pause: function () { + // do nothing + return; + }, + resume: function () { + // do nothing + return; + } + }; + }, + fakeResponse = function () { + var headers = {}; + return { + allHeaders: function () { + return headers; + }, + getHeader: function (key) { + return headers[key]; + }, + setHeader: function (key, value) { + headers[key] = value; + return; + }, + get: function (key) { + return headers[key]; + } + }; + }; + + describe('cors', function () { + it('does not alter `options` configuration object', function () { + var options = Object.freeze({ + origin: 'custom-origin' + }); + (function () { + cors(options); + }).should.not.throw(); + }); + + it('passes control to next middleware', function (done) { + // arrange + var req, res, next; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + done(); + }; + + // act + cors()(req, res, next); + }); + + it('shortcircuits preflight requests', function (done) { + // arrange + var req, res, next; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.statusCode.should.equal(204); + done(); + }; + next = function () { + // assert + done('should not be called'); + }; + + // act + cors()(req, res, next); + }); + + it('can configure preflight success response status code', function (done) { + // arrange + var req, res, next; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.statusCode.should.equal(200); + done(); + }; + next = function () { + // assert + done('should not be called'); + }; + + // act + cors({optionsSuccessStatus: 200})(req, res, next); + }); + + it('doesn\'t shortcircuit preflight requests with preflightContinue option', function (done) { + // arrange + var req, res, next; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + done('should not be called'); + }; + next = function () { + // assert + done(); + }; + + // act + cors({preflightContinue: true})(req, res, next); + }); + + it('normalizes method names', function (done) { + // arrange + var req, res, next; + req = fakeRequest(); + req.method = 'options'; + res = fakeResponse(); + res.end = function () { + // assert + res.statusCode.should.equal(204); + done(); + }; + next = function () { + // assert + done('should not be called'); + }; + + // act + cors()(req, res, next); + }); + + it('includes Content-Length response header', function (done) { + // arrange + var req, res, next; + req = fakeRequest(); + req.method = 'options'; + res = fakeResponse(); + res.end = function () { + // assert + res.getHeader('Content-Length').should.equal('0'); + done(); + }; + next = function () { + // assert + done('should not be called'); + }; + + // act + cors()(req, res, next); + }); + + it('no options enables default CORS to all origins', function (done) { + // arrange + var req, res, next; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + res.getHeader('Access-Control-Allow-Origin').should.equal('*'); + should.not.exist(res.getHeader('Access-Control-Allow-Methods')); + done(); + }; + + // act + cors()(req, res, next); + }); + + it('OPTION call with no options enables default CORS to all origins and methods', function (done) { + // arrange + var req, res, next; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.statusCode.should.equal(204); + done(); + }; + next = function () { + // assert + res.getHeader('Access-Control-Allow-Origin').should.equal('*'); + res.getHeader('Access-Control-Allow-Methods').should.equal('GET,PUT,PATCH,POST,DELETE'); + done(); + }; + + // act + cors()(req, res, next); + }); + + describe('passing static options', function () { + it('overrides defaults', function (done) { + // arrange + var req, res, next, options; + options = { + origin: 'example.com', + methods: ['FOO', 'bar'], + headers: ['FIZZ', 'buzz'], + credentials: true, + maxAge: 123 + }; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.statusCode.should.equal(204); + done(); + }; + next = function () { + // assert + res.getHeader('Access-Control-Allow-Origin').should.equal('example.com'); + res.getHeader('Access-Control-Allow-Methods').should.equal('FOO,bar'); + res.getHeader('Access-Control-Allow-Headers').should.equal('FIZZ,buzz'); + res.getHeader('Access-Control-Allow-Credentials').should.equal('true'); + res.getHeader('Access-Control-Max-Age').should.equal('123'); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('matches request origin against regexp', function(done) { + var req = fakeRequest(); + var res = fakeResponse(); + var options = { origin: /^(.+\.)?request.com$/ }; + cors(options)(req, res, function(err) { + should.not.exist(err); + res.getHeader('Access-Control-Allow-Origin').should.equal(req.headers.origin); + should.exist(res.getHeader('Vary')); + res.getHeader('Vary').should.equal('Origin'); + return done(); + }); + }); + + it('matches request origin against array of origin checks', function(done) { + var req = fakeRequest(); + var res = fakeResponse(); + var options = { origin: [ /foo\.com$/, 'request.com' ] }; + cors(options)(req, res, function(err) { + should.not.exist(err); + res.getHeader('Access-Control-Allow-Origin').should.equal(req.headers.origin); + should.exist(res.getHeader('Vary')); + res.getHeader('Vary').should.equal('Origin'); + return done(); + }); + }); + + it('doesn\'t match request origin against array of invalid origin checks', function(done) { + var req = fakeRequest(); + var res = fakeResponse(); + var options = { origin: [ /foo\.com$/, 'bar.com' ] }; + cors(options)(req, res, function(err) { + should.not.exist(err); + should.not.exist(res.getHeader('Access-Control-Allow-Origin')); + should.exist(res.getHeader('Vary')); + res.getHeader('Vary').should.equal('Origin'); + return done(); + }); + }); + + it('origin of false disables cors', function (done) { + // arrange + var req, res, next, options; + options = { + origin: false, + methods: ['FOO', 'bar'], + headers: ['FIZZ', 'buzz'], + credentials: true, + maxAge: 123 + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + should.not.exist(res.getHeader('Access-Control-Allow-Origin')); + should.not.exist(res.getHeader('Access-Control-Allow-Methods')); + should.not.exist(res.getHeader('Access-Control-Allow-Headers')); + should.not.exist(res.getHeader('Access-Control-Allow-Credentials')); + should.not.exist(res.getHeader('Access-Control-Max-Age')); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('can override origin', function (done) { + // arrange + var req, res, next, options; + options = { + origin: 'example.com' + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + res.getHeader('Access-Control-Allow-Origin').should.equal('example.com'); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('includes Vary header for specific origins', function (done) { + // arrange + var req, res, next, options; + options = { + origin: 'example.com' + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + should.exist(res.getHeader('Vary')); + res.getHeader('Vary').should.equal('Origin'); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('appends to an existing Vary header', function (done) { + // arrange + var req, res, next, options; + options = { + origin: 'example.com' + }; + req = fakeRequest(); + res = fakeResponse(); + res.setHeader('Vary', 'Foo'); + next = function () { + // assert + res.getHeader('Vary').should.equal('Foo, Origin'); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('origin defaults to *', function (done) { + // arrange + var req, res, next, options; + options = { + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + res.getHeader('Access-Control-Allow-Origin').should.equal('*'); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('specifying true for origin reflects requesting origin', function (done) { + // arrange + var req, res, next, options; + options = { + origin: true + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + res.getHeader('Access-Control-Allow-Origin').should.equal('request.com'); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('should allow origin when callback returns true', function (done) { + var req, res, next, options; + options = { + origin: function (sentOrigin, cb) { + sentOrigin.should.equal('request.com'); + cb(null, true); + } + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + res.getHeader('Access-Control-Allow-Origin').should.equal('request.com'); + done(); + }; + + cors(options)(req, res, next); + }); + + it('should not allow origin when callback returns false', function (done) { + var req, res, next, options; + options = { + origin: function (sentOrigin, cb) { + sentOrigin.should.equal('request.com'); + cb(null, false); + } + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + should.not.exist(res.getHeader('Access-Control-Allow-Origin')); + should.not.exist(res.getHeader('Access-Control-Allow-Methods')); + should.not.exist(res.getHeader('Access-Control-Allow-Headers')); + should.not.exist(res.getHeader('Access-Control-Allow-Credentials')); + should.not.exist(res.getHeader('Access-Control-Max-Age')); + done(); + }; + + cors(options)(req, res, next); + }); + + it('should not override options.origin callback', function (done) { + var req, res, next, options; + options = { + origin: function (sentOrigin, cb) { + var isValid = sentOrigin === 'request.com'; + cb(null, isValid); + } + }; + + req = fakeRequest(); + res = fakeResponse(); + next = function () { + res.getHeader('Access-Control-Allow-Origin').should.equal('request.com'); + }; + + cors(options)(req, res, next); + + req = fakeRequest({ + 'origin': 'invalid-request.com' + }); + res = fakeResponse(); + + next = function () { + should.not.exist(res.getHeader('Access-Control-Allow-Origin')); + should.not.exist(res.getHeader('Access-Control-Allow-Methods')); + should.not.exist(res.getHeader('Access-Control-Allow-Headers')); + should.not.exist(res.getHeader('Access-Control-Allow-Credentials')); + should.not.exist(res.getHeader('Access-Control-Max-Age')); + done(); + }; + + cors(options)(req, res, next); + }); + + + it('can override methods', function (done) { + // arrange + var req, res, next, options; + options = { + methods: ['method1', 'method2'] + }; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.statusCode.should.equal(204); + done(); + }; + next = function () { + // assert + res.getHeader('Access-Control-Allow-Methods').should.equal('method1,method2'); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('methods defaults to GET, PUT, PATCH, POST, DELETE', function (done) { + // arrange + var req, res, next, options; + options = { + }; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.statusCode.should.equal(204); + done(); + }; + next = function () { + // assert + res.getHeader('Access-Control-Allow-Methods').should.equal('GET,PUT,PATCH,POST,DELETE'); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('can specify allowed headers', function (done) { + // arrange + var req, res, options; + options = { + allowedHeaders: ['header1', 'header2'] + }; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.getHeader('Access-Control-Allow-Headers').should.equal('header1,header2'); + should.not.exist(res.getHeader('Vary')); + done(); + }; + + // act + cors(options)(req, res, null); + }); + + it('specifying an empty list or string of allowed headers will result in no response header for allowed headers', function (done) { + // arrange + var req, res, next, options; + options = { + allowedHeaders: [] + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + should.not.exist(res.getHeader('Access-Control-Allow-Headers')); + should.not.exist(res.getHeader('Vary')); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('if no allowed headers are specified, defaults to requested allowed headers', function (done) { + // arrange + var req, res, options; + options = { + }; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.getHeader('Access-Control-Allow-Headers').should.equal('requestedHeader1,requestedHeader2'); + should.exist(res.getHeader('Vary')); + res.getHeader('Vary').should.equal('Access-Control-Request-Headers'); + done(); + }; + + // act + cors(options)(req, res, null); + }); + + it('can specify exposed headers', function (done) { + // arrange + var req, res, options, next; + options = { + exposedHeaders: ['custom-header1', 'custom-header2'] + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + res.getHeader('Access-Control-Expose-Headers').should.equal('custom-header1,custom-header2'); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('specifying an empty list or string of exposed headers will result in no response header for exposed headers', function (done) { + // arrange + var req, res, next, options; + options = { + exposedHeaders: [] + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + should.not.exist(res.getHeader('Access-Control-Expose-Headers')); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('includes credentials if explicitly enabled', function (done) { + // arrange + var req, res, options; + options = { + credentials: true + }; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.getHeader('Access-Control-Allow-Credentials').should.equal('true'); + done(); + }; + + // act + cors(options)(req, res, null); + }); + + it('does not includes credentials unless explicitly enabled', function (done) { + // arrange + var req, res, next, options; + options = { + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + should.not.exist(res.getHeader('Access-Control-Allow-Credentials')); + done(); + }; + + // act + cors(options)(req, res, next); + }); + + it('includes maxAge when specified', function (done) { + // arrange + var req, res, options; + options = { + maxAge: 456 + }; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.getHeader('Access-Control-Max-Age').should.equal('456'); + done(); + }; + + // act + cors(options)(req, res, null); + }); + + it('does not includes maxAge unless specified', function (done) { + // arrange + var req, res, next, options; + options = { + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + should.not.exist(res.getHeader('Access-Control-Max-Age')); + done(); + }; + + // act + cors(options)(req, res, next); + }); + }); + + describe('passing a function to build options', function () { + it('handles options specified via callback', function (done) { + // arrange + var req, res, next, delegate; + delegate = function (req2, cb) { + cb(null, { + origin: 'delegate.com' + }); + }; + req = fakeRequest(); + res = fakeResponse(); + next = function () { + // assert + res.getHeader('Access-Control-Allow-Origin').should.equal('delegate.com'); + done(); + }; + + // act + cors(delegate)(req, res, next); + }); + + it('handles options specified via callback for preflight', function (done) { + // arrange + var req, res, delegate; + delegate = function (req2, cb) { + cb(null, { + origin: 'delegate.com', + maxAge: 1000 + }); + }; + req = fakeRequest(); + req.method = 'OPTIONS'; + res = fakeResponse(); + res.end = function () { + // assert + res.getHeader('Access-Control-Allow-Origin').should.equal('delegate.com'); + res.getHeader('Access-Control-Max-Age').should.equal('1000'); + done(); + }; + + // act + cors(delegate)(req, res, null); + }); + + it('handles error specified via callback', function (done) { + // arrange + var req, res, next, delegate; + delegate = function (req2, cb) { + cb('some error'); + }; + req = fakeRequest(); + res = fakeResponse(); + next = function (err) { + // assert + err.should.equal('some error'); + done(); + }; + + // act + cors(delegate)(req, res, next); + }); + }); + }); + +}()); diff --git a/backend/node_modules/cors/test/error-response.js b/backend/node_modules/cors/test/error-response.js new file mode 100644 index 0000000..06c7b97 --- /dev/null +++ b/backend/node_modules/cors/test/error-response.js @@ -0,0 +1,77 @@ +(function () { + /*global describe, it*/ + + 'use strict'; + + var should = require('should'), + express = require('express'), + supertest = require('supertest'), + cors = require('../lib'); + + var app; + + /* -------------------------------------------------------------------------- */ + + app = express(); + app.use(cors()); + + app.post('/five-hundred', function (req, res, next) { + next(new Error('nope')); + }); + + app.post('/four-oh-one', function (req, res, next) { + next(new Error('401')); + }); + + app.post('/four-oh-four', function (req, res, next) { + next(); + }); + + app.use(function (err, req, res, next) { + if (err.message === '401') { + res.status(401).send('unauthorized'); + } else { + next(err); + } + }); + + /* -------------------------------------------------------------------------- */ + + describe('error response', function () { + it('500', function (done) { + supertest(app) + .post('/five-hundred') + .expect(500) + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + res.text.should.containEql('Error: nope'); + done(); + }); + }); + + it('401', function (done) { + supertest(app) + .post('/four-oh-one') + .expect(401) + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + res.text.should.eql('unauthorized'); + done(); + }); + }); + + it('404', function (done) { + supertest(app) + .post('/four-oh-four') + .expect(404) + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + done(); + }); + }); + }); + +}()); diff --git a/backend/node_modules/cors/test/example-app.js b/backend/node_modules/cors/test/example-app.js new file mode 100644 index 0000000..590cb31 --- /dev/null +++ b/backend/node_modules/cors/test/example-app.js @@ -0,0 +1,98 @@ +(function () { + /*global describe, it*/ + + 'use strict'; + + var should = require('should'), + express = require('express'), + supertest = require('supertest'), + cors = require('../lib'); + + var simpleApp, + complexApp; + + /* -------------------------------------------------------------------------- */ + + simpleApp = express(); + simpleApp.head('/', cors(), function (req, res) { + res.status(204).send(); + }); + simpleApp.get('/', cors(), function (req, res) { + res.send('Hello World (Get)'); + }); + simpleApp.post('/', cors(), function (req, res) { + res.send('Hello World (Post)'); + }); + + /* -------------------------------------------------------------------------- */ + + complexApp = express(); + complexApp.options('/', cors()); + complexApp.delete('/', cors(), function (req, res) { + res.send('Hello World (Delete)'); + }); + + /* -------------------------------------------------------------------------- */ + + describe('example app(s)', function () { + describe('simple methods', function () { + it('GET works', function (done) { + supertest(simpleApp) + .get('/') + .expect(200) + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + res.text.should.eql('Hello World (Get)'); + done(); + }); + }); + it('HEAD works', function (done) { + supertest(simpleApp) + .head('/') + .expect(204) + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + done(); + }); + }); + it('POST works', function (done) { + supertest(simpleApp) + .post('/') + .expect(200) + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + res.text.should.eql('Hello World (Post)'); + done(); + }); + }); + }); + + describe('complex methods', function () { + it('OPTIONS works', function (done) { + supertest(complexApp) + .options('/') + .expect(204) + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + done(); + }); + }); + it('DELETE works', function (done) { + supertest(complexApp) + .del('/') + .expect(200) + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + res.text.should.eql('Hello World (Delete)'); + done(); + }); + }); + }); + }); + +}()); diff --git a/backend/node_modules/cors/test/issue-2.js b/backend/node_modules/cors/test/issue-2.js new file mode 100644 index 0000000..0784bcd --- /dev/null +++ b/backend/node_modules/cors/test/issue-2.js @@ -0,0 +1,56 @@ +(function () { + /*global describe, it*/ + + 'use strict'; + + var should = require('should'), + express = require('express'), + supertest = require('supertest'), + cors = require('../lib'); + + var app, + corsOptions; + + /* -------------------------------------------------------------------------- */ + + app = express(); + corsOptions = { + origin: true, + methods: ['POST'], + credentials: true, + maxAge: 3600 + }; + app.options('/api/login', cors(corsOptions)); + app.post('/api/login', cors(corsOptions), function (req, res) { + res.send('LOGIN'); + }); + + /* -------------------------------------------------------------------------- */ + + describe('issue #2', function () { + it('OPTIONS works', function (done) { + supertest(app) + .options('/api/login') + .expect(204) + .set('Origin', 'http://example.com') + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('http://example.com'); + done(); + }); + }); + it('POST works', function (done) { + supertest(app) + .post('/api/login') + .expect(200) + .set('Origin', 'http://example.com') + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('http://example.com'); + res.text.should.eql('LOGIN'); + done(); + }); + }); + }); + +}()); diff --git a/backend/node_modules/cors/test/issue-31.js b/backend/node_modules/cors/test/issue-31.js new file mode 100644 index 0000000..4f678fe --- /dev/null +++ b/backend/node_modules/cors/test/issue-31.js @@ -0,0 +1,58 @@ +(function () { + /*global describe, it*/ + + 'use strict'; + + var should = require('should'), + express = require('express'), + supertest = require('supertest'), + cors = require('../lib'); + + var app, + mainRouter, + itemsRouter; + + /* -------------------------------------------------------------------------- */ + + itemsRouter = new express.Router(); + itemsRouter.get('/', function (req, res) { + res.send('hello world'); + }); + + mainRouter = new express.Router(); + mainRouter.use('/items', itemsRouter); + + app = express(); + app.use(cors()); + app.use(mainRouter); + + /* -------------------------------------------------------------------------- */ + + describe('issue #31', function () { + it('OPTIONS works', function (done) { + supertest(app) + .options('/items') + .expect(204) + .set('Origin', 'http://example.com') + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + done(); + }); + }); + + it('GET works', function (done) { + supertest(app) + .get('/items') + .expect(200) + .set('Origin', 'http://example.com') + .end(function (err, res) { + should.not.exist(err); + res.headers['access-control-allow-origin'].should.eql('*'); + res.text.should.eql('hello world'); + done(); + }); + }); + }); + +}()); diff --git a/backend/node_modules/cors/test/mocha.opts b/backend/node_modules/cors/test/mocha.opts new file mode 100644 index 0000000..c74c434 --- /dev/null +++ b/backend/node_modules/cors/test/mocha.opts @@ -0,0 +1,4 @@ +--ui bdd +--reporter spec +--require should +--require test/support/env diff --git a/backend/node_modules/cors/test/support/env.js b/backend/node_modules/cors/test/support/env.js new file mode 100644 index 0000000..eb938f3 --- /dev/null +++ b/backend/node_modules/cors/test/support/env.js @@ -0,0 +1,2 @@ + +process.env.NODE_ENV = 'test'; diff --git a/backend/node_modules/object-assign/index.js b/backend/node_modules/object-assign/index.js new file mode 100644 index 0000000..0930cf8 --- /dev/null +++ b/backend/node_modules/object-assign/index.js @@ -0,0 +1,90 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +'use strict'; +/* eslint-disable no-unused-vars */ +var getOwnPropertySymbols = Object.getOwnPropertySymbols; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var propIsEnumerable = Object.prototype.propertyIsEnumerable; + +function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); +} + +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== + 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } +} + +module.exports = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; +}; diff --git a/backend/node_modules/object-assign/license b/backend/node_modules/object-assign/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/backend/node_modules/object-assign/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/backend/node_modules/object-assign/package.json b/backend/node_modules/object-assign/package.json new file mode 100644 index 0000000..092a832 --- /dev/null +++ b/backend/node_modules/object-assign/package.json @@ -0,0 +1,118 @@ +{ + "_args": [ + [ + { + "raw": "object-assign@^4", + "scope": null, + "escapedName": "object-assign", + "name": "object-assign", + "rawSpec": "^4", + "spec": ">=4.0.0 <5.0.0", + "type": "range" + }, + "C:\\Users\\Dell\\Downloads\\sprint3 new\\sprint3 new\\gator-meetup\\backend\\node_modules\\cors" + ] + ], + "_from": "object-assign@>=4.0.0 <5.0.0", + "_id": "object-assign@4.1.1", + "_inCache": true, + "_location": "/object-assign", + "_nodeVersion": "4.6.2", + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/object-assign-4.1.1.tgz_1484580915042_0.07107710791751742" + }, + "_npmUser": { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + }, + "_npmVersion": "2.15.11", + "_phantomChildren": {}, + "_requested": { + "raw": "object-assign@^4", + "scope": null, + "escapedName": "object-assign", + "name": "object-assign", + "rawSpec": "^4", + "spec": ">=4.0.0 <5.0.0", + "type": "range" + }, + "_requiredBy": [ + "/cors" + ], + "_resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "_shasum": "2109adc7965887cfc05cbbd442cac8bfbb360863", + "_shrinkwrap": null, + "_spec": "object-assign@^4", + "_where": "C:\\Users\\Dell\\Downloads\\sprint3 new\\sprint3 new\\gator-meetup\\backend\\node_modules\\cors", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/object-assign/issues" + }, + "dependencies": {}, + "description": "ES2015 `Object.assign()` ponyfill", + "devDependencies": { + "ava": "^0.16.0", + "lodash": "^4.16.4", + "matcha": "^0.7.0", + "xo": "^0.16.0" + }, + "directories": {}, + "dist": { + "shasum": "2109adc7965887cfc05cbbd442cac8bfbb360863", + "tarball": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "gitHead": "a89774b252c91612203876984bbd6addbe3b5a0e", + "homepage": "https://github.com/sindresorhus/object-assign#readme", + "keywords": [ + "object", + "assign", + "extend", + "properties", + "es2015", + "ecmascript", + "harmony", + "ponyfill", + "prollyfill", + "polyfill", + "shim", + "browser" + ], + "license": "MIT", + "maintainers": [ + { + "name": "gaearon", + "email": "dan.abramov@gmail.com" + }, + { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + }, + { + "name": "spicyj", + "email": "ben@benalpert.com" + } + ], + "name": "object-assign", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/object-assign.git" + }, + "scripts": { + "bench": "matcha bench.js", + "test": "xo && ava" + }, + "version": "4.1.1" +} diff --git a/backend/node_modules/object-assign/readme.md b/backend/node_modules/object-assign/readme.md new file mode 100644 index 0000000..1be09d3 --- /dev/null +++ b/backend/node_modules/object-assign/readme.md @@ -0,0 +1,61 @@ +# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign) + +> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) [ponyfill](https://ponyfill.com) + + +## Use the built-in + +Node.js 4 and up, as well as every evergreen browser (Chrome, Edge, Firefox, Opera, Safari), +support `Object.assign()` :tada:. If you target only those environments, then by all +means, use `Object.assign()` instead of this package. + + +## Install + +``` +$ npm install --save object-assign +``` + + +## Usage + +```js +const objectAssign = require('object-assign'); + +objectAssign({foo: 0}, {bar: 1}); +//=> {foo: 0, bar: 1} + +// multiple sources +objectAssign({foo: 0}, {bar: 1}, {baz: 2}); +//=> {foo: 0, bar: 1, baz: 2} + +// overwrites equal keys +objectAssign({foo: 0}, {foo: 1}, {foo: 2}); +//=> {foo: 2} + +// ignores null and undefined sources +objectAssign({foo: 0}, null, {bar: 1}, undefined); +//=> {foo: 0, bar: 1} +``` + + +## API + +### objectAssign(target, [source, ...]) + +Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones. + + +## Resources + +- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign) + + +## Related + +- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()` + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/backend/package.json b/backend/package.json index abb9c1b..b0f90c7 100644 --- a/backend/package.json +++ b/backend/package.json @@ -9,6 +9,7 @@ "license": "ISC", "description": "", "dependencies": { + "cors": "^2.8.4", "express": "^4.16.2", "mongodb": "^2.2.33" } diff --git a/backend/server/routes/api.js b/backend/server/routes/api.js index 1f8da48..fd48bce 100644 --- a/backend/server/routes/api.js +++ b/backend/server/routes/api.js @@ -1,11 +1,14 @@ require('dotenv').config() const express = require('express'); const router = express.Router(); +var cors = require('cors'); const MongoClient = require('mongodb').MongoClient, assert = require('assert'); const ObjectID = require('mongodb').ObjectID // Connect var db; +router.use(cors()) + // Connection URL var url = process.env.MONGO_DB_DEV_URI @@ -65,6 +68,289 @@ router.post('/postMeetup', (req, res) => { }); }); + +router.post('/updateData', (req, res) => { + console.log(req.body); + // res.send('ok'); + var data = req.body; + var valueType = req.body.valueType; + + var newData; + var oldData; + switch (valueType) { + case "Emailaddress": + newData = { + $set:{ + Emailaddress: req.body.value + } + } + oldData = { + Emailaddress: req.body.originalValue + } + break; + case 'Name': + newData = { + $set:{ + name: req.body.value + } + } + oldData = { + name: req.body.originalValue + } + break; + case 'Location': + newData = { + $set:{ + Location: req.body.value + } + } + oldData = { + Location: req.body.originalValue + } + break; + case 'Hometown': + newData = { + $set:{ + Hometown: req.body.value + } + } + oldData = { + Hometown: req.body.originalValue + } + + + break; + case 'Language': + newData = { + $set:{ + Language: req.body.value + } + } + oldData = { + Language: req.body.originalValue + } + + break; + case 'DOB': + newData = { + $set:{ + DOB: req.body.value + } + } + oldData = { + DOB: req.body.originalValue + } + break; + case 'Gender': + newData = { + $set:{ + Gender: req.body.value + } + } + oldData = { + Gender: req.body.originalValue + } + + + console.log(oldData); + console.log(newData); + connection((db) => { + db.collection('user') + .update(oldData, newData) + .then((events) => { + response.data = events; + res.json(response); + // console.log(res); + }) + .catch((err) => { + sendError(err, res); + }); + }); +}); + +router.get('/getMeetup', (req, res) => { + connection((db) => { + db.collection("meetup").find({}).toArray(function(err, result) { + if (err) throw err; + console.log(result); + res.send(result) + db.close(); + }); + }); +}); + +router.get('/getUser', (req, res) => { + var UserID = "5510" + connection((db) => { + db.collection("user").find({UserID: UserID}).toArray(function(err, result) { + if (err) throw err; + console.log(result); + res.send(result) + db.close(); + }); + }); +}); + +router.get('/addUser', (req, res) => { + var newUser = { + + name: "Siddharth", + UserID :"5510", + Emailaddress: "sid@gmail.com", + Password : "112", + Location :"CA", + Hometown:"San Jose", + Language:"English", + DOB : "05-05-1992", + Gender :"Male", + BIO:" This is sid" + } + connection((db) => { + db.collection('user') + .insertOne(newUser) + .then((events) => { + response.data = events; + res.json(response); + // console.log(res); + }) + .catch((err) => { + sendError(err, res); + }); + }); +}); + +router.get('/updateHometown', (req, res) => { + var newUser = {$set:{ + Hometown: "CABCD" + }}; + var user={UserID :"5510"}; + connection((db) => { + db.collection('user') + .update(user, newUser) + .then((events) => { + response.data = events; + res.json(response); + console.log(res); + }) + .catch((err) => { + sendError(err, res); + }); + }); +}); + + + + + + + + + + + + + + +router.get('/updateLocation', (req, res) => { + var newUser = {$set:{ + Location: "CA" + }}; + var user={UserID :"1234"}; + connection((db) => { + db.collection('user') + .update(user, newUser) + .then((events) => { + response.data = events; + res.json(response); + console.log(res); + }) + .catch((err) => { + sendError(err, res); + }); + }); +}); + + +router.get('/updatePassword', (req, res) => { + var newUser = {$set:{ + Password: "Siddharth" + }}; + var user={UserID :"1234"}; + connection((db) => { + db.collection('user') + .update(user, newUser) + .then((events) => { + response.data = events; + res.json(response); + console.log(res); + }) + .catch((err) => { + sendError(err, res); + }); + }); +}); + + + + + + + + + +router.get('/updatename', (req, res) => { + var newUser = {$set:{ + name: "Siddharth" + }}; + var user={UserID :"1234"}; + connection((db) => { + db.collection('user') + .update(user, newUser) + .then((events) => { + response.data = events; + res.json(response); + console.log(res); + }) + .catch((err) => { + sendError(err, res); + }); + }); +}); + + + + + + + +router.get('/updateemail', (req, res) => { + var newUser = {$set:{ + Emailaddress: "Sith" + }}; + var user={UserID :"1234"}; + connection((db) => { + db.collection('user') + .update(user, newUser) + .then((events) => { + response.data = events; + res.json(response); + console.log(res); + }) + .catch((err) => { + sendError(err, res); + }); + }); +}); + + + + + + + + + + module.exports = router; // Without wrapped doesnt include status. @@ -82,4 +368,45 @@ module.exports = router; // if (err) return console.log(err); // console.log(result); // }) -// }); \ No newline at end of file + +// }); + + +// Without wrapped doesnt include status. +// get meetups list +// router.get('/getMeetups', function (req, res) { +// db.collection('meetup').find().toArray(function(err, results) { +// console.log(results) +// res.send(results); +// }); +// }); + +// post meetup +// router.post('/postMeetup', function (req, res) { +// db.collection('meetup').insertOne(req.body, (err, result) => { +// if (err) return console.log(err); +// console.log(result); +// }) +// }); + + + + + + + + + + + + +// app.post('/new', function(req, res){ +// new user({ + +// name: req.body.name + +// }).save(function(err, doc){ +// if(err) res.json(err); +// else res.send('Successfully inserted!'); +// }); +// }); \ No newline at end of file diff --git a/debug.log b/debug.log new file mode 100644 index 0000000..acaa6f6 --- /dev/null +++ b/debug.log @@ -0,0 +1,18 @@ +[1109/094007.587:ERROR:process_reader_win.cc(123)] NtOpenThread: {Access Denied} A process has requested access to an object, but has not been granted those access rights. (0xc0000022) +[1109/094007.609:ERROR:exception_snapshot_win.cc(87)] thread ID 9164 not found in process +[1109/094007.609:WARNING:crash_report_exception_handler.cc(62)] ProcessSnapshotWin::Initialize failed +[1109/094117.459:ERROR:process_reader_win.cc(151)] SuspendThread: Access is denied. (0x5) +[1109/094117.478:ERROR:process_reader_win.cc(151)] SuspendThread: Access is denied. (0x5) +[1109/094117.478:ERROR:process_reader_win.cc(151)] SuspendThread: Access is denied. (0x5) +[1109/094117.478:ERROR:process_reader_win.cc(123)] NtOpenThread: {Access Denied} A process has requested access to an object, but has not been granted those access rights. (0xc0000022) +[1109/094117.480:ERROR:exception_snapshot_win.cc(87)] thread ID 8856 not found in process +[1109/094117.480:WARNING:crash_report_exception_handler.cc(62)] ProcessSnapshotWin::Initialize failed +[1109/113042.364:ERROR:process_reader_win.cc(151)] SuspendThread: Access is denied. (0x5) +[1109/113042.369:ERROR:process_reader_win.cc(151)] SuspendThread: Access is denied. (0x5) +[1109/113042.369:ERROR:process_reader_win.cc(151)] SuspendThread: Access is denied. (0x5) +[1109/113042.369:ERROR:process_reader_win.cc(123)] NtOpenThread: {Access Denied} A process has requested access to an object, but has not been granted those access rights. (0xc0000022) +[1109/113042.370:ERROR:exception_snapshot_win.cc(87)] thread ID 11312 not found in process +[1109/113042.370:WARNING:crash_report_exception_handler.cc(62)] ProcessSnapshotWin::Initialize failed +[1109/113218.301:ERROR:process_reader_win.cc(123)] NtOpenThread: {Access Denied} A process has requested access to an object, but has not been granted those access rights. (0xc0000022) +[1109/113218.307:ERROR:exception_snapshot_win.cc(87)] thread ID 1232 not found in process +[1109/113218.307:WARNING:crash_report_exception_handler.cc(62)] ProcessSnapshotWin::Initialize failed diff --git a/e2e/app.e2e-spec.ts b/e2e/app.e2e-spec.ts index d22d564..a8105db 100644 --- a/e2e/app.e2e-spec.ts +++ b/e2e/app.e2e-spec.ts @@ -8,6 +8,13 @@ describe('gator-meetup App', () => { page = new AppPage(); }); + + + it('Create event button should open the create page', () => { + page.getCreateMeetupButton().click(); + expect(browser.getCurrentUrl()).toContain('/create-meetup'); + }); + it('Should display the page title correctly', () => { page.navigateToHome(); expect(browser.getTitle()).toEqual('GatorMeetup'); @@ -142,4 +149,15 @@ describe('gator-meetup App', () => { expect(browser.getCurrentUrl()).toContain('/home'); }); + it('Should display the settings page title correctly', () => { + page.navigateToSettings(); + expect(browser.getTitle()).toEqual('GatorMeetup'); + }); + + + + + + + }); diff --git a/e2e/app.po.ts b/e2e/app.po.ts index e040a50..46a61c1 100644 --- a/e2e/app.po.ts +++ b/e2e/app.po.ts @@ -52,4 +52,9 @@ export class AppPage { element.all(by.tagName('button')).get(index).click(); // browser.pause(); } + + + navigateToSettings() { + return browser.get('/settings'); + } } diff --git a/npm-debug.log.3604909771 b/npm-debug.log.3604909771 new file mode 100644 index 0000000..e69de29 diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index d35cf63..b737013 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -4,13 +4,16 @@ import { RouterModule, Routes } from '@angular/router'; import {GridComponent} from './grid/grid.component'; import {CreateMeetupComponent} from './create-meetup/create-meetup.component'; import {SettingsComponent} from './create-meetup-2/settings.component'; +import { EditComponent } from './create-meetup-2/edit/edit.component'; // import {SettingsComponent} from './settings/settings.component'; const routes: Routes = [ { path: '', component: GridComponent }, { path: 'home', component: GridComponent }, { path: 'create-meetup', component: CreateMeetupComponent }, - { path: 'settings', component: SettingsComponent } + { path: 'settings', component: SettingsComponent }, + // {path:'Edit/:name/:display',component:EditComponent} + { path: 'Edit/:display/:value', component: EditComponent } // { path: 'settings', component: SettingsComponent } ]; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 1afff5e..0a78921 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -50,6 +50,8 @@ import { } from '@angular/material'; import { CreateMeetupComponent } from './create-meetup/create-meetup.component'; import { SettingsComponent } from './create-meetup-2/settings.component'; +import { EditComponent } from './create-meetup-2/edit/edit.component'; +import { PsersonService } from './create-meetup-2/person.service'; // import { SettingsComponent } from './settings/settings.component'; @NgModule({ @@ -86,7 +88,8 @@ import { SettingsComponent } from './create-meetup-2/settings.component'; MatTabsModule, MatToolbarModule, MatTooltipModule, - ] + ], + declarations: [] }) export class AppMaterialModule {} @@ -95,7 +98,8 @@ export class AppMaterialModule {} AppComponent, GridComponent, CreateMeetupComponent, - SettingsComponent + SettingsComponent, + EditComponent // SettingsComponent ], imports: [ @@ -108,7 +112,7 @@ export class AppMaterialModule {} AppMaterialModule, Ng4GeoautocompleteModule.forRoot() ], - providers: [CreateMeetUpService], + providers: [CreateMeetUpService,PsersonService], bootstrap: [AppComponent] }) export class AppModule { } diff --git a/src/app/create-meetup-2/edit/edit.component.css b/src/app/create-meetup-2/edit/edit.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/create-meetup-2/edit/edit.component.html b/src/app/create-meetup-2/edit/edit.component.html new file mode 100644 index 0000000..843ca83 --- /dev/null +++ b/src/app/create-meetup-2/edit/edit.component.html @@ -0,0 +1,19 @@ + + Edit {{Name}} + +
+
+
+
+ {{Name}} : + + + +
+ +
+
+ +
+
+
diff --git a/src/app/create-meetup-2/edit/edit.component.spec.ts b/src/app/create-meetup-2/edit/edit.component.spec.ts new file mode 100644 index 0000000..34ef921 --- /dev/null +++ b/src/app/create-meetup-2/edit/edit.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditComponent } from './edit.component'; + +describe('EditComponent', () => { + let component: EditComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/create-meetup-2/edit/edit.component.ts b/src/app/create-meetup-2/edit/edit.component.ts new file mode 100644 index 0000000..280a5d9 --- /dev/null +++ b/src/app/create-meetup-2/edit/edit.component.ts @@ -0,0 +1,89 @@ +import { Component, OnInit } from '@angular/core'; +import { Http, Headers, RequestOptions } from '@angular/http'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import 'rxjs/add/operator/map'; +import { ActivatedRoute, Router } from '@angular/router'; +@Component({ + selector: 'app-edit', + templateUrl: './edit.component.html', + styleUrls: ['./edit.component.css'] +}) +export class EditComponent implements OnInit { + public Name:string=''; + public Value:string=''; + public OriginalValue:string=''; + constructor(private router: Router,private route: ActivatedRoute, private _http: Http) { } + update() + { + console.log(this.Value); + let headers = new Headers(); + let data = { + originalValue: this.OriginalValue, + value: this.Value, + valueType: this.Name + } + let body=JSON.stringify(data); + headers.append('Content-Type','application/json'); + headers.append('Access-Control-Allow-Origin', '*'); + headers.append('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS'); + headers.append('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Auth-Token'); + let options = new RequestOptions({ headers: headers }); + return this._http.post("http://localhost:8000/updateData",body,options).subscribe(res => { + console.log(res); + alert("Updated") + }); + } + ngOnInit() { + this.route.params.subscribe(params => { + this.Name = params['display']; + this.Value = params['value']; + this.OriginalValue = params['value']; + + }); + } + Navigatebook() + { + this.router.navigate(['/settings']); + + } + // private name:string=''; +// private originalName:string=''; +// private displayname:string=''; +// public showcontrol = true; +// constructor(private route: ActivatedRoute, private _http: Http) { } + +// ngOnInit() { +// this.route.params.subscribe(params => { +// this.originalName = params['name']; +// this.name = params['name']; +// this.displayname= params['display']; + +// if(this.displayname=='date') +// { +// this.showcontrol = false; +// } +// console.log(params['name']) // (+) converts string 'id' to a number + +// // In a real app: dispatch action to load the details here. +// }); +// } + +// updateData() { +// let headers = new Headers(); +// let data = { +// originalValue: this.originalName, +// value: this.name, +// valueType: this.displayname +// } +// let body=JSON.stringify(data); +// headers.append('Content-Type','application/json'); +// headers.append('Access-Control-Allow-Origin', '*'); +// headers.append('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS'); +// headers.append('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Auth-Token'); +// let options = new RequestOptions({ headers: headers }); +// return this._http.post("http://localhost:8000/updateData",body,options).subscribe(res => { +// console.log(res); +// }); +// } + +} diff --git a/src/app/create-meetup-2/person.interface.ts b/src/app/create-meetup-2/person.interface.ts new file mode 100644 index 0000000..6ad658f --- /dev/null +++ b/src/app/create-meetup-2/person.interface.ts @@ -0,0 +1,14 @@ +export interface userdetail +{ +_id :string; +name:string; +UserID:string; +Emailaddress:string; +Password:string; +Location:string; +Hometown:string; +Language:string; +DOB:string; +Gender:string; +BIO:string; +} \ No newline at end of file diff --git a/src/app/create-meetup-2/person.service.ts b/src/app/create-meetup-2/person.service.ts new file mode 100644 index 0000000..85fe065 --- /dev/null +++ b/src/app/create-meetup-2/person.service.ts @@ -0,0 +1,26 @@ +import { BehaviorSubject } from "rxjs/BehaviorSubject"; +import { Http, RequestOptions,Headers } from "@angular/http"; + +import { Subject } from "rxjs/Subject"; +import { Injectable } from "@angular/core"; + + +@Injectable() +export class PsersonService { + baseurl="http://localhost:8000/"; + constructor(private http: Http) { + } + + GetUser() + { + let headers = new Headers(); + + + headers.append('Content-Type','application/json'); + headers.append('Access-Control-Allow-Origin', '*'); + headers.append('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS'); + headers.append('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Auth-Token'); + let options = new RequestOptions({ headers: headers }); + return this.http.get(this.baseurl+"getUser",options).map(res=>res.json()); + } +} \ No newline at end of file diff --git a/src/app/create-meetup-2/settings.component.html b/src/app/create-meetup-2/settings.component.html index 9c14501..cd60d0d 100644 --- a/src/app/create-meetup-2/settings.component.html +++ b/src/app/create-meetup-2/settings.component.html @@ -16,22 +16,30 @@

Name:
-
James
+
{{user?.name}} + Edit +
-
Email address:
-
james.smith@gmail.com
+
Emailaddress:
+
{{user?.Emailaddress}} + Edit +
Location:
-
Sunnyvale, CA
+
{{user?.Location}} + Edit +
Hometown:
-
Sunnyvale, CA
+
{{user?.Hometown}} + Edit +
@@ -39,27 +47,35 @@

Language:
-
English
+
{{user?.Language}} + Edit +
- Birthday:
-
May 5, 1992
+ DOB:
+
{{user?.DOB}} + Edit +
Gender:
-
Male
+
{{user?.Gender}} + Edit +
- Bio:
-
This is Me..
+ BIO:
+
{{user?.BIO}} + Edit +
diff --git a/src/app/create-meetup-2/settings.component.ts b/src/app/create-meetup-2/settings.component.ts index 0c68905..6e54698 100644 --- a/src/app/create-meetup-2/settings.component.ts +++ b/src/app/create-meetup-2/settings.component.ts @@ -1,6 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { NgClass } from '@angular/common'; import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { PsersonService } from './person.service'; +import { userdetail } from './person.interface'; @Component({ selector: 'app-settings', @@ -8,6 +10,9 @@ import {FormBuilder, FormGroup, Validators} from '@angular/forms'; styleUrls: ['./settings.component.css'] }) export class SettingsComponent implements OnInit { +user:userdetail={_id:' ',name :' ', UserID : ' ', Emailaddress:' ', +Password :' ',Location: ' ',Hometown : ' ',Language : ' ', +DOB : ' ',Gender: ' ', BIO : ' '} ; isLinear = false; firstFormGroup: FormGroup; @@ -21,7 +26,7 @@ export class SettingsComponent implements OnInit { ]; selectedSettingsItem: String = this.settingsItems[0]['name']; - constructor(private _formBuilder: FormBuilder) { } + constructor(private _formBuilder: FormBuilder, private psersonService:PsersonService) { } ngOnInit() { this.firstFormGroup = this._formBuilder.group({ @@ -33,6 +38,10 @@ export class SettingsComponent implements OnInit { this.thirdFormGroup = this._formBuilder.group({ thirdCtrl: ['', Validators.required] }); + this.psersonService.GetUser().subscribe(res=>{ + this.user =res[0]; + console.log(res); + }) } selectSetting(index: number) {