From d631a65fe09819fbe4964cc0b8874fdb0744b205 Mon Sep 17 00:00:00 2001 From: SamuelLangenfeld Date: Wed, 6 Dec 2017 11:40:54 -0500 Subject: [PATCH 1/9] seeds working --- .gitignore | 1 + app.js | 46 ++ bin/www | 90 ++++ config/mongo.json | 16 + models/index.js | 15 + models/user.js | 16 + mongo.js | 10 + package-lock.json | 833 +++++++++++++++++++++++++++++++++++ package.json | 22 + public/stylesheets/style.css | 8 + repl.js | 27 ++ routes/index.js | 9 + routes/users.js | 9 + seeds/index.js | 34 ++ seeds/user.js | 0 views/error.hbs | 3 + views/index.hbs | 2 + views/layout.hbs | 10 + 18 files changed, 1151 insertions(+) create mode 100644 .gitignore create mode 100644 app.js create mode 100755 bin/www create mode 100644 config/mongo.json create mode 100644 models/index.js create mode 100644 models/user.js create mode 100644 mongo.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/stylesheets/style.css create mode 100644 repl.js create mode 100644 routes/index.js create mode 100644 routes/users.js create mode 100644 seeds/index.js create mode 100644 seeds/user.js create mode 100644 views/error.hbs create mode 100644 views/index.hbs create mode 100644 views/layout.hbs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..94a75a6 --- /dev/null +++ b/app.js @@ -0,0 +1,46 @@ +var express = require('express'); +var path = require('path'); +var favicon = require('serve-favicon'); +var logger = require('morgan'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); + +var index = require('./routes/index'); +var users = require('./routes/users'); + +var app = express(); + +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'hbs'); + +// uncomment after placing your favicon in /public +//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); +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('/', index); +app.use('/users', users); + +// catch 404 and forward to error handler +app.use(function(req, res, next) { + var err = new Error('Not Found'); + err.status = 404; + next(err); +}); + +// error handler +app.use(function(err, req, res, next) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('error'); +}); + +module.exports = app; diff --git a/bin/www b/bin/www new file mode 100755 index 0000000..b835f12 --- /dev/null +++ b/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('assignment-thoreddit:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '3000'); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/config/mongo.json b/config/mongo.json new file mode 100644 index 0000000..58b41a1 --- /dev/null +++ b/config/mongo.json @@ -0,0 +1,16 @@ +{ + "development": + { + "database": "thoreddit_development", + "host": "localhost" + }, + "test": + { + "database": "thoreddit_test", + "host": "localhost" + }, + "production": + { + "use_env_variable": "MONGODB_URI" + } +} \ No newline at end of file diff --git a/models/index.js b/models/index.js new file mode 100644 index 0000000..aa6252d --- /dev/null +++ b/models/index.js @@ -0,0 +1,15 @@ +var mongoose = require('mongoose'); +var bluebird = require('bluebird'); + +// Set bluebird as the promise +// library for mongoose +mongoose.Promise = bluebird; + +var models = {}; + +// Load models and attach to models here +models.User = require('./user'); +console.log("in index models.user is " + models.User) +//... more models + +module.exports = models; \ No newline at end of file diff --git a/models/user.js b/models/user.js new file mode 100644 index 0000000..5573db0 --- /dev/null +++ b/models/user.js @@ -0,0 +1,16 @@ +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; + + +var UserSchema = new Schema({ + username: String, + email: String + +}, { + timestamps: true +}); + +// Create the model with a defined schema +var User = mongoose.model('User', UserSchema); + +module.exports = User; \ No newline at end of file diff --git a/mongo.js b/mongo.js new file mode 100644 index 0000000..8584d7b --- /dev/null +++ b/mongo.js @@ -0,0 +1,10 @@ +var mongoose = require('mongoose'); +var env = process.env.NODE_ENV || 'development'; +var config = require('./config/mongo')[env]; + +module.exports = () => { + var envUrl = process.env[config.use_env_variable]; + var localUrl = `mongodb://${ config.host }/${ config.database }`; + var mongoUrl = envUrl ? envUrl : localUrl; + return mongoose.connect(mongoUrl); +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..fefd2bd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,833 @@ +{ + "name": "assignment-thoreddit", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "4.17.4" + } + }, + "basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + } + }, + "bson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", + "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "optional": true + } + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "optional": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz", + "integrity": "sha1-ZwI1ypWYiQpa6BcLg9tyK4Qu2Sc=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.0.6", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "1.1.5", + "qs": "6.5.0", + "range-parser": "1.2.0", + "send": "0.15.6", + "serve-static": "1.12.6", + "setprototypeof": "1.0.3", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.0", + "vary": "1.1.2" + }, + "dependencies": { + "qs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", + "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "handlebars": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", + "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=", + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + } + } + }, + "hbs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.0.1.tgz", + "integrity": "sha1-S/2YZQ3IydrESzyprfnAmOi8M7Y=", + "requires": { + "handlebars": "4.0.5", + "walk": "2.3.9" + } + }, + "hooks-fixed": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", + "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "kareem": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", + "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "optional": true + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "mongodb": { + "version": "2.2.33", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.33.tgz", + "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=", + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.17", + "readable-stream": "2.2.7" + } + }, + "mongodb-core": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.17.tgz", + "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=", + "requires": { + "bson": "1.0.4", + "require_optional": "1.0.1" + } + }, + "mongoose": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.13.6.tgz", + "integrity": "sha512-H+loD0D8UCwGmbOzWV7rZAf6/efRr9CPGB1Bess/IIjiWvpRQNo4zH4UHkueKoEbMWdnSYenjdEL8A0Q8p7JXg==", + "requires": { + "async": "2.1.4", + "bson": "1.0.4", + "hooks-fixed": "2.0.2", + "kareem": "1.5.0", + "lodash.get": "4.4.2", + "mongodb": "2.2.33", + "mpath": "0.3.0", + "mpromise": "0.5.5", + "mquery": "2.3.3", + "ms": "2.0.0", + "muri": "1.3.0", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" + } + }, + "mongooseeder": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/mongooseeder/-/mongooseeder-2.0.5.tgz", + "integrity": "sha512-w1+g48UdomQKOukO4Kr89MikmX06qLXs8GvPVJMng1TRRbeZCEv5ZnL0cutoLvDeFfouH+xYB+qDpnqut7beFQ==" + }, + "morgan": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", + "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", + "requires": { + "basic-auth": "2.0.0", + "debug": "2.6.9", + "depd": "1.1.1", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + } + }, + "mpath": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", + "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" + }, + "mpromise": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", + "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" + }, + "mquery": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.3.tgz", + "integrity": "sha512-NC8L14kn+qxJbbJ1gbcEMDxF0sC3sv+1cbRReXXwVvowcwY1y9KoVZFq0ebwARibsadu8lx8nWGvm3V0Pf0ZWQ==", + "requires": { + "bluebird": "3.5.0", + "debug": "2.6.9", + "regexp-clone": "0.0.1", + "sliced": "0.0.5" + }, + "dependencies": { + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "muri": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", + "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.4.0" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.4.1" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "send": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", + "integrity": "sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ=", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-favicon": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", + "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "ms": "2.0.0", + "parseurl": "1.3.2", + "safe-buffer": "5.1.1" + } + }, + "serve-static": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.6.tgz", + "integrity": "sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc=", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.6" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "walk": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.9.tgz", + "integrity": "sha1-MbTbZnjyrgHDnqn7hyWpAx5Vins=", + "requires": { + "foreachasync": "3.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b79063d --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "assignment-thoreddit", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www", + "seed": "node seeds", + "seeds": "node seeds" + }, + "dependencies": { + "bluebird": "^3.5.1", + "body-parser": "~1.18.2", + "cookie-parser": "~1.4.3", + "debug": "~2.6.9", + "express": "~4.15.5", + "hbs": "~4.0.1", + "mongoose": "^4.13.6", + "mongooseeder": "^2.0.5", + "morgan": "~1.9.0", + "serve-favicon": "~2.4.5" + } +} \ No newline at end of file diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css new file mode 100644 index 0000000..9453385 --- /dev/null +++ b/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} diff --git a/repl.js b/repl.js new file mode 100644 index 0000000..9a28166 --- /dev/null +++ b/repl.js @@ -0,0 +1,27 @@ +// Require mongoose and start up the REPL +// Also require our models +var mongoose = require('mongoose'); +var repl = require('repl').start({}); +var models = require('./models/index.js'); + +// Use our promise based connection +// file to wrap our REPL and execute +// only once we've connected to MongoDB +require('./mongo')().then(() => { + + // Set `models` to be available in + // the REPL by name + repl.context.models = models; + + + // Set each model to be available in the REPL + // by name + Object.keys(models).forEach((modelName) => { + repl.context[modelName] = mongoose.model(modelName); + }); + + + // Helper function to output the result of + // a query + repl.context.lg = (data) => console.log(data); +}); \ No newline at end of file diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..ecca96a --- /dev/null +++ b/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'Express' }); +}); + +module.exports = router; diff --git a/routes/users.js b/routes/users.js new file mode 100644 index 0000000..623e430 --- /dev/null +++ b/routes/users.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET users listing. */ +router.get('/', function(req, res, next) { + res.send('respond with a resource'); +}); + +module.exports = router; diff --git a/seeds/index.js b/seeds/index.js new file mode 100644 index 0000000..2c513cf --- /dev/null +++ b/seeds/index.js @@ -0,0 +1,34 @@ +const mongoose = require('mongoose'); +const mongooseeder = require('mongooseeder'); +const models = require('./../models/index.js'); + +var env = process.env.NODE_ENV || 'development'; +var config = require('./../config/mongo')[env]; + +const mongodbUrl = process.env.NODE_ENV === 'production' ? + process.env[config.use_env_variable] : + `mongodb://${ config.host }/${ config.database }`; + + +mongooseeder.seed({ + + mongodbUrl: mongodbUrl, + models: models, + clean: true, + mongoose: mongoose, + seeds: () => { + // -------------------------------------- + // Create Users + // -------------------------------------- + console.log('Creating Users'); + var users = []; + for (let i = 0; i < 10; i++) { + var user = ({ + username: `foobar${ i }`, + email: `foobar${ i }@gmail.com` + }); + users.push(models.User.create(user)); + } + return Promise.all(users); + } +}); \ No newline at end of file diff --git a/seeds/user.js b/seeds/user.js new file mode 100644 index 0000000..e69de29 diff --git a/views/error.hbs b/views/error.hbs new file mode 100644 index 0000000..0659765 --- /dev/null +++ b/views/error.hbs @@ -0,0 +1,3 @@ +

{{message}}

+

{{error.status}}

+
{{error.stack}}
diff --git a/views/index.hbs b/views/index.hbs new file mode 100644 index 0000000..1f308fd --- /dev/null +++ b/views/index.hbs @@ -0,0 +1,2 @@ +

{{title}}

+

Welcome to {{title}}

diff --git a/views/layout.hbs b/views/layout.hbs new file mode 100644 index 0000000..068eb6b --- /dev/null +++ b/views/layout.hbs @@ -0,0 +1,10 @@ + + + + {{title}} + + + + {{{body}}} + + From de73c42875dcec4c36ff060eb7d60085917fcb52 Mon Sep 17 00:00:00 2001 From: EdwinYung Date: Wed, 6 Dec 2017 12:09:37 -0500 Subject: [PATCH 2/9] got user index working --- app.js | 9 ++++++++ models/index.js | 4 ++-- package.json | 2 +- routes/users.js | 13 +++++++++-- views/users/user_index.hbs | 45 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 views/users/user_index.hbs diff --git a/app.js b/app.js index 94a75a6..1cef873 100644 --- a/app.js +++ b/app.js @@ -10,6 +10,15 @@ var users = require('./routes/users'); var app = express(); +var mongoose = require('mongoose'); +app.use((req, res, next) => { + if (mongoose.connection.readyState) { + next(); + } else { + require('./mongo')().then(() => next()); + } +}); + // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'hbs'); diff --git a/models/index.js b/models/index.js index aa6252d..723c2fe 100644 --- a/models/index.js +++ b/models/index.js @@ -9,7 +9,7 @@ var models = {}; // Load models and attach to models here models.User = require('./user'); -console.log("in index models.user is " + models.User) + //... more models -module.exports = models; \ No newline at end of file +module.exports = models; diff --git a/package.json b/package.json index b79063d..41d7d06 100644 --- a/package.json +++ b/package.json @@ -19,4 +19,4 @@ "morgan": "~1.9.0", "serve-favicon": "~2.4.5" } -} \ No newline at end of file +} diff --git a/routes/users.js b/routes/users.js index 623e430..643d0f8 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,9 +1,18 @@ var express = require('express'); var router = express.Router(); +var mongoose = require('mongoose'); +var models = require('./../models'); +var User = mongoose.model('User'); /* GET users listing. */ -router.get('/', function(req, res, next) { - res.send('respond with a resource'); +router.get('/', (req, res) => { + console.log('ROUTE IS BEING HIT'); + User.find({}) + .then(users => { + console.log('THEN IS BEING HIT'); + res.render('users/user_index', { users }); + }) + .catch(e => res.status(500).send(e.stack)); }); module.exports = router; diff --git a/views/users/user_index.hbs b/views/users/user_index.hbs new file mode 100644 index 0000000..02b89a9 --- /dev/null +++ b/views/users/user_index.hbs @@ -0,0 +1,45 @@ + + + +{{#if users.length }} + +{{/if }} + +{{#if users.length }} + + + + + + + + + + + {{#each users as |user| }} + + + + + + + {{/each }} + +
UsernameEmail
+ {{ user.username }} + + {{ user.email }} + + Edit + + Delete +
+{{else }} +

No users

+{{/if }} From f72c317494a3334d8a90295cca007cfe0bc8ff08 Mon Sep 17 00:00:00 2001 From: SamuelLangenfeld Date: Wed, 6 Dec 2017 13:29:26 -0500 Subject: [PATCH 3/9] login functional --- app.js | 45 +++++++++++++++++++++++-- models/commentable.js | 0 models/index.js | 3 +- package-lock.json | 57 ++++++++++++++++++++++++++++++++ package.json | 3 ++ routes/login.js | 19 +++++++++++ routes/users.js | 68 ++++++++++++++++++++++++++++++++++++-- views/login.hbs | 16 +++++++++ views/users/edit.hbs | 22 ++++++++++++ views/users/new.hbs | 20 +++++++++++ views/users/show.hbs | 24 ++++++++++++++ views/users/user_index.hbs | 7 ---- 12 files changed, 271 insertions(+), 13 deletions(-) create mode 100644 models/commentable.js create mode 100644 routes/login.js create mode 100644 views/login.hbs create mode 100644 views/users/edit.hbs create mode 100644 views/users/new.hbs create mode 100644 views/users/show.hbs diff --git a/app.js b/app.js index 1cef873..64c19a5 100644 --- a/app.js +++ b/app.js @@ -4,10 +4,11 @@ var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); +var session = require('express-session'); var index = require('./routes/index'); var users = require('./routes/users'); - +var login = require('./routes/login'); var app = express(); var mongoose = require('mongoose'); @@ -31,9 +32,46 @@ app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); + +// -------------------------------------- +// Method Override +// -------------------------------------- +const methodOverride = require('method-override'); +const getPostSupport = require('express-method-override-get-post-support'); + + +app.use(methodOverride( + getPostSupport.callback, + getPostSupport.options // { methods: ['POST', 'GET'] } +)); + + +app.use(session({ + secret: 'keyboard cat', + resave: true, + saveUninitialized: true, + cookie: { secure: false } +})); + +app.use('/login', login); + +app.use(function(req, res, next) { + + if (!req.session.userId && req.path != "/login") { + req.path = '/login'; + res.redirect('/login'); + } else { + next(); + } +}); + + app.use('/', index); app.use('/users', users); + + + // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); @@ -52,4 +90,7 @@ app.use(function(err, req, res, next) { res.render('error'); }); -module.exports = app; + + + +module.exports = app; \ No newline at end of file diff --git a/models/commentable.js b/models/commentable.js new file mode 100644 index 0000000..e69de29 diff --git a/models/index.js b/models/index.js index 723c2fe..ed761bd 100644 --- a/models/index.js +++ b/models/index.js @@ -10,6 +10,7 @@ var models = {}; // Load models and attach to models here models.User = require('./user'); + //... more models -module.exports = models; +module.exports = models; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fefd2bd..bd2c4a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -155,6 +155,11 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "crc": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", + "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -251,6 +256,34 @@ } } }, + "express-method-override-get-post-support": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/express-method-override-get-post-support/-/express-method-override-get-post-support-1.0.0.tgz", + "integrity": "sha512-uBS1tJsdoRgTa3ujiJRXC1z6haAdSccZs1tH0a4NTpm9dm598xgM/C7rg+x3qPf14GLQf90h6ltsQ4x68zkt/Q==" + }, + "express-session": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", + "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "crc": "3.4.4", + "debug": "2.6.9", + "depd": "1.1.1", + "on-headers": "1.0.1", + "parseurl": "1.3.2", + "uid-safe": "2.1.5", + "utils-merge": "1.0.1" + }, + "dependencies": { + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + } + } + }, "finalhandler": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", @@ -399,6 +432,17 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "method-override": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz", + "integrity": "sha1-49r41d7hDdLc59SuiNYrvud0drQ=", + "requires": { + "debug": "2.6.9", + "methods": "1.1.2", + "parseurl": "1.3.2", + "vary": "1.1.2" + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -590,6 +634,11 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -778,6 +827,14 @@ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "1.0.0" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index 41d7d06..54ea858 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,10 @@ "cookie-parser": "~1.4.3", "debug": "~2.6.9", "express": "~4.15.5", + "express-method-override-get-post-support": "^1.0.0", + "express-session": "^1.15.6", "hbs": "~4.0.1", + "method-override": "^2.3.10", "mongoose": "^4.13.6", "mongooseeder": "^2.0.5", "morgan": "~1.9.0", diff --git a/routes/login.js b/routes/login.js new file mode 100644 index 0000000..8c3d233 --- /dev/null +++ b/routes/login.js @@ -0,0 +1,19 @@ +var express = require('express'); +var router = express.Router(); +var mongoose = require('mongoose'); +var models = require('./../models'); +var User = mongoose.model('User'); + +router.get('/', (req, res, next) => { + res.render('login'); +}) + +router.post('/', (req, res, next) => { + User.findOne({ email: req.body.email, username: req.body.username }).then(user => { + req.session.userId = user.id; + req.method = "get"; + res.redirect(`users/${user.id}`); + }) +}) + +module.exports = router; \ No newline at end of file diff --git a/routes/users.js b/routes/users.js index 643d0f8..17e3d46 100644 --- a/routes/users.js +++ b/routes/users.js @@ -6,13 +6,75 @@ var User = mongoose.model('User'); /* GET users listing. */ router.get('/', (req, res) => { - console.log('ROUTE IS BEING HIT'); User.find({}) .then(users => { - console.log('THEN IS BEING HIT'); res.render('users/user_index', { users }); }) .catch(e => res.status(500).send(e.stack)); }); -module.exports = router; +router.get('/new', (req, res) => { + res.render('users/new'); +}); + +router.put('/:id', (req, res) => { + var userParams = { + username: req.body['user[username]'], + email: req.body['user[email]'] + }; + + User.findByIdAndUpdate(req.params.id, userParams) + .then((user) => { + req.method = 'GET'; + res.redirect(`/users/${ user.id }`); + }) + .catch((e) => res.status(500).send(e.stack)); +}); +router.get('/:id/edit', (req, res) => { + User.findById(req.params.id) + .then((user) => { + res.render('users/edit', { user }); + }) + .catch((e) => res.status(500).send(e.stack)); +}); + +router.get('/:id', (req, res) => { + User.findById(req.params.id) + .then((user) => { + res.render('users/show', { user }); + }) + .catch((e) => res.status(500).send(e.stack)); +}); + + + +router.post('/', (req, res) => { + console.log(req.body); + console.log(typeof req.body); + var user = new User({ + username: req.body['user[username]'], + email: req.body['user[email]'] + }); + + user.save() + .then((user) => { + res.redirect(`/users/${ user.id }`); + }) + .catch((e) => res.status(500).send(e.stack)); +}); + + + + +router.delete('/:id', (req, res) => { + User.findByIdAndRemove(req.params.id) + .then(() => { + req.method = 'GET'; + res.redirect('/users'); + }) + .catch((e) => res.status(500).send(e.stack)); +}); + + + +module.exports = router; \ No newline at end of file diff --git a/views/login.hbs b/views/login.hbs new file mode 100644 index 0000000..b450eec --- /dev/null +++ b/views/login.hbs @@ -0,0 +1,16 @@ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
\ No newline at end of file diff --git a/views/users/edit.hbs b/views/users/edit.hbs new file mode 100644 index 0000000..a4045a2 --- /dev/null +++ b/views/users/edit.hbs @@ -0,0 +1,22 @@ + + + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
\ No newline at end of file diff --git a/views/users/new.hbs b/views/users/new.hbs new file mode 100644 index 0000000..b87d23c --- /dev/null +++ b/views/users/new.hbs @@ -0,0 +1,20 @@ + + + +
+
+ + +
+ +
+ + +
+ +
+ +
+
\ No newline at end of file diff --git a/views/users/show.hbs b/views/users/show.hbs new file mode 100644 index 0000000..8dcf23c --- /dev/null +++ b/views/users/show.hbs @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + +
KeyValue
Username{{ user.username }}
Email{{ user.email }}
\ No newline at end of file diff --git a/views/users/user_index.hbs b/views/users/user_index.hbs index 02b89a9..de2b47c 100644 --- a/views/users/user_index.hbs +++ b/views/users/user_index.hbs @@ -4,13 +4,6 @@ -{{#if users.length }} - -{{/if }} - {{#if users.length }} From 47a5f225ef9cd9af74a2c116ba30a914a2602b27 Mon Sep 17 00:00:00 2001 From: EdwinYung Date: Wed, 6 Dec 2017 15:28:00 -0500 Subject: [PATCH 4/9] modeling commentabel --- app.js | 105 +++++++++++++++++++++--------------------- models/comment.js | 16 +++++++ models/commentable.js | 19 ++++++++ models/post.js | 13 ++++++ models/vote.js | 18 ++++++++ mongo.js | 2 +- package.json | 5 +- repl.js | 27 ----------- seeds/index.js | 31 ++++++------- 9 files changed, 137 insertions(+), 99 deletions(-) create mode 100644 models/comment.js create mode 100644 models/post.js create mode 100644 models/vote.js delete mode 100644 repl.js diff --git a/app.js b/app.js index 64c19a5..8ba97c0 100644 --- a/app.js +++ b/app.js @@ -1,80 +1,82 @@ -var express = require('express'); -var path = require('path'); -var favicon = require('serve-favicon'); -var logger = require('morgan'); -var cookieParser = require('cookie-parser'); -var bodyParser = require('body-parser'); -var session = require('express-session'); - -var index = require('./routes/index'); -var users = require('./routes/users'); -var login = require('./routes/login'); +var express = require("express"); +var path = require("path"); +var favicon = require("serve-favicon"); +var logger = require("morgan"); +var cookieParser = require("cookie-parser"); +var bodyParser = require("body-parser"); +var session = require("express-session"); + +var index = require("./routes/index"); +var users = require("./routes/users"); +var login = require("./routes/login"); var app = express(); -var mongoose = require('mongoose'); +var mongoose = require("mongoose"); app.use((req, res, next) => { if (mongoose.connection.readyState) { next(); } else { - require('./mongo')().then(() => next()); + require("./mongo")().then(() => next()); } }); // view engine setup -app.set('views', path.join(__dirname, 'views')); -app.set('view engine', 'hbs'); +app.set("views", path.join(__dirname, "views")); +app.set("view engine", "hbs"); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(logger('dev')); +app.use(logger("dev")); app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: false })); +app.use( + bodyParser.urlencoded({ + extended: false + }) +); app.use(cookieParser()); -app.use(express.static(path.join(__dirname, 'public'))); - +app.use(express.static(path.join(__dirname, "public"))); // -------------------------------------- // Method Override // -------------------------------------- -const methodOverride = require('method-override'); -const getPostSupport = require('express-method-override-get-post-support'); - - -app.use(methodOverride( - getPostSupport.callback, - getPostSupport.options // { methods: ['POST', 'GET'] } -)); - - -app.use(session({ - secret: 'keyboard cat', - resave: true, - saveUninitialized: true, - cookie: { secure: false } -})); - -app.use('/login', login); +const methodOverride = require("method-override"); +const getPostSupport = require("express-method-override-get-post-support"); + +app.use( + methodOverride( + getPostSupport.callback, + getPostSupport.options // { methods: ['POST', 'GET'] } + ) +); + +app.use( + session({ + secret: "keyboard cat", + resave: true, + saveUninitialized: true, + cookie: { + secure: false + } //our website is not secure + }) +); + +app.use("/login", login); app.use(function(req, res, next) { - if (!req.session.userId && req.path != "/login") { - req.path = '/login'; - res.redirect('/login'); + req.path = "/login"; + res.redirect("/login"); } else { next(); } }); - -app.use('/', index); -app.use('/users', users); - - - +app.use("/", index); +app.use("/users", users); // catch 404 and forward to error handler app.use(function(req, res, next) { - var err = new Error('Not Found'); + var err = new Error("Not Found"); err.status = 404; next(err); }); @@ -83,14 +85,11 @@ app.use(function(req, res, next) { app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; - res.locals.error = req.app.get('env') === 'development' ? err : {}; + res.locals.error = req.app.get("env") === "development" ? err : {}; // render the error page res.status(err.status || 500); - res.render('error'); + res.render("error"); }); - - - -module.exports = app; \ No newline at end of file +module.exports = app; diff --git a/models/comment.js b/models/comment.js new file mode 100644 index 0000000..82b692d --- /dev/null +++ b/models/comment.js @@ -0,0 +1,16 @@ +import Commentable from './Commentable'; + +var CommentSchema = new Schema( + { + parent: { + type: Schema.Types.ObjectId, + ref: 'Commentable' + } + }, + { + discriminatorKey: 'kind' + } +); + +var Comment = Commentable.discriminator('Comment', CommentSchema); +module.exports = Comment; diff --git a/models/commentable.js b/models/commentable.js index e69de29..e7bef28 100644 --- a/models/commentable.js +++ b/models/commentable.js @@ -0,0 +1,19 @@ +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; + +var CommentableSchema = new Schema( + { + author: { + type: Schema.Types.ObjectId, + ref: 'User' + }, + body: String + }, + { + timestamps: true, + discriminatorKey: 'kind' + } +); + +var Commentable = mongoose.model('Commentable', CommentableSchema); +module.exports = Commentable; diff --git a/models/post.js b/models/post.js new file mode 100644 index 0000000..8063c38 --- /dev/null +++ b/models/post.js @@ -0,0 +1,13 @@ +import Commentable from './Commentable'; + +var PostSchema = new Schema( + { + name: String + }, + { + discriminatorKey: 'kind' + } +); + +var Post = Commentable.discriminator('Post', PostSchema); +module.exports = Post; diff --git a/models/vote.js b/models/vote.js new file mode 100644 index 0000000..17b55ff --- /dev/null +++ b/models/vote.js @@ -0,0 +1,18 @@ +import Commentable from './Commentable'; + +var VoteSchema = new Schema( + { + user: { type: Schema.Types.ObjectId, ref: 'User' }, //just have user vote once. Query vote collection for already submitted user + votetype: Number, + commentable: { + type: Schema.Types.ObjectId, + ref: 'Commentable' + } + }, + { + discriminatorKey: 'kind' + } +); + +var Vote = Commentable.discriminator('Vote', VoteSchema); +module.exports = Vote; diff --git a/mongo.js b/mongo.js index 8584d7b..ea76492 100644 --- a/mongo.js +++ b/mongo.js @@ -4,7 +4,7 @@ var config = require('./config/mongo')[env]; module.exports = () => { var envUrl = process.env[config.use_env_variable]; - var localUrl = `mongodb://${ config.host }/${ config.database }`; + var localUrl = `mongodb://${config.host}/${config.database}`; var mongoUrl = envUrl ? envUrl : localUrl; return mongoose.connect(mongoUrl); }; \ No newline at end of file diff --git a/package.json b/package.json index 54ea858..d8ebd43 100644 --- a/package.json +++ b/package.json @@ -21,5 +21,6 @@ "mongooseeder": "^2.0.5", "morgan": "~1.9.0", "serve-favicon": "~2.4.5" - } -} + }, + "devDependencies": {} +} \ No newline at end of file diff --git a/repl.js b/repl.js deleted file mode 100644 index 9a28166..0000000 --- a/repl.js +++ /dev/null @@ -1,27 +0,0 @@ -// Require mongoose and start up the REPL -// Also require our models -var mongoose = require('mongoose'); -var repl = require('repl').start({}); -var models = require('./models/index.js'); - -// Use our promise based connection -// file to wrap our REPL and execute -// only once we've connected to MongoDB -require('./mongo')().then(() => { - - // Set `models` to be available in - // the REPL by name - repl.context.models = models; - - - // Set each model to be available in the REPL - // by name - Object.keys(models).forEach((modelName) => { - repl.context[modelName] = mongoose.model(modelName); - }); - - - // Helper function to output the result of - // a query - repl.context.lg = (data) => console.log(data); -}); \ No newline at end of file diff --git a/seeds/index.js b/seeds/index.js index 2c513cf..69171e1 100644 --- a/seeds/index.js +++ b/seeds/index.js @@ -1,17 +1,16 @@ -const mongoose = require('mongoose'); -const mongooseeder = require('mongooseeder'); -const models = require('./../models/index.js'); +const mongoose = require("mongoose"); +const mongooseeder = require("mongooseeder"); +const models = require("./../models/index.js"); -var env = process.env.NODE_ENV || 'development'; -var config = require('./../config/mongo')[env]; - -const mongodbUrl = process.env.NODE_ENV === 'production' ? - process.env[config.use_env_variable] : - `mongodb://${ config.host }/${ config.database }`; +var env = process.env.NODE_ENV || "development"; +var config = require("./../config/mongo")[env]; +const mongodbUrl = + process.env.NODE_ENV === "production" + ? process.env[config.use_env_variable] + : `mongodb://${config.host}/${config.database}`; mongooseeder.seed({ - mongodbUrl: mongodbUrl, models: models, clean: true, @@ -20,15 +19,15 @@ mongooseeder.seed({ // -------------------------------------- // Create Users // -------------------------------------- - console.log('Creating Users'); + console.log("Creating Users"); var users = []; for (let i = 0; i < 10; i++) { - var user = ({ - username: `foobar${ i }`, - email: `foobar${ i }@gmail.com` - }); + var user = { + username: `foobar${i}`, + email: `foobar${i}@gmail.com` + }; users.push(models.User.create(user)); } return Promise.all(users); } -}); \ No newline at end of file +}); From 64ecbfae34e1036038de623157313526bc068997 Mon Sep 17 00:00:00 2001 From: SamuelLangenfeld Date: Wed, 6 Dec 2017 16:13:31 -0500 Subject: [PATCH 5/9] basic posts are finished --- app.js | 6 +++++- models/comment.js | 23 ++++++++++----------- models/commentable.js | 27 +++++++++++++------------ models/index.js | 3 ++- models/post.js | 20 +++++++++---------- models/vote.js | 28 +++++++++++++------------- repl.js | 27 +++++++++++++++++++++++++ routes/post.js | 25 +++++++++++++++++++++++ seeds/index.js | 38 ++++++++++++++++++++++++++--------- seeds/user.js | 0 views/posts/postsIndex.hbs | 41 ++++++++++++++++++++++++++++++++++++++ views/posts/show.hbs | 34 +++++++++++++++++++++++++++++++ 12 files changed, 212 insertions(+), 60 deletions(-) create mode 100644 repl.js create mode 100644 routes/post.js delete mode 100644 seeds/user.js create mode 100644 views/posts/postsIndex.hbs create mode 100644 views/posts/show.hbs diff --git a/app.js b/app.js index 8ba97c0..df833ac 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,8 @@ var session = require("express-session"); var index = require("./routes/index"); var users = require("./routes/users"); +var posts = require("./routes/post"); + var login = require("./routes/login"); var app = express(); @@ -73,6 +75,8 @@ app.use(function(req, res, next) { app.use("/", index); app.use("/users", users); +app.use("/posts", posts); + // catch 404 and forward to error handler app.use(function(req, res, next) { @@ -92,4 +96,4 @@ app.use(function(err, req, res, next) { res.render("error"); }); -module.exports = app; +module.exports = app; \ No newline at end of file diff --git a/models/comment.js b/models/comment.js index 82b692d..eefc50f 100644 --- a/models/comment.js +++ b/models/comment.js @@ -1,16 +1,15 @@ -import Commentable from './Commentable'; +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; -var CommentSchema = new Schema( - { - parent: { - type: Schema.Types.ObjectId, - ref: 'Commentable' - } - }, - { - discriminatorKey: 'kind' +const Commentable = require('./commentable.js'); +var CommentSchema = new Schema({ + parent: { + type: Schema.Types.ObjectId, + ref: 'Commentable' } -); +}, { + discriminatorKey: 'kind' +}); var Comment = Commentable.discriminator('Comment', CommentSchema); -module.exports = Comment; +module.exports = Comment; \ No newline at end of file diff --git a/models/commentable.js b/models/commentable.js index e7bef28..9383168 100644 --- a/models/commentable.js +++ b/models/commentable.js @@ -1,19 +1,20 @@ var mongoose = require('mongoose'); var Schema = mongoose.Schema; -var CommentableSchema = new Schema( - { - author: { - type: Schema.Types.ObjectId, - ref: 'User' - }, - body: String +var CommentableSchema = new Schema({ + author: { + type: Schema.Types.ObjectId, + ref: 'User' }, - { - timestamps: true, - discriminatorKey: 'kind' - } -); + body: String, + children: [{ + type: Schema.Types.ObjectId, + ref: 'Commentable' + }], +}, { + timestamps: true, + discriminatorKey: 'kind' +}); var Commentable = mongoose.model('Commentable', CommentableSchema); -module.exports = Commentable; +module.exports = Commentable; \ No newline at end of file diff --git a/models/index.js b/models/index.js index ed761bd..732d370 100644 --- a/models/index.js +++ b/models/index.js @@ -9,7 +9,8 @@ var models = {}; // Load models and attach to models here models.User = require('./user'); - +models.Post = require('./post'); +models.Comment = require('./comment'); //... more models diff --git a/models/post.js b/models/post.js index 8063c38..fe7eddd 100644 --- a/models/post.js +++ b/models/post.js @@ -1,13 +1,13 @@ -import Commentable from './Commentable'; +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; -var PostSchema = new Schema( - { - name: String - }, - { - discriminatorKey: 'kind' - } -); +const Commentable = require('./commentable.js'); + +var PostSchema = new Schema({ + title: String +}, { + discriminatorKey: 'kind' +}); var Post = Commentable.discriminator('Post', PostSchema); -module.exports = Post; +module.exports = Post; \ No newline at end of file diff --git a/models/vote.js b/models/vote.js index 17b55ff..b1d861c 100644 --- a/models/vote.js +++ b/models/vote.js @@ -1,18 +1,18 @@ -import Commentable from './Commentable'; +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; -var VoteSchema = new Schema( - { - user: { type: Schema.Types.ObjectId, ref: 'User' }, //just have user vote once. Query vote collection for already submitted user - votetype: Number, - commentable: { - type: Schema.Types.ObjectId, - ref: 'Commentable' - } - }, - { - discriminatorKey: 'kind' +const Commentable = require('./commentable.js'); + +var VoteSchema = new Schema({ + user: { type: Schema.Types.ObjectId, ref: 'User' }, //just have user vote once. Query vote collection for already submitted user + votetype: Number, + commentable: { + type: Schema.Types.ObjectId, + ref: 'Commentable' } -); +}, { + discriminatorKey: 'kind' +}); var Vote = Commentable.discriminator('Vote', VoteSchema); -module.exports = Vote; +module.exports = Vote; \ No newline at end of file diff --git a/repl.js b/repl.js new file mode 100644 index 0000000..4602669 --- /dev/null +++ b/repl.js @@ -0,0 +1,27 @@ +// Require mongoose and start up the REPL +// Also require our models +var mongoose = require('mongoose'); +var repl = require('repl').start({}); +var models = require('./models'); + +// Use our promise based connection +// file to wrap our REPL and execute +// only once we've connected to MongoDB +require('./mongo')().then(() => { + + // Set `models` to be available in + // the REPL by name + repl.context.models = models; + + + // Set each model to be available in the REPL + // by name + Object.keys(models).forEach((modelName) => { + repl.context[modelName] = mongoose.model(modelName); + }); + + + // Helper function to output the result of + // a query + repl.context.lg = (data) => console.log(data); +}); \ No newline at end of file diff --git a/routes/post.js b/routes/post.js new file mode 100644 index 0000000..276ef6e --- /dev/null +++ b/routes/post.js @@ -0,0 +1,25 @@ +var express = require('express'); +var router = express.Router(); +var mongoose = require('mongoose'); +var models = require('./../models'); +var Post = mongoose.model('Post'); + +router.get('/', (req, res, next) => { + Post.find().then(posts => { + res.render('posts/postsIndex', { posts }); + }) + .catch((e) => res.status(500).send(e.stack)); + +}) + + +router.get('/:id', (req, res) => { + Post.findById(req.params.id) + .then((post) => { + res.render('posts/show', { post }); + }) + .catch((e) => res.status(500).send(e.stack)); +}); + + +module.exports = router; \ No newline at end of file diff --git a/seeds/index.js b/seeds/index.js index 69171e1..7c3fb3b 100644 --- a/seeds/index.js +++ b/seeds/index.js @@ -6,9 +6,9 @@ var env = process.env.NODE_ENV || "development"; var config = require("./../config/mongo")[env]; const mongodbUrl = - process.env.NODE_ENV === "production" - ? process.env[config.use_env_variable] - : `mongodb://${config.host}/${config.database}`; + process.env.NODE_ENV === "production" ? + process.env[config.use_env_variable] : + `mongodb://${config.host}/${config.database}`; mongooseeder.seed({ mongodbUrl: mongodbUrl, @@ -19,15 +19,35 @@ mongooseeder.seed({ // -------------------------------------- // Create Users // -------------------------------------- - console.log("Creating Users"); - var users = []; + + var records = []; for (let i = 0; i < 10; i++) { var user = { username: `foobar${i}`, email: `foobar${i}@gmail.com` }; - users.push(models.User.create(user)); - } - return Promise.all(users); + records.push(models.User.create(user)); + }; + + for (let i = 0; i < 10; i++) { + var post = { + title: `Title for Post ${i}`, + body: `Body for Post ${i}`, + children: [] + }; + records.push(models.Post.create(post)); + }; + + for (let i = 0; i < 10; i++) { + var comment = { + title: `Title for Comment ${i}`, + body: `Body for Comment ${i}`, + children: [] + }; + records.push(models.Comment.create(post)); + }; + + + return Promise.all(records); } -}); +}); \ No newline at end of file diff --git a/seeds/user.js b/seeds/user.js deleted file mode 100644 index e69de29..0000000 diff --git a/views/posts/postsIndex.hbs b/views/posts/postsIndex.hbs new file mode 100644 index 0000000..2bc23bc --- /dev/null +++ b/views/posts/postsIndex.hbs @@ -0,0 +1,41 @@ + + + +{{#if posts.length }} +
+ + + + + + + + + + {{#each posts as |post| }} + + + + + + + + {{/each }} + +
AuthorTitleBody
+ {{ post.author }} + + {{ post.title }} + + {{ post.body }} + + Edit + + Delete +
+{{else }} +

No posts

+{{/if }} diff --git a/views/posts/show.hbs b/views/posts/show.hbs new file mode 100644 index 0000000..5867923 --- /dev/null +++ b/views/posts/show.hbs @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + {{#each post.children as |child|}} + + + + + {{/each}} + +
KeyValue
author{{ post.author }}
title{{ post.title }}
body{{ post.body }}
comments{{ child }}
\ No newline at end of file From 5bbabb48669d33470f621b8b7756ad8a3f085395 Mon Sep 17 00:00:00 2001 From: EdwinYung Date: Wed, 6 Dec 2017 17:00:51 -0500 Subject: [PATCH 6/9] posts work. Working on comments --- models/commentable.js | 37 +++++++++-------- routes/post.js | 82 +++++++++++++++++++++++++++++++------- routes/users.js | 79 +++++++++++++++++------------------- views/posts/edit.hbs | 22 ++++++++++ views/posts/new.hbs | 20 ++++++++++ views/posts/postsIndex.hbs | 2 +- views/posts/show.hbs | 15 ++++++- 7 files changed, 182 insertions(+), 75 deletions(-) create mode 100644 views/posts/edit.hbs create mode 100644 views/posts/new.hbs diff --git a/models/commentable.js b/models/commentable.js index 9383168..3951115 100644 --- a/models/commentable.js +++ b/models/commentable.js @@ -1,20 +1,25 @@ -var mongoose = require('mongoose'); +var mongoose = require("mongoose"); var Schema = mongoose.Schema; -var CommentableSchema = new Schema({ - author: { - type: Schema.Types.ObjectId, - ref: 'User' +var CommentableSchema = new Schema( + { + author: { + type: Schema.Types.ObjectId, + ref: "User" + }, + body: String, + children: [ + { + type: Schema.Types.ObjectId, + ref: "Commentable" + } + ] }, - body: String, - children: [{ - type: Schema.Types.ObjectId, - ref: 'Commentable' - }], -}, { - timestamps: true, - discriminatorKey: 'kind' -}); + { + timestamps: true, + discriminatorKey: "kind" + } +); -var Commentable = mongoose.model('Commentable', CommentableSchema); -module.exports = Commentable; \ No newline at end of file +var Commentable = mongoose.model("Commentable", CommentableSchema); +module.exports = Commentable; diff --git a/routes/post.js b/routes/post.js index 276ef6e..e25d235 100644 --- a/routes/post.js +++ b/routes/post.js @@ -1,25 +1,79 @@ -var express = require('express'); +var express = require("express"); var router = express.Router(); -var mongoose = require('mongoose'); -var models = require('./../models'); -var Post = mongoose.model('Post'); +var mongoose = require("mongoose"); +var models = require("./../models"); +var Post = mongoose.model("Post"); +var User = mongoose.model("User"); -router.get('/', (req, res, next) => { - Post.find().then(posts => { - res.render('posts/postsIndex', { posts }); +router.get("/", (req, res, next) => { + Post.find() + .populate("author") + .then(posts => { + res.render("posts/postsIndex", { posts }); }) - .catch((e) => res.status(500).send(e.stack)); + .catch(e => res.status(500).send(e.stack)); +}); + +router.get("/new", (req, res) => { + res.render("posts/new"); +}); -}) +router.get("/:id/edit", (req, res) => { + Post.findById(req.params.id) + .then(post => { + res.render("posts/edit", { post }); + }) + .catch(e => res.status(500).send(e.stack)); +}); +router.put("/:id", (req, res) => { + console.log(req.body); + var postParams = { + title: req.body["post[title]"], + body: req.body["post[body]"] + }; -router.get('/:id', (req, res) => { + Post.findByIdAndUpdate(req.params.id, postParams) + .then(post => { + req.method = "GET"; + res.redirect(`/posts/${post.id}`); + }) + .catch(e => res.status(500).send(e.stack)); +}); + +router.get("/:id", (req, res) => { Post.findById(req.params.id) - .then((post) => { - res.render('posts/show', { post }); + .then(post => { + User.findById(req.session.userId).then(user => { + post.authorName = user.username; + res.render("posts/show", { post }); + }); }) - .catch((e) => res.status(500).send(e.stack)); + .catch(e => res.status(500).send(e.stack)); }); +router.post("/", (req, res) => { + var post = new Post({ + author: req.session.userId, + title: req.body["post[title]"], + body: req.body["post[body]"] + }); + + post + .save() + .then(post => { + res.redirect(`/posts/${post.id}`); + }) + .catch(e => res.status(500).send(e.stack)); +}); + +router.delete("/:id", (req, res) => { + Post.findByIdAndRemove(req.params.id) + .then(() => { + req.method = "GET"; + res.redirect("/posts"); + }) + .catch(e => res.status(500).send(e.stack)); +}); -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/routes/users.js b/routes/users.js index 17e3d46..9a0208c 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,80 +1,75 @@ -var express = require('express'); +var express = require("express"); var router = express.Router(); -var mongoose = require('mongoose'); -var models = require('./../models'); -var User = mongoose.model('User'); +var mongoose = require("mongoose"); +var models = require("./../models"); +var User = mongoose.model("User"); /* GET users listing. */ -router.get('/', (req, res) => { +router.get("/", (req, res) => { User.find({}) .then(users => { - res.render('users/user_index', { users }); + res.render("users/user_index", { users }); }) .catch(e => res.status(500).send(e.stack)); }); -router.get('/new', (req, res) => { - res.render('users/new'); +router.get("/new", (req, res) => { + res.render("users/new"); }); -router.put('/:id', (req, res) => { +router.put("/:id", (req, res) => { var userParams = { - username: req.body['user[username]'], - email: req.body['user[email]'] + username: req.body["user[username]"], + email: req.body["user[email]"] }; User.findByIdAndUpdate(req.params.id, userParams) - .then((user) => { - req.method = 'GET'; - res.redirect(`/users/${ user.id }`); + .then(user => { + req.method = "GET"; + res.redirect(`/users/${user.id}`); }) - .catch((e) => res.status(500).send(e.stack)); + .catch(e => res.status(500).send(e.stack)); }); -router.get('/:id/edit', (req, res) => { + +router.get("/:id/edit", (req, res) => { User.findById(req.params.id) - .then((user) => { - res.render('users/edit', { user }); + .then(user => { + res.render("users/edit", { user }); }) - .catch((e) => res.status(500).send(e.stack)); + .catch(e => res.status(500).send(e.stack)); }); -router.get('/:id', (req, res) => { +router.get("/:id", (req, res) => { User.findById(req.params.id) - .then((user) => { - res.render('users/show', { user }); + .then(user => { + res.render("users/show", { user }); }) - .catch((e) => res.status(500).send(e.stack)); + .catch(e => res.status(500).send(e.stack)); }); - - -router.post('/', (req, res) => { +router.post("/", (req, res) => { console.log(req.body); console.log(typeof req.body); var user = new User({ - username: req.body['user[username]'], - email: req.body['user[email]'] + username: req.body["user[username]"], + email: req.body["user[email]"] }); - user.save() - .then((user) => { - res.redirect(`/users/${ user.id }`); + user + .save() + .then(user => { + res.redirect(`/users/${user.id}`); }) - .catch((e) => res.status(500).send(e.stack)); + .catch(e => res.status(500).send(e.stack)); }); - - - -router.delete('/:id', (req, res) => { +router.delete("/:id", (req, res) => { User.findByIdAndRemove(req.params.id) .then(() => { - req.method = 'GET'; - res.redirect('/users'); + req.method = "GET"; + res.redirect("/users"); }) - .catch((e) => res.status(500).send(e.stack)); + .catch(e => res.status(500).send(e.stack)); }); - - -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/views/posts/edit.hbs b/views/posts/edit.hbs new file mode 100644 index 0000000..fea6724 --- /dev/null +++ b/views/posts/edit.hbs @@ -0,0 +1,22 @@ + + + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
diff --git a/views/posts/new.hbs b/views/posts/new.hbs new file mode 100644 index 0000000..c2dd475 --- /dev/null +++ b/views/posts/new.hbs @@ -0,0 +1,20 @@ + + + +
+
+ + +
+ +
+ + +
+ +
+ +
+
diff --git a/views/posts/postsIndex.hbs b/views/posts/postsIndex.hbs index 2bc23bc..70abe6b 100644 --- a/views/posts/postsIndex.hbs +++ b/views/posts/postsIndex.hbs @@ -18,7 +18,7 @@ {{#each posts as |post| }} - {{ post.author }} + {{ post.author.username }} {{ post.title }} diff --git a/views/posts/show.hbs b/views/posts/show.hbs index 5867923..3ee5b5a 100644 --- a/views/posts/show.hbs +++ b/views/posts/show.hbs @@ -14,7 +14,7 @@ author - {{ post.author }} + {{ post.authorName }} title @@ -31,4 +31,15 @@ {{/each}} - \ No newline at end of file + + +
+
+ + +
+ +
+ +
+
From e26b5af264b37875a0941698c7e26d095e037975 Mon Sep 17 00:00:00 2001 From: SamuelLangenfeld Date: Wed, 6 Dec 2017 17:30:19 -0500 Subject: [PATCH 7/9] comments in progress --- package.json | 2 +- routes/login.js | 2 +- routes/post.js | 28 +++++++++++++++++++++++++--- views/layout.hbs | 3 ++- views/posts/show.hbs | 29 +++++++++++++++++++++++------ 5 files changed, 52 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index d8ebd43..cae88fa 100644 --- a/package.json +++ b/package.json @@ -23,4 +23,4 @@ "serve-favicon": "~2.4.5" }, "devDependencies": {} -} \ No newline at end of file +} diff --git a/routes/login.js b/routes/login.js index 8c3d233..144e3dd 100644 --- a/routes/login.js +++ b/routes/login.js @@ -12,7 +12,7 @@ router.post('/', (req, res, next) => { User.findOne({ email: req.body.email, username: req.body.username }).then(user => { req.session.userId = user.id; req.method = "get"; - res.redirect(`users/${user.id}`); + res.redirect(`/posts`); }) }) diff --git a/routes/post.js b/routes/post.js index e25d235..f8a8403 100644 --- a/routes/post.js +++ b/routes/post.js @@ -4,6 +4,8 @@ var mongoose = require("mongoose"); var models = require("./../models"); var Post = mongoose.model("Post"); var User = mongoose.model("User"); +var Comment = mongoose.model("Comment"); + router.get("/", (req, res, next) => { Post.find() @@ -42,7 +44,7 @@ router.put("/:id", (req, res) => { }); router.get("/:id", (req, res) => { - Post.findById(req.params.id) + Post.findById(req.params.id).populate({ path: 'children', populate: { path: 'author' } }) .then(post => { User.findById(req.session.userId).then(user => { post.authorName = user.username; @@ -52,11 +54,31 @@ router.get("/:id", (req, res) => { .catch(e => res.status(500).send(e.stack)); }); +router.post('/:postId/comments', (req, res) => { + var comment = new Comment({ + author: req.session.userId, + body: req.body["comment[body]"], + children: [], + parent: req.params.postId + }) + + comment.save().then(comment => { + Post.findById(req.params.postId).then(post => { + post.children.push(comment.id); + post.save().then(post => { + req.method = "GET"; + res.redirect(`/posts/${req.params.postId}`); + }) + }) + }) +}); + router.post("/", (req, res) => { var post = new Post({ author: req.session.userId, title: req.body["post[title]"], - body: req.body["post[body]"] + body: req.body["post[body]"], + children: [] }); post @@ -76,4 +98,4 @@ router.delete("/:id", (req, res) => { .catch(e => res.status(500).send(e.stack)); }); -module.exports = router; +module.exports = router; \ No newline at end of file diff --git a/views/layout.hbs b/views/layout.hbs index 068eb6b..6cf4f87 100644 --- a/views/layout.hbs +++ b/views/layout.hbs @@ -2,7 +2,8 @@ {{title}} - + + {{{body}}} diff --git a/views/posts/show.hbs b/views/posts/show.hbs index 3ee5b5a..45dd103 100644 --- a/views/posts/show.hbs +++ b/views/posts/show.hbs @@ -24,15 +24,32 @@ body {{ post.body }} - {{#each post.children as |child|}} - - comments - {{ child }} - - {{/each}} + + {{#each post.children as |child|}} +
+
+
{{child.author.username}}
+
{{ child.body }}
+
+ +
+
+ + +
+ +
+ +
+
+
+ {{/each}} + + +
From 533f2f102d7f090141699883a4e1046f6bb7e1dd Mon Sep 17 00:00:00 2001 From: EdwinYung Date: Wed, 6 Dec 2017 18:59:37 -0500 Subject: [PATCH 8/9] stuck on nested children --- app.js | 13 +- models/index.js | 15 +- package-lock.json | 474 ++++++++++++++++++++++++++++++++++++++++++- package.json | 3 +- routes/comment.js | 29 +++ routes/post.js | 34 +--- views/posts/show.hbs | 48 +++-- 7 files changed, 566 insertions(+), 50 deletions(-) create mode 100644 routes/comment.js diff --git a/app.js b/app.js index df833ac..9d990e2 100644 --- a/app.js +++ b/app.js @@ -9,10 +9,12 @@ var session = require("express-session"); var index = require("./routes/index"); var users = require("./routes/users"); var posts = require("./routes/post"); +var comments = require("./routes/comment"); var login = require("./routes/login"); var app = express(); +//middleware to connect to MongoDB via mongoose in your `app.js` var mongoose = require("mongoose"); app.use((req, res, next) => { if (mongoose.connection.readyState) { @@ -32,7 +34,7 @@ app.use(logger("dev")); app.use(bodyParser.json()); app.use( bodyParser.urlencoded({ - extended: false + extended: true }) ); app.use(cookieParser()); @@ -62,6 +64,11 @@ app.use( }) ); +const morgan = require("morgan"); +const morganToolkit = require("morgan-toolkit")(morgan); + +app.use(morganToolkit()); + app.use("/login", login); app.use(function(req, res, next) { @@ -76,7 +83,7 @@ app.use(function(req, res, next) { app.use("/", index); app.use("/users", users); app.use("/posts", posts); - +app.use("/comments", comments); // catch 404 and forward to error handler app.use(function(req, res, next) { @@ -96,4 +103,4 @@ app.use(function(err, req, res, next) { res.render("error"); }); -module.exports = app; \ No newline at end of file +module.exports = app; diff --git a/models/index.js b/models/index.js index 732d370..9373535 100644 --- a/models/index.js +++ b/models/index.js @@ -1,5 +1,5 @@ -var mongoose = require('mongoose'); -var bluebird = require('bluebird'); +var mongoose = require("mongoose"); +var bluebird = require("bluebird"); // Set bluebird as the promise // library for mongoose @@ -8,10 +8,11 @@ mongoose.Promise = bluebird; var models = {}; // Load models and attach to models here -models.User = require('./user'); -models.Post = require('./post'); -models.Comment = require('./comment'); - +models.User = require("./user"); +models.Post = require("./post"); +models.Comment = require("./comment"); +models.Commentable = require("./commentable"); //... more models -module.exports = models; \ No newline at end of file +module.exports = models; + diff --git a/package-lock.json b/package-lock.json index bd2c4a4..319d923 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/node": { + "version": "8.0.56", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.56.tgz", + "integrity": "sha512-JAlQv3hUWbrnruuTiLDf1scd4F/TBT0LgGEe+BBeF3p/Rc3yL6RV57WJN2nK5i+BshEz1sDllwH0Fzbuo7G4QA==" + }, "accepts": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", @@ -28,6 +33,24 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -102,6 +125,71 @@ "lazy-cache": "1.0.4" } }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "cli-highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-1.2.3.tgz", + "integrity": "sha512-cmc4Y2kJuEpT2KZd9pgWWskpDMMfJu2roIcY1Ya/aIItufF5FKsV/NtA6vvdhSUllR8KJfvQDNmIcskU+MKLDg==", + "requires": { + "chalk": "2.3.0", + "highlight.js": "9.12.0", + "mz": "2.7.0", + "parse5": "3.0.3", + "yargs": "10.0.3" + }, + "dependencies": { + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "yargs": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz", + "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==", + "requires": { + "cliui": "3.2.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.0.0" + } + } + } + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -121,6 +209,24 @@ } } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -160,6 +266,16 @@ "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -171,8 +287,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "optional": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "depd": { "version": "1.1.1", @@ -204,11 +319,30 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, "express": { "version": "4.15.5", "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz", @@ -305,6 +439,14 @@ } } }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "2.0.0" + } + }, "foreachasync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", @@ -320,6 +462,16 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, "handlebars": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", @@ -338,6 +490,11 @@ } } }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, "hbs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.0.1.tgz", @@ -347,6 +504,11 @@ "walk": "2.3.9" } }, + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=" + }, "hooks-fixed": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", @@ -373,6 +535,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, "ipaddr.js": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", @@ -383,11 +550,29 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, "kareem": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", @@ -407,6 +592,23 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "optional": true }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, "lodash": { "version": "4.17.4", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", @@ -422,11 +624,28 @@ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "1.1.0" + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -466,6 +685,11 @@ "mime-db": "1.30.0" } }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + }, "minimist": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", @@ -527,6 +751,15 @@ "on-headers": "1.0.1" } }, + "morgan-toolkit": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/morgan-toolkit/-/morgan-toolkit-1.0.2.tgz", + "integrity": "sha512-tFhfamRSNrnGlaVfY384lFyeHZl8Y4IwSt2219+6YEuVeEJKVBlAQHT/NSAF5hlHrloI0G578zRy0Hxv4Iv10Q==", + "requires": { + "chalk": "2.3.0", + "cli-highlight": "1.2.3" + } + }, "mpath": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", @@ -578,11 +811,39 @@ "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "1.3.0", + "object-assign": "4.1.1", + "thenify-all": "1.6.0" + } + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -605,11 +866,57 @@ "wordwrap": "0.0.3" } }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "1.1.0" + } + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "requires": { + "@types/node": "8.0.56" + } + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -629,6 +936,11 @@ "ipaddr.js": "1.4.0" } }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", @@ -679,6 +991,16 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, "require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -762,11 +1084,34 @@ "send": "0.15.6" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "setprototypeof": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, "sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", @@ -785,6 +1130,35 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", @@ -793,6 +1167,43 @@ "safe-buffer": "5.1.1" } }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "requires": { + "any-promise": "1.3.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": "3.3.0" + } + }, "type-is": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", @@ -863,6 +1274,19 @@ "foreachasync": "3.0.0" } }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", @@ -874,6 +1298,37 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", @@ -885,6 +1340,21 @@ "decamelize": "1.2.0", "window-size": "0.1.0" } + }, + "yargs-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz", + "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=", + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } } } } diff --git a/package.json b/package.json index cae88fa..bf24dfe 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "method-override": "^2.3.10", "mongoose": "^4.13.6", "mongooseeder": "^2.0.5", - "morgan": "~1.9.0", + "morgan": "^1.9.0", + "morgan-toolkit": "^1.0.2", "serve-favicon": "~2.4.5" }, "devDependencies": {} diff --git a/routes/comment.js b/routes/comment.js new file mode 100644 index 0000000..3570f27 --- /dev/null +++ b/routes/comment.js @@ -0,0 +1,29 @@ +var express = require("express"); +var router = express.Router(); +var mongoose = require("mongoose"); +var models = require("./../models"); +var Post = mongoose.model("Post"); +var User = mongoose.model("User"); +var Comment = mongoose.model("Comment"); +var Commentable = mongoose.model("Commentable"); + +router.post("/:parentId", (req, res) => { + var comment = new Comment({ + author: req.session.userId, + body: req.body.comment.body, + children: [], + parent: req.params.parentId + }); + + comment.save().then(comment => { + Commentable.findById(req.params.parentId).then(commentable => { + commentable.children.push(comment.id); + commentable.save().then(commentable => { + req.method = "GET"; + res.redirect("back"); + }); + }); + }); +}); + +module.exports = router; diff --git a/routes/post.js b/routes/post.js index f8a8403..dc47db8 100644 --- a/routes/post.js +++ b/routes/post.js @@ -6,7 +6,6 @@ var Post = mongoose.model("Post"); var User = mongoose.model("User"); var Comment = mongoose.model("Comment"); - router.get("/", (req, res, next) => { Post.find() .populate("author") @@ -31,7 +30,7 @@ router.get("/:id/edit", (req, res) => { router.put("/:id", (req, res) => { console.log(req.body); var postParams = { - title: req.body["post[title]"], + title: req.body.post.title, body: req.body["post[body]"] }; @@ -44,8 +43,16 @@ router.put("/:id", (req, res) => { }); router.get("/:id", (req, res) => { - Post.findById(req.params.id).populate({ path: 'children', populate: { path: 'author' } }) + Post.findById(req.params.id) + .populate({ + path: "children author", + populate: { + path: "children author", + populate: { path: "children author" } + } + }) .then(post => { + console.log(JSON.stringify(post, null, 2)); User.findById(req.session.userId).then(user => { post.authorName = user.username; res.render("posts/show", { post }); @@ -54,25 +61,6 @@ router.get("/:id", (req, res) => { .catch(e => res.status(500).send(e.stack)); }); -router.post('/:postId/comments', (req, res) => { - var comment = new Comment({ - author: req.session.userId, - body: req.body["comment[body]"], - children: [], - parent: req.params.postId - }) - - comment.save().then(comment => { - Post.findById(req.params.postId).then(post => { - post.children.push(comment.id); - post.save().then(post => { - req.method = "GET"; - res.redirect(`/posts/${req.params.postId}`); - }) - }) - }) -}); - router.post("/", (req, res) => { var post = new Post({ author: req.session.userId, @@ -98,4 +86,4 @@ router.delete("/:id", (req, res) => { .catch(e => res.status(500).send(e.stack)); }); -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/views/posts/show.hbs b/views/posts/show.hbs index 45dd103..ec7aed4 100644 --- a/views/posts/show.hbs +++ b/views/posts/show.hbs @@ -27,15 +27,27 @@ - + + +
+ + +
+ +
+ +
+ + + {{#each post.children as |child|}} -
+
{{child.author.username}}
{{ child.body }}
-
+
@@ -46,17 +58,25 @@
- {{/each}} - + {{#each post.children.children as |nestedChild|}} +
+
+
{{nestedChild.author.username}}
+
{{ nestedChild.body }}
+
-
-
- - -
+ +
+ + +
-
- -
-
+
+ +
+ +
+ {{/each}} + + {{/each}} From 6bc1a1c7a4bfdeccac9309de34be29682f355426 Mon Sep 17 00:00:00 2001 From: SamuelLangenfeld Date: Wed, 6 Dec 2017 19:54:01 -0500 Subject: [PATCH 9/9] pretty much working. still don't have voting --- app.js | 5 ++--- routes/comment.js | 4 ++-- routes/login.js | 2 +- routes/post.js | 17 +++++++++-------- routes/users.js | 4 +--- views/posts/show.hbs | 35 +++++++++++++++-------------------- 6 files changed, 30 insertions(+), 37 deletions(-) diff --git a/app.js b/app.js index 9d990e2..b6cfb5e 100644 --- a/app.js +++ b/app.js @@ -31,7 +31,6 @@ app.set("view engine", "hbs"); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger("dev")); -app.use(bodyParser.json()); app.use( bodyParser.urlencoded({ extended: true @@ -72,7 +71,7 @@ app.use(morganToolkit()); app.use("/login", login); app.use(function(req, res, next) { - if (!req.session.userId && req.path != "/login") { + if (!req.cookies.userId && req.path != "/login") { req.path = "/login"; res.redirect("/login"); } else { @@ -103,4 +102,4 @@ app.use(function(err, req, res, next) { res.render("error"); }); -module.exports = app; +module.exports = app; \ No newline at end of file diff --git a/routes/comment.js b/routes/comment.js index 3570f27..3763ac2 100644 --- a/routes/comment.js +++ b/routes/comment.js @@ -9,7 +9,7 @@ var Commentable = mongoose.model("Commentable"); router.post("/:parentId", (req, res) => { var comment = new Comment({ - author: req.session.userId, + author: req.cookies.userId, body: req.body.comment.body, children: [], parent: req.params.parentId @@ -26,4 +26,4 @@ router.post("/:parentId", (req, res) => { }); }); -module.exports = router; +module.exports = router; \ No newline at end of file diff --git a/routes/login.js b/routes/login.js index 144e3dd..8c1fe33 100644 --- a/routes/login.js +++ b/routes/login.js @@ -10,7 +10,7 @@ router.get('/', (req, res, next) => { router.post('/', (req, res, next) => { User.findOne({ email: req.body.email, username: req.body.username }).then(user => { - req.session.userId = user.id; + res.cookie("userId", user.id); req.method = "get"; res.redirect(`/posts`); }) diff --git a/routes/post.js b/routes/post.js index dc47db8..6dea177 100644 --- a/routes/post.js +++ b/routes/post.js @@ -28,10 +28,9 @@ router.get("/:id/edit", (req, res) => { }); router.put("/:id", (req, res) => { - console.log(req.body); var postParams = { title: req.body.post.title, - body: req.body["post[body]"] + body: req.body.body }; Post.findByIdAndUpdate(req.params.id, postParams) @@ -52,8 +51,7 @@ router.get("/:id", (req, res) => { } }) .then(post => { - console.log(JSON.stringify(post, null, 2)); - User.findById(req.session.userId).then(user => { + User.findById(req.cookies.userId).then(user => { post.authorName = user.username; res.render("posts/show", { post }); }); @@ -62,13 +60,16 @@ router.get("/:id", (req, res) => { }); router.post("/", (req, res) => { + var post = new Post({ - author: req.session.userId, - title: req.body["post[title]"], - body: req.body["post[body]"], + author: req.cookies.userId, + + title: req.body.post.title, + body: req.body.post.body, children: [] }); + post .save() .then(post => { @@ -86,4 +87,4 @@ router.delete("/:id", (req, res) => { .catch(e => res.status(500).send(e.stack)); }); -module.exports = router; +module.exports = router; \ No newline at end of file diff --git a/routes/users.js b/routes/users.js index 9a0208c..3d7e305 100644 --- a/routes/users.js +++ b/routes/users.js @@ -48,8 +48,6 @@ router.get("/:id", (req, res) => { }); router.post("/", (req, res) => { - console.log(req.body); - console.log(typeof req.body); var user = new User({ username: req.body["user[username]"], email: req.body["user[email]"] @@ -72,4 +70,4 @@ router.delete("/:id", (req, res) => { .catch(e => res.status(500).send(e.stack)); }); -module.exports = router; +module.exports = router; \ No newline at end of file diff --git a/views/posts/show.hbs b/views/posts/show.hbs index ec7aed4..1a339f3 100644 --- a/views/posts/show.hbs +++ b/views/posts/show.hbs @@ -7,30 +7,24 @@ - - + + + - - - - - - -
KeyValueAuthorTitleBody
author {{ post.authorName }}
title {{ post.title }}
body {{ post.body }}
- +
- +
@@ -38,16 +32,17 @@
+
{{#each post.children as |child|}} -
+
-
{{child.author.username}}
-
{{ child.body }}
+
Author: {{child.author.username}}
+
Body: {{ child.body }}
-
+
@@ -59,14 +54,14 @@
- {{#each post.children.children as |nestedChild|}} -
+ {{#each child.children as |nestedChild|}} +
-
{{nestedChild.author.username}}
-
{{ nestedChild.body }}
+
Author: {{nestedChild.author.username}}
+
Body: {{ nestedChild.body }}
-
+