diff --git a/.gitignore b/.gitignore index cef2387..4148712 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ node_modules *.log .env -/build +/build/* +/seeds/* +.DS_Store diff --git a/bin/www b/bin/www index 9a999cc..321c04d 100755 --- a/bin/www +++ b/bin/www @@ -88,3 +88,11 @@ function onListening() { : 'port ' + addr.port; debug('Listening on ' + bind); } + +const mongoose = require('mongoose') +mongoose.Promise = global.Promise +const connection ='mongodb://localhost/lizardboard' + +mongoose.connect(connection) + .then(() => console.log('connection succesful')) + .catch((error) => console.error(error)) diff --git a/models/dashboards.js b/models/dashboards.js new file mode 100644 index 0000000..1fe77fc --- /dev/null +++ b/models/dashboards.js @@ -0,0 +1,20 @@ +const mongoose = require('mongoose') +const { Schema } = mongoose +const User = require('./users.js') +const { DashboardWidgetSchema } = require('./dashboardwidgets.js') + +const DashboardSchema = new Schema ({ + name: { type: String, required: true, default: 'Company Dashboard' }, + location: { type: String, required: true, default: 'Oakland' }, + width: { type: Number, required: true, default: 2 }, + theme: { type: String, required: true, default: 'Dark' }, + responsive: { type: Boolean, required: true, default: true }, + created_at: { type: Date, required: true, default: Date.now }, + users: [{ type: Schema.Types.ObjectId, ref:'User' }], + dashboard_widgets: [ DashboardWidgetSchema ] +}) + + +const Dashboard = mongoose.model('Dashboard', DashboardSchema) + +module.exports = Dashboard diff --git a/models/dashboardwidgets.js b/models/dashboardwidgets.js new file mode 100644 index 0000000..590fe56 --- /dev/null +++ b/models/dashboardwidgets.js @@ -0,0 +1,13 @@ +const mongoose = require('mongoose') +const { Schema } = mongoose + +const DashboardWidgetSchema = new Schema ({ + type: String, + title: String, + size: String, + contents: String +}) + +const DashboardWidget = mongoose.model( 'DasboardWidget', DashboardWidgetSchema ) + +module.exports = { DashboardWidgetSchema, DashboardWidget } diff --git a/models/users.js b/models/users.js new file mode 100644 index 0000000..f6e17ae --- /dev/null +++ b/models/users.js @@ -0,0 +1,20 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const UserSchema = new Schema({ + name: String, + username: { type: String, required: true, unique: true }, + password: { type: String, required: true }, + admin: Boolean, + location: String, + meta: { + age: Number, + website: String + }, + created_at: Date, + updated_at: Date +}); + +const User = mongoose.model('User', UserSchema); + +module.exports = User; diff --git a/models/widgets.js b/models/widgets.js new file mode 100644 index 0000000..ed4cdf8 --- /dev/null +++ b/models/widgets.js @@ -0,0 +1,13 @@ +const mongoose = require('mongoose') +const { Schema } = mongoose + +const WidgetSchema = new Schema ({ + type: String, + title: String, + size: String, + contents: String +}) + +const Widget = mongoose.model( 'Widget', WidgetSchema ) + +module.exports = { WidgetSchema, Widget } diff --git a/package.json b/package.json index 5533364..da52313 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "debug": "~2.2.0", "ejs": "^2.5.2", "express": "~4.13.4", - "mongoose": "^4.6.5", + "mongoose": "^4.6.6", "morgan": "~1.7.0", "pug": "^2.0.0-beta6", "react": "^15.3.2", diff --git a/routes/api/manifest.js b/routes/api/manifest.js new file mode 100644 index 0000000..5f70547 --- /dev/null +++ b/routes/api/manifest.js @@ -0,0 +1,7 @@ +const dashboards = require('./v1/dashboards') +const users = require('./v1/users') + + +module.exports = { + v1: { dashboards, users } +} diff --git a/routes/api/v1/dashboards.js b/routes/api/v1/dashboards.js new file mode 100644 index 0000000..6020351 --- /dev/null +++ b/routes/api/v1/dashboards.js @@ -0,0 +1,69 @@ +const Dashboard = require('../../../models/dashboards.js') +const { DashboardWidget } = require('../../../models/dashboardwidgets.js') + +const express = require('express') +const router = express.Router() + +router.get('/', (request, response, next) => { + Dashboard.find().exec() + .then( dashboard => response.json( dashboard ) ) + .catch( error => next( error ) ) +}) + +router.post('/', (request, response, next) => { + Dashboard.create( request.body ) + .then( dashboard => response.json( dashboard ) ) + .catch( error => next( error ) ) +}) + +router.get('/:id', (request, response, next) => { + Dashboard.findById( request.params.id ).exec() + .then( dashboard => response.json( dashboard ) ) + .catch( error => next( error ) ) +}) + +router.put('/:id', (request, response, next) => { + Dashboard.findByIdAndUpdate( request.params.id, request.body ).exec() + .then( dashboard => response.json( dashboard ) ) + .catch( error => next( error ) ) +}) + +router.delete('/:id',(request, response, next) => { + Dashboard.findByIdAndRemove( request.params.id ).exec() + .then( dashboard => response.json( dashboard ) ) + .catch( error => next( error ) ) +}) + +// get all widgets by dashboard_id +// GET dashboards/:id/widgets/ + +// router.get('/:id/widgets/', (request, response, next) => { +// const findAllWidgets = widgetData => dashboard => { +// return dashboard.widgets.find().exec() +// } +// Widget.find({}, 'widgets' +// Dashboard.findById( request.params.id ).exec() +// .then( ).exec()) +// .then( dashboard => response.json( dashboard ) ) +// .catch( error => next( error ) ) +// }) + +router.post('/:id/dashboardwidgets', (request, response, next) => { + const addDashboardWidget = dashboardWidgetData => dashboard => { + dashboard.dashboard_widgets.push( new DashboardWidget( dashboardWidgetData ) ) + return dashboard.save() + } + + Dashboard.findById( request.params.id ).exec() + .then( addDashboardWidget( request.body )) + .then( dashboard => response.json( dashboard ) ) + .catch( error => next( error ) ) +}) + +// update widget by dashboard_id and widget_id +// PUT dashboards/:id/widgets/:id + +// delete widget by dashboard_id and widget_id +// DELETE dashboards/:id/widgets/:id + +module.exports = router diff --git a/routes/api/v1/users.js b/routes/api/v1/users.js new file mode 100644 index 0000000..27eb3cd --- /dev/null +++ b/routes/api/v1/users.js @@ -0,0 +1,36 @@ +const User = require('../../../models/users.js') + +const express = require('express') +const router = express.Router() + +router.get('/', (request, response, next) => { + User.find().exec() + .then( user => response.json( user ) ) + .catch( error => next( error ) ) +}) + +router.post('/', (request, response, next) => { + User.create( request.body ) + .then( user => response.json( user ) ) + .catch( error => next( error ) ) +}) + +router.get('/:id', (request, response, next) => { + User.findById( request.params.id ).exec() + .then( user => response.json( user ) ) + .catch( error => next( error ) ) +}) + +router.put('/:id', (request, response, next) => { + User.findByIdAndUpdate( request.params.id, request.body ).exec() + .then( user => response.json( user ) ) + .catch( error => next( error ) ) +}) + +router.delete('/:id',(request, response, next) => { + User.findByIdAndRemove( request.params.id ).exec() + .then( user => response.json( user ) ) + .catch( error => next( error ) ) +}) + +module.exports = router diff --git a/routes/index.js b/routes/index.js index 806b164..3055fa8 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,7 +1,6 @@ const express = require('express'); const router = express.Router(); -/* GET home page. */ router.get('/', (request, response, next) => { response.render('index', { title: 'Dragonboard', logo: 'D' }); }); diff --git a/server/index.js b/server/index.js index 3d4d5c1..9b54fde 100644 --- a/server/index.js +++ b/server/index.js @@ -8,6 +8,9 @@ const bodyParser = require('body-parser'); const routes = require('../routes/index'); const users = require('../routes/users'); +// const widgets = require( './routes/widgets' ) +const api = require( '../routes/api/manifest').v1 + const appRoot = process.env.APP_ROOT const app = express(); @@ -38,6 +41,10 @@ app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/users', users); +app.use( '/api/v1/dashboards', api.dashboards ) +app.use( '/api/v1/users', api.users ) + + // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); @@ -69,5 +76,4 @@ app.use(function(err, req, res, next) { }); }); - -module.exports = app; \ No newline at end of file +module.exports = app; diff --git a/views/dashboard.pug b/views/dashboard.pug new file mode 100644 index 0000000..1f49feb --- /dev/null +++ b/views/dashboard.pug @@ -0,0 +1,8 @@ +extends layout + +block content + h1 Create a Dashboard + form(action='/dashboards',method='post') + | Dashboard Name: + input(name='name' type='text' value='Company Dashboard' placeholder='dashboard title') + input(type='submit', value='Submit') diff --git a/views/layout.pug b/views/layout.pug index d6daa39..6bda451 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -6,21 +6,21 @@ html link(rel='stylesheet', href='/stylesheets/style.css') div.nav - div.nav-header-left - h1.logo= logo - h2.title= title + div.nav-header-left + h1.logo= logo + h2.title= title - div.nav-header-right - a(href= '/product') Product - a(href= '/users/login') Login - input(type="text", placeholder="Email address") - button(type="submit" ) Free Trial + div.nav-header-right + a(href= '/product') Product + a(href= '/users/login') Login + input(type="text", placeholder="Email address") + button(type="submit" ) Free Trial body block content div.footer-nav - include footer - script(src="/javascripts/index.js") - script(src="/public/javascripts/index.js") + //- include footer + //- script(src="/javascripts/index.js") + //- script(src="/public/javascripts/index.js") diff --git a/yarn.lock b/yarn.lock index 53dcb99..2a15957 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,8 +34,8 @@ align-text@^0.1.1, align-text@^0.1.3: repeat-string "^1.5.2" amdefine@>=0.0.4: - version "1.0.0" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" ansi-regex@^2.0.0: version "2.0.0" @@ -109,11 +109,11 @@ async@~0.2.6: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" -async@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" +async@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" dependencies: - lodash "^4.8.0" + lodash "^4.14.0" asynckit@^0.4.0: version "0.4.0" @@ -157,8 +157,8 @@ babel-code-frame@^6.16.0: js-tokens "^2.0.0" babel-core@^6.13.2, babel-core@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.0.tgz#bb5ce9bc0a956e6e94e2f12d597abb3b0b330deb" + version "6.18.2" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.2.tgz#d8bb14dd6986fa4f3566a26ceda3964fa0e04e5b" dependencies: babel-code-frame "^6.16.0" babel-generator "^6.18.0" @@ -762,10 +762,8 @@ cliui@^2.1.0: wordwrap "0.0.2" code-point-at@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" - dependencies: - number-is-nan "^1.0.0" + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" @@ -868,7 +866,13 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@^2.1.1, debug@^2.2.0, debug@~2.2.0, debug@2.2.0: +debug@^2.1.1, debug@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.0.tgz#3912dc55d7167fc3af17d2b85c13f93deaedaa43" + dependencies: + ms "0.7.2" + +debug@~2.2.0, debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -1125,8 +1129,8 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.0.14" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.14.tgz#558e8cc38643d8ef40fe45158486d0d25758eee4" + version "1.0.15" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" dependencies: nan "^2.3.0" node-pre-gyp "^0.6.29" @@ -1243,8 +1247,8 @@ got@^3.2.0: timed-out "^2.0.0" graceful-fs@^4.1.2, graceful-fs@^4.1.4: - version "4.1.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" + version "4.1.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.10.tgz#f2d720c22092f743228775c75e3612632501f131" "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -1681,9 +1685,9 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" -lodash@^4.2.0, lodash@^4.8.0: - version "4.16.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.5.tgz#77d88feac548009b1a5c4ca7b49ac431ce346ae8" +lodash@^4.14.0, lodash@^4.2.0: + version "4.16.6" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" longest@^1.0.1: version "1.0.1" @@ -1798,11 +1802,11 @@ mongodb@2.2.11: mongodb-core "2.0.13" readable-stream "2.1.5" -mongoose@^4.6.5: - version "4.6.5" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.6.5.tgz#74eed37312e557c391d428c0cf3c8b8eb8959515" +mongoose: + version "4.6.6" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.6.6.tgz#62817b63804dcefd2e5c6f7e6a9bb68e30811968" dependencies: - async "2.0.1" + async "2.1.2" bson "~0.5.4" hooks-fixed "1.2.0" kareem "1.1.3" @@ -1846,6 +1850,10 @@ ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + muri@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/muri/-/muri-1.1.1.tgz#64bd904eaf8ff89600c994441fad3c5195905ac2" @@ -2274,8 +2282,8 @@ regenerate@^1.2.1: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.1.tgz#0300203a5d2fdcf89116dce84275d011f5903f33" regenerator-runtime@^0.9.5: - version "0.9.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" + version "0.9.6" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" regex-cache@^0.4.2: version "0.4.3" @@ -2333,8 +2341,8 @@ repeating@^2.0.0: is-finite "^1.0.0" request@^2.75.0: - version "2.76.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.76.0.tgz#be44505afef70360a0436955106be3945d95560e" + version "2.78.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.78.0.tgz#e1c8dec346e1c81923b24acdb337f11decabe9cc" dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -2649,8 +2657,8 @@ type-is@~1.6.13, type-is@~1.6.6: mime-types "~2.1.11" ua-parser-js@^0.7.9: - version "0.7.10" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.10.tgz#917559ddcce07cbc09ece7d80495e4c268f4ef9f" + version "0.7.11" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.11.tgz#3741e2dd2fb09251a960f9ef076cd0cc72eaf6a0" uglify-js@^2.6.1: version "2.7.4"