From 7ff12abe2f00403ba6ccfbd6e2f1b45bb98de1d2 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Tue, 15 Sep 2015 16:17:13 -0700 Subject: [PATCH 01/96] Generated node framework & customer & movie controllers & added node_modules to gitignore. --- .gitignore | 1 + app.js | 60 ++++++++++++++++++++++++ bin/www | 90 ++++++++++++++++++++++++++++++++++++ controllers/customers.js | 0 controllers/movies.js | 0 package.json | 17 +++++++ public/stylesheets/style.css | 8 ++++ routes/index.js | 9 ++++ routes/users.js | 9 ++++ views/error.jade | 6 +++ views/index.jade | 5 ++ views/layout.jade | 7 +++ 12 files changed, 212 insertions(+) create mode 100644 app.js create mode 100755 bin/www create mode 100644 controllers/customers.js create mode 100644 controllers/movies.js create mode 100644 package.json create mode 100644 public/stylesheets/style.css create mode 100644 routes/index.js create mode 100644 routes/users.js create mode 100644 views/error.jade create mode 100644 views/index.jade create mode 100644 views/layout.jade diff --git a/.gitignore b/.gitignore index e43b0f9..03e05e4 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .DS_Store +/node_modules diff --git a/app.js b/app.js new file mode 100644 index 0000000..80a3c36 --- /dev/null +++ b/app.js @@ -0,0 +1,60 @@ +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 routes = 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', 'jade'); + +// 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('/', routes); +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 handlers + +// development error handler +// will print stacktrace +if (app.get('env') === 'development') { + app.use(function(err, req, res, next) { + res.status(err.status || 500); + res.render('error', { + message: err.message, + error: err + }); + }); +} + +// production error handler +// no stacktraces leaked to user +app.use(function(err, req, res, next) { + res.status(err.status || 500); + res.render('error', { + message: err.message, + error: {} + }); +}); + + +module.exports = app; diff --git a/bin/www b/bin/www new file mode 100755 index 0000000..cc43085 --- /dev/null +++ b/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('C3Projects--VideoStoreAPI: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/controllers/customers.js b/controllers/customers.js new file mode 100644 index 0000000..e69de29 diff --git a/controllers/movies.js b/controllers/movies.js new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json new file mode 100644 index 0000000..0ab806b --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "C3Projects--VideoStoreAPI", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "dependencies": { + "body-parser": "~1.13.2", + "cookie-parser": "~1.3.5", + "debug": "~2.2.0", + "express": "~4.13.1", + "jade": "~1.11.0", + "morgan": "~1.6.1", + "serve-favicon": "~2.3.0" + } +} \ 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/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/views/error.jade b/views/error.jade new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/views/index.jade b/views/index.jade new file mode 100644 index 0000000..3d63b9a --- /dev/null +++ b/views/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p Welcome to #{title} diff --git a/views/layout.jade b/views/layout.jade new file mode 100644 index 0000000..15af079 --- /dev/null +++ b/views/layout.jade @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content From 4303a894fc33b9db2435936e4fd9f420b884e2f7 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Tue, 15 Sep 2015 16:25:37 -0700 Subject: [PATCH 02/96] finished zomg it works endpoint --- controllers/movies.js | 10 ++++++++++ routes/index.js | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/controllers/movies.js b/controllers/movies.js index e69de29..f57de32 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -0,0 +1,10 @@ +"use strict"; + +exports.moviesController = { + zomg: function getZomg(req, res) { + var results = { + zomg: "it works!" + } + return res.status(200).json(results); + } +} diff --git a/routes/index.js b/routes/index.js index ecca96a..c361ff7 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,9 +1,14 @@ var express = require('express'); var router = express.Router(); +var movie_exports = require('../controllers/movies') /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); +router.get('/zomg', function(req, res, next){ + return movie_exports.moviesController.zomg(req, res); +}); + module.exports = router; From ac261111ad0e4aeee6ece82c8db5094922ce5f1b Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Tue, 15 Sep 2015 16:45:47 -0700 Subject: [PATCH 03/96] Setup routes for zomg; changed users to customers & added movies.js. --- app.js | 6 ++++-- controllers/customers.js | 1 + routes/{users.js => customers.js} | 1 + routes/movies.js | 14 ++++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) rename routes/{users.js => customers.js} (77%) create mode 100644 routes/movies.js diff --git a/app.js b/app.js index 80a3c36..9f93fc6 100644 --- a/app.js +++ b/app.js @@ -6,7 +6,8 @@ var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var routes = require('./routes/index'); -var users = require('./routes/users'); +var movies = require('./routes/movies'); +var customers = require('./routes/customers'); var app = express(); @@ -23,7 +24,8 @@ app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); -app.use('/users', users); +app.use('/customers', customers); +app.use('/movies', movies); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/controllers/customers.js b/controllers/customers.js index e69de29..3918c74 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -0,0 +1 @@ +"use strict"; diff --git a/routes/users.js b/routes/customers.js similarity index 77% rename from routes/users.js rename to routes/customers.js index 623e430..506a347 100644 --- a/routes/users.js +++ b/routes/customers.js @@ -1,5 +1,6 @@ var express = require('express'); var router = express.Router(); +var customer_exports = require('../controllers/customers'); /* GET users listing. */ router.get('/', function(req, res, next) { diff --git a/routes/movies.js b/routes/movies.js new file mode 100644 index 0000000..75f40fa --- /dev/null +++ b/routes/movies.js @@ -0,0 +1,14 @@ +var express = require('express'); +var router = express.Router(); +var movie_exports = require('../controllers/movies'); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'Movies' }); +}); + +router.get('/zomg', function(req, res, next){ + return movie_exports.moviesController.zomg(req, res); +}); + +module.exports = router; From 7db7a9329ce67b05de957b577dec76ab91c200f1 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Tue, 15 Sep 2015 16:58:27 -0700 Subject: [PATCH 04/96] Added pseudo-code for movies. --- controllers/movies.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/controllers/movies.js b/controllers/movies.js index f57de32..790327d 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -7,4 +7,20 @@ exports.moviesController = { } return res.status(200).json(results); } + + /* + GET /movies + + GET /movies/title?n=XXX&p=XXX + + GET /movies/release_date?n=XXX&p=XXX + + GET /movies/:title/checked_out_current + + GET /movies/:title/checked_out_history?ordered_by=XXX + // ordered_by + // - id + // - name + // - check out date + */ } From a1b0467af89e618dea94a81773958b9041a115b4 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Thu, 17 Sep 2015 13:42:44 -0700 Subject: [PATCH 05/96] Psuedo code for routes --- controllers/customers.js | 17 +++++++++++++++++ controllers/movies.js | 4 ++++ controllers/rentals.js | 15 +++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 controllers/rentals.js diff --git a/controllers/customers.js b/controllers/customers.js index 3918c74..bd55c90 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -1 +1,18 @@ "use strict"; + +exports.customersController = { + /* + GET /customers + all customers + + GET /customers/:id + (currently checkout_out movies, rental history) + + GET /customers/name?n=XXX&p=XXX + + GET /customers/registered_at?n=XXX&p=XXX + + GET /customers/postal_code?n=XXX&p=XXX + + */ +} diff --git a/controllers/movies.js b/controllers/movies.js index 790327d..4298254 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -11,6 +11,10 @@ exports.moviesController = { /* GET /movies + Get /movies/:id(synopsis, inventory, release_date) + + GET /movies/:title/inventory + GET /movies/title?n=XXX&p=XXX GET /movies/release_date?n=XXX&p=XXX diff --git a/controllers/rentals.js b/controllers/rentals.js new file mode 100644 index 0000000..e1f4d16 --- /dev/null +++ b/controllers/rentals.js @@ -0,0 +1,15 @@ +"use strict"; + +exports.rentalsController = { + /* + GET /rentals/overdue + movies and the customer associated with it + + GET /rentals/checkout_out + + POST /rentals/check_out(cust id, movie title) (math for checkout cost) + + PATCH /rentals/check_in(cust id, movie title) + + */ +} From ac1b5c041d8008143f99fb1c01a424cff730458e Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 17 Sep 2015 13:55:31 -0700 Subject: [PATCH 06/96] Created utils folder for schema and seed data. --- customers.json => utils/customers.json | 0 movies.json => utils/movies.json | 0 utils/schema.js | 0 utils/seed.js | 1 + 4 files changed, 1 insertion(+) rename customers.json => utils/customers.json (100%) rename movies.json => utils/movies.json (100%) create mode 100644 utils/schema.js create mode 100644 utils/seed.js diff --git a/customers.json b/utils/customers.json similarity index 100% rename from customers.json rename to utils/customers.json diff --git a/movies.json b/utils/movies.json similarity index 100% rename from movies.json rename to utils/movies.json diff --git a/utils/schema.js b/utils/schema.js new file mode 100644 index 0000000..e69de29 diff --git a/utils/seed.js b/utils/seed.js new file mode 100644 index 0000000..3918c74 --- /dev/null +++ b/utils/seed.js @@ -0,0 +1 @@ +"use strict"; From a352697d0b19cac7a314836b8c5bbbbc0100c3d6 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 17 Sep 2015 14:15:28 -0700 Subject: [PATCH 07/96] Added db folder to gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 03e05e4..deca3a1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store /node_modules +/db From 04ba619cf09caa0e71ad6a432401b3c48db19ce3 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 17 Sep 2015 14:15:41 -0700 Subject: [PATCH 08/96] Set up schema for database. --- utils/schema.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/utils/schema.js b/utils/schema.js index e69de29..567759b 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -0,0 +1,31 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development', + db = new sqlite3.Database('db/' + db_env + '.db'); + +var movie_fields = [ + ['title', 'text'], + ['overview', 'text'], + ['release_date', 'text'], + ['inventory', 'integer'] +] + +db.serialize(function() { + // drop existing tables + db.run("DROP TABLE IF EXISTS movies;"); + + // create fresh versions of those tables + db.run("CREATE TABLE movies (id INTEGER PRIMARY KEY);"); + + // add columns that I need to those tables + for(var i = 0; i < movie_fields.length; i++) { + var name = movie_fields[i][0], + type = movie_fields[i][1]; + + // ALTER TABLE movies ADD COLUMN title text; + db.run("ALTER TABLE movies ADD COLUMN " + name + " " + type + ";"); + } +}); + +db.close(); From 39c2136e553fa228c78c075a48851d44930e4210 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 17 Sep 2015 14:36:59 -0700 Subject: [PATCH 09/96] Added sqlite3 to package.json. --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0ab806b..87e6a93 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "express": "~4.13.1", "jade": "~1.11.0", "morgan": "~1.6.1", - "serve-favicon": "~2.3.0" + "serve-favicon": "~2.3.0", + "sqlite3": "^3.1.0" } -} \ No newline at end of file +} From 34db91529b389359aec407f442f3e9559b434ea8 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 17 Sep 2015 14:37:20 -0700 Subject: [PATCH 10/96] Added schema for all tables & added seed data from json files. --- utils/schema.js | 53 +++++++++++++++++++++++++++++++++++++++++++++ utils/seed.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/utils/schema.js b/utils/schema.js index 567759b..68fa138 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -28,4 +28,57 @@ db.serialize(function() { } }); +var customer_fields = [ + ['name', 'text'], + ['registered_at', 'text'], + ['address', 'text'], + ['city', 'text'], + ['state', 'text'], + ['postal_code', 'text'], + ['phone', 'text'], + ['account_credit', 'real'] +] + +db.serialize(function() { + // drop existing tables + db.run("DROP TABLE IF EXISTS customers;"); + + // create fresh versions of those tables + db.run("CREATE TABLE customers (id INTEGER PRIMARY KEY);"); + + // add columns that I need to those tables + for(var i = 0; i < customer_fields.length; i++) { + var name = customer_fields[i][0], + type = customer_fields[i][1]; + + // ALTER TABLE movies ADD COLUMN title text; + db.run("ALTER TABLE customers ADD COLUMN " + name + " " + type + ";"); + } +}); + +var rental_fields = [ + ['check_out_date', 'text'], + ['check_in_date', 'text'], + ['expected_return_date', 'text'], + ['customer_id', 'integer'], + ['movie_id', 'integer'] +] + +db.serialize(function() { + // drop existing tables + db.run("DROP TABLE IF EXISTS rentals;"); + + // create fresh versions of those tables + db.run("CREATE TABLE rentals (id INTEGER PRIMARY KEY);"); + + // add columns that I need to those tables + for(var i = 0; i < customer_fields.length; i++) { + var name = customer_fields[i][0], + type = customer_fields[i][1]; + + // ALTER TABLE movies ADD COLUMN title text; + db.run("ALTER TABLE rentals ADD COLUMN " + name + " " + type + ";"); + } +}); + db.close(); diff --git a/utils/seed.js b/utils/seed.js index 3918c74..6be97f9 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -1 +1,58 @@ "use strict"; + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development', + db = new sqlite3.Database('db/' + db_env + '.db'); + +var movies = require('./movies'); +//insert into movies(title, inventory) values("Jaws", 10); +var movie_statement = db.prepare( + "INSERT INTO movies(title, overview, inventory, release_date) \ + VALUES (?, ?, ?, ?);" +); + +db.serialize(function() { + // loop them movies + for(var i = 0; i < movies.length; i++) { + var movie = movies[i]; + + // insert each one into the db + movie_statement.run( + movie.title, + movie.overview, + movie.inventory, + movie.release_date + ); + } + + movie_statement.finalize(); +}); + +var customers = require('./customers'); +var customer_statement = db.prepare( + "INSERT INTO customers(name, registered_at, address, city, state, postal_code, \ + phone, account_credit) VALUES (?, ?, ?, ?, ?, ?, ?, ?);" +); + +db.serialize(function() { + // loop them movies + for(var i = 0; i < customers.length; i++) { + var customer = customers[i]; + + // insert each one into the db + customer_statement.run( + customer.name, + customer.registered_at, + customer.address, + customer.city, + customer.state, + customer.postal_code, + customer.phone, + customer.account_credit + ); + } + + customer_statement.finalize(); +}); + +db.close(); From 63bdc817465c8d50f30a07ee6ccbd55e025cb07a Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 17 Sep 2015 14:51:55 -0700 Subject: [PATCH 11/96] Added custom scripts to packages.json file. --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 87e6a93..393d10c 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,9 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www" + "start": "node ./bin/www", + "reset": "node ./utils/schema", + "seed": "node ./utils/seed" }, "dependencies": { "body-parser": "~1.13.2", From 330220a1867291e23f38bd01f115f99540bee233 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 17 Sep 2015 15:05:31 -0700 Subject: [PATCH 12/96] Set up mocha with phony test. --- test/test.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 test/test.js diff --git a/test/test.js b/test/test.js new file mode 100644 index 0000000..d5b377f --- /dev/null +++ b/test/test.js @@ -0,0 +1,11 @@ +"use strict"; + +var assert = require("assert"); +describe('Array', function() { + describe('#indexOf()', function () { + it('should return -1 when the value is not present', function () { + assert.equal(-1, [1,2,3].indexOf(5)); + assert.equal(-1, [1,2,3].indexOf(0)); + }); + }); +}); From 70e23f7e353b9994d32a4b93da78811e1d50964d Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Thu, 17 Sep 2015 15:35:00 -0700 Subject: [PATCH 13/96] WIP testing --- test/database_tests.js | 25 +++++++++++++++++++++++++ test/test.js | 11 ----------- 2 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 test/database_tests.js delete mode 100644 test/test.js diff --git a/test/database_tests.js b/test/database_tests.js new file mode 100644 index 0000000..1f45b59 --- /dev/null +++ b/test/database_tests.js @@ -0,0 +1,25 @@ +"use strict"; + +var assert = require("assert"); +var Database = require('../database'); + +describe("Database", function(){ + var db; + var database_path = "db/development.db"; + + beforeEach(function(){ + db = newDatabase(database_path); + }) + + it("can be instantiated", function(){ + assert.equal(db instanceof Database, true); + }) + + it("has a `test` property that is a function", function(){ + assert.equal(typeof db.test, "function"); + }) + + it("holds onto the `path` to the database", function(){ + assert.equal(db.path, database_path); + }) +}) diff --git a/test/test.js b/test/test.js deleted file mode 100644 index d5b377f..0000000 --- a/test/test.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; - -var assert = require("assert"); -describe('Array', function() { - describe('#indexOf()', function () { - it('should return -1 when the value is not present', function () { - assert.equal(-1, [1,2,3].indexOf(5)); - assert.equal(-1, [1,2,3].indexOf(0)); - }); - }); -}); From 08a81b6ed119fde53929f25e6736feb04855ee21 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Thu, 17 Sep 2015 23:11:57 -0700 Subject: [PATCH 14/96] WIP tring to get movies to show by title, index and all --- controllers/movies.js | 39 ++++++++++++++++--- npm-debug.log | 36 +++++++++++++++++ routes/index.js | 5 ++- routes/movies.js | 31 +++++++++++++-- test/movies_controller_tests.js | 68 +++++++++++++++++++++++++++++++++ 5 files changed, 168 insertions(+), 11 deletions(-) create mode 100644 npm-debug.log create mode 100644 test/movies_controller_tests.js diff --git a/controllers/movies.js b/controllers/movies.js index 4298254..86aa36a 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -1,15 +1,42 @@ "use strict"; +var sqlite3 = require('sqlite3').verbose(); +var db_env = process.env.DB || 'development'; +var db = new sqlite3.Database('db/' + db_env + '.db'); + exports.moviesController = { - zomg: function getZomg(req, res) { - var results = { - zomg: "it works!" - } - return res.status(200).json(results); + + // GET /movies + getAllMovies: function(res) { + db.all("SELECT title, overview, release_date, inventory FROM movies", function(err, rows) { + if (err != null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, + + // GET /movies/id/:id + getMovieById: function(id, res) { + db.all("SELECT title, overview, release_date, inventory FROM movies WHERE id=?", id, function(err, rows) { + if (err != null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, + + // GET /movies/title/:title + getMovieByTitle: function(title, res) { + db.all("SELECT title, overview, release_date, inventory FROM movies WHERE title LIKE ?", title, function(err, rows) { + if (err != null) { + console.log(err); + } + res.status(200).json(rows); + }); } /* - GET /movies Get /movies/:id(synopsis, inventory, release_date) diff --git a/npm-debug.log b/npm-debug.log new file mode 100644 index 0000000..6df50bc --- /dev/null +++ b/npm-debug.log @@ -0,0 +1,36 @@ +0 info it worked if it ends with ok +1 verbose cli [ 'node', '/usr/local/bin/npm', 'start' ] +2 info using npm@2.12.1 +3 info using node@v0.12.7 +4 verbose node symlink /usr/local/bin/node +5 verbose run-script [ 'prestart', 'start', 'poststart' ] +6 info prestart C3Projects--VideoStoreAPI@0.0.0 +7 info start C3Projects--VideoStoreAPI@0.0.0 +8 verbose unsafe-perm in lifecycle true +9 info C3Projects--VideoStoreAPI@0.0.0 Failed to exec start script +10 verbose stack Error: C3Projects--VideoStoreAPI@0.0.0 start: `node ./bin/www` +10 verbose stack Exit status 1 +10 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:213:16) +10 verbose stack at EventEmitter.emit (events.js:110:17) +10 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:24:14) +10 verbose stack at ChildProcess.emit (events.js:110:17) +10 verbose stack at maybeClose (child_process.js:1015:16) +10 verbose stack at Process.ChildProcess._handle.onexit (child_process.js:1087:5) +11 verbose pkgid C3Projects--VideoStoreAPI@0.0.0 +12 verbose cwd /Users/MisShellyMac/ada/project-forks/C3Projects--VideoStoreAPI +13 error Darwin 14.5.0 +14 error argv "node" "/usr/local/bin/npm" "start" +15 error node v0.12.7 +16 error npm v2.12.1 +17 error code ELIFECYCLE +18 error C3Projects--VideoStoreAPI@0.0.0 start: `node ./bin/www` +18 error Exit status 1 +19 error Failed at the C3Projects--VideoStoreAPI@0.0.0 start script 'node ./bin/www'. +19 error This is most likely a problem with the C3Projects--VideoStoreAPI package, +19 error not with npm itself. +19 error Tell the author that this fails on your system: +19 error node ./bin/www +19 error You can get their info via: +19 error npm owner ls C3Projects--VideoStoreAPI +19 error There is likely additional logging output above. +20 verbose exit [ 1, true ] diff --git a/routes/index.js b/routes/index.js index c361ff7..84451a9 100644 --- a/routes/index.js +++ b/routes/index.js @@ -8,7 +8,10 @@ router.get('/', function(req, res, next) { }); router.get('/zomg', function(req, res, next){ - return movie_exports.moviesController.zomg(req, res); + var results = { + zomg: "it works!" + }; + res.status(200).json(results); }); module.exports = router; diff --git a/routes/movies.js b/routes/movies.js index 75f40fa..388cecd 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -2,13 +2,36 @@ var express = require('express'); var router = express.Router(); var movie_exports = require('../controllers/movies'); -/* GET home page. */ +// GET /movies router.get('/', function(req, res, next) { - res.render('index', { title: 'Movies' }); + movie_exports.moviesController.getAllMovies(res); }); -router.get('/zomg', function(req, res, next){ - return movie_exports.moviesController.zomg(req, res); +router.get('/id/:id', function(req, res, next) { + movie_exports.moviesController.getMovieById(req.params.id, res); }); +router.get('/title/:title', function(req, res, next) { + movie_exports.moviesController.getMovieByTitle(req.params.title, res); +}); + +/* + +Get /movies/:id(synopsis, inventory, release_date) + +GET /movies/:title/inventory + +GET /movies/title?n=XXX&p=XXX + +GET /movies/release_date?n=XXX&p=XXX + +GET /movies/:title/checked_out_current + +GET /movies/:title/checked_out_history?ordered_by=XXX + // ordered_by + // - id + // - name + // - check out date +*/ + module.exports = router; diff --git a/test/movies_controller_tests.js b/test/movies_controller_tests.js new file mode 100644 index 0000000..f2a18d4 --- /dev/null +++ b/test/movies_controller_tests.js @@ -0,0 +1,68 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(); +var db_env = process.env.DB || 'development'; +var db = new sqlite3.Database('db/' + db_env + '.db'); + +// var assert = require("assert"); +// +// describe("moviesController", function(){ +// +// }) + +// var assert = require("assert"); +// describe('Array', function() { +// describe('#indexOf()', function () { +// it('should return -1 when the value is not present', function () { +// assert.equal(-1, [1,2,3].indexOf(5)); +// assert.equal(-1, [1,2,3].indexOf(0)); +// }); +// }); +// }); + + +var assert = require("assert"); +describe("moviesController", function() { + var moviesController = null + + beforeEach(function() { + + }) + + it("GET all movies at endpoint /movies", function() { + + db.all("SELECT title, overview, release_date, inventory FROM movies", function(err, rows) { + assert.equal(err, null); + + // Make HTTP request to /movies and compare the returned data with + // the data from the DB (rows) + + }); + }) + + it("has a `test` property that is a function", function() { + assert.equal(typeof db.test, "function"); + }) + + it("holds onto the `path` to the database", function() { + assert.equal(db.path, database_path); + }) + + describe("`query` function", function() { + before(function() { + // create a users table + db.query("CREATE TABLE IF NOT EXISTS users (name TEXT);"); + + // insert some users + }) + + it("has a users table", function(done) { + var table_exists = "SELECT count(*) AS table_count FROM sqlite_master WHERE type='table' AND name='users'; "; + + db.query(table_exists, function(result) { + assert.equal(result[0].table_count, 1); + done(); + }); + }) + }) +}) From 8ff761acc1b794ab074cb464fbe811f78214e6fc Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 18 Sep 2015 10:13:28 -0700 Subject: [PATCH 15/96] WIP: Added customers models & controllers & tests. Still working on. --- controllers/customers.js | 28 +++++++++++++++++-- models/customers.js | 29 +++++++++++++++++++ routes/customers.js | 2 +- test/customers_controller_tests.js | 45 ++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 models/customers.js create mode 100644 test/customers_controller_tests.js diff --git a/controllers/customers.js b/controllers/customers.js index bd55c90..8f24a21 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -1,6 +1,28 @@ "use strict"; +// function CustomersController() { +// console.log("HELLO"); +// } + exports.customersController = { + index: function(req, res) { + var results = { "customers": [] } + + + // create our own models + + // for each customer, add that customer to results + for (var i = 0; i < !!!USERS!!!; i++) { + results.customers[i] = { + "id": , + "name": , + } + } + + return res.status(200).json(results); + } + + /* GET /customers all customers @@ -8,11 +30,11 @@ exports.customersController = { GET /customers/:id (currently checkout_out movies, rental history) - GET /customers/name?n=XXX&p=XXX + GET /customers/by_name?n=XXX&p=XXX - GET /customers/registered_at?n=XXX&p=XXX + GET /customers/by_registered_at?n=XXX&p=XXX - GET /customers/postal_code?n=XXX&p=XXX + GET /customers/by_postal_code?n=XXX&p=XXX */ } diff --git a/models/customers.js b/models/customers.js new file mode 100644 index 0000000..75a356e --- /dev/null +++ b/models/customers.js @@ -0,0 +1,29 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(); + +function Models() { + this.path = "../db/development.db"; +} + +Customers.prototype = { + +} + +Customers.prototype = { + test: function() { console.log('yay! it works!'); }, + + query: function(statement, callback) { + var db = new sqlite3.Customers(this.path); + + db.serialize(function() { + db.all(statement, function(err, res) { + if (callback) { callback(res); } + }); + }); + + db.close(); + } +} + +module.exports = Customers; diff --git a/routes/customers.js b/routes/customers.js index 506a347..f2f50d5 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -4,7 +4,7 @@ var customer_exports = require('../controllers/customers'); /* GET users listing. */ router.get('/', function(req, res, next) { - res.send('respond with a resource'); + return customer_exports.customersController.index(req, res); }); module.exports = router; diff --git a/test/customers_controller_tests.js b/test/customers_controller_tests.js new file mode 100644 index 0000000..f63b661 --- /dev/null +++ b/test/customers_controller_tests.js @@ -0,0 +1,45 @@ +var assert = require("assert"); +var CustomersController = require("../controllers/customers"); + +describe("CustomersController", function() { + var cc = null, + db = null; + beforeEach(function() { + db = new Database("db/test.db"); + cc = new CustomerController; + }); + + describe("GET /customers", function() { + it("returns all customers") + }); + + describe("GET /customers/:id", function() { + + }); + + describe("GET /customers/by_name", function() { + + }); + + describe("GET /customers/by_registered_at", function() { + + }); + + describe("GET /customers/by_postal_code", function() { + + }); +}); + +// THEY ALL SHOULD: +// +// it("returns JSON", function() { +// +// }); +// +// it("should return 200 if results", function() { +// +// }); +// +// it("should return 204 if no results", function() { +// +// }); From 4c1cc20b121ad0e5c6c9becf285276cf8842ce85 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Fri, 18 Sep 2015 10:33:10 -0700 Subject: [PATCH 16/96] WIP database.js --- database.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 database.js diff --git a/database.js b/database.js new file mode 100644 index 0000000..ea6ee9f --- /dev/null +++ b/database.js @@ -0,0 +1,26 @@ +"use strict"; + +var sqlite3 = require("sqlite3").verbose(), + db_env = process.env.DB || 'development'; + +module.exports = { + all: function(callback){ + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT * FROM " + this.table_name + ";"; + + db.all(statement, value, function(err, res){ + if (callback) callback(err, res); + db.close(); + }); + }, + + find_by: function(column, value, callback){ + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT * FROM " + this.table_name + " WHERE " + column + " = ?;"; + + db.all(statement, value, function(err, res){ + if (callback) callback(err, res); + db.close(); + }); + }, +} From d5dc439c9d047b7f8832452abaa4073d9f9d9e81 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 18 Sep 2015 10:45:28 -0700 Subject: [PATCH 17/96] Added functions to database.js. --- database.js | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/database.js b/database.js index ea6ee9f..f595645 100644 --- a/database.js +++ b/database.js @@ -23,4 +23,46 @@ module.exports = { db.close(); }); }, + + create: function(data, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var keys = Object.keys(data); + var key_pairs = []; + var values = []; + + for (var i = 0; i < keys.length; i++) { + values.push(data[keys[i]]); + key_pairs.push('?'); + } + + var statement = "INSERT INTO " + this.table_name + " (" + keys.join(',') + ") " + "VALUES(" + key_pairs.join(',') + ");"; + + db.run(statement, values, function(err) { + callback(err, { inserted_id: this.lastID, changed: this.changes }); + db.close(); + }); + }, + + save: function(data, callback) { + if (data.id) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var keys = Object.keys(data); + var key_pairs = []; + var values = []; + + for (var i = 0; i < keys.length; i++) { + values.push(data[keys[i]]); + key_pairs.push(keys[i] + "=? "); + } + + var statement = "UPDATE " + this.table_name + " SET " + key_pairs.join(',') + " WHERE id=" + data.id; + + db.run(statement, values, function(err) { + callback(err, { inserted_id: this.lastID, changed: this.changed }); + db.close(); + }); + } else { + callback({ err: "Missing key", message: "Can't save without an id; use `create`" }); + } + } } From a04660ca0462dbe32b888afc5a55831607e62402 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Fri, 18 Sep 2015 11:50:40 -0700 Subject: [PATCH 18/96] Added ability to look at movies/title/title/inventory --- README.md | 4 ++-- controllers/movies.js | 27 ++++++++++++++++----------- routes/movies.js | 12 ++++++++---- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 28b57b9..1bb295c 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,8 @@ The API you build should have the following capabilities. The schema of your dat - There is not an authentication requirement for this project; assume all users interacting with the API are video store employees. ### Customers -- Retrive a list of all customers -- Retrive a subset of customers +- Retrieve a list of all customers +- Retrieve a subset of customers - Given a sort column, return _n_ customer records, offset by _p_ records (this will be used to create "pages" of customers) - Sort columns are - `name` diff --git a/controllers/movies.js b/controllers/movies.js index 86aa36a..a4b959f 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -16,9 +16,19 @@ exports.moviesController = { }); }, - // GET /movies/id/:id - getMovieById: function(id, res) { - db.all("SELECT title, overview, release_date, inventory FROM movies WHERE id=?", id, function(err, rows) { + // Get /movies/id/:id(synopsis, inventory, release_date) + // getMovieById: function(id, res) { + // db.all("SELECT title, overview, release_date, inventory FROM movies WHERE id=?", id, function(err, rows) { + // if (err != null) { + // console.log(err); + // } + // res.status(200).json(rows); + // }); + // }, + + // GET /movies/title/:title + getMovieByTitle: function(title, res) { + db.all("SELECT title, overview, release_date, inventory FROM movies WHERE title LIKE ?", title, function(err, rows) { if (err != null) { console.log(err); } @@ -26,22 +36,17 @@ exports.moviesController = { }); }, - // GET /movies/title/:title - getMovieByTitle: function(title, res) { - db.all("SELECT title, overview, release_date, inventory FROM movies WHERE title LIKE ?", title, function(err, rows) { + // GET /movies/title/:title/:inventory + getMovieByTitleInventory: function(title, res) { + db.all("SELECT title, inventory FROM movies WHERE title LIKE ?", title, function(err, rows) { if (err != null) { console.log(err); } res.status(200).json(rows); }); } - /* - Get /movies/:id(synopsis, inventory, release_date) - - GET /movies/:title/inventory - GET /movies/title?n=XXX&p=XXX GET /movies/release_date?n=XXX&p=XXX diff --git a/routes/movies.js b/routes/movies.js index 388cecd..57a798d 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -7,19 +7,23 @@ router.get('/', function(req, res, next) { movie_exports.moviesController.getAllMovies(res); }); +// GET /movies/:id(synopsis, inventory, release_date) router.get('/id/:id', function(req, res, next) { movie_exports.moviesController.getMovieById(req.params.id, res); }); +// GET /movies/:title/inventory +router.get('/title/:title/inventory', function(req, res, next){ + movie_exports.moviesController.getMovieByTitleInventory(req.params.title, res); +}); + +// GET /movies/title/:title router.get('/title/:title', function(req, res, next) { movie_exports.moviesController.getMovieByTitle(req.params.title, res); }); -/* -Get /movies/:id(synopsis, inventory, release_date) - -GET /movies/:title/inventory +/* GET /movies/title?n=XXX&p=XXX From 2624083e7f9730d376588eebaeddbb2005996347 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 18 Sep 2015 13:20:26 -0700 Subject: [PATCH 19/96] Added npm-debug to gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index deca3a1..776bb1a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store /node_modules /db +npm-debug.log From cf12c465fc461c83841db9e6c5015b9dac4efe39 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 18 Sep 2015 13:22:03 -0700 Subject: [PATCH 20/96] WIP: Working on customers controller index, got it working, now will continue to work on other controller functions. --- controllers/customers.js | 50 ++++++++++++++++++++++++++-------------- database.js | 8 +++++-- models/customers.js | 28 ++++------------------ package.json | 2 +- routes/customers.js | 4 ++++ 5 files changed, 48 insertions(+), 44 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 8f24a21..d086d25 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -1,34 +1,50 @@ "use strict"; +var Customer = require('../models/customers'); + +// // ALTERNATIVE WAY OF CODING THIS: // function CustomersController() { -// console.log("HELLO"); +// // CODE HERE // } +// module.exports = CustomersController; exports.customersController = { + // GET /customers index: function(req, res) { var results = { "customers": [] } + var db = new Customer(); + var data = db.everything(function(err, result) { + return res.status(200).json(result); + }); - - // create our own models + // find_by // for each customer, add that customer to results - for (var i = 0; i < !!!USERS!!!; i++) { - results.customers[i] = { - "id": , - "name": , - } - } - - return res.status(200).json(results); + // for (var i = 0; i < data.length; i++) { + // results.customers[i] = { + // "id": "yo", + // "name": "yo", + // } + // } + var results = { "customers": [] } + // var db = new Customer(); + // console.log("db = " + db); + // var data = db.everything(); + // console.log("data = " + data); + var db = new Customer(); + var data = db.find_by("id", 1, function(err, result) { + // console.log("res: " + res.as_json); + // return res; + return res.status(200).json(result); + }); } - + // GET /customers/:id + // show: function(req, res) { + // // (currently checkout_out movies, rental history) + // + // } /* - GET /customers - all customers - - GET /customers/:id - (currently checkout_out movies, rental history) GET /customers/by_name?n=XXX&p=XXX diff --git a/database.js b/database.js index f595645..cc71515 100644 --- a/database.js +++ b/database.js @@ -4,11 +4,15 @@ var sqlite3 = require("sqlite3").verbose(), db_env = process.env.DB || 'development'; module.exports = { - all: function(callback){ + hello: function() { + var hi = "Hello!"; + return hi; + }, + everything: function(callback){ var db = new sqlite3.Database('db/' + db_env + '.db'); var statement = "SELECT * FROM " + this.table_name + ";"; - db.all(statement, value, function(err, res){ + db.all(statement, function(err, res){ if (callback) callback(err, res); db.close(); }); diff --git a/models/customers.js b/models/customers.js index 75a356e..55445ed 100644 --- a/models/customers.js +++ b/models/customers.js @@ -1,29 +1,9 @@ "use strict"; -var sqlite3 = require('sqlite3').verbose(); - -function Models() { - this.path = "../db/development.db"; -} - -Customers.prototype = { - +function Customer() { + this.table_name = "customers"; } -Customers.prototype = { - test: function() { console.log('yay! it works!'); }, - - query: function(statement, callback) { - var db = new sqlite3.Customers(this.path); - - db.serialize(function() { - db.all(statement, function(err, res) { - if (callback) { callback(res); } - }); - }); - - db.close(); - } -} +Customer.prototype = require('../database'); -module.exports = Customers; +module.exports = Customer; diff --git a/package.json b/package.json index 393d10c..58e3c4a 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www", + "start": "nodemon ./bin/www", "reset": "node ./utils/schema", "seed": "node ./utils/seed" }, diff --git a/routes/customers.js b/routes/customers.js index f2f50d5..e7cc4f6 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -7,4 +7,8 @@ router.get('/', function(req, res, next) { return customer_exports.customersController.index(req, res); }); +router.get('/:id', function(req, res, next) { + return customer_exports.customersController.show(req, res); +}); + module.exports = router; From e7a4126ee15dfd3dc5141d72aa02b344d17c5ea6 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 18 Sep 2015 13:56:39 -0700 Subject: [PATCH 21/96] Still WIP for customers controller. --- controllers/customers.js | 48 +++++++++++++++++++--------------------- database.js | 6 +---- models/rentals.js | 9 ++++++++ 3 files changed, 33 insertions(+), 30 deletions(-) create mode 100644 models/rentals.js diff --git a/controllers/customers.js b/controllers/customers.js index d086d25..6381b39 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -1,6 +1,7 @@ "use strict"; var Customer = require('../models/customers'); +var Rentals = require('../models/rentals'); // // ALTERNATIVE WAY OF CODING THIS: // function CustomersController() { @@ -11,38 +12,36 @@ var Customer = require('../models/customers'); exports.customersController = { // GET /customers index: function(req, res) { - var results = { "customers": [] } + // var results = { "customers": [] } var db = new Customer(); - var data = db.everything(function(err, result) { + var data = db.all(function(err, result) { return res.status(200).json(result); }); - - // find_by - - // for each customer, add that customer to results - // for (var i = 0; i < data.length; i++) { - // results.customers[i] = { - // "id": "yo", - // "name": "yo", - // } - // } - var results = { "customers": [] } - // var db = new Customer(); - // console.log("db = " + db); - // var data = db.everything(); - // console.log("data = " + data); + }, + // GET /customers/:id + show: function(req, res) { + // (currently checkout_out movies, rental history) + var id = req["params"]["id"]; var db = new Customer(); - var data = db.find_by("id", 1, function(err, result) { - // console.log("res: " + res.as_json); - // return res; + var data = db.find_by("id", id, function(err, result) { + // console.log(result); + // var db_rentals = new Rentals(); + // var dataing = db_rentals.find_by("") + // need to receive checked_out movies by customer id + // need to recieve rental history by customer id + return res.status(200).json(result); }); } - // GET /customers/:id - // show: function(req, res) { - // // (currently checkout_out movies, rental history) - // + + // for each customer, add that customer to results + // for (var i = 0; i < data.length; i++) { + // results.customers[i] = { + // "id": "yo", + // "name": "yo", + // } // } +}; /* @@ -53,4 +52,3 @@ exports.customersController = { GET /customers/by_postal_code?n=XXX&p=XXX */ -} diff --git a/database.js b/database.js index cc71515..716b47a 100644 --- a/database.js +++ b/database.js @@ -4,11 +4,7 @@ var sqlite3 = require("sqlite3").verbose(), db_env = process.env.DB || 'development'; module.exports = { - hello: function() { - var hi = "Hello!"; - return hi; - }, - everything: function(callback){ + all: function(callback){ var db = new sqlite3.Database('db/' + db_env + '.db'); var statement = "SELECT * FROM " + this.table_name + ";"; diff --git a/models/rentals.js b/models/rentals.js new file mode 100644 index 0000000..7c16c10 --- /dev/null +++ b/models/rentals.js @@ -0,0 +1,9 @@ +"use strict"; + +function Rental() { + this.table_name = "rentals"; +} + +Rental.prototype = require('../database'); + +module.exports = Rental; From 9d10e49053a397d14efd8fc21d1c62b9d9d65e39 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Fri, 18 Sep 2015 14:26:59 -0700 Subject: [PATCH 22/96] Sorting Movies by Release Date Possible at movies/release_date endpoint --- controllers/movies.js | 12 +++++++++++- models/movies.js | 9 +++++++++ routes/movies.js | 6 +++++- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 models/movies.js diff --git a/controllers/movies.js b/controllers/movies.js index a4b959f..9d8102c 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -3,6 +3,7 @@ var sqlite3 = require('sqlite3').verbose(); var db_env = process.env.DB || 'development'; var db = new sqlite3.Database('db/' + db_env + '.db'); +var Movie = require('../models/movies'); exports.moviesController = { @@ -44,12 +45,21 @@ exports.moviesController = { } res.status(200).json(rows); }); + }, + + // GET /movies/release_date?n=XXX&p=XXX + getMovieByReleaseDate: function(title, res) { + db.all("SELECT title, release_date FROM movies ORDER BY release_date DESC", title, function(err, rows) { + if (err != null) { + console.log(err); + } + res.status(200).json(rows); + }); } /* GET /movies/title?n=XXX&p=XXX - GET /movies/release_date?n=XXX&p=XXX GET /movies/:title/checked_out_current diff --git a/models/movies.js b/models/movies.js new file mode 100644 index 0000000..d12ec50 --- /dev/null +++ b/models/movies.js @@ -0,0 +1,9 @@ +"use strict"; + +function Movie() { + this.table_name = "movies"; +} + +Movie.prototype = require('../database'); + +module.exports = Movie; diff --git a/routes/movies.js b/routes/movies.js index 57a798d..97ce89b 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -22,12 +22,16 @@ router.get('/title/:title', function(req, res, next) { movie_exports.moviesController.getMovieByTitle(req.params.title, res); }); +// GET /movies/release_date?n=XXX&p=XXX +router.get('/release_date', function(req, res, next){ + movie_exports.moviesController.getMovieByReleaseDate(req.params.title, res); +}) + /* GET /movies/title?n=XXX&p=XXX -GET /movies/release_date?n=XXX&p=XXX GET /movies/:title/checked_out_current From 8a7613c8e01aa4f8304cfa74ea9c927cf3335605 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Sun, 20 Sep 2015 19:00:42 -0700 Subject: [PATCH 23/96] Added seeds for rentals. --- utils/rentals.json | 30 ++++++++++++++++++++++++++++++ utils/schema.js | 6 +++--- utils/seed.js | 26 +++++++++++++++++++++++++- 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 utils/rentals.json diff --git a/utils/rentals.json b/utils/rentals.json new file mode 100644 index 0000000..042a033 --- /dev/null +++ b/utils/rentals.json @@ -0,0 +1,30 @@ +[ + { + "check_out_date": "1988-07-07", + "check_in_date": "1988-07-17", + "expected_return_date": "1988-08-07", + "customer_id": 1, + "movie_id": 54 + }, + { + "check_out_date": "1989-10-01", + "check_in_date": "1989-10-02", + "expected_return_date": "1989-11-01", + "customer_id": 3, + "movie_id": 33 + }, + { + "check_out_date": "1989-10-01", + "check_in_date": "1989-10-02", + "expected_return_date": "1989-11-01", + "customer_id": 3, + "movie_id": 33 + }, + { + "check_out_date": "1990-01-01", + "check_in_date": "", + "expected_return_date": "1990-02-01", + "customer_id": 10, + "movie_id": 15 + } +] diff --git a/utils/schema.js b/utils/schema.js index 68fa138..568fd8b 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -72,9 +72,9 @@ db.serialize(function() { db.run("CREATE TABLE rentals (id INTEGER PRIMARY KEY);"); // add columns that I need to those tables - for(var i = 0; i < customer_fields.length; i++) { - var name = customer_fields[i][0], - type = customer_fields[i][1]; + for(var i = 0; i < rental_fields.length; i++) { + var name = rental_fields[i][0], + type = rental_fields[i][1]; // ALTER TABLE movies ADD COLUMN title text; db.run("ALTER TABLE rentals ADD COLUMN " + name + " " + type + ";"); diff --git a/utils/seed.js b/utils/seed.js index 6be97f9..e839745 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -35,7 +35,7 @@ var customer_statement = db.prepare( ); db.serialize(function() { - // loop them movies + // loop through customers for(var i = 0; i < customers.length; i++) { var customer = customers[i]; @@ -55,4 +55,28 @@ db.serialize(function() { customer_statement.finalize(); }); +var rentals = require('./rentals'); +var rental_statement = db.prepare( + "INSERT INTO rentals(check_out_date, check_in_date, expected_return_date, \ + customer_id, movie_id) VALUES (?, ?, ?, ?, ?);" +); + +db.serialize(function() { + // loop through rentals + for(var i = 0; i < rentals.length; i++) { + var rental = rentals[i]; + + // insert each one into the db + rental_statement.run( + rental.check_out_date, + rental.check_in_date, + rental.expected_return_date, + rental.customer_id, + rental.movie_id + ); + } + + rental_statement.finalize(); +}); + db.close(); From 1ef1dd64529ab8e38d3bcc94c70040ace696a5df Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Sun, 20 Sep 2015 19:02:14 -0700 Subject: [PATCH 24/96] Removed duplicate. --- utils/rentals.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/utils/rentals.json b/utils/rentals.json index 042a033..5951ad2 100644 --- a/utils/rentals.json +++ b/utils/rentals.json @@ -13,13 +13,6 @@ "customer_id": 3, "movie_id": 33 }, - { - "check_out_date": "1989-10-01", - "check_in_date": "1989-10-02", - "expected_return_date": "1989-11-01", - "customer_id": 3, - "movie_id": 33 - }, { "check_out_date": "1990-01-01", "check_in_date": "", From 36dda1a5dce7d1cda90df3139c2ccbdc93884477 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Sun, 20 Sep 2015 19:18:24 -0700 Subject: [PATCH 25/96] WIP: Customer functions & routes. --- controllers/customers.js | 32 ++++++++++++++++++++------------ models/customers.js | 15 +++++++++++++++ routes/customers.js | 12 ++++++++++++ 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 6381b39..e3f9049 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -1,7 +1,7 @@ "use strict"; var Customer = require('../models/customers'); -var Rentals = require('../models/rentals'); +// var Rentals = require('../models/rentals'); // // ALTERNATIVE WAY OF CODING THIS: // function CustomersController() { @@ -30,10 +30,15 @@ exports.customersController = { // need to receive checked_out movies by customer id // need to recieve rental history by customer id + currently_checked_out_movies_statement = + "SELECT * FROM rentals WHERE customer_id = " + id + + " AND check_in_date = \"\";" + returned_movies_statement = + "SELECT * FROM rentals WHERE customer_id = " + id + + " AND check_in_date != \"\";" + return res.status(200).json(result); }); - } - // for each customer, add that customer to results // for (var i = 0; i < data.length; i++) { // results.customers[i] = { @@ -41,14 +46,17 @@ exports.customersController = { // "name": "yo", // } // } -}; - - /* - - GET /customers/by_name?n=XXX&p=XXX - - GET /customers/by_registered_at?n=XXX&p=XXX + }, + // GET /customers/by_name?n=XXX&p=XXX + showByName: function(req, res) { + var Customer = new Customer(); + }, + // GET /customers/by_registered_at?n=XXX&p=XXX + showByRegistered_at: function(req, res) { - GET /customers/by_postal_code?n=XXX&p=XXX + }, + // GET /customers/by_postal_code?n=XXX&p=XXX + showByPostalCode: function(req, res) { - */ + } +}; diff --git a/models/customers.js b/models/customers.js index 55445ed..5ef492a 100644 --- a/models/customers.js +++ b/models/customers.js @@ -1,9 +1,24 @@ "use strict"; +var sqlite3 = require("sqlite3").verbose(), + db_env = process.env.DB || 'development'; + function Customer() { this.table_name = "customers"; } Customer.prototype = require('../database'); +// Customer.prototype.find_stuff = function(callback) { +// var db = new sqlite3.Database('db/' + db_env + '.db'); +// var statement = "SELECT * FROM " + this.table_name + ";"; +// +// db.all(statement, function(err, res){ +// if (callback) callback(err, res); +// db.close(); +// }); +// }; + +// console.log(Customer.prototype); + module.exports = Customer; diff --git a/routes/customers.js b/routes/customers.js index e7cc4f6..fc54c97 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -11,4 +11,16 @@ router.get('/:id', function(req, res, next) { return customer_exports.customersController.show(req, res); }); +router.get('/by_name', function(req, res, next) { + return customer_exports.customersController.showByName(req, res); +}); + +router.get('/by_registered_at', function(req, res, next) { + return customer_exports.customersController.showByRegistered_at(req, res); +}); + +router.get('/by_postal_code', function(req, res, next) { + return customer_exports.customersController.showByPostalCode(req, res); +}); + module.exports = router; From 6b9cff18fa9cdc934eae17082909219e2196d043 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Sun, 20 Sep 2015 19:18:45 -0700 Subject: [PATCH 26/96] Removed npm-debug, put the file in the gitignore. --- npm-debug.log | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 npm-debug.log diff --git a/npm-debug.log b/npm-debug.log deleted file mode 100644 index 6df50bc..0000000 --- a/npm-debug.log +++ /dev/null @@ -1,36 +0,0 @@ -0 info it worked if it ends with ok -1 verbose cli [ 'node', '/usr/local/bin/npm', 'start' ] -2 info using npm@2.12.1 -3 info using node@v0.12.7 -4 verbose node symlink /usr/local/bin/node -5 verbose run-script [ 'prestart', 'start', 'poststart' ] -6 info prestart C3Projects--VideoStoreAPI@0.0.0 -7 info start C3Projects--VideoStoreAPI@0.0.0 -8 verbose unsafe-perm in lifecycle true -9 info C3Projects--VideoStoreAPI@0.0.0 Failed to exec start script -10 verbose stack Error: C3Projects--VideoStoreAPI@0.0.0 start: `node ./bin/www` -10 verbose stack Exit status 1 -10 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:213:16) -10 verbose stack at EventEmitter.emit (events.js:110:17) -10 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:24:14) -10 verbose stack at ChildProcess.emit (events.js:110:17) -10 verbose stack at maybeClose (child_process.js:1015:16) -10 verbose stack at Process.ChildProcess._handle.onexit (child_process.js:1087:5) -11 verbose pkgid C3Projects--VideoStoreAPI@0.0.0 -12 verbose cwd /Users/MisShellyMac/ada/project-forks/C3Projects--VideoStoreAPI -13 error Darwin 14.5.0 -14 error argv "node" "/usr/local/bin/npm" "start" -15 error node v0.12.7 -16 error npm v2.12.1 -17 error code ELIFECYCLE -18 error C3Projects--VideoStoreAPI@0.0.0 start: `node ./bin/www` -18 error Exit status 1 -19 error Failed at the C3Projects--VideoStoreAPI@0.0.0 start script 'node ./bin/www'. -19 error This is most likely a problem with the C3Projects--VideoStoreAPI package, -19 error not with npm itself. -19 error Tell the author that this fails on your system: -19 error node ./bin/www -19 error You can get their info via: -19 error npm owner ls C3Projects--VideoStoreAPI -19 error There is likely additional logging output above. -20 verbose exit [ 1, true ] From d3f9c9d00c971c2c94bdb371cb208ae817be6ef3 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Sun, 20 Sep 2015 19:46:01 -0700 Subject: [PATCH 27/96] Got show method to work. Displaying currently checked out movies & returned movies. --- controllers/customers.js | 33 +++++++++++++-------------------- models/customers.js | 23 +++++++++++++++++++++++ models/rentals.js | 23 +++++++++++++++++++++++ 3 files changed, 59 insertions(+), 20 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index e3f9049..53bd3c3 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -23,20 +23,13 @@ exports.customersController = { // (currently checkout_out movies, rental history) var id = req["params"]["id"]; var db = new Customer(); - var data = db.find_by("id", id, function(err, result) { + var data = db.find_checked_out(id, function(err, result) { // console.log(result); // var db_rentals = new Rentals(); // var dataing = db_rentals.find_by("") // need to receive checked_out movies by customer id // need to recieve rental history by customer id - currently_checked_out_movies_statement = - "SELECT * FROM rentals WHERE customer_id = " + id + - " AND check_in_date = \"\";" - returned_movies_statement = - "SELECT * FROM rentals WHERE customer_id = " + id + - " AND check_in_date != \"\";" - return res.status(200).json(result); }); // for each customer, add that customer to results @@ -46,17 +39,17 @@ exports.customersController = { // "name": "yo", // } // } - }, - // GET /customers/by_name?n=XXX&p=XXX - showByName: function(req, res) { - var Customer = new Customer(); - }, - // GET /customers/by_registered_at?n=XXX&p=XXX - showByRegistered_at: function(req, res) { - - }, - // GET /customers/by_postal_code?n=XXX&p=XXX - showByPostalCode: function(req, res) { - } + // GET /customers/by_name?n=XXX&p=XXX + // showByName: function(req, res) { + // var Customer = new Customer(); + // }, + // // GET /customers/by_registered_at?n=XXX&p=XXX + // showByRegistered_at: function(req, res) { + // + // }, + // // GET /customers/by_postal_code?n=XXX&p=XXX + // showByPostalCode: function(req, res) { + // + // } }; diff --git a/models/customers.js b/models/customers.js index 5ef492a..524f6ba 100644 --- a/models/customers.js +++ b/models/customers.js @@ -9,6 +9,29 @@ function Customer() { Customer.prototype = require('../database'); +Customer.prototype.find_checked_out = function(id, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var currently_checked_out_movies_statement = + "SELECT * FROM rentals WHERE customer_id = " + id + + " AND check_in_date = \"\";"; + var returned_movies_statement = + "SELECT * FROM rentals WHERE customer_id = " + id + + " AND check_in_date != \"\";"; + + db.all(currently_checked_out_movies_statement, function(err, res1) { + db.all(returned_movies_statement, function(err, res2) { + var result = { + "checked_out_movies": res1, + "returned_movies": res2 + }; + console.log(result); + if (callback) callback(err, result); + + db.close(); + }); + }); +}; + // Customer.prototype.find_stuff = function(callback) { // var db = new sqlite3.Database('db/' + db_env + '.db'); // var statement = "SELECT * FROM " + this.table_name + ";"; diff --git a/models/rentals.js b/models/rentals.js index 7c16c10..7b5c7b8 100644 --- a/models/rentals.js +++ b/models/rentals.js @@ -6,4 +6,27 @@ function Rental() { Rental.prototype = require('../database'); +// Rental.prototype.find_checked_out = function(callback) { +// var db = new sqlite3.Database('db/' + db_env + '.db'); +// var currently_checked_out_movies_statement = +// "SELECT * FROM rentals WHERE customer_id = " + id + +// " AND check_in_date = \"\";"; +// var returned_movies_statement = +// "SELECT * FROM rentals WHERE customer_id = " + id + +// " AND check_in_date != \"\";"; +// +// db.all(currently_checked_out_movies_statement, function(err, res1) { +// db.all(returned_movies_statement, function(err, res2) { +// var result = { +// "result1": res1, +// "result2": res2 +// }; +// console.log(result); +// if (callback) callback(err, result); +// +// db.close(); +// } +// }); +// }; + module.exports = Rental; From 4ac69eb512891e16e91016f2d2650c63abdc7560 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Sun, 20 Sep 2015 19:46:50 -0700 Subject: [PATCH 28/96] Removed commented out code. --- models/customers.js | 13 ------------- models/rentals.js | 23 ----------------------- 2 files changed, 36 deletions(-) diff --git a/models/customers.js b/models/customers.js index 524f6ba..d67c655 100644 --- a/models/customers.js +++ b/models/customers.js @@ -24,7 +24,6 @@ Customer.prototype.find_checked_out = function(id, callback) { "checked_out_movies": res1, "returned_movies": res2 }; - console.log(result); if (callback) callback(err, result); db.close(); @@ -32,16 +31,4 @@ Customer.prototype.find_checked_out = function(id, callback) { }); }; -// Customer.prototype.find_stuff = function(callback) { -// var db = new sqlite3.Database('db/' + db_env + '.db'); -// var statement = "SELECT * FROM " + this.table_name + ";"; -// -// db.all(statement, function(err, res){ -// if (callback) callback(err, res); -// db.close(); -// }); -// }; - -// console.log(Customer.prototype); - module.exports = Customer; diff --git a/models/rentals.js b/models/rentals.js index 7b5c7b8..7c16c10 100644 --- a/models/rentals.js +++ b/models/rentals.js @@ -6,27 +6,4 @@ function Rental() { Rental.prototype = require('../database'); -// Rental.prototype.find_checked_out = function(callback) { -// var db = new sqlite3.Database('db/' + db_env + '.db'); -// var currently_checked_out_movies_statement = -// "SELECT * FROM rentals WHERE customer_id = " + id + -// " AND check_in_date = \"\";"; -// var returned_movies_statement = -// "SELECT * FROM rentals WHERE customer_id = " + id + -// " AND check_in_date != \"\";"; -// -// db.all(currently_checked_out_movies_statement, function(err, res1) { -// db.all(returned_movies_statement, function(err, res2) { -// var result = { -// "result1": res1, -// "result2": res2 -// }; -// console.log(result); -// if (callback) callback(err, result); -// -// db.close(); -// } -// }); -// }; - module.exports = Rental; From a364a4c5f51e1cdf8f4ffa067e52973bcc3b5e91 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Sun, 20 Sep 2015 23:31:05 -0700 Subject: [PATCH 29/96] added ability to search by page and number and to see current and past rentals --- controllers/movies.js | 79 ++++++++++++++++++++++++++++++++++++------- npm-debug.log | 36 -------------------- routes/movies.js | 27 ++++++++------- utils/schema.js | 8 ++--- 4 files changed, 84 insertions(+), 66 deletions(-) delete mode 100644 npm-debug.log diff --git a/controllers/movies.js b/controllers/movies.js index 9d8102c..7c940d3 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -48,25 +48,78 @@ exports.moviesController = { }, // GET /movies/release_date?n=XXX&p=XXX - getMovieByReleaseDate: function(title, res) { - db.all("SELECT title, release_date FROM movies ORDER BY release_date DESC", title, function(err, rows) { + getMoviesByReleaseDate: function(num, page, res) { + var callback = function(err, rows) { if (err != null) { console.log(err); } res.status(200).json(rows); - }); - } - /* + }; - GET /movies/title?n=XXX&p=XXX + // This is the case when no query parameters are given + if (num === undefined && page === undefined) { + db.all("SELECT title, release_date FROM movies ORDER BY release_date DESC", callback); + } + // This is the case when only n is given + else if (page === undefined) { + db.all("SELECT title, release_date FROM movies ORDER BY release_date DESC LIMIT ?", num, callback); + } + else { + // Assume both num and page are specified + db.all("SELECT title, release_date FROM movies WHERE id NOT IN ( SELECT id FROM movies ORDER BY release_date DESC LIMIT ?) ORDER BY release_date DESC LIMIT ?", (page - 1) * num, num, callback); + } + }, + // GET /movies/title?n=XXX&p=XXX + getMoviesByTitle: function(num, page, res) { + var callback = function(err, rows) { + if (err != null) { + console.log(err); + } + res.status(200).json(rows); + }; - GET /movies/:title/checked_out_current + // This is the case when no query parameters are given + if (num === undefined && page === undefined) { + db.all("SELECT title, release_date FROM movies ORDER BY title ASC", callback); + } + // This is the case when only n is given + else if (page === undefined) { + db.all("SELECT title, release_date FROM movies ORDER BY title ASC LIMIT ?", num, callback); + } + else { + // Assume both num and page are specified + db.all("SELECT title, release_date FROM movies WHERE id NOT IN ( SELECT id FROM movies ORDER BY title ASC LIMIT ?) ORDER BY title ASC LIMIT ?", (page - 1) * num, num, callback); + } + }, - GET /movies/:title/checked_out_history?ordered_by=XXX - // ordered_by - // - id - // - name - // - check out date - */ + // GET /movies/title/:title/checked_out_current + getCheckedOutCustomersByTitle: function(title, res) { + db.all("SELECT customers.id, customers.name, customers.phone, rentals.check_out_date FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id INNER JOIN movies ON movies.id = rentals.movie_id WHERE movies.title LIKE ? AND rentals.check_in_date IS NULL", title, function(err, rows) { + if (err != null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, + + // GET /movies/title/:title/checked_out_history?ordered_by=XXX + // ordered_by id, name, check out date + getCheckedOutHistoryByTitle: function(title, ordered_by, res) { + + var order = "customers.id"; + if (ordered_by == "id") + order = "customers.id"; + else if (ordered_by == "name") + order = "customers.name"; + else if (ordered_by != undefined) + order = ordered_by; + + db.all("SELECT customers.id, customers.name, customers.phone, rentals.check_out_date FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id INNER JOIN movies ON movies.id = rentals.movie_id WHERE movies.title LIKE ? AND rentals.check_in_date IS NOT NULL ORDER BY ?", title, order, function(err, rows) { + if (err != null) { + console.log(err); + } + res.status(200).json(rows); + }); + } } diff --git a/npm-debug.log b/npm-debug.log deleted file mode 100644 index 6df50bc..0000000 --- a/npm-debug.log +++ /dev/null @@ -1,36 +0,0 @@ -0 info it worked if it ends with ok -1 verbose cli [ 'node', '/usr/local/bin/npm', 'start' ] -2 info using npm@2.12.1 -3 info using node@v0.12.7 -4 verbose node symlink /usr/local/bin/node -5 verbose run-script [ 'prestart', 'start', 'poststart' ] -6 info prestart C3Projects--VideoStoreAPI@0.0.0 -7 info start C3Projects--VideoStoreAPI@0.0.0 -8 verbose unsafe-perm in lifecycle true -9 info C3Projects--VideoStoreAPI@0.0.0 Failed to exec start script -10 verbose stack Error: C3Projects--VideoStoreAPI@0.0.0 start: `node ./bin/www` -10 verbose stack Exit status 1 -10 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:213:16) -10 verbose stack at EventEmitter.emit (events.js:110:17) -10 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:24:14) -10 verbose stack at ChildProcess.emit (events.js:110:17) -10 verbose stack at maybeClose (child_process.js:1015:16) -10 verbose stack at Process.ChildProcess._handle.onexit (child_process.js:1087:5) -11 verbose pkgid C3Projects--VideoStoreAPI@0.0.0 -12 verbose cwd /Users/MisShellyMac/ada/project-forks/C3Projects--VideoStoreAPI -13 error Darwin 14.5.0 -14 error argv "node" "/usr/local/bin/npm" "start" -15 error node v0.12.7 -16 error npm v2.12.1 -17 error code ELIFECYCLE -18 error C3Projects--VideoStoreAPI@0.0.0 start: `node ./bin/www` -18 error Exit status 1 -19 error Failed at the C3Projects--VideoStoreAPI@0.0.0 start script 'node ./bin/www'. -19 error This is most likely a problem with the C3Projects--VideoStoreAPI package, -19 error not with npm itself. -19 error Tell the author that this fails on your system: -19 error node ./bin/www -19 error You can get their info via: -19 error npm owner ls C3Projects--VideoStoreAPI -19 error There is likely additional logging output above. -20 verbose exit [ 1, true ] diff --git a/routes/movies.js b/routes/movies.js index 97ce89b..9d6cc53 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -24,22 +24,23 @@ router.get('/title/:title', function(req, res, next) { // GET /movies/release_date?n=XXX&p=XXX router.get('/release_date', function(req, res, next){ - movie_exports.moviesController.getMovieByReleaseDate(req.params.title, res); + movie_exports.moviesController.getMoviesByReleaseDate(req.query.n, req.query.p, res); }) +// GET /movies/title?n=XXX&p=XXX +router.get('/title', function(req, res, next){ + movie_exports.moviesController.getMoviesByTitle(req.query.n, req.query.p, res); +}); -/* - -GET /movies/title?n=XXX&p=XXX - - -GET /movies/:title/checked_out_current +// GET /movies/title/:title/checked_out_current +router.get('/title/:title/checked_out_current', function(req, res, next){ + movie_exports.moviesController.getCheckedOutCustomersByTitle(req.params.title, res); +}); -GET /movies/:title/checked_out_history?ordered_by=XXX - // ordered_by - // - id - // - name - // - check out date -*/ +// GET /movies/:title/checked_out_history?ordered_by=XXX +// ordered_by id, name, check out date +router.get('/title/:title/checked_out_history', function(req, res, next){ + movie_exports.moviesController.getCheckedOutHistoryByTitle(req.params.title, req.query.ordered_by, res); +}); module.exports = router; diff --git a/utils/schema.js b/utils/schema.js index 68fa138..67d0ff5 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -62,7 +62,7 @@ var rental_fields = [ ['expected_return_date', 'text'], ['customer_id', 'integer'], ['movie_id', 'integer'] -] +]; db.serialize(function() { // drop existing tables @@ -72,9 +72,9 @@ db.serialize(function() { db.run("CREATE TABLE rentals (id INTEGER PRIMARY KEY);"); // add columns that I need to those tables - for(var i = 0; i < customer_fields.length; i++) { - var name = customer_fields[i][0], - type = customer_fields[i][1]; + for(var i = 0; i < rental_fields.length; i++) { + var name = rental_fields[i][0], + type = rental_fields[i][1]; // ALTER TABLE movies ADD COLUMN title text; db.run("ALTER TABLE rentals ADD COLUMN " + name + " " + type + ";"); From a8ee71440b56fab944b8ec92525fc4a1b740c0dd Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 09:03:52 -0700 Subject: [PATCH 30/96] Added to seed one record. --- utils/rentals.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/utils/rentals.json b/utils/rentals.json index 5951ad2..0eacd0b 100644 --- a/utils/rentals.json +++ b/utils/rentals.json @@ -19,5 +19,12 @@ "expected_return_date": "1990-02-01", "customer_id": 10, "movie_id": 15 + }, + { + "check_out_date": "1990-01-01", + "check_in_date": "1990-01-16", + "expected_return_date": "1990-02-01", + "customer_id": 10, + "movie_id": 110 } ] From fd73407cea2f880ecd848ad6c8ecc7f5122ec188 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 09:15:01 -0700 Subject: [PATCH 31/96] Removed a lot of my commented-out code. --- controllers/customers.js | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 53bd3c3..d796be5 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -1,13 +1,6 @@ "use strict"; var Customer = require('../models/customers'); -// var Rentals = require('../models/rentals'); - -// // ALTERNATIVE WAY OF CODING THIS: -// function CustomersController() { -// // CODE HERE -// } -// module.exports = CustomersController; exports.customersController = { // GET /customers @@ -18,36 +11,26 @@ exports.customersController = { return res.status(200).json(result); }); }, + // GET /customers/:id show: function(req, res) { - // (currently checkout_out movies, rental history) + // returns currently checkout_out movies & rental history var id = req["params"]["id"]; var db = new Customer(); var data = db.find_checked_out(id, function(err, result) { - // console.log(result); - // var db_rentals = new Rentals(); - // var dataing = db_rentals.find_by("") - // need to receive checked_out movies by customer id - // need to recieve rental history by customer id - return res.status(200).json(result); }); - // for each customer, add that customer to results - // for (var i = 0; i < data.length; i++) { - // results.customers[i] = { - // "id": "yo", - // "name": "yo", - // } - // } - } + // GET /customers/by_name?n=XXX&p=XXX // showByName: function(req, res) { // var Customer = new Customer(); // }, + // // GET /customers/by_registered_at?n=XXX&p=XXX // showByRegistered_at: function(req, res) { // // }, + // // GET /customers/by_postal_code?n=XXX&p=XXX // showByPostalCode: function(req, res) { // From 3f4e2b2da15ddc874356e4b81db9cd08156de6d7 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 09:19:37 -0700 Subject: [PATCH 32/96] Don't need var data since there's a callback returning the results. --- controllers/customers.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index d796be5..1aa54ee 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -7,7 +7,7 @@ exports.customersController = { index: function(req, res) { // var results = { "customers": [] } var db = new Customer(); - var data = db.all(function(err, result) { + db.all(function(err, result) { return res.status(200).json(result); }); }, @@ -17,14 +17,15 @@ exports.customersController = { // returns currently checkout_out movies & rental history var id = req["params"]["id"]; var db = new Customer(); - var data = db.find_checked_out(id, function(err, result) { + db.find_checked_out(id, function(err, result) { return res.status(200).json(result); }); + }, // GET /customers/by_name?n=XXX&p=XXX - // showByName: function(req, res) { - // var Customer = new Customer(); - // }, + showByName: function(req, res) { + var db = new Customer(); + } // // GET /customers/by_registered_at?n=XXX&p=XXX // showByRegistered_at: function(req, res) { From 9f66aeb9853de4e58f4203b203fc7d5415c2a457 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 09:50:53 -0700 Subject: [PATCH 33/96] WIP: Sort by functions for customers. --- controllers/customers.js | 9 +++++++++ models/customers.js | 19 +++++++++++++++++++ routes/customers.js | 9 +++++---- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 1aa54ee..6becd57 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -24,7 +24,12 @@ exports.customersController = { // GET /customers/by_name?n=XXX&p=XXX showByName: function(req, res) { + var number = req["query"]["n"]; + var pages = req["query"]["p"]; var db = new Customer(); + db.find_by_sorted("name", number, pages, function(err, result) { + return res.status(200).json(result); + }); } // // GET /customers/by_registered_at?n=XXX&p=XXX @@ -36,4 +41,8 @@ exports.customersController = { // showByPostalCode: function(req, res) { // // } + + // sortBy: function() { + // + // } }; diff --git a/models/customers.js b/models/customers.js index d67c655..c18388b 100644 --- a/models/customers.js +++ b/models/customers.js @@ -31,4 +31,23 @@ Customer.prototype.find_checked_out = function(id, callback) { }); }; +Customer.prototype.find_by_sorted = function(sort_by, number, pages, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var offset = (pages - 1) * number; + var statement = "SELECT * FROM customers ORDER BY " + sort_by + "ASC LIMIT " + number + "OFFSET" + offset + ";"; + + // id 1-10 - page 1 1 * 10 = 10 if 1: show no offset + // id 11-20 - page 2 2 * 10 = 20 if 2: ((2 - 1) * 10) = 10 + // id 21-30 - page 3 3 * 10 = 30 if 3: ((3 - 1) * 10) = 20 + // id 31-40 - page 4 4 * 10 = 40 + + // id 1-7 - page 1 + // id 8-14 - page 2 1 * 7 = 7 + + db.all(statement, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); +}; + module.exports = Customer; diff --git a/routes/customers.js b/routes/customers.js index fc54c97..d38701e 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -7,10 +7,6 @@ router.get('/', function(req, res, next) { return customer_exports.customersController.index(req, res); }); -router.get('/:id', function(req, res, next) { - return customer_exports.customersController.show(req, res); -}); - router.get('/by_name', function(req, res, next) { return customer_exports.customersController.showByName(req, res); }); @@ -23,4 +19,9 @@ router.get('/by_postal_code', function(req, res, next) { return customer_exports.customersController.showByPostalCode(req, res); }); +router.get('/:id', function(req, res, next) { + return customer_exports.customersController.show(req, res); +}); + + module.exports = router; From a4abb9fa4ab559627af765c3b1b7ec7e97262ce9 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Mon, 21 Sep 2015 10:00:34 -0700 Subject: [PATCH 34/96] Made change to seed file and updated readme --- README.md | 8 ++++---- controllers/movies.js | 34 +++++++++++++++++----------------- utils/rentals.json | 4 ++-- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 1bb295c..74de0bc 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,10 @@ The API you build should have the following capabilities. The schema of your dat ### Movies - Retrieve a list of all movies +- Look a movie up by title to see + - it's synopsis + - release date + - and inventory total - Retrieve a subset of movies - Given a sort column, return _n_ movie records, offset by _p_ records (this will be used to create "pages" of movies) - Sort columns are @@ -70,10 +74,6 @@ The API you build should have the following capabilities. The schema of your dat - ordered by check out date ### Rental -- Look a movie up by title to see - - it's synopsis - - release date - - and inventory total - Know if a movie has any inventory available to rent - See a list of customers that have _currently_ checked out any of the movie's inventory - Given a customer's `id` and a movie's `title` ... diff --git a/controllers/movies.js b/controllers/movies.js index 7c940d3..cb0cd9e 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -10,27 +10,27 @@ exports.moviesController = { // GET /movies getAllMovies: function(res) { db.all("SELECT title, overview, release_date, inventory FROM movies", function(err, rows) { - if (err != null) { + if (err !== null) { console.log(err); } res.status(200).json(rows); }); }, - // Get /movies/id/:id(synopsis, inventory, release_date) - // getMovieById: function(id, res) { - // db.all("SELECT title, overview, release_date, inventory FROM movies WHERE id=?", id, function(err, rows) { - // if (err != null) { - // console.log(err); - // } - // res.status(200).json(rows); - // }); - // }, + // Get /movies/id/:id(synopsis, inventory, release_date) + getMovieById: function(id, res) { + db.all("SELECT title, overview, release_date, inventory FROM movies WHERE id=?", id, function(err, rows) { + if (err !== null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, // GET /movies/title/:title getMovieByTitle: function(title, res) { db.all("SELECT title, overview, release_date, inventory FROM movies WHERE title LIKE ?", title, function(err, rows) { - if (err != null) { + if (err !== null) { console.log(err); } res.status(200).json(rows); @@ -40,7 +40,7 @@ exports.moviesController = { // GET /movies/title/:title/:inventory getMovieByTitleInventory: function(title, res) { db.all("SELECT title, inventory FROM movies WHERE title LIKE ?", title, function(err, rows) { - if (err != null) { + if (err !== null) { console.log(err); } res.status(200).json(rows); @@ -50,7 +50,7 @@ exports.moviesController = { // GET /movies/release_date?n=XXX&p=XXX getMoviesByReleaseDate: function(num, page, res) { var callback = function(err, rows) { - if (err != null) { + if (err !== null) { console.log(err); } res.status(200).json(rows); @@ -73,7 +73,7 @@ exports.moviesController = { // GET /movies/title?n=XXX&p=XXX getMoviesByTitle: function(num, page, res) { var callback = function(err, rows) { - if (err != null) { + if (err !== null) { console.log(err); } res.status(200).json(rows); @@ -96,7 +96,7 @@ exports.moviesController = { // GET /movies/title/:title/checked_out_current getCheckedOutCustomersByTitle: function(title, res) { db.all("SELECT customers.id, customers.name, customers.phone, rentals.check_out_date FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id INNER JOIN movies ON movies.id = rentals.movie_id WHERE movies.title LIKE ? AND rentals.check_in_date IS NULL", title, function(err, rows) { - if (err != null) { + if (err !== null) { console.log(err); } res.status(200).json(rows); @@ -112,11 +112,11 @@ exports.moviesController = { order = "customers.id"; else if (ordered_by == "name") order = "customers.name"; - else if (ordered_by != undefined) + else if (ordered_by !== undefined) order = ordered_by; db.all("SELECT customers.id, customers.name, customers.phone, rentals.check_out_date FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id INNER JOIN movies ON movies.id = rentals.movie_id WHERE movies.title LIKE ? AND rentals.check_in_date IS NOT NULL ORDER BY ?", title, order, function(err, rows) { - if (err != null) { + if (err !== null) { console.log(err); } res.status(200).json(rows); diff --git a/utils/rentals.json b/utils/rentals.json index 0eacd0b..9b0cc9a 100644 --- a/utils/rentals.json +++ b/utils/rentals.json @@ -17,7 +17,7 @@ "check_out_date": "1990-01-01", "check_in_date": "", "expected_return_date": "1990-02-01", - "customer_id": 10, + "customer_id": 5, "movie_id": 15 }, { @@ -25,6 +25,6 @@ "check_in_date": "1990-01-16", "expected_return_date": "1990-02-01", "customer_id": 10, - "movie_id": 110 + "movie_id": 1 } ] From 6da432f35cc88e8bc7e6439366758c712baa22bf Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 10:04:47 -0700 Subject: [PATCH 35/96] WIP: Working on a single method for the all the sortby functions. --- controllers/customers.js | 23 ++++++++++++++--------- models/customers.js | 18 ++++++++---------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 6becd57..7d4d912 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -2,6 +2,15 @@ var Customer = require('../models/customers'); +function sortBy(sort_by, req, res) { + var number = req["query"]["n"]; + var pages = req["query"]["p"]; + var db = new Customer(); + db.find_by_sorted(sort_by, number, pages, function(err, result) { + return res.status(200).json(result); + }); +} + exports.customersController = { // GET /customers index: function(req, res) { @@ -30,19 +39,15 @@ exports.customersController = { db.find_by_sorted("name", number, pages, function(err, result) { return res.status(200).json(result); }); - } + }, - // // GET /customers/by_registered_at?n=XXX&p=XXX - // showByRegistered_at: function(req, res) { - // - // }, + // GET /customers/by_registered_at?n=XXX&p=XXX + showByRegistered_at: function(req, res) { + sortBy("registered_at", req, res); + }, // // GET /customers/by_postal_code?n=XXX&p=XXX // showByPostalCode: function(req, res) { // // } - - // sortBy: function() { - // - // } }; diff --git a/models/customers.js b/models/customers.js index c18388b..888d7f9 100644 --- a/models/customers.js +++ b/models/customers.js @@ -33,16 +33,14 @@ Customer.prototype.find_checked_out = function(id, callback) { Customer.prototype.find_by_sorted = function(sort_by, number, pages, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - var offset = (pages - 1) * number; - var statement = "SELECT * FROM customers ORDER BY " + sort_by + "ASC LIMIT " + number + "OFFSET" + offset + ";"; - - // id 1-10 - page 1 1 * 10 = 10 if 1: show no offset - // id 11-20 - page 2 2 * 10 = 20 if 2: ((2 - 1) * 10) = 10 - // id 21-30 - page 3 3 * 10 = 30 if 3: ((3 - 1) * 10) = 20 - // id 31-40 - page 4 4 * 10 = 40 - - // id 1-7 - page 1 - // id 8-14 - page 2 1 * 7 = 7 + var statement; + if (number && pages) { + var offset = (pages - 1) * number; + statement = "SELECT * FROM customers ORDER BY " + sort_by + " ASC LIMIT " + number + " OFFSET " + offset + ";"; + } + else { + statement = "SELECT * FROM customers ORDER BY " + sort_by + " ASC;"; + } db.all(statement, function(err, res) { if (callback) callback(err, res); From 276b930428c04e93e9f912d6c081819f251d01d8 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 10:07:42 -0700 Subject: [PATCH 36/96] Finished basic functionality of customers functions; still need to format results (returning everything vs specific columns). Also, dates are not sorting correctly (sorting alphabetical). --- controllers/customers.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 7d4d912..420bcc4 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -33,21 +33,17 @@ exports.customersController = { // GET /customers/by_name?n=XXX&p=XXX showByName: function(req, res) { - var number = req["query"]["n"]; - var pages = req["query"]["p"]; - var db = new Customer(); - db.find_by_sorted("name", number, pages, function(err, result) { - return res.status(200).json(result); - }); + sortBy("registered_at", req, res); }, // GET /customers/by_registered_at?n=XXX&p=XXX + // NOTE: Need to change registered at to a time object? Sorting alphabetally vs. by date! showByRegistered_at: function(req, res) { sortBy("registered_at", req, res); }, - // // GET /customers/by_postal_code?n=XXX&p=XXX - // showByPostalCode: function(req, res) { - // - // } + // GET /customers/by_postal_code?n=XXX&p=XXX + showByPostalCode: function(req, res) { + sortBy("postal_code", req, res); + } }; From 935042eccfd3ee062da07bd848d00cacbd2c2621 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 10:49:36 -0700 Subject: [PATCH 37/96] Corrected a path. --- controllers/customers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/customers.js b/controllers/customers.js index 420bcc4..d9cc630 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -33,7 +33,7 @@ exports.customersController = { // GET /customers/by_name?n=XXX&p=XXX showByName: function(req, res) { - sortBy("registered_at", req, res); + sortBy("name", req, res); }, // GET /customers/by_registered_at?n=XXX&p=XXX From 07eabc2d91157537b7607c8e20363b2df22a0c32 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Mon, 21 Sep 2015 13:56:20 -0700 Subject: [PATCH 38/96] Added 2 endpoints for overdue and current rentals --- routes/rentals.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 routes/rentals.js diff --git a/routes/rentals.js b/routes/rentals.js new file mode 100644 index 0000000..5e1225d --- /dev/null +++ b/routes/rentals.js @@ -0,0 +1,23 @@ +var express = require('express'); +var router = express.Router(); +var movie_exports = require('../controllers/movies'); +var customer_exports = require('../controllers/customers'); +var rental_exports = require('../controllers/rentals'); + +// GET /rentals +router.get('/', function(req, res, next) { + rental_exports.rentalsController.getAllRentals(res); +}); + +// GET /rentals/overdue +router.get('/overdue', function(req, res, next) { + rental_exports.rentalsController.getAllOverdue(res); +}); + +// GET /rentals/currently_out +router.get('/currently_out', function(req, res, next){ + rental_exports.rentalsController.getAllCurrentlyOut(res); +}); + + +module.exports = router; From f7005173fa6d104419416f97c5b6b399290a31f8 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Mon, 21 Sep 2015 13:56:54 -0700 Subject: [PATCH 39/96] WIP Rentals controller actions --- README.md | 2 +- app.js | 2 ++ controllers/rentals.js | 52 ++++++++++++++++++++++++++++++++++++++---- utils/rentals.json | 2 +- 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 74de0bc..90392af 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ The API you build should have the following capabilities. The schema of your dat - ordered by check out date ### Rental -- Know if a movie has any inventory available to rent +- Know if a movie has available inventory to rent (diff than total inventory) - See a list of customers that have _currently_ checked out any of the movie's inventory - Given a customer's `id` and a movie's `title` ... - "check out" one of the movie's inventory to the customer diff --git a/app.js b/app.js index 9f93fc6..05f9202 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,7 @@ var bodyParser = require('body-parser'); var routes = require('./routes/index'); var movies = require('./routes/movies'); var customers = require('./routes/customers'); +var rentals = require('./routes/rentals'); var app = express(); @@ -26,6 +27,7 @@ app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/customers', customers); app.use('/movies', movies); +app.use('/rentals', rentals); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/controllers/rentals.js b/controllers/rentals.js index e1f4d16..0049d31 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -1,14 +1,58 @@ "use strict"; +var sqlite3 = require('sqlite3').verbose(); +var db_env = process.env.DB || 'development'; +var db = new sqlite3.Database('db/' + db_env + '.db'); +var Movie = require('../models/rentals'); + exports.rentalsController = { - /* - GET /rentals/overdue - movies and the customer associated with it + // GET /rentals + getAllRentals: function(res) { + db.all("SELECT * FROM rentals ", function(err, rows) { + if (err !== null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, - GET /rentals/checkout_out + // GET /rentals/overdue + // movies and the customer associated with it + getAllOverdue:function(res) { + db.all("SELECT customers.name, movies.title FROM rentals INNER JOIN customers on customers.id = rentals.customer_id INNER JOIN movies on movies.id = rentals.movie_id WHERE check_in_date IS NULL; ", function(err, rows) { + if (err !== null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, + + // GET /rentals/checkout_out + getAllCurrentlyOut:function(res) { + db.all("SELECT customers.name, movies.title FROM rentals INNER JOIN customers on customers.id = rentals.customer_id INNER JOIN movies on movies.id = rentals.movie_id WHERE check_in_date IS NOT NULL; ", function(err, rows) { + if (err !== null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, + /* POST /rentals/check_out(cust id, movie title) (math for checkout cost) + restapi.post('/data', function(req, res){ + db.run("UPDATE counts SET value = value + 1 WHERE key = ?", "counter", function(err, row){ + if (err){ + console.err(err); + res.status(500); + } + else { + res.status(202); + } + res.end(); + }); +}); + PATCH /rentals/check_in(cust id, movie title) */ diff --git a/utils/rentals.json b/utils/rentals.json index 9b0cc9a..7e536cd 100644 --- a/utils/rentals.json +++ b/utils/rentals.json @@ -15,7 +15,7 @@ }, { "check_out_date": "1990-01-01", - "check_in_date": "", + "check_in_date": null, "expected_return_date": "1990-02-01", "customer_id": 5, "movie_id": 15 From 645a32b79c94f33c823c8f6dcf204543212860d8 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 13:56:58 -0700 Subject: [PATCH 40/96] Added rentals to routes. --- app.js | 2 ++ routes/rentals.js | 10 ++++++++++ 2 files changed, 12 insertions(+) create mode 100644 routes/rentals.js diff --git a/app.js b/app.js index 9f93fc6..05f9202 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,7 @@ var bodyParser = require('body-parser'); var routes = require('./routes/index'); var movies = require('./routes/movies'); var customers = require('./routes/customers'); +var rentals = require('./routes/rentals'); var app = express(); @@ -26,6 +27,7 @@ app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/customers', customers); app.use('/movies', movies); +app.use('/rentals', rentals); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/routes/rentals.js b/routes/rentals.js new file mode 100644 index 0000000..ce37b4e --- /dev/null +++ b/routes/rentals.js @@ -0,0 +1,10 @@ +var express = require('express'); +var router = express.Router(); +var rental_exports = require('../controllers/rentals'); + +// GET /movies +router.post('/', function(req, res, next) { + rental_exports.rentalsController.create(res); +}); + +module.exports = router; From 1e6194d84def9d400c964632a79decd8d19a1066 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 13:57:38 -0700 Subject: [PATCH 41/96] Changed statement to include 'null' wording. --- models/customers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/customers.js b/models/customers.js index 888d7f9..a9cf96e 100644 --- a/models/customers.js +++ b/models/customers.js @@ -13,10 +13,10 @@ Customer.prototype.find_checked_out = function(id, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); var currently_checked_out_movies_statement = "SELECT * FROM rentals WHERE customer_id = " + id + - " AND check_in_date = \"\";"; + " AND check_in_date IS NULL;"; var returned_movies_statement = "SELECT * FROM rentals WHERE customer_id = " + id + - " AND check_in_date != \"\";"; + " AND check_in_date IS NOT NULL;"; db.all(currently_checked_out_movies_statement, function(err, res1) { db.all(returned_movies_statement, function(err, res2) { From 18894498fa59f3a83dad89667c40c8bd73abc376 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 13:58:15 -0700 Subject: [PATCH 42/96] Got post route to work in rentals? --- controllers/rentals.js | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index e1f4d16..a044bc4 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -1,4 +1,5 @@ "use strict"; + var Customer = require('../models/customers'); exports.rentalsController = { /* @@ -8,8 +9,39 @@ exports.rentalsController = { GET /rentals/checkout_out POST /rentals/check_out(cust id, movie title) (math for checkout cost) + // creating a new rental with no returned date PATCH /rentals/check_in(cust id, movie title) - + // adding returned date */ -} + + create: function(req, res) { + console.log(req["req"]["body"]); + + // return res.status(200).json(req["req"]["body"]); + // return res.redirect('index', { title: 'Express' }); + + var data = req["req"]["body"] + + var db = new Customer(); + db.create(data, function(err, result) { + console.log("DONE"); + }); + + // if (req.method == 'POST') { + // var body = req.body; + // req.on('data', function (data) { + // body += data; + // + // // Too much POST data, kill the connection! + // if (body.length > 1e6) + // request.connection.destroy(); + // }); + // req.on('end', function () { + // var post = qs.parse(body); + // + // // use post['blah'], etc. + // }); + // } + } +}; From b68f2b905f6f67fd00923895128337593e2d0e2c Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 14:04:24 -0700 Subject: [PATCH 43/96] Rentals. --- controllers/rentals.js | 53 ++++-------------------------------------- 1 file changed, 5 insertions(+), 48 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 4c0216c..914989f 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -1,60 +1,16 @@ "use strict"; var Customer = require('../models/customers'); -var sqlite3 = require('sqlite3').verbose(); -var db_env = process.env.DB || 'development'; -var db = new sqlite3.Database('db/' + db_env + '.db'); -var Movie = require('../models/rentals'); - exports.rentalsController = { - // GET /rentals - getAllRentals: function(res) { - db.all("SELECT * FROM rentals ", function(err, rows) { - if (err !== null) { - console.log(err); - } - res.status(200).json(rows); - }); - }, - - // GET /rentals/overdue - // movies and the customer associated with it - getAllOverdue:function(res) { - db.all("SELECT customers.name, movies.title FROM rentals INNER JOIN customers on customers.id = rentals.customer_id INNER JOIN movies on movies.id = rentals.movie_id WHERE check_in_date IS NULL; ", function(err, rows) { - if (err !== null) { - console.log(err); - } - res.status(200).json(rows); - }); - }, - - // GET /rentals/checkout_out - getAllCurrentlyOut:function(res) { - db.all("SELECT customers.name, movies.title FROM rentals INNER JOIN customers on customers.id = rentals.customer_id INNER JOIN movies on movies.id = rentals.movie_id WHERE check_in_date IS NOT NULL; ", function(err, rows) { - if (err !== null) { - console.log(err); - } - res.status(200).json(rows); - }); - }, /* + GET /rentals/overdue + movies and the customer associated with it + + GET /rentals/checkout_out POST /rentals/check_out(cust id, movie title) (math for checkout cost) // creating a new rental with no returned date - restapi.post('/data', function(req, res){ - db.run("UPDATE counts SET value = value + 1 WHERE key = ?", "counter", function(err, row){ - if (err){ - console.err(err); - res.status(500); - } - else { - res.status(202); - } - res.end(); - }); -}); - PATCH /rentals/check_in(cust id, movie title) // adding returned date */ @@ -69,6 +25,7 @@ exports.rentalsController = { var db = new Customer(); db.create(data, function(err, result) { + console.log("DONE"); }); From f62f018f3be14246367ad17b0381bf0d93c18768 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 14:09:55 -0700 Subject: [PATCH 44/96] Fixed rentals; weird merge didn't flag rentals for the same changes. --- controllers/rentals.js | 64 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 914989f..2bdde52 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -1,20 +1,44 @@ "use strict"; - var Customer = require('../models/customers'); +var sqlite3 = require('sqlite3').verbose(); +var db_env = process.env.DB || 'development'; +var db = new sqlite3.Database('db/' + db_env + '.db'); +var Movie = require('../models/rentals'); +var Customer = require('../models/customers'); exports.rentalsController = { - /* - GET /rentals/overdue - movies and the customer associated with it - - GET /rentals/checkout_out + // GET /rentals + getAllRentals: function(res) { + db.all("SELECT * FROM rentals ", function(err, rows) { + if (err !== null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, - POST /rentals/check_out(cust id, movie title) (math for checkout cost) - // creating a new rental with no returned date + // GET /rentals/overdue + // movies and the customer associated with it + getAllOverdue:function(res) { + db.all("SELECT customers.name, movies.title FROM rentals INNER JOIN customers on customers.id = rentals.customer_id INNER JOIN movies on movies.id = rentals.movie_id WHERE check_in_date IS NULL; ", function(err, rows) { + if (err !== null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, - PATCH /rentals/check_in(cust id, movie title) - // adding returned date - */ + // GET /rentals/checkout_out + getAllCurrentlyOut:function(res) { + db.all("SELECT customers.name, movies.title FROM rentals INNER JOIN customers on customers.id = rentals.customer_id INNER JOIN movies on movies.id = rentals.movie_id WHERE check_in_date IS NOT NULL; ", function(err, rows) { + if (err !== null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, + // POST /rentals/check_out(cust id, movie title) (math for checkout cost) + // creating a new rental with no returned date create: function(req, res) { console.log(req["req"]["body"]); @@ -45,4 +69,22 @@ exports.rentalsController = { // }); // } } + +/* + restapi.post('/data', function(req, res){ + db.run("UPDATE counts SET value = value + 1 WHERE key = ?", "counter", function(err, row){ + if (err){ + console.err(err); + res.status(500); + } + else { + res.status(202); + } + res.end(); + }); +}); + + PATCH /rentals/check_in(cust id, movie title) +// adding returned date + */ }; From 8dd14cdbed74670f90f72c698c6ae23da0dcc6e0 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 14:37:08 -0700 Subject: [PATCH 45/96] Removed some comments. --- controllers/rentals.js | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 2bdde52..900eb51 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -40,34 +40,14 @@ exports.rentalsController = { // POST /rentals/check_out(cust id, movie title) (math for checkout cost) // creating a new rental with no returned date create: function(req, res) { - console.log(req["req"]["body"]); - - // return res.status(200).json(req["req"]["body"]); - // return res.redirect('index', { title: 'Express' }); - var data = req["req"]["body"] - var db = new Customer(); - db.create(data, function(err, result) { + db.create(data, function(err, result) { console.log("DONE"); + // return res.status(200).json(req["req"]["body"]); + // return res.redirect('index', { title: 'Express' }); }); - - // if (req.method == 'POST') { - // var body = req.body; - // req.on('data', function (data) { - // body += data; - // - // // Too much POST data, kill the connection! - // if (body.length > 1e6) - // request.connection.destroy(); - // }); - // req.on('end', function () { - // var post = qs.parse(body); - // - // // use post['blah'], etc. - // }); - // } } /* From 1a8f4d336295f914480b09dbaad6e0726227f02a Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 14:46:09 -0700 Subject: [PATCH 46/96] Realized there weren't specific columns that the API call wanted back, so simply going to return all columns (going to undo my work in this commit, but I wanted a record of it in case I need to come back to it). --- controllers/customers.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/controllers/customers.js b/controllers/customers.js index d9cc630..3e10e80 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -17,6 +17,22 @@ exports.customersController = { // var results = { "customers": [] } var db = new Customer(); db.all(function(err, result) { + console.log(result) + results = [] + for (var i = 0; i < result.length; i++) { + result[i].name + results.push() + } + + // id: 1, + // name: 'Shelley Rocha', + // registered_at: 'Wed, 29 Apr 2015 07:54:14 -0700', + // address: 'Ap #292-5216 Ipsum Rd.', + // city: 'Hillsboro', + // state: 'OR', + // postal_code: '24309', + // phone: '(322) 510-8695', + // account_credit: 13.15 }, return res.status(200).json(result); }); }, From 61d0c580fc5d5856523f70cd8846f7384bc902f8 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 14:46:27 -0700 Subject: [PATCH 47/96] See previous commit. --- controllers/customers.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 3e10e80..d9cc630 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -17,22 +17,6 @@ exports.customersController = { // var results = { "customers": [] } var db = new Customer(); db.all(function(err, result) { - console.log(result) - results = [] - for (var i = 0; i < result.length; i++) { - result[i].name - results.push() - } - - // id: 1, - // name: 'Shelley Rocha', - // registered_at: 'Wed, 29 Apr 2015 07:54:14 -0700', - // address: 'Ap #292-5216 Ipsum Rd.', - // city: 'Hillsboro', - // state: 'OR', - // postal_code: '24309', - // phone: '(322) 510-8695', - // account_credit: 13.15 }, return res.status(200).json(result); }); }, From 0cc4aa0a43c3969dbaa108b8aa5aa0f9d5ea58cf Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 14:55:40 -0700 Subject: [PATCH 48/96] Added comment. --- controllers/customers.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/controllers/customers.js b/controllers/customers.js index d9cc630..80024f1 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -13,6 +13,7 @@ function sortBy(sort_by, req, res) { exports.customersController = { // GET /customers + // returns all customers index: function(req, res) { // var results = { "customers": [] } var db = new Customer(); @@ -22,8 +23,8 @@ exports.customersController = { }, // GET /customers/:id + // returns currently checked out movies & rental history show: function(req, res) { - // returns currently checkout_out movies & rental history var id = req["params"]["id"]; var db = new Customer(); db.find_checked_out(id, function(err, result) { @@ -32,17 +33,20 @@ exports.customersController = { }, // GET /customers/by_name?n=XXX&p=XXX + // returns customers sorted by name & only the number & pages selected showByName: function(req, res) { sortBy("name", req, res); }, // GET /customers/by_registered_at?n=XXX&p=XXX + // returns customers sorted by registered at & only the number & pages selected // NOTE: Need to change registered at to a time object? Sorting alphabetally vs. by date! showByRegistered_at: function(req, res) { sortBy("registered_at", req, res); }, // GET /customers/by_postal_code?n=XXX&p=XXX + // returns customers sorted by postal code & only the number & pages selected showByPostalCode: function(req, res) { sortBy("postal_code", req, res); } From 5771ccc63ae124ca09aeb57cb4b4f32cf47b8ae8 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Mon, 21 Sep 2015 15:22:34 -0700 Subject: [PATCH 49/96] WIP: Working on fixing sort by for registered at. --- controllers/customers.js | 7 +++++- models/customers.js | 47 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/controllers/customers.js b/controllers/customers.js index 80024f1..3f1a17e 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -42,7 +42,12 @@ exports.customersController = { // returns customers sorted by registered at & only the number & pages selected // NOTE: Need to change registered at to a time object? Sorting alphabetally vs. by date! showByRegistered_at: function(req, res) { - sortBy("registered_at", req, res); + var number = req["query"]["n"]; + var pages = req["query"]["p"]; + var db = new Customer(); + db.find_by_sorted_date("registered_at", number, pages, function(err, result) { + return res.status(200).json(result); + }); }, // GET /customers/by_postal_code?n=XXX&p=XXX diff --git a/models/customers.js b/models/customers.js index a9cf96e..89eb415 100644 --- a/models/customers.js +++ b/models/customers.js @@ -48,4 +48,51 @@ Customer.prototype.find_by_sorted = function(sort_by, number, pages, callback) { }); }; +Customer.prototype.find_by_sorted_date = function(sort_by, number, pages, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT * FROM customers;"; + + db.all(statement, function(err, res) { + // console.log(res); + // [ { id: 1, + // name: 'Shelley Rocha', + // registered_at: 'Wed, 29 Apr 2015 07:54:14 -0700', + // address: 'Ap #292-5216 Ipsum Rd.', + // city: 'Hillsboro', + // state: 'OR', + // postal_code: '24309', + // phone: '(322) 510-8695', + // account_credit: 13.15 }, + // { id: 2, + + // for each registered_at key inside the object inside the array + // compare + + var sorted = res.sort(function(a, b){ + return new Date(a.registered_at) - new Date(b.registered_at) + }); + console.log(sorted); + + + + + // if (number && pages) { + // var offset = (pages - 1) * number; + // + // + // var list = [{"name": "Bob", "me": 75}, {"name": "Anna", "me": 25}, {"name": "Jill", "me": 50}]; + // keysSorted = list.sort(function(a, b){return a.me-b.me}); + // alert(keysSorted); + // keysSorted = Object.keys(list).sort(function(a,b){return list[a]-list[b]}) + // alert(keysSorted); + // } + // else { + // statement = "SELECT * FROM customers ORDER BY " + sort_by + " ASC;"; + // } + + if (callback) callback(err, res); + db.close(); + }); +}; + module.exports = Customer; From 41c9fc264dabb032e356ce42fa656b24f97acaf3 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Tue, 22 Sep 2015 00:42:05 -0700 Subject: [PATCH 50/96] Added functionality for rentals --- controllers/rentals.js | 83 ++++++++++++++++++++++++++++++++++++++++-- routes/movies.js | 2 +- routes/rentals.js | 20 ++++++++++ 3 files changed, 100 insertions(+), 5 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 2bdde52..e37e4de 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -2,8 +2,17 @@ var sqlite3 = require('sqlite3').verbose(); var db_env = process.env.DB || 'development'; var db = new sqlite3.Database('db/' + db_env + '.db'); -var Movie = require('../models/rentals'); +var Movie = require('../models/movies'); var Customer = require('../models/customers'); +var Rental = require('../models/rentals'); + +// Convert a JavaScript Date to a string in yyyymmdd format +function yyyymmdd(date) { + var yyyy = date.getFullYear().toString(); + var mm = (date.getMonth()+1).toString(); // getMonth() is zero-based + var dd = date.getDate().toString(); + return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]); +} exports.rentalsController = { // GET /rentals @@ -19,7 +28,7 @@ exports.rentalsController = { // GET /rentals/overdue // movies and the customer associated with it getAllOverdue:function(res) { - db.all("SELECT customers.name, movies.title FROM rentals INNER JOIN customers on customers.id = rentals.customer_id INNER JOIN movies on movies.id = rentals.movie_id WHERE check_in_date IS NULL; ", function(err, rows) { + db.all("SELECT customers.name, movies.title FROM rentals INNER JOIN customers on customers.id = rentals.customer_id INNER JOIN movies on movies.id = rentals.movie_id WHERE check_in_date IS NULL AND date(expected_return_date) < date('now')", function(err, rows) { if (err !== null) { console.log(err); } @@ -27,9 +36,19 @@ exports.rentalsController = { }); }, - // GET /rentals/checkout_out + // GET /rentals/currently_out getAllCurrentlyOut:function(res) { - db.all("SELECT customers.name, movies.title FROM rentals INNER JOIN customers on customers.id = rentals.customer_id INNER JOIN movies on movies.id = rentals.movie_id WHERE check_in_date IS NOT NULL; ", function(err, rows) { + db.all("SELECT customers.name, movies.title FROM rentals INNER JOIN customers on customers.id = rentals.customer_id INNER JOIN movies on movies.id = rentals.movie_id WHERE check_in_date IS NULL", function(err, rows) { + if (err !== null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, + + // GET /rentals/available_inventory + getAvailableInventory:function(res) { + db.all("SELECT movies.title, movies.inventory-(SELECT COUNT(*) from rentals WHERE rentals.movie_id=movies.id AND check_in_date IS NULL) AS available from movies", function(err, rows) { if (err !== null) { console.log(err); } @@ -37,6 +56,62 @@ exports.rentalsController = { }); }, + // GET /rentals/current_renters/:title + getAllCurrentRenters:function(title, res) { + db.all("SELECT customers.name from rentals INNER JOIN movies ON movies.id = rentals.movie_id INNER JOIN customers on customers.id = rentals.customer_id WHERE movies.title LIKE ? AND check_in_date IS NULL", title, function(err, rows) { + if (err !== null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, + + // POST rentals/check_in?id=XXX&title=XXX + checkIn:function(id, title, res) { + + var now = new Date(); + //TODO: See if we can limit this to updating one row if multiple match + // (The same customer had checked out multiple copies of the same movie) + db.run("UPDATE rentals SET check_in_date=? WHERE customer_id=? AND movie_id=(SELECT id FROM movies where title LIKE ?)", yyyymmdd(now), id, title, function(err, rows) { + if (err !== null) { + console.log(err); + } + }); + + // TODO: Charge a late fee if now > expected_return_date + /* + db.run("UPDATE customers SET account_credit=(account_credit-5) WHERE id=?", id, function(err, rows) { + if (err !== null) { + console.log(err); + } + }); + */ + + res.status(200).json([]); + }, + + // POST rentals/check_out?id=XXX&title=XXX + checkOut:function(id, title, res) { + var checkoutLengthDays = 4; + var now = new Date(); + var due = new Date(now); + due.setDate(now.getDate()+checkoutLengthDays); + + db.run("INSERT INTO rentals (check_out_date, expected_return_date, customer_id, movie_id) VALUES (?,?,?,(SELECT id FROM movies where title LIKE ?))", yyyymmdd(now), yyyymmdd(due), id, title, function(err, rows) { + if (err !== null) { + console.log(err); + } + }); + + db.run("UPDATE customers SET account_credit=(account_credit-5) WHERE id=?", id, function(err, rows) { + if (err !== null) { + console.log(err); + } + }); + + res.status(200).json([]); + }, + // POST /rentals/check_out(cust id, movie title) (math for checkout cost) // creating a new rental with no returned date create: function(req, res) { diff --git a/routes/movies.js b/routes/movies.js index 9d6cc53..0841f43 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -25,7 +25,7 @@ router.get('/title/:title', function(req, res, next) { // GET /movies/release_date?n=XXX&p=XXX router.get('/release_date', function(req, res, next){ movie_exports.moviesController.getMoviesByReleaseDate(req.query.n, req.query.p, res); -}) +}); // GET /movies/title?n=XXX&p=XXX router.get('/title', function(req, res, next){ diff --git a/routes/rentals.js b/routes/rentals.js index bbbecd8..8638cdd 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -17,6 +17,26 @@ router.get('/currently_out', function(req, res, next){ rental_exports.rentalsController.getAllCurrentlyOut(res); }); +// GET rentals/available_inventory +router.get('/available_inventory', function(req, res, next){ + rental_exports.rentalsController.getAvailableInventory(res); +}); + +// GET rentals/current_renters/:title +router.get('/current_renters/:title', function(req, res, next) { + rental_exports.rentalsController.getAllCurrentRenters(req.params.title, res); +}); + +// POST rentals/check_in?id=XXX&title=XXX +router.post('/check_in', function(req, res, next) { + rental_exports.rentalsController.checkIn(req.query.id, req.query.title, res); +}); + +// POST rentals/check_out?id=XXX&title=XXX +router.post('/check_out', function(req, res, next) { + rental_exports.rentalsController.checkOut(req.query.id, req.query.title, res); +}); + // POST /rentals // check_out & check_in router.post('/', function(req, res, next) { From 4e4679deae041d3b4afda0b473698d2229407baf Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Tue, 22 Sep 2015 11:16:48 -0700 Subject: [PATCH 51/96] Took out some comments. --- controllers/rentals.js | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 900eb51..2d6da27 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -48,23 +48,11 @@ exports.rentalsController = { // return res.status(200).json(req["req"]["body"]); // return res.redirect('index', { title: 'Express' }); }); - } + }, -/* - restapi.post('/data', function(req, res){ - db.run("UPDATE counts SET value = value + 1 WHERE key = ?", "counter", function(err, row){ - if (err){ - console.err(err); - res.status(500); - } - else { - res.status(202); - } - res.end(); - }); -}); + //PATCH /rentals/check_in(cust id, movie title) + // adding returned date + update: function(req, res) { - PATCH /rentals/check_in(cust id, movie title) -// adding returned date - */ + } }; From 9194fa85bf3848b6cc1b9799d13e2b6ea48765e3 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Tue, 22 Sep 2015 11:18:32 -0700 Subject: [PATCH 52/96] Working on fixing the sort by registered date; works, but still a lot of commented out code to delete. --- controllers/customers.js | 17 ++++++++++- models/customers.js | 63 ++++++++++++++++------------------------ 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 3f1a17e..a32e2e1 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -46,7 +46,22 @@ exports.customersController = { var pages = req["query"]["p"]; var db = new Customer(); db.find_by_sorted_date("registered_at", number, pages, function(err, result) { - return res.status(200).json(result); + if (number && pages) { + var select = [] + var offset = (pages - 1) * number; + + // 6 - 10 (page 2 & number 5) + // [5, 6, 7, 8, 9] + var selection = Array.apply(null, Array(number)).map(function (_, i) {return offset + i;}); + for (var i = selection[0]; i < (selection[0] + selection.length); i++) { + select.push(result[i]); + } + + console.log(select); + return res.status(200).json(select); + } else { + return res.status(200).json(result); + } }); }, diff --git a/models/customers.js b/models/customers.js index 89eb415..bd993c9 100644 --- a/models/customers.js +++ b/models/customers.js @@ -53,44 +53,31 @@ Customer.prototype.find_by_sorted_date = function(sort_by, number, pages, callba var statement = "SELECT * FROM customers;"; db.all(statement, function(err, res) { - // console.log(res); - // [ { id: 1, - // name: 'Shelley Rocha', - // registered_at: 'Wed, 29 Apr 2015 07:54:14 -0700', - // address: 'Ap #292-5216 Ipsum Rd.', - // city: 'Hillsboro', - // state: 'OR', - // postal_code: '24309', - // phone: '(322) 510-8695', - // account_credit: 13.15 }, - // { id: 2, - - // for each registered_at key inside the object inside the array - // compare - - var sorted = res.sort(function(a, b){ - return new Date(a.registered_at) - new Date(b.registered_at) - }); - console.log(sorted); - - - - - // if (number && pages) { - // var offset = (pages - 1) * number; - // - // - // var list = [{"name": "Bob", "me": 75}, {"name": "Anna", "me": 25}, {"name": "Jill", "me": 50}]; - // keysSorted = list.sort(function(a, b){return a.me-b.me}); - // alert(keysSorted); - // keysSorted = Object.keys(list).sort(function(a,b){return list[a]-list[b]}) - // alert(keysSorted); - // } - // else { - // statement = "SELECT * FROM customers ORDER BY " + sort_by + " ASC;"; - // } - - if (callback) callback(err, res); + if (number && pages) { + // var offset = (pages - 1) * number; + + var sorted = res.sort(function(a, b){ + return new Date(a.registered_at) - new Date(b.registered_at) + }); + // sorted[offset] + // sorted[i] + // var select = [] + // + // var selection = Array.apply(null, Array(number)).map(function (_, i) {return offset + i;}); + // for (var i = selection[0]; i < (selection[0] + selection.length); i++) { + // select.push(sorted[i]); + // } + // + // console.log(select); + } + else { + var sorted = res.sort(function(a, b){ + return new Date(a.registered_at) - new Date(b.registered_at) + }); + console.log(sorted); + } + + if (callback) callback(err, sorted); db.close(); }); }; From e8f066baa7cc7929bf105015470adf06b82759ef Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Tue, 22 Sep 2015 14:05:32 -0700 Subject: [PATCH 53/96] WIP using models instead of controllers --- controllers/rentals.js | 57 ++++++++++++++++++++++-------------------- models/rentals.js | 37 +++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 232041b..5696b1c 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -7,12 +7,12 @@ var Customer = require('../models/customers'); var Rental = require('../models/rentals'); // Convert a JavaScript Date to a string in yyyymmdd format -function yyyymmdd(date) { - var yyyy = date.getFullYear().toString(); - var mm = (date.getMonth()+1).toString(); // getMonth() is zero-based - var dd = date.getDate().toString(); - return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]); -} +// function yyyymmdd(date) { +// var yyyy = date.getFullYear().toString(); +// var mm = (date.getMonth()+1).toString(); // getMonth() is zero-based +// var dd = date.getDate().toString(); +// return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]); +// } exports.rentalsController = { // GET /rentals @@ -91,26 +91,28 @@ exports.rentalsController = { }, // POST rentals/check_out?id=XXX&title=XXX - checkOut:function(id, title, res) { - var checkoutLengthDays = 4; - var now = new Date(); - var due = new Date(now); - due.setDate(now.getDate()+checkoutLengthDays); - - db.run("INSERT INTO rentals (check_out_date, expected_return_date, customer_id, movie_id) VALUES (?,?,?,(SELECT id FROM movies where title LIKE ?))", yyyymmdd(now), yyyymmdd(due), id, title, function(err, rows) { - if (err !== null) { - console.log(err); - } - }); - - db.run("UPDATE customers SET account_credit=(account_credit-5) WHERE id=?", id, function(err, rows) { - if (err !== null) { - console.log(err); - } - }); - - res.status(200).json([]); - }, + // checkOut:function(id, title, res) { + // var checkoutLengthDays = 4; + // var now = new Date(); + // var due = new Date(now); + // var rental_cost = 5 + // var late_fee = 3 + // due.setDate(now.getDate()+checkoutLengthDays); + // + // db.run("INSERT INTO rentals (check_out_date, expected_return_date, customer_id, movie_id) VALUES (?,?,?,(SELECT id FROM movies where title LIKE ?))", yyyymmdd(now), yyyymmdd(due), id, title, function(err, rows) { + // if (err !== null) { + // console.log(err); + // } + // }); + // + // db.run("UPDATE customers SET account_credit=(account_credit-rental_cost) WHERE id=?", id, function(err, rows) { + // if (err !== null) { + // console.log(err); + // } + // }); + // + // res.status(200).json([]); + // }, // POST /rentals/check_out(cust id, movie title) (math for checkout cost) // creating a new rental with no returned date @@ -118,7 +120,8 @@ exports.rentalsController = { var data = req["req"]["body"] var db = new Customer(); - db.create(data, function(err, result) { + db.check_out(data, function(err, result) { + // res.status(200).json(); console.log("DONE"); // return res.status(200).json(req["req"]["body"]); // return res.redirect('index', { title: 'Express' }); diff --git a/models/rentals.js b/models/rentals.js index 7c16c10..38e563e 100644 --- a/models/rentals.js +++ b/models/rentals.js @@ -1,9 +1,46 @@ "use strict"; +var sqlite3 = require("sqlite3").verbose(), + db_env = process.env.DB || 'development'; function Rental() { this.table_name = "rentals"; } +function yyyymmdd(date) { + var yyyy = date.getFullYear().toString(); + var mm = (date.getMonth()+1).toString(); // getMonth() is zero-based + var dd = date.getDate().toString(); + return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]); +} + Rental.prototype = require('../database'); +// Data should be an object with keys of customer_id and movie_title +Rental.prototype.check_out = function(data, callback){ + var db = new sqlite3.Database('db/'+ db_env + '.db'); + var checkoutLengthDays = 4; + var now = new Date(); + var due = new Date(now); + var rental_cost = 5 + var late_fee = 3 + var id = data.customer_id; + var title = data.movie_title + due.setDate(now.getDate()+checkoutLengthDays); + var insert_statement = "INSERT INTO rentals (check_out_date, expected_return_date, customer_id, movie_id) VALUES (?,?,?,(SELECT id FROM movies where title LIKE ?))"; + var charge_statement = "UPDATE customers SET account_credit=(account_credit-" +rental_cost+") WHERE id=?"; + db.run(insert_statement, yyyymmdd(now), yyyymmdd(due), id, title, function(err, rows) { + if (err !== null) { + console.log(err); + } + }); + + db.run(charge_statement, id, function(err, res) { + if (err !== null) { + console.log(err); + } + if (callback) callback(err, res); + db.close(); + }); +}; + module.exports = Rental; From 9e79aff49e71b87a83f07fdef28fb09fee45f6e8 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Tue, 22 Sep 2015 14:24:56 -0700 Subject: [PATCH 54/96] Fixed / Got Rentals POST request working\! --- controllers/rentals.js | 6 +++++- routes/rentals.js | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 232041b..510fece 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -115,11 +115,15 @@ exports.rentalsController = { // POST /rentals/check_out(cust id, movie title) (math for checkout cost) // creating a new rental with no returned date create: function(req, res) { - var data = req["req"]["body"] + console.log("request ", req); + var data = req["body"] var db = new Customer(); + console.log("response", res); db.create(data, function(err, result) { console.log("DONE"); + console.log(res); + return res.status(200).json({}); // return res.status(200).json(req["req"]["body"]); // return res.redirect('index', { title: 'Express' }); }); diff --git a/routes/rentals.js b/routes/rentals.js index 8638cdd..0758c0a 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -40,7 +40,7 @@ router.post('/check_out', function(req, res, next) { // POST /rentals // check_out & check_in router.post('/', function(req, res, next) { - rental_exports.rentalsController.create(res); + rental_exports.rentalsController.create(req, res); }); module.exports = router; From 4a587989ecc36061838deeded0295996a8de993d Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Tue, 22 Sep 2015 14:35:19 -0700 Subject: [PATCH 55/96] Removed comments from the create function & added error check. --- controllers/rentals.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 540e2f0..b4c5914 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -117,18 +117,16 @@ exports.rentalsController = { // POST /rentals/check_out(cust id, movie title) (math for checkout cost) // creating a new rental with no returned date create: function(req, res) { - console.log("request ", req); var data = req["body"] var db = new Customer(); - console.log("response", res); db.check_out(data, function(err, result) { - // res.status(200).json(); - console.log("DONE"); - console.log(res); - return res.status(200).json({}); - // return res.status(200).json(req["req"]["body"]); - // return res.redirect('index', { title: 'Express' }); + if (err !== null) { + console.log(err); + return res.status(500).json({}); + } else { + return res.status(200).json({}); + } }); }, From 69572c4855bdba07b9cd27d064531047a7a95308 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Tue, 22 Sep 2015 16:23:37 -0700 Subject: [PATCH 56/96] Working on checkout and checkin functions for rentals. Troubleshooting late-fees (ain't working yet). --- controllers/rentals.js | 97 +++++++++++++++++++++--------------------- routes/rentals.js | 10 +---- utils/rentals.json | 14 ++++++ 3 files changed, 65 insertions(+), 56 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index b4c5914..a581e71 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -7,12 +7,12 @@ var Customer = require('../models/customers'); var Rental = require('../models/rentals'); // Convert a JavaScript Date to a string in yyyymmdd format -// function yyyymmdd(date) { -// var yyyy = date.getFullYear().toString(); -// var mm = (date.getMonth()+1).toString(); // getMonth() is zero-based -// var dd = date.getDate().toString(); -// return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]); -// } +function yyyymmdd(date) { + var yyyy = date.getFullYear().toString(); + var mm = (date.getMonth()+1).toString(); // getMonth() is zero-based + var dd = date.getDate().toString(); + return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]); +} exports.rentalsController = { // GET /rentals @@ -66,17 +66,51 @@ exports.rentalsController = { }); }, - // POST rentals/check_in?id=XXX&title=XXX + // PATCH rentals/check_in?id=XXX&title=XXX checkIn:function(id, title, res) { - var now = new Date(); + var late_fee = 3; //TODO: See if we can limit this to updating one row if multiple match // (The same customer had checked out multiple copies of the same movie) - db.run("UPDATE rentals SET check_in_date=? WHERE customer_id=? AND movie_id=(SELECT id FROM movies where title LIKE ?)", yyyymmdd(now), id, title, function(err, rows) { - if (err !== null) { - console.log(err); - } - }); + // db.run("UPDATE rentals SET check_in_date=? WHERE customer_id=? AND movie_id=(SELECT id FROM movies where title LIKE ?)", yyyymmdd(now), id, title, function(err, result) { + // if (err !== null) { + // console.log(err); + // } + // else { + // res.status(200).json([]); + // } + // }); + var statement = "SELECT id FROM rentals WHERE customer_id=? \ + AND movie_id=(SELECT id FROM movies where title LIKE ?) \ + AND check_in_date IS NULL;" + + db.all(statement, id, title, function(err, result1) { + console.log(result1); + // if (result == []) { + // res.status(404).json([]); + // } + // else { + var statement_oldest = "UPDATE rentals SET check_in_date=? WHERE id=" + result1[0].id; + db.all(statement_oldest, yyyymmdd(now), function(err, result2) { + if (err !== null) { + console.log(err); + } else { + var statement_late_fee = "UPDATE customers SET account_credit=(account_credit-" + late_fee + ") WHERE id=? AND date(SELECT expected_return_date FROM rentals WHERE id=?) < date('now')"; + + db.run(statement_late_fee, id, result1[0].id, function(err, result3) { + if (err !== null) { + console.log(err); + } + else { + res.status(200).json([]); + } + }); + } + }) + // } + }) + }, + // TODO: Charge a late fee if now > expected_return_date /* @@ -87,37 +121,10 @@ exports.rentalsController = { }); */ - res.status(200).json([]); - }, - - // POST rentals/check_out?id=XXX&title=XXX - // checkOut:function(id, title, res) { - // var checkoutLengthDays = 4; - // var now = new Date(); - // var due = new Date(now); - // var rental_cost = 5 - // var late_fee = 3 - // due.setDate(now.getDate()+checkoutLengthDays); - // - // db.run("INSERT INTO rentals (check_out_date, expected_return_date, customer_id, movie_id) VALUES (?,?,?,(SELECT id FROM movies where title LIKE ?))", yyyymmdd(now), yyyymmdd(due), id, title, function(err, rows) { - // if (err !== null) { - // console.log(err); - // } - // }); - // - // db.run("UPDATE customers SET account_credit=(account_credit-rental_cost) WHERE id=?", id, function(err, rows) { - // if (err !== null) { - // console.log(err); - // } - // }); - // - // res.status(200).json([]); - // }, - // POST /rentals/check_out(cust id, movie title) (math for checkout cost) // creating a new rental with no returned date - create: function(req, res) { - var data = req["body"] + checkOut:function(req, res) { + var data = req["body"]; var db = new Customer(); db.check_out(data, function(err, result) { @@ -128,11 +135,5 @@ exports.rentalsController = { return res.status(200).json({}); } }); - }, - - //PATCH /rentals/check_in(cust id, movie title) - // adding returned date - update: function(req, res) { - } }; diff --git a/routes/rentals.js b/routes/rentals.js index 0758c0a..e75d6a3 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -28,19 +28,13 @@ router.get('/current_renters/:title', function(req, res, next) { }); // POST rentals/check_in?id=XXX&title=XXX -router.post('/check_in', function(req, res, next) { +router.patch('/check_in', function(req, res, next) { rental_exports.rentalsController.checkIn(req.query.id, req.query.title, res); }); // POST rentals/check_out?id=XXX&title=XXX router.post('/check_out', function(req, res, next) { - rental_exports.rentalsController.checkOut(req.query.id, req.query.title, res); -}); - -// POST /rentals -// check_out & check_in -router.post('/', function(req, res, next) { - rental_exports.rentalsController.create(req, res); + rental_exports.rentalsController.checkOut(req, res); }); module.exports = router; diff --git a/utils/rentals.json b/utils/rentals.json index 7e536cd..1bc5b96 100644 --- a/utils/rentals.json +++ b/utils/rentals.json @@ -26,5 +26,19 @@ "expected_return_date": "1990-02-01", "customer_id": 10, "movie_id": 1 + }, + { + "check_out_date": "1990-01-01", + "check_in_date": null, + "expected_return_date": "1990-02-01", + "customer_id": 5, + "movie_id": 16 + }, + { + "check_out_date": "2015-09-19", + "check_in_date": null, + "expected_return_date": "2015-10-01", + "customer_id": 5, + "movie_id": 17 } ] From e2524d393b25e5b261cdbd568c9b22a30b59c63f Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Tue, 22 Sep 2015 16:44:38 -0700 Subject: [PATCH 57/96] Finished Rentals checkin/! Charge customer late fee if late. --- controllers/rentals.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index a581e71..319bda9 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -95,8 +95,8 @@ exports.rentalsController = { if (err !== null) { console.log(err); } else { - var statement_late_fee = "UPDATE customers SET account_credit=(account_credit-" + late_fee + ") WHERE id=? AND date(SELECT expected_return_date FROM rentals WHERE id=?) < date('now')"; - + var statement_late_fee = "UPDATE customers SET account_credit=(account_credit-" + late_fee + ") WHERE id=? AND date((SELECT expected_return_date FROM rentals WHERE id=?)) < date('now');"; + db.run(statement_late_fee, id, result1[0].id, function(err, result3) { if (err !== null) { console.log(err); From 628fcf2f49c577b10cf0eca06a7d27cd5c09112b Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Tue, 22 Sep 2015 22:38:40 -0700 Subject: [PATCH 58/96] WIP testing on movies endpoint --- package.json | 4 +- test/models/movies.js | 285 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 288 insertions(+), 1 deletion(-) create mode 100644 test/models/movies.js diff --git a/package.json b/package.json index 58e3c4a..126bddb 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "scripts": { "start": "nodemon ./bin/www", + "test": "clear; DB=test mocha --recursive", "reset": "node ./utils/schema", "seed": "node ./utils/seed" }, @@ -15,6 +16,7 @@ "jade": "~1.11.0", "morgan": "~1.6.1", "serve-favicon": "~2.3.0", - "sqlite3": "^3.1.0" + "sqlite3": "^3.1.0", + "supertest": "^1.1.0" } } diff --git a/test/models/movies.js b/test/models/movies.js new file mode 100644 index 0000000..3228253 --- /dev/null +++ b/test/models/movies.js @@ -0,0 +1,285 @@ +var request = require('supertest'), + assert = require('assert'), + //Movie = require('../models/movies') + sqlite3 = require('sqlite3').verbose(), + app = require('../../app'), + agent = request.agent(app); + +/* +describe("Movie", function() { + var movie, db_cleaner + + beforeEach(function(done) { + movie = new Movie.create(); + + }) + + it("can be instantiated", function() { + assert(movie instanceof Movie); + }); +*/ + +describe("Endpoints under /movies", function() { + + // Reset test.db with test data before each test + beforeEach(function(done) { + var db_cleaner = new sqlite3.Database('db/test.db'); + db_cleaner.serialize(function() { + db_cleaner.exec( + "BEGIN; \ + DELETE FROM movies; \ + INSERT INTO movies(title, overview, release_date, inventory) \ + VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ + ('Maws', 'Worm!', 'Yesterday', 11), \ + ('Claws', 'Cat!', 'Yesterday', 12), \ + ('Paws', 'Bear!', 'Yesterday', 13), \ + ('Gauze', 'Ouch!', 'Yesterday', 14); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + + describe('GET /movies', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/movies') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"title":"Jaws","overview":"Shark!","release_date":"Yesterday","inventory":10},{"title":"Maws","overview":"Worm!","release_date":"Yesterday","inventory":11},{"title":"Claws","overview":"Cat!","release_date":"Yesterday","inventory":12},{"title":"Paws","overview":"Bear!","release_date":"Yesterday","inventory":13},{"title":"Gauze","overview":"Ouch!","release_date":"Yesterday","inventory":14}]', done); + }); + }); + + describe('GET /movies/title/:title/inventory', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/movies/title/Jaws/inventory') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"title":"Jaws","inventory":10}]', done); + }); + }); + + describe('GET /movies/title/:title', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/movies/title/Paws') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with json (different casing of title)', function(done){ + agent + .get('/movies/title/pAwS') + .set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"title":"Paws","overview":"Bear!","release_date":"Yesterday","inventory":13}]', done); + }); + + it('responds with correct data (different casing of title)', function(done){ + agent + .get('/movies/title/pAwS') + .set('Accept', 'application/json') + .expect('[{"title":"Paws","overview":"Bear!","release_date":"Yesterday","inventory":13}]', done); + }); + }); + + describe('GET /movies/release_date?n=XXX&p=XXX', function(){ + + it('handles no n and no p', function(done){ + agent + .get('/movies/release_date') + .set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200) + .expect('[{"title":"Jaws","release_date":"Yesterday"},{"title":"Maws","release_date":"Yesterday"},{"title":"Claws","release_date":"Yesterday"},{"title":"Paws","release_date":"Yesterday"},{"title":"Gauze","release_date":"Yesterday"}]', done); + }); + + it('handles n=0', function(done){ + agent + .get('/movies/release_date?n=0') + .set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200) + .expect('[]', done); + }); + + it('handles n=1', function(done){ + agent + .get('/movies/release_date?n=1') + .set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200) + .expect('[{"title":"Jaws","release_date":"Yesterday"}]', done); + }); + + it('handles n=2', function(done){ + agent + .get('/movies/release_date?n=2') + .set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200) + .expect('[{"title":"Jaws","release_date":"Yesterday"},{"title":"Maws","release_date":"Yesterday"}]', done); + }); + + it('handles n=0, p=1', function(done){ + agent + .get('/movies/release_date?n=0&p=1') + .set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200) + .expect('[]', done); + }); + + it('handles n=1, p=3', function(done){ + agent + .get('/movies/release_date?n=1&p=3') + .set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200) + .expect('[{"title":"Claws","release_date":"Yesterday"}]', done); + }); + + it('handles n=2, p=2', function(done){ + agent + .get('/movies/release_date?n=2&p=2') + .set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200) + .expect('[{"title":"Claws","release_date":"Yesterday"},{"title":"Paws","release_date":"Yesterday"}]', done); + }); + + it('handles n=2, p=3', function(done){ + agent + .get('/movies/release_date?n=2&p=3') + .set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200) + .expect('[{"title":"Gauze","release_date":"Yesterday"}]', done); + }); + + }); + + +}); + +/* +describe("instance methods", function() { + it("can find all movies", function(done) { + movie.all(function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 5); //jaws maws claws paws gauze + + assert.equal(res[0].title, 'Jaws'); + assert.equal(res[1].title, 'Maws'); + + done(); + }); + }); + + it("can find some of the movies", function(done) { + movie.some(2, 3, function(error, result) { + assert.equal(error, undefined); + assert(result instanceof Array); + assert.equal(result.length, 2); //paws gauze + + assert.equal(result[0].title, 'Paws'); + assert.equal(result[1].title, 'Gauze'); + + done(); + }); + }); + + it("can find a movie by id", function(done){ + movie.find_by("id", 1, function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(res[0].id, 1); + done(); + }); + }); + + it("can find a movie by title", function(done) { + movie.find_by("title", "Jaws", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(res[0].title, 'Jaws'); + done(); + }); + }); + + it("can save changes to a movie", function(done) { + movie.find_by("title", "Jaws", function(err, res) { + var original_title = res[0].title; + var id = res[0].id; + movie.save({title: "Jaws 2: Jawsier", id: id}, function(err, res) { + assert.equal(err, undefined); + assert.equal(res.inserted_id, 0); //it didn't insert any records + assert.equal(res.changed, 1); //it updated one record + done(); + }); + }); + }); + + it("can save a new movie to the database", function(done) { + var data = { + title: "RoboJaws", + overview: "Jaws is hunted by RoboJaws", + release_date: "Tomorrow", + inventory: 10 + }; + + movie.create(data, function(err, res) { + assert.equal(res.inserted_id, 6); //it inserted a new record + assert.equal(res.changed, 1); //one record was changed + + movie.find_by("title", "RoboJaws", function(err, res) { + assert.equal(res.length, 1); + assert.equal(res[0].title, 'RoboJaws'); //we found our new movie + done(); + }); + }); + }); +}); +*/ +// }) From 917c89fd7e1727624f78fcfeb76e2d7ae9b0683d Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Wed, 23 Sep 2015 09:17:40 -0700 Subject: [PATCH 59/96] Deleted some old comments. --- controllers/rentals.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 319bda9..c896ea3 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -111,16 +111,6 @@ exports.rentalsController = { }) }, - - // TODO: Charge a late fee if now > expected_return_date - /* - db.run("UPDATE customers SET account_credit=(account_credit-5) WHERE id=?", id, function(err, rows) { - if (err !== null) { - console.log(err); - } - }); - */ - // POST /rentals/check_out(cust id, movie title) (math for checkout cost) // creating a new rental with no returned date checkOut:function(req, res) { From 362f31971f30df240c8d73cd7c6d5fe661818ef8 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Wed, 23 Sep 2015 09:21:14 -0700 Subject: [PATCH 60/96] deleted commented out test that don't work --- test/models/movies.js | 100 ------------------------------------------ 1 file changed, 100 deletions(-) diff --git a/test/models/movies.js b/test/models/movies.js index 3228253..27ba88f 100644 --- a/test/models/movies.js +++ b/test/models/movies.js @@ -5,19 +5,6 @@ var request = require('supertest'), app = require('../../app'), agent = request.agent(app); -/* -describe("Movie", function() { - var movie, db_cleaner - - beforeEach(function(done) { - movie = new Movie.create(); - - }) - - it("can be instantiated", function() { - assert(movie instanceof Movie); - }); -*/ describe("Endpoints under /movies", function() { @@ -194,92 +181,5 @@ describe("Endpoints under /movies", function() { .expect(200) .expect('[{"title":"Gauze","release_date":"Yesterday"}]', done); }); - - }); - - -}); - -/* -describe("instance methods", function() { - it("can find all movies", function(done) { - movie.all(function(err, res) { - assert.equal(err, undefined); - assert(res instanceof Array); - assert.equal(res.length, 5); //jaws maws claws paws gauze - - assert.equal(res[0].title, 'Jaws'); - assert.equal(res[1].title, 'Maws'); - - done(); - }); - }); - - it("can find some of the movies", function(done) { - movie.some(2, 3, function(error, result) { - assert.equal(error, undefined); - assert(result instanceof Array); - assert.equal(result.length, 2); //paws gauze - - assert.equal(result[0].title, 'Paws'); - assert.equal(result[1].title, 'Gauze'); - - done(); - }); - }); - - it("can find a movie by id", function(done){ - movie.find_by("id", 1, function(err, res) { - assert.equal(err, undefined); - assert(res instanceof Array); - assert.equal(res.length, 1); - assert.equal(res[0].id, 1); - done(); - }); - }); - - it("can find a movie by title", function(done) { - movie.find_by("title", "Jaws", function(err, res) { - assert.equal(err, undefined); - assert(res instanceof Array); - assert.equal(res.length, 1); - assert.equal(res[0].title, 'Jaws'); - done(); - }); - }); - - it("can save changes to a movie", function(done) { - movie.find_by("title", "Jaws", function(err, res) { - var original_title = res[0].title; - var id = res[0].id; - movie.save({title: "Jaws 2: Jawsier", id: id}, function(err, res) { - assert.equal(err, undefined); - assert.equal(res.inserted_id, 0); //it didn't insert any records - assert.equal(res.changed, 1); //it updated one record - done(); - }); - }); - }); - - it("can save a new movie to the database", function(done) { - var data = { - title: "RoboJaws", - overview: "Jaws is hunted by RoboJaws", - release_date: "Tomorrow", - inventory: 10 - }; - - movie.create(data, function(err, res) { - assert.equal(res.inserted_id, 6); //it inserted a new record - assert.equal(res.changed, 1); //one record was changed - - movie.find_by("title", "RoboJaws", function(err, res) { - assert.equal(res.length, 1); - assert.equal(res[0].title, 'RoboJaws'); //we found our new movie - done(); - }); - }); }); }); -*/ -// }) From 9e3c86b9df6b7af14846717cefbef3e4dc39d8f2 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Wed, 23 Sep 2015 11:12:35 -0700 Subject: [PATCH 61/96] Working on (and trying to understand) tests for nodejs & customers. --- .../controllers/customers_controller_tests.js | 85 +++++++++++++++++++ test/customers_controller_tests.js | 45 ---------- test/models/customer_tests.js | 19 +++++ 3 files changed, 104 insertions(+), 45 deletions(-) create mode 100644 test/controllers/customers_controller_tests.js delete mode 100644 test/customers_controller_tests.js create mode 100644 test/models/customer_tests.js diff --git a/test/controllers/customers_controller_tests.js b/test/controllers/customers_controller_tests.js new file mode 100644 index 0000000..2737a0d --- /dev/null +++ b/test/controllers/customers_controller_tests.js @@ -0,0 +1,85 @@ +var request = require('supertest'); +var assert = require('assert'); +var app = require('../../app'); +var sqlite3 = require('sqlite3').verbose(); +var agent = request.agent(app); +// var CustomersController = require("../controllers/customers"); + +describe("Customers Controller", function() { + // var cc = null, + // db = null; + // beforeEach(function() { + // db = new Database("db/test.db"); + // cc = new CustomerController; + // }); + beforeEach(function(done) { + db_cleaner = new sqlite3.Database('db/test.db'); + db_cleaner.serialize(function() { + db_cleaner.exec( + "BEGIN TRANSACTION; \ + DELETE FROM customers; \ + INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ + VALUES('A', '2015-01-01', '111 St', 'Seattle', 'WA', '55555', '555-5555', 19.50), \ + ('B', '2015-01-02', '222 St', 'Seattle', 'WA', '55555', '666-6666', 18.50); \ + COMMIT TRANSACTION;", + function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }) + + describe("GET /customers", function() { + var movie_request; + + beforeEach(function(done) { + movie_request = agent + .get('/customers') + .set('Accept', 'application/json'); + done(); + }) + + it("responds with json", function(done) { + movie_request + .expect('Content-Type', /application\/xmljson/) + .expect(200) + .end(function(err, res) { + if (err) return done(err); + done(); + }); + }) + + // it("returns all customers") + }); + + // describe("GET /customers/:id", function() { + // + // }); + // + // describe("GET /customers/by_name", function() { + // + // }); + // + // describe("GET /customers/by_registered_at", function() { + // + // }); + // + // describe("GET /customers/by_postal_code", function() { + // + // }); +}); + +// THEY ALL SHOULD: +// +// it("returns JSON", function() { +// +// }); +// +// it("should return 200 if results", function() { +// +// }); +// +// it("should return 204 if no results", function() { +// +// }); diff --git a/test/customers_controller_tests.js b/test/customers_controller_tests.js deleted file mode 100644 index f63b661..0000000 --- a/test/customers_controller_tests.js +++ /dev/null @@ -1,45 +0,0 @@ -var assert = require("assert"); -var CustomersController = require("../controllers/customers"); - -describe("CustomersController", function() { - var cc = null, - db = null; - beforeEach(function() { - db = new Database("db/test.db"); - cc = new CustomerController; - }); - - describe("GET /customers", function() { - it("returns all customers") - }); - - describe("GET /customers/:id", function() { - - }); - - describe("GET /customers/by_name", function() { - - }); - - describe("GET /customers/by_registered_at", function() { - - }); - - describe("GET /customers/by_postal_code", function() { - - }); -}); - -// THEY ALL SHOULD: -// -// it("returns JSON", function() { -// -// }); -// -// it("should return 200 if results", function() { -// -// }); -// -// it("should return 204 if no results", function() { -// -// }); diff --git a/test/models/customer_tests.js b/test/models/customer_tests.js new file mode 100644 index 0000000..042d261 --- /dev/null +++ b/test/models/customer_tests.js @@ -0,0 +1,19 @@ +var assert = require('assert'), + sqlite3 = require('sqlite3').verbose(), + customer = require('../../models/customers'); + +describe("Customer", function() { + var a_customer; + var db_cleaner; + + beforeEach(function(done) { + a_customer = new Customer(); + + db_cleaner = new sqlite3.Database('db/test.db'); + db_cleaner.serialize(function() { + db_cleaner.exec( + + ) + }) + }) +}) From 186b7ef67eae6ee57e9fe857410674c3e68731ad Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Wed, 23 Sep 2015 11:41:39 -0700 Subject: [PATCH 62/96] Movies Controller Endpoint Tests --- controllers/movies.js | 4 +- test/{models => controllers}/movies.js | 98 +++++++++++++++++++++++--- test/movies_controller_tests.js | 68 ------------------ 3 files changed, 90 insertions(+), 80 deletions(-) rename test/{models => controllers}/movies.js (62%) delete mode 100644 test/movies_controller_tests.js diff --git a/controllers/movies.js b/controllers/movies.js index cb0cd9e..c8e31e0 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -98,7 +98,7 @@ exports.moviesController = { db.all("SELECT customers.id, customers.name, customers.phone, rentals.check_out_date FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id INNER JOIN movies ON movies.id = rentals.movie_id WHERE movies.title LIKE ? AND rentals.check_in_date IS NULL", title, function(err, rows) { if (err !== null) { console.log(err); - } + }console.log(rows); res.status(200).json(rows); }); }, @@ -118,7 +118,7 @@ exports.moviesController = { db.all("SELECT customers.id, customers.name, customers.phone, rentals.check_out_date FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id INNER JOIN movies ON movies.id = rentals.movie_id WHERE movies.title LIKE ? AND rentals.check_in_date IS NOT NULL ORDER BY ?", title, order, function(err, rows) { if (err !== null) { console.log(err); - } + }console.log(rows); res.status(200).json(rows); }); } diff --git a/test/models/movies.js b/test/controllers/movies.js similarity index 62% rename from test/models/movies.js rename to test/controllers/movies.js index 27ba88f..145552b 100644 --- a/test/models/movies.js +++ b/test/controllers/movies.js @@ -1,11 +1,9 @@ var request = require('supertest'), assert = require('assert'), - //Movie = require('../models/movies') sqlite3 = require('sqlite3').verbose(), app = require('../../app'), agent = request.agent(app); - describe("Endpoints under /movies", function() { // Reset test.db with test data before each test @@ -15,14 +13,29 @@ describe("Endpoints under /movies", function() { db_cleaner.exec( "BEGIN; \ DELETE FROM movies; \ - INSERT INTO movies(title, overview, release_date, inventory) \ - VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ - ('Maws', 'Worm!', 'Yesterday', 11), \ - ('Claws', 'Cat!', 'Yesterday', 12), \ - ('Paws', 'Bear!', 'Yesterday', 13), \ - ('Gauze', 'Ouch!', 'Yesterday', 14); \ - COMMIT;" - , function(err) { + INSERT INTO movies(id, title, overview, release_date, inventory) \ + VALUES(1, 'Jaws', 'Shark!', 'Yesterday', 10), \ + (2, 'Maws', 'Worm!', 'Yesterday', 11), \ + (3, 'Claws', 'Cat!', 'Yesterday', 12), \ + (4, 'Paws', 'Bear!', 'Yesterday', 13), \ + (5, 'Gauze', 'Ouch!', 'Yesterday', 14); \ + DELETE FROM customers; \ + INSERT INTO customers(id, name, registered_at, address, city, state, postal_code, phone, account_credit) \ + VALUES(1, 'Shelly', '2013-09-16', '123 somewhere st', 'Kirkland', 'WA', '98033', '(123)-456-7890', '40'), \ + (2, 'Michelle', '2012-09-19', '234 blvd e', 'Tacoma', 'WA', '98047', '(123)-456-7810', '34'), \ + (3, 'Adam', 2014-09-22, '5 privet dr', 'Little Winging', 'HP', '12345', '(425)-456-7890', '30'), \ + (4, 'Tyler', '2015-09-22', '1600 Pennsylvania ave', 'Yakima', 'WA', '98908', '(360)-123-3345', '24'), \ + (5, 'Brandi', 2011-09-22, '567 your town', 'Seattle', 'WA', '98102', '(206)-456-7890', '10'); \ + DELETE FROM rentals; \ + INSERT INTO rentals(id, check_out_date, check_in_date, expected_return_date, movie_id, customer_id) \ + VALUES(1, '2015-09-15', '2015-09-16', '2015-09-19', 1, 1), \ + (2, '2015-09-16', '2015-09-19', '2015-09-20', 2, 2), \ + (3, '2015-09-17', null, '2015-09-21', 1, 3), \ + (4, '2015-09-18', '2015-09-22', '2015-09-22', 3, 4), \ + (5, '2015-09-19', null, '2015-09-23', 4, 5); \ + COMMIT;", + function(err) { + console.log(err); db_cleaner.close(); done(); } @@ -51,6 +64,27 @@ describe("Endpoints under /movies", function() { }); }); + describe('GET /movies/id/:id', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/movies/id/1') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"title":"Jaws","overview":"Shark!","release_date":"Yesterday","inventory":10}]', done); + }); + }); + describe('GET /movies/title/:title/inventory', function(){ var request; beforeEach(function(done) { @@ -182,4 +216,48 @@ describe("Endpoints under /movies", function() { .expect('[{"title":"Gauze","release_date":"Yesterday"}]', done); }); }); + + describe('GET /movies/title/:title/checked_out_current', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/movies/title/Jaws/checked_out_current') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"id":3,"name":"Adam","phone":"(425)-456-7890","check_out_date":"2015-09-17"}]', function(err, res){ + done(err); + }); + }); + }); + + describe('GET /movies/title/:title/checked_out_history', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/movies/title/Jaws/checked_out_history') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"id":1,"name":"Shelly","phone":"(123)-456-7890","check_out_date":"2015-09-15"}]', done); + }); + }); }); diff --git a/test/movies_controller_tests.js b/test/movies_controller_tests.js deleted file mode 100644 index f2a18d4..0000000 --- a/test/movies_controller_tests.js +++ /dev/null @@ -1,68 +0,0 @@ -"use strict"; - -var sqlite3 = require('sqlite3').verbose(); -var db_env = process.env.DB || 'development'; -var db = new sqlite3.Database('db/' + db_env + '.db'); - -// var assert = require("assert"); -// -// describe("moviesController", function(){ -// -// }) - -// var assert = require("assert"); -// describe('Array', function() { -// describe('#indexOf()', function () { -// it('should return -1 when the value is not present', function () { -// assert.equal(-1, [1,2,3].indexOf(5)); -// assert.equal(-1, [1,2,3].indexOf(0)); -// }); -// }); -// }); - - -var assert = require("assert"); -describe("moviesController", function() { - var moviesController = null - - beforeEach(function() { - - }) - - it("GET all movies at endpoint /movies", function() { - - db.all("SELECT title, overview, release_date, inventory FROM movies", function(err, rows) { - assert.equal(err, null); - - // Make HTTP request to /movies and compare the returned data with - // the data from the DB (rows) - - }); - }) - - it("has a `test` property that is a function", function() { - assert.equal(typeof db.test, "function"); - }) - - it("holds onto the `path` to the database", function() { - assert.equal(db.path, database_path); - }) - - describe("`query` function", function() { - before(function() { - // create a users table - db.query("CREATE TABLE IF NOT EXISTS users (name TEXT);"); - - // insert some users - }) - - it("has a users table", function(done) { - var table_exists = "SELECT count(*) AS table_count FROM sqlite_master WHERE type='table' AND name='users'; "; - - db.query(table_exists, function(result) { - assert.equal(result[0].table_count, 1); - done(); - }); - }) - }) -}) From cd4a4264fca118f721a43bc03a71014549a0a278 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Wed, 23 Sep 2015 12:00:20 -0700 Subject: [PATCH 63/96] Added some new npm commands. --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 126bddb..88137f0 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,10 @@ "private": true, "scripts": { "start": "nodemon ./bin/www", - "test": "clear; DB=test mocha --recursive", + "test": "clear; DB=test mocha --recursive;", "reset": "node ./utils/schema", - "seed": "node ./utils/seed" + "seed": "node ./utils/seed", + "setup": "npm run reset; npm run seed; DB=test npm run reset" }, "dependencies": { "body-parser": "~1.13.2", From 43fa49e8434c0a701900afa07d2c8791f78a635a Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Wed, 23 Sep 2015 12:02:34 -0700 Subject: [PATCH 64/96] Wrote an incorrect test for customers/:id\! Way to get involved and look at the requirements, whoo\! --- .../controllers/customers_controller_tests.js | 75 ++++++++++++++++--- 1 file changed, 63 insertions(+), 12 deletions(-) diff --git a/test/controllers/customers_controller_tests.js b/test/controllers/customers_controller_tests.js index 2737a0d..af08034 100644 --- a/test/controllers/customers_controller_tests.js +++ b/test/controllers/customers_controller_tests.js @@ -31,32 +31,83 @@ describe("Customers Controller", function() { }) describe("GET /customers", function() { - var movie_request; + var customer_request; beforeEach(function(done) { - movie_request = agent - .get('/customers') - .set('Accept', 'application/json'); + customer_request = agent + .get('/customers') + .set('Accept', 'application/json'); done(); }) it("responds with json", function(done) { - movie_request - .expect('Content-Type', /application\/xmljson/) + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + // .end(function(err, res) { + // if (err) return done(err); + // done(); + // }); + }); + + it("returns an array of all customer objects", function(done) { + customer_request + .expect(200, function(error, result) { + assert.equal(result.body.length, 2); + + var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }) + }); + }); + + describe("GET /customers/:id", function() { + var customer_request; + + beforeEach(function(done) { + customer_request = agent + .get('/customers/1') + .set('Accept', 'application/json'); + done(); + }) + + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) .expect(200) .end(function(err, res) { if (err) return done(err); done(); }); - }) + }); + + it("can find customer with id 1", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + console.log(res); + assert.equal(res.body.length, 1); + + var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; + var customer = res.body[0] + assert.deepEqual(Object.keys(customer), keys); + + assert.equal(customer.name, 'A'); + assert.equal(customer.registered_at, '2015-01-01'); + assert.equal(customer.address, '111 St'); + assert.equal(customer.city, 'Seattle'); + assert.equal(customer.state, 'WA'); + assert.equal(customer.postal_code, '55555'); + assert.equal(customer.phone, '555-5555'); + assert.equal(customer.account_credit, 19.50); + + done(); + }) + }); - // it("returns all customers") }); - // describe("GET /customers/:id", function() { - // - // }); - // // describe("GET /customers/by_name", function() { // // }); From 14a5f3c6b787b25df29430645b8233bc5aea77d7 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Wed, 23 Sep 2015 13:38:42 -0700 Subject: [PATCH 65/96] WIP rentals controllers --- controllers/rentals.js | 10 --- test/controllers/rentals.js | 151 ++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 10 deletions(-) create mode 100644 test/controllers/rentals.js diff --git a/controllers/rentals.js b/controllers/rentals.js index c896ea3..cda5057 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -70,16 +70,6 @@ exports.rentalsController = { checkIn:function(id, title, res) { var now = new Date(); var late_fee = 3; - //TODO: See if we can limit this to updating one row if multiple match - // (The same customer had checked out multiple copies of the same movie) - // db.run("UPDATE rentals SET check_in_date=? WHERE customer_id=? AND movie_id=(SELECT id FROM movies where title LIKE ?)", yyyymmdd(now), id, title, function(err, result) { - // if (err !== null) { - // console.log(err); - // } - // else { - // res.status(200).json([]); - // } - // }); var statement = "SELECT id FROM rentals WHERE customer_id=? \ AND movie_id=(SELECT id FROM movies where title LIKE ?) \ AND check_in_date IS NULL;" diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js new file mode 100644 index 0000000..66dd236 --- /dev/null +++ b/test/controllers/rentals.js @@ -0,0 +1,151 @@ +var request = require('supertest'), +assert = require('assert'), +app = require('../../app'), +sqlite3 = require('sqlite3').verbose(), +agent = request.agent(app); + +describe("Endpoints under /rentals", function() { + + // Reset test.db with test data before each test + beforeEach(function(done) { + var db_cleaner = new sqlite3.Database('db/test.db'); + db_cleaner.serialize(function() { + db_cleaner.exec( + "BEGIN; \ + DELETE FROM movies; \ + INSERT INTO movies(id, title, overview, release_date, inventory) \ + VALUES(1, 'Jaws', 'Shark!', 'Yesterday', 10), \ + (2, 'Maws', 'Worm!', 'Yesterday', 11), \ + (3, 'Claws', 'Cat!', 'Yesterday', 12), \ + (4, 'Paws', 'Bear!', 'Yesterday', 13), \ + (5, 'Gauze', 'Ouch!', 'Yesterday', 14); \ + DELETE FROM customers; \ + INSERT INTO customers(id, name, registered_at, address, city, state, postal_code, phone, account_credit) \ + VALUES(1, 'Shelly', '2013-09-16', '123 somewhere st', 'Kirkland', 'WA', '98033', '(123)-456-7890', '40'), \ + (2, 'Michelle', '2012-09-19', '234 blvd e', 'Tacoma', 'WA', '98047', '(123)-456-7810', '34'), \ + (3, 'Adam', 2014-09-22, '5 privet dr', 'Little Winging', 'HP', '12345', '(425)-456-7890', '30'), \ + (4, 'Tyler', '2015-09-22', '1600 Pennsylvania ave', 'Yakima', 'WA', '98908', '(360)-123-3345', '24'), \ + (5, 'Brandi', 2011-09-22, '567 your town', 'Seattle', 'WA', '98102', '(206)-456-7890', '10'); \ + DELETE FROM rentals; \ + INSERT INTO rentals(id, check_out_date, check_in_date, expected_return_date, movie_id, customer_id) \ + VALUES(1, '2015-09-15', '2015-09-16', '2015-09-19', 1, 1), \ + (2, '2015-09-16', '2015-09-19', '2015-09-20', 2, 2), \ + (3, '2015-09-17', null, '2015-09-21', 1, 3), \ + (4, '2015-09-18', '2015-09-22', '2015-09-22', 3, 4), \ + (5, '2015-09-19', null, '2015-09-23', 4, 5); \ + COMMIT;", + function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + + describe('GET /rentals', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/rentals') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"id":1,"check_out_date":"2015-09-15","check_in_date":"2015-09-16","expected_return_date":"2015-09-19","customer_id":1,"movie_id":1},{"id":2,"check_out_date":"2015-09-16","check_in_date":"2015-09-19","expected_return_date":"2015-09-20","customer_id":2,"movie_id":2},{"id":3,"check_out_date":"2015-09-17","check_in_date":null,"expected_return_date":"2015-09-21","customer_id":3,"movie_id":1},{"id":4,"check_out_date":"2015-09-18","check_in_date":"2015-09-22","expected_return_date":"2015-09-22","customer_id":4,"movie_id":3},{"id":5,"check_out_date":"2015-09-19","check_in_date":null,"expected_return_date":"2015-09-23","customer_id":5,"movie_id":4}]', done); + }); + }); + + describe('GET /rentals/overdue', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/rentals/overdue') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"name":"Adam","title":"Jaws"}]', done); + }); + }); + + + describe('GET /rentals/currently_out', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/rentals/currently_out') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"name":"Adam","title":"Jaws"},{"name":"Brandi","title":"Paws"}]', done); + }); + }); + + describe('GET /rentals/available_inventory', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/rentals/available_inventory') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"title":"Jaws","available":9},{"title":"Maws","available":11},{"title":"Claws","available":12},{"title":"Paws","available":12},{"title":"Gauze","available":14}]', done); + }); + }); + + + describe('GET /rentals/current_renters/jaws', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/rentals/current_renters/jaws') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"name":"Adam"}]', done); + }); + }); +}); From d6d3568acd943ee1f749a16e60c5b5f914a8da95 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Wed, 23 Sep 2015 14:15:18 -0700 Subject: [PATCH 66/96] Successfully tested each endpoint for the customers controller. --- controllers/customers.js | 2 +- models/customers.js | 2 +- .../controllers/customers_controller_tests.js | 313 ++++++++++++++---- 3 files changed, 255 insertions(+), 62 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index a32e2e1..42932c4 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -57,7 +57,7 @@ exports.customersController = { select.push(result[i]); } - console.log(select); + // console.log(select); return res.status(200).json(select); } else { return res.status(200).json(result); diff --git a/models/customers.js b/models/customers.js index bd993c9..3f08079 100644 --- a/models/customers.js +++ b/models/customers.js @@ -74,7 +74,7 @@ Customer.prototype.find_by_sorted_date = function(sort_by, number, pages, callba var sorted = res.sort(function(a, b){ return new Date(a.registered_at) - new Date(b.registered_at) }); - console.log(sorted); + // console.log(sorted); } if (callback) callback(err, sorted); diff --git a/test/controllers/customers_controller_tests.js b/test/controllers/customers_controller_tests.js index af08034..a008d40 100644 --- a/test/controllers/customers_controller_tests.js +++ b/test/controllers/customers_controller_tests.js @@ -15,18 +15,39 @@ describe("Customers Controller", function() { beforeEach(function(done) { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { - db_cleaner.exec( - "BEGIN TRANSACTION; \ - DELETE FROM customers; \ - INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ - VALUES('A', '2015-01-01', '111 St', 'Seattle', 'WA', '55555', '555-5555', 19.50), \ - ('B', '2015-01-02', '222 St', 'Seattle', 'WA', '55555', '666-6666', 18.50); \ - COMMIT TRANSACTION;", - function(err) { - db_cleaner.close(); - done(); - } - ); + db_cleaner.parallelize(function() { + db_cleaner.exec( + "BEGIN TRANSACTION; \ + DELETE FROM rentals; \ + INSERT INTO rentals(check_out_date, check_in_date, expected_return_date, customer_id, movie_id) \ + VALUES('2015-01-01', '2015-01-10', '2015-02-01', 1, 1), \ + ('2015-01-01', null, '2015-02-01', 1, 2); \ + COMMIT TRANSACTION;" + ); // rentals + + db_cleaner.exec( + "BEGIN TRANSACTION; \ + DELETE FROM movies; \ + INSERT INTO movies(title, overview, release_date, inventory) \ + VALUES('The Movie', 'See title.', '2000-01-01', 10), \ + ('The Movie: Sequal', 'So amazing.', '2001-01-01', 5); \ + COMMIT TRANSACTION;" + ); // movies + + db_cleaner.exec( + "BEGIN TRANSACTION; \ + DELETE FROM customers; \ + INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ + VALUES('B', '2015-01-01', '111 St', 'Seattle', 'WA', '55555', '555-5555', 19.50), \ + ('A', '2015-01-02', '222 St', 'Seattle', 'WA', '11111', '666-6666', 18.50), \ + ('C', '2014-01-01', '333 St', 'Seattle', 'WA', '99999', '444-4444', 21.00); \ + COMMIT TRANSACTION;" + ); // customers + }) + + db_cleaner.close(function() { + done(); + }); }); }) @@ -43,17 +64,17 @@ describe("Customers Controller", function() { it("responds with json", function(done) { customer_request .expect('Content-Type', /application\/json/) - .expect(200, done); - // .end(function(err, res) { - // if (err) return done(err); - // done(); - // }); + .expect(200) + .end(function(err, res) { + if (err) return done(err); + done(); + }); }); it("returns an array of all customer objects", function(done) { customer_request .expect(200, function(error, result) { - assert.equal(result.body.length, 2); + assert.equal(result.body.length, 3); var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; assert.deepEqual(Object.keys(result.body[0]), keys); @@ -75,62 +96,234 @@ describe("Customers Controller", function() { it("responds with json", function(done) { customer_request .expect('Content-Type', /application\/json/) - .expect(200) - .end(function(err, res) { - if (err) return done(err); - done(); - }); + .expect(200, done); }); it("can find customer with id 1", function(done) { customer_request .expect('Content-Type', /application\/json/) .expect(200, function(err, res) { - console.log(res); + var keys = ['checked_out_movies', 'returned_movies']; + assert.deepEqual(Object.keys(res.body), keys); + + assert.equal(res.body.checked_out_movies.length, 1); + assert.equal(res.body.returned_movies.length, 1); + + assert.deepEqual(res.body.checked_out_movies[0].id, 2); + assert.deepEqual(res.body.returned_movies[0].id, 1); + + done(); + }) + }); + }); + + describe("GET /customers/by_name", function() { + var customer_request; + + beforeEach(function(done) { + customer_request = agent + .get('/customers/by_name') + .set('Accept', 'application/json'); + done(); + }) + + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it("returns all customers sorted by name", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(res.body.length, 3); + + assert.equal(res.body[0].name, 'A'); + assert.equal(res.body[1].name, 'B'); + assert.equal(res.body[2].name, 'C'); + + done(); + }) + }); + + it("returns a customer with the correct keys", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; + assert.deepEqual(Object.keys(res.body[0]), keys); + + done(); + }) + }); + }); + + describe("GET /customers/by_name?n=1&p=2", function() { + var customer_request; + + beforeEach(function(done) { + customer_request = agent + .get('/customers/by_name?n=1&p=2') + .set('Accept', 'application/json'); + done(); + }) + + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it("returns a customer sorted by name", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { assert.equal(res.body.length, 1); + assert.equal(res.body[0].name, 'B'); + + done(); + }) + }); + }); + + describe("GET /customers/by_registered_at", function() { + var customer_request; + + beforeEach(function(done) { + customer_request = agent + .get('/customers/by_registered_at') + .set('Accept', 'application/json'); + done(); + }) + + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it("returns all customers sorted by registered at", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(res.body.length, 3); + + assert.equal(res.body[0].name, 'C'); + assert.equal(res.body[1].name, 'B'); + assert.equal(res.body[2].name, 'A'); + + done(); + }) + }); + it("returns a customer with the correct keys", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; - var customer = res.body[0] - assert.deepEqual(Object.keys(customer), keys); - - assert.equal(customer.name, 'A'); - assert.equal(customer.registered_at, '2015-01-01'); - assert.equal(customer.address, '111 St'); - assert.equal(customer.city, 'Seattle'); - assert.equal(customer.state, 'WA'); - assert.equal(customer.postal_code, '55555'); - assert.equal(customer.phone, '555-5555'); - assert.equal(customer.account_credit, 19.50); + assert.deepEqual(Object.keys(res.body[0]), keys); done(); }) }); + }); + describe("GET /customers/by_registered_at?n=1&p=3", function() { + var customer_request; + + beforeEach(function(done) { + customer_request = agent + .get('/customers/by_registered_at?n=1&p=3') + .set('Accept', 'application/json'); + done(); + }) + + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it("returns a customer sorted by registered_at", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(res.body.length, 1); + assert.equal(res.body[0].name, 'A'); + + done(); + }) + }); }); - // describe("GET /customers/by_name", function() { - // - // }); - // - // describe("GET /customers/by_registered_at", function() { - // - // }); - // - // describe("GET /customers/by_postal_code", function() { - // - // }); -}); + describe("GET /customers/by_postal_code", function() { + var customer_request; + + beforeEach(function(done) { + customer_request = agent + .get('/customers/by_postal_code') + .set('Accept', 'application/json'); + done(); + }) + + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it("returns all customers sorted by postal code", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(res.body.length, 3); + + assert.equal(res.body[0].name, 'A'); + assert.equal(res.body[1].name, 'B'); + assert.equal(res.body[2].name, 'C'); + + done(); + }) + }); + + it("returns a customer with the correct keys", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; + assert.deepEqual(Object.keys(res.body[0]), keys); -// THEY ALL SHOULD: -// -// it("returns JSON", function() { -// -// }); -// -// it("should return 200 if results", function() { -// -// }); -// -// it("should return 204 if no results", function() { -// -// }); + done(); + }) + }); + }); + + describe("GET /customers/by_postal_code?n=1&p=3", function() { + var customer_request; + + beforeEach(function(done) { + customer_request = agent + .get('/customers/by_postal_code?n=1&p=3') + .set('Accept', 'application/json'); + done(); + }) + + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it("returns a customer sorted by postal code", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(res.body.length, 1); + assert.equal(res.body[0].name, 'C'); + + done(); + }) + }); + }); +}); From d4ebe71dad141f9f0f648d1a80fad8475123d020 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Wed, 23 Sep 2015 14:16:02 -0700 Subject: [PATCH 67/96] Deleted extraneous console.log line 37 --- test/controllers/movies.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/controllers/movies.js b/test/controllers/movies.js index 145552b..1bf6517 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -35,7 +35,6 @@ describe("Endpoints under /movies", function() { (5, '2015-09-19', null, '2015-09-23', 4, 5); \ COMMIT;", function(err) { - console.log(err); db_cleaner.close(); done(); } From b6cd3971b673b418ff97d6ac0f3e3d3fef4f44f8 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Wed, 23 Sep 2015 14:16:32 -0700 Subject: [PATCH 68/96] Deleted some commented out code. --- test/controllers/customers_controller_tests.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/test/controllers/customers_controller_tests.js b/test/controllers/customers_controller_tests.js index a008d40..9342890 100644 --- a/test/controllers/customers_controller_tests.js +++ b/test/controllers/customers_controller_tests.js @@ -3,15 +3,8 @@ var assert = require('assert'); var app = require('../../app'); var sqlite3 = require('sqlite3').verbose(); var agent = request.agent(app); -// var CustomersController = require("../controllers/customers"); describe("Customers Controller", function() { - // var cc = null, - // db = null; - // beforeEach(function() { - // db = new Database("db/test.db"); - // cc = new CustomerController; - // }); beforeEach(function(done) { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { From 9d7d68dac25d87f892b24c8f3c21755e62baa87a Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Wed, 23 Sep 2015 14:25:42 -0700 Subject: [PATCH 69/96] Renamed test file names. --- test/controllers/{customers_controller_tests.js => customers.js} | 0 test/models/{customer_tests.js => customers.js} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename test/controllers/{customers_controller_tests.js => customers.js} (100%) rename test/models/{customer_tests.js => customers.js} (100%) diff --git a/test/controllers/customers_controller_tests.js b/test/controllers/customers.js similarity index 100% rename from test/controllers/customers_controller_tests.js rename to test/controllers/customers.js diff --git a/test/models/customer_tests.js b/test/models/customers.js similarity index 100% rename from test/models/customer_tests.js rename to test/models/customers.js From 74c796d2640f8483c5b83b44c80ce8161cd49956 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Wed, 23 Sep 2015 15:14:57 -0700 Subject: [PATCH 70/96] Added tests for POST endpoint check_out. --- test/controllers/rentals.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 66dd236..1ad7af2 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -148,4 +148,37 @@ describe("Endpoints under /rentals", function() { .expect('[{"name":"Adam"}]', done); }); }); + + describe('POST /rentals/check_out', function(){ + var request; + beforeEach(function(done) { + request = agent + .post('/rentals/check_out') + .send({ 'customer_id': '1', 'movie_title': 'Jaws' }); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('{}', done); + }); + + it('creates a new rental in the database', function(done) { + var db = new sqlite3.Database('db/test.db'); + + request + .end(function(err, res) { + db.all("SELECT COUNT(*) AS 'num_of_rentals' FROM rentals", function(error, result) { + assert.deepEqual([{'num_of_rentals': 6}], result); + done(); + }); + }); + }); + }); }); From e3a9beb27eb167d941ea88f2df2fd6f49b74fd49 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Wed, 23 Sep 2015 16:40:56 -0700 Subject: [PATCH 71/96] Working on customers tests. --- test/models/customers.js | 84 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 78 insertions(+), 6 deletions(-) diff --git a/test/models/customers.js b/test/models/customers.js index 042d261..c159caf 100644 --- a/test/models/customers.js +++ b/test/models/customers.js @@ -1,19 +1,91 @@ +"use strict"; + var assert = require('assert'), sqlite3 = require('sqlite3').verbose(), customer = require('../../models/customers'); -describe("Customer", function() { +describe("Customer Model", function() { var a_customer; var db_cleaner; beforeEach(function(done) { - a_customer = new Customer(); - + a_customer = new customer(); db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { - db_cleaner.exec( + db_cleaner.parallelize(function() { + db_cleaner.exec( + "BEGIN TRANSACTION; \ + DELETE FROM rentals; \ + INSERT INTO rentals(check_out_date, check_in_date, expected_return_date, customer_id, movie_id) \ + VALUES('2015-01-01', '2015-01-10', '2015-02-01', 1, 1), \ + ('2015-01-01', null, '2015-02-01', 1, 2); \ + COMMIT TRANSACTION;" + ); // rentals + + db_cleaner.exec( + "BEGIN TRANSACTION; \ + DELETE FROM movies; \ + INSERT INTO movies(title, overview, release_date, inventory) \ + VALUES('The Movie', 'See title.', '2000-01-01', 10), \ + ('The Movie: Sequal', 'So amazing.', '2001-01-01', 5); \ + COMMIT TRANSACTION;" + ); // movies + + db_cleaner.exec( + "BEGIN TRANSACTION; \ + DELETE FROM customers; \ + INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ + VALUES('B', '2015-01-01', '111 St', 'Seattle', 'WA', '55555', '555-5555', 19.50), \ + ('A', '2015-01-02', '222 St', 'Seattle', 'WA', '11111', '666-6666', 18.50), \ + ('C', '2014-01-01', '333 St', 'Seattle', 'WA', '99999', '444-4444', 21.00); \ + COMMIT TRANSACTION;" + ); // customers + }) - ) - }) + db_cleaner.close(function() { + done(); + }); + }); }) + + it("can be instantiated", function(done) { + assert(a_customer instanceof customer); + done(); + }); + + describe("instance methods: all", function() { + it("can find all customers", function(done) { + a_customer.all(function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 3); + + assert.equal(res[0].name, 'B'); + assert.equal(res[1].name, 'A'); + assert.equal(res[2].name, 'C'); + + done(); + }); + }); + }); + + describe("instance methods: find_checked_out", function() { + it("finds the checked out movies for the customer", function(done) { + a_customer.find_checked_out(1, function(err, res) { + var keys = ['checked_out_movies', 'returned_movies']; + assert.equal(err, undefined); + assert(res instanceof Object); + + assert.deepEqual(Object.keys(res), keys); + + assert.equal(res.checked_out_movies.length, 1); + assert.equal(res.returned_movies.length, 1); + + assert.deepEqual(res.checked_out_movies[0].id, 2); + assert.deepEqual(res.returned_movies[0].id, 1); + + done(); + }); + }); + }); }) From 7c32feaa0c7ba756d5998e0d79e3ec8ebb6a2d74 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Wed, 23 Sep 2015 16:44:42 -0700 Subject: [PATCH 72/96] Removed database test. --- test/database_tests.js | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 test/database_tests.js diff --git a/test/database_tests.js b/test/database_tests.js deleted file mode 100644 index 1f45b59..0000000 --- a/test/database_tests.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; - -var assert = require("assert"); -var Database = require('../database'); - -describe("Database", function(){ - var db; - var database_path = "db/development.db"; - - beforeEach(function(){ - db = newDatabase(database_path); - }) - - it("can be instantiated", function(){ - assert.equal(db instanceof Database, true); - }) - - it("has a `test` property that is a function", function(){ - assert.equal(typeof db.test, "function"); - }) - - it("holds onto the `path` to the database", function(){ - assert.equal(db.path, database_path); - }) -}) From f2ab4b52200cefdf6859ee2fe7942ace47b58805 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Wed, 23 Sep 2015 16:56:51 -0700 Subject: [PATCH 73/96] Added last endpoint test for check_in under rentals controller test --- test/controllers/rentals.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 1ad7af2..f192908 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -181,4 +181,25 @@ describe("Endpoints under /rentals", function() { }); }); }); + + + describe('PATCH /rentals/check_in', function(){ + var request; + beforeEach(function(done) { + request = agent + .patch('/rentals/check_in?id=3&title=Jaws'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[]', done); + }); + }); }); From 5fc5addac0e159abfc86e4808375df2636ea8e60 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Thu, 24 Sep 2015 09:16:07 -0700 Subject: [PATCH 74/96] fixed rentals/overdue test to passing --- test/controllers/rentals.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index f192908..f543c4e 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -80,7 +80,7 @@ describe("Endpoints under /rentals", function() { it('responds with correct data', function(done){ request - .expect('[{"name":"Adam","title":"Jaws"}]', done); + .expect('[{"name":"Adam","title":"Jaws"},{"name":"Brandi","title":"Paws"}]', done); }); }); From 5eaf464f8625ff8a1148b556a95037031629cc55 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 24 Sep 2015 10:02:48 -0700 Subject: [PATCH 75/96] Added seed data\! --- utils/rentals.json | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/utils/rentals.json b/utils/rentals.json index 1bc5b96..0a0d803 100644 --- a/utils/rentals.json +++ b/utils/rentals.json @@ -13,6 +13,34 @@ "customer_id": 3, "movie_id": 33 }, + { + "check_out_date": "1989-10-01", + "check_in_date": "1989-10-02", + "expected_return_date": "1989-11-01", + "customer_id": 5, + "movie_id": 1 + }, + { + "check_out_date": "1989-10-01", + "check_in_date": "1989-10-02", + "expected_return_date": "1989-11-01", + "customer_id": 1, + "movie_id": 1 + }, + { + "check_out_date": "1989-10-01", + "check_in_date": "1989-10-02", + "expected_return_date": "1989-11-01", + "customer_id": 10, + "movie_id": 1 + }, + { + "check_out_date": "1989-10-01", + "check_in_date": "1989-10-02", + "expected_return_date": "1989-11-01", + "customer_id": 90, + "movie_id": 1 + }, { "check_out_date": "1990-01-01", "check_in_date": null, @@ -20,6 +48,13 @@ "customer_id": 5, "movie_id": 15 }, + { + "check_out_date": "2015-01-01", + "check_in_date": "2015-01-16", + "expected_return_date": "2015-01-16", + "customer_id": 10, + "movie_id": 2 + }, { "check_out_date": "1990-01-01", "check_in_date": "1990-01-16", From 6e69f761479b3f72196bfbb53fad0fca96086b02 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Thu, 24 Sep 2015 10:51:44 -0700 Subject: [PATCH 76/96] Finished new endpoint and test for rentals/:title/available_inventory --- controllers/rentals.js | 10 ++++++++++ routes/rentals.js | 5 +++++ test/controllers/rentals.js | 21 +++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/controllers/rentals.js b/controllers/rentals.js index cda5057..1cfd478 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -56,6 +56,16 @@ exports.rentalsController = { }); }, + // GET /rentals/:title/available_inventory + getMovieAvailableInventory:function(title, res) { + db.all("SELECT movies.title, movies.inventory-(SELECT COUNT(*) from rentals WHERE rentals.movie_id=movies.id AND check_in_date IS NULL) AS available from movies WHERE title LIKE ?", title, function(err, rows) { + if (err !== null) { + console.log(err); + } + res.status(200).json(rows); + }); + }, + // GET /rentals/current_renters/:title getAllCurrentRenters:function(title, res) { db.all("SELECT customers.name from rentals INNER JOIN movies ON movies.id = rentals.movie_id INNER JOIN customers on customers.id = rentals.customer_id WHERE movies.title LIKE ? AND check_in_date IS NULL", title, function(err, rows) { diff --git a/routes/rentals.js b/routes/rentals.js index e75d6a3..639f12b 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -22,6 +22,11 @@ router.get('/available_inventory', function(req, res, next){ rental_exports.rentalsController.getAvailableInventory(res); }); +// GET rentals/:title/available_inventory +router.get('/:title/available_inventory', function(req, res, next){ + rental_exports.rentalsController.getMovieAvailableInventory(req.params.title, res); +}); + // GET rentals/current_renters/:title router.get('/current_renters/:title', function(req, res, next) { rental_exports.rentalsController.getAllCurrentRenters(req.params.title, res); diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index f543c4e..da30726 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -127,6 +127,27 @@ describe("Endpoints under /rentals", function() { }); }); + describe('GET /rentals/:title/available_inventory', function(){ + var request; + beforeEach(function(done) { + request = agent + .get('/rentals/jaws/available_inventory') + .set('Accept', 'application/json'); + done(); + }); + + it('responds with json', function(done){ + request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('responds with correct data', function(done){ + request + .expect('[{"title":"Jaws","available":9}]', done); + }); + }); + describe('GET /rentals/current_renters/jaws', function(){ var request; From c37e7a9bd10a72f8c334ae7bb7f0245fe5a5924e Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Thu, 24 Sep 2015 13:12:33 -0700 Subject: [PATCH 77/96] Added SELECT title, overview, release_date, inventory to http://localhost:3000/movies/release_date and http://localhost:3000/movies/title --- controllers/movies.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index c8e31e0..d9c5dad 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -58,11 +58,11 @@ exports.moviesController = { // This is the case when no query parameters are given if (num === undefined && page === undefined) { - db.all("SELECT title, release_date FROM movies ORDER BY release_date DESC", callback); + db.all("SELECT title, overview, release_date, inventory FROM movies ORDER BY release_date DESC", callback); } // This is the case when only n is given else if (page === undefined) { - db.all("SELECT title, release_date FROM movies ORDER BY release_date DESC LIMIT ?", num, callback); + db.all("SELECT title, overview, release_date, inventory FROM movies ORDER BY release_date DESC LIMIT ?", num, callback); } else { // Assume both num and page are specified @@ -81,15 +81,15 @@ exports.moviesController = { // This is the case when no query parameters are given if (num === undefined && page === undefined) { - db.all("SELECT title, release_date FROM movies ORDER BY title ASC", callback); + db.all("SELECT title, overview, release_date, inventory FROM movies ORDER BY title ASC", callback); } // This is the case when only n is given else if (page === undefined) { - db.all("SELECT title, release_date FROM movies ORDER BY title ASC LIMIT ?", num, callback); + db.all("SELECT title, overview, release_date, inventory FROM movies ORDER BY title ASC LIMIT ?", num, callback); } else { // Assume both num and page are specified - db.all("SELECT title, release_date FROM movies WHERE id NOT IN ( SELECT id FROM movies ORDER BY title ASC LIMIT ?) ORDER BY title ASC LIMIT ?", (page - 1) * num, num, callback); + db.all("SELECT title, overview, release_date, inventory FROM movies WHERE id NOT IN ( SELECT id FROM movies ORDER BY title ASC LIMIT ?) ORDER BY title ASC LIMIT ?", (page - 1) * num, num, callback); } }, From 48d4b9a69db6889c9c9d8e636f75e81762e46997 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 24 Sep 2015 13:32:12 -0700 Subject: [PATCH 78/96] Seperated customers/:id into two seperate API endpoints (customers/:id/current & customers/:id/history) and also sorted movie results by check_out_date. --- controllers/customers.js | 32 ++++++++++++++++++-------------- models/customers.js | 38 ++++++++++++++++++++++---------------- routes/customers.js | 14 +++++++++++--- utils/rentals.json | 14 ++++++++++++++ 4 files changed, 65 insertions(+), 33 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 42932c4..2e1b1d7 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -13,7 +13,6 @@ function sortBy(sort_by, req, res) { exports.customersController = { // GET /customers - // returns all customers index: function(req, res) { // var results = { "customers": [] } var db = new Customer(); @@ -22,24 +21,12 @@ exports.customersController = { }); }, - // GET /customers/:id - // returns currently checked out movies & rental history - show: function(req, res) { - var id = req["params"]["id"]; - var db = new Customer(); - db.find_checked_out(id, function(err, result) { - return res.status(200).json(result); - }); - }, - // GET /customers/by_name?n=XXX&p=XXX - // returns customers sorted by name & only the number & pages selected showByName: function(req, res) { sortBy("name", req, res); }, // GET /customers/by_registered_at?n=XXX&p=XXX - // returns customers sorted by registered at & only the number & pages selected // NOTE: Need to change registered at to a time object? Sorting alphabetally vs. by date! showByRegistered_at: function(req, res) { var number = req["query"]["n"]; @@ -66,8 +53,25 @@ exports.customersController = { }, // GET /customers/by_postal_code?n=XXX&p=XXX - // returns customers sorted by postal code & only the number & pages selected showByPostalCode: function(req, res) { sortBy("postal_code", req, res); + }, + + // GET /customers/:id/current + showCustomerCurrent: function(req, res) { + var id = req["params"]["id"]; + var db = new Customer(); + db.find_current(id, function(err, result) { + return res.status(200).json(result); + }); + }, + + // GET /customers/:id/history + showCustomerHistory: function(req, res) { + var id = req["params"]["id"]; + var db = new Customer(); + db.find_history(id, function(err, result) { + return res.status(200).json(result); + }); } }; diff --git a/models/customers.js b/models/customers.js index 3f08079..afc7c28 100644 --- a/models/customers.js +++ b/models/customers.js @@ -9,25 +9,31 @@ function Customer() { Customer.prototype = require('../database'); -Customer.prototype.find_checked_out = function(id, callback) { +Customer.prototype.find_current = function(id, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - var currently_checked_out_movies_statement = - "SELECT * FROM rentals WHERE customer_id = " + id + - " AND check_in_date IS NULL;"; - var returned_movies_statement = - "SELECT * FROM rentals WHERE customer_id = " + id + - " AND check_in_date IS NOT NULL;"; + var statement = + "SELECT movies.id AS movie_id, movies.title, rentals.check_out_date, rentals.expected_return_date \ + FROM rentals INNER JOIN movies ON movies.id = rentals.movie_id \ + WHERE customer_id=" + id + " AND check_in_date IS NULL \ + ORDER BY date(check_out_date);"; - db.all(currently_checked_out_movies_statement, function(err, res1) { - db.all(returned_movies_statement, function(err, res2) { - var result = { - "checked_out_movies": res1, - "returned_movies": res2 - }; - if (callback) callback(err, result); + db.all(statement, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); +}; - db.close(); - }); +Customer.prototype.find_history = function(id, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = + "SELECT movies.id AS movie_id, movies.title, rentals.check_out_date, rentals.check_in_date, rentals.expected_return_date \ + FROM rentals INNER JOIN movies ON movies.id = rentals.movie_id \ + WHERE customer_id=" + id + " AND check_in_date IS NOT NULL \ + ORDER BY date(check_out_date);"; + + db.all(statement, function(err, res) { + if (callback) callback(err, res); + db.close(); }); }; diff --git a/routes/customers.js b/routes/customers.js index d38701e..bdc39b4 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -2,26 +2,34 @@ var express = require('express'); var router = express.Router(); var customer_exports = require('../controllers/customers'); -/* GET users listing. */ +// all customers router.get('/', function(req, res, next) { return customer_exports.customersController.index(req, res); }); +// all customers by name (optional query for number (n=#) & page (p=#)) router.get('/by_name', function(req, res, next) { return customer_exports.customersController.showByName(req, res); }); +// all customers by registered at (optional query for number (n=#) & page (p=#)) router.get('/by_registered_at', function(req, res, next) { return customer_exports.customersController.showByRegistered_at(req, res); }); +// all customers by postal code (optional query for number (n=#) & page (p=#)) router.get('/by_postal_code', function(req, res, next) { return customer_exports.customersController.showByPostalCode(req, res); }); -router.get('/:id', function(req, res, next) { - return customer_exports.customersController.show(req, res); +// a single customer's currently checked out movies +router.get('/:id/current', function(req, res, next) { + return customer_exports.customersController.showCustomerCurrent(req, res); }); +// a single customer's previously checked out (& returned) movies +router.get('/:id/history', function(req, res, next) { + return customer_exports.customersController.showCustomerHistory(req, res); +}); module.exports = router; diff --git a/utils/rentals.json b/utils/rentals.json index 0a0d803..66df6d5 100644 --- a/utils/rentals.json +++ b/utils/rentals.json @@ -1,4 +1,18 @@ [ + { + "check_out_date": "2015-09-19", + "check_in_date": null, + "expected_return_date": "2015-10-01", + "customer_id": 1, + "movie_id": 20 + }, + { + "check_out_date": "2015-09-19", + "check_in_date": "2015-10-01", + "expected_return_date": "2015-10-01", + "customer_id": 1, + "movie_id": 21 + }, { "check_out_date": "1988-07-07", "check_in_date": "1988-07-17", From d8989053e6aa17bc593483000f3007fce2a72824 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 24 Sep 2015 13:32:49 -0700 Subject: [PATCH 79/96] Edited the tests for the seperated endpoint of customers/:id. --- test/controllers/customers.js | 42 +++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/test/controllers/customers.js b/test/controllers/customers.js index 9342890..7d17b39 100644 --- a/test/controllers/customers.js +++ b/test/controllers/customers.js @@ -76,12 +76,12 @@ describe("Customers Controller", function() { }); }); - describe("GET /customers/:id", function() { + describe("GET /customers/:id/current", function() { var customer_request; beforeEach(function(done) { customer_request = agent - .get('/customers/1') + .get('/customers/1/current') .set('Accept', 'application/json'); done(); }) @@ -96,14 +96,42 @@ describe("Customers Controller", function() { customer_request .expect('Content-Type', /application\/json/) .expect(200, function(err, res) { - var keys = ['checked_out_movies', 'returned_movies']; + var keys = ['movie_id', 'title', "check_out_date", "expected_return_date"]; assert.deepEqual(Object.keys(res.body), keys); - assert.equal(res.body.checked_out_movies.length, 1); - assert.equal(res.body.returned_movies.length, 1); + assert.equal(res.body.length, 1); + assert.equal(res.body[0].movie_id, 2); + + done(); + }) + }); + }); + + describe("GET /customers/:id/history", function() { + var customer_request; + + beforeEach(function(done) { + customer_request = agent + .get('/customers/1/history') + .set('Accept', 'application/json'); + done(); + }) - assert.deepEqual(res.body.checked_out_movies[0].id, 2); - assert.deepEqual(res.body.returned_movies[0].id, 1); + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it("can find customer with id 1", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + var keys = ['movie_id', 'title', "check_out_date", "check_in_date", "expected_return_date"]; + assert.deepEqual(Object.keys(res.body), keys); + + assert.equal(res.body.length, 1); + assert.equal(res.body[0].movie_id, 1); done(); }) From 3e39aedadfef2294b410fc71efd11c0654f6f810 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 24 Sep 2015 13:46:32 -0700 Subject: [PATCH 80/96] Revised rewritten tests to pass. --- test/controllers/customers.js | 4 ++-- test/models/customers.js | 15 ++++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/test/controllers/customers.js b/test/controllers/customers.js index 7d17b39..0810388 100644 --- a/test/controllers/customers.js +++ b/test/controllers/customers.js @@ -97,7 +97,7 @@ describe("Customers Controller", function() { .expect('Content-Type', /application\/json/) .expect(200, function(err, res) { var keys = ['movie_id', 'title', "check_out_date", "expected_return_date"]; - assert.deepEqual(Object.keys(res.body), keys); + assert.deepEqual(Object.keys(res.body[0]), keys); assert.equal(res.body.length, 1); assert.equal(res.body[0].movie_id, 2); @@ -128,7 +128,7 @@ describe("Customers Controller", function() { .expect('Content-Type', /application\/json/) .expect(200, function(err, res) { var keys = ['movie_id', 'title', "check_out_date", "check_in_date", "expected_return_date"]; - assert.deepEqual(Object.keys(res.body), keys); + assert.deepEqual(Object.keys(res.body[0]), keys); assert.equal(res.body.length, 1); assert.equal(res.body[0].movie_id, 1); diff --git a/test/models/customers.js b/test/models/customers.js index c159caf..a3c3274 100644 --- a/test/models/customers.js +++ b/test/models/customers.js @@ -69,20 +69,17 @@ describe("Customer Model", function() { }); }); - describe("instance methods: find_checked_out", function() { + describe("instance methods: find_current", function() { it("finds the checked out movies for the customer", function(done) { - a_customer.find_checked_out(1, function(err, res) { - var keys = ['checked_out_movies', 'returned_movies']; + a_customer.find_current(1, function(err, res) { + var keys = ['movie_id', 'title', "check_out_date", "expected_return_date"]; assert.equal(err, undefined); assert(res instanceof Object); - assert.deepEqual(Object.keys(res), keys); + assert.deepEqual(Object.keys(res[0]), keys); - assert.equal(res.checked_out_movies.length, 1); - assert.equal(res.returned_movies.length, 1); - - assert.deepEqual(res.checked_out_movies[0].id, 2); - assert.deepEqual(res.returned_movies[0].id, 1); + assert.equal(res.length, 1); + assert.equal(res[0].movie_id, 2); done(); }); From 69bb89349a717e6f80754ed38416cd580dcdffb8 Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Thu, 24 Sep 2015 13:52:31 -0700 Subject: [PATCH 81/96] updated movies test file to accommadate for more data being returned --- test/controllers/movies.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/controllers/movies.js b/test/controllers/movies.js index 1bf6517..f1e8b31 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -149,7 +149,7 @@ describe("Endpoints under /movies", function() { .set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200) - .expect('[{"title":"Jaws","release_date":"Yesterday"},{"title":"Maws","release_date":"Yesterday"},{"title":"Claws","release_date":"Yesterday"},{"title":"Paws","release_date":"Yesterday"},{"title":"Gauze","release_date":"Yesterday"}]', done); + .expect('[{"title":"Jaws","overview":"Shark!","release_date":"Yesterday","inventory":10},{"title":"Maws","overview":"Worm!","release_date":"Yesterday","inventory":11},{"title":"Claws","overview":"Cat!","release_date":"Yesterday","inventory":12},{"title":"Paws","overview":"Bear!","release_date":"Yesterday","inventory":13},{"title":"Gauze","overview":"Ouch!","release_date":"Yesterday","inventory":14}]', done); }); it('handles n=0', function(done){ @@ -167,7 +167,7 @@ describe("Endpoints under /movies", function() { .set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200) - .expect('[{"title":"Jaws","release_date":"Yesterday"}]', done); + .expect('[{"title":"Jaws","overview":"Shark!","release_date":"Yesterday","inventory":10}]', done); }); it('handles n=2', function(done){ @@ -176,7 +176,7 @@ describe("Endpoints under /movies", function() { .set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200) - .expect('[{"title":"Jaws","release_date":"Yesterday"},{"title":"Maws","release_date":"Yesterday"}]', done); + .expect('[{"title":"Jaws","overview":"Shark!","release_date":"Yesterday","inventory":10},{"title":"Maws","overview":"Worm!","release_date":"Yesterday","inventory":11}]', done); }); it('handles n=0, p=1', function(done){ From dc7790282a8cbc520d2efd775f27747454d22305 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 24 Sep 2015 13:57:46 -0700 Subject: [PATCH 82/96] Removed public-facing/default Express page. --- routes/index.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/routes/index.js b/routes/index.js index 84451a9..43f03e6 100644 --- a/routes/index.js +++ b/routes/index.js @@ -2,11 +2,6 @@ var express = require('express'); var router = express.Router(); var movie_exports = require('../controllers/movies') -/* GET home page. */ -router.get('/', function(req, res, next) { - res.render('index', { title: 'Express' }); -}); - router.get('/zomg', function(req, res, next){ var results = { zomg: "it works!" From beeec2725f1dfb6762773fee19f26d951e3b3e19 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 24 Sep 2015 14:21:08 -0700 Subject: [PATCH 83/96] Fixing getCheckedOutHistoryByTitle function; ordering correctly: id, name, & check_out_date. --- controllers/movies.js | 13 +++++++++++-- utils/rentals.json | 12 ++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index d9c5dad..17e2a85 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -108,14 +108,23 @@ exports.moviesController = { getCheckedOutHistoryByTitle: function(title, ordered_by, res) { var order = "customers.id"; - if (ordered_by == "id") + if (ordered_by == "id") { order = "customers.id"; + } else if (ordered_by == "name") order = "customers.name"; + else if (ordered_by == "check_out_date" || ordered_by == "checkout_date") + order = "rentals.check_out_date"; else if (ordered_by !== undefined) order = ordered_by; - db.all("SELECT customers.id, customers.name, customers.phone, rentals.check_out_date FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id INNER JOIN movies ON movies.id = rentals.movie_id WHERE movies.title LIKE ? AND rentals.check_in_date IS NOT NULL ORDER BY ?", title, order, function(err, rows) { + var statement = + "SELECT customers.id, customers.name, customers.phone, rentals.check_out_date \ + FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id INNER JOIN movies ON movies.id = rentals.movie_id \ + WHERE movies.title LIKE ? AND rentals.check_in_date IS NOT NULL ORDER BY " + order; + +// SELECT customers.id, customers.name, customers.phone, rentals.check_out_date FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id INNER JOIN movies ON movies.id = rentals.movie_id WHERE movies.title LIKE 'psycho' AND rentals.check_in_date IS NOT NULL ORDER BY customers.id; + db.all(statement, title, function(err, rows) { if (err !== null) { console.log(err); }console.log(rows); diff --git a/utils/rentals.json b/utils/rentals.json index 66df6d5..0a93e17 100644 --- a/utils/rentals.json +++ b/utils/rentals.json @@ -28,9 +28,9 @@ "movie_id": 33 }, { - "check_out_date": "1989-10-01", - "check_in_date": "1989-10-02", - "expected_return_date": "1989-11-01", + "check_out_date": "1999-10-01", + "check_in_date": "1999-10-02", + "expected_return_date": "1999-11-01", "customer_id": 5, "movie_id": 1 }, @@ -42,9 +42,9 @@ "movie_id": 1 }, { - "check_out_date": "1989-10-01", - "check_in_date": "1989-10-02", - "expected_return_date": "1989-11-01", + "check_out_date": "2000-10-01", + "check_in_date": "2000-10-02", + "expected_return_date": "2000-11-01", "customer_id": 10, "movie_id": 1 }, From 5d0b7a5bde3a788b30bdf0c4938086aae274e3dc Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 24 Sep 2015 15:00:47 -0700 Subject: [PATCH 84/96] Refactored the customers controller a bit. --- controllers/customers.js | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 2e1b1d7..e2ff886 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -1,12 +1,19 @@ "use strict"; -var Customer = require('../models/customers'); +var customer_instance = require('../models/customers'); +var Customer = new customer_instance; function sortBy(sort_by, req, res) { var number = req["query"]["n"]; var pages = req["query"]["p"]; - var db = new Customer(); - db.find_by_sorted(sort_by, number, pages, function(err, result) { + Customer.find_by_sorted(sort_by, number, pages, function(err, result) { + return res.status(200).json(result); + }); +} + +function showRentals(the_function, req, res) { + var id = req["params"]["id"]; + the_function(id, function(err, result) { return res.status(200).json(result); }); } @@ -14,9 +21,7 @@ function sortBy(sort_by, req, res) { exports.customersController = { // GET /customers index: function(req, res) { - // var results = { "customers": [] } - var db = new Customer(); - db.all(function(err, result) { + Customer.all(function(err, result) { return res.status(200).json(result); }); }, @@ -31,8 +36,7 @@ exports.customersController = { showByRegistered_at: function(req, res) { var number = req["query"]["n"]; var pages = req["query"]["p"]; - var db = new Customer(); - db.find_by_sorted_date("registered_at", number, pages, function(err, result) { + Customer.find_by_sorted_date("registered_at", number, pages, function(err, result) { if (number && pages) { var select = [] var offset = (pages - 1) * number; @@ -59,19 +63,11 @@ exports.customersController = { // GET /customers/:id/current showCustomerCurrent: function(req, res) { - var id = req["params"]["id"]; - var db = new Customer(); - db.find_current(id, function(err, result) { - return res.status(200).json(result); - }); + showRentals(Customer.find_current, req, res); }, // GET /customers/:id/history showCustomerHistory: function(req, res) { - var id = req["params"]["id"]; - var db = new Customer(); - db.find_history(id, function(err, result) { - return res.status(200).json(result); - }); + showRentals(Customer.find_history, req, res); } }; From fd611f19796246bf7ae0d3bb3d0fedfb06f204b1 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 24 Sep 2015 16:34:15 -0700 Subject: [PATCH 85/96] Added another test for Rentals to make sure check_in updated the rentals database. --- test/controllers/rentals.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index da30726..caa435d 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -222,5 +222,17 @@ describe("Endpoints under /rentals", function() { request .expect('[]', done); }); + + it('updates the rental in the database', function(done) { + var db = new sqlite3.Database('db/test.db'); + + request + .end(function(err, res) { + db.all("SELECT COUNT(*) AS num_of_checked_out_movies FROM rentals WHERE check_in_date IS NULL", function(error, result) { + assert.deepEqual([{'num_of_checked_out_movies': 1}], result); + done(); + }); + }); + }); }); }); From 1033ddaa4eaab8af8bf6e1a1b40818ac947b9c25 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Thu, 24 Sep 2015 17:23:56 -0700 Subject: [PATCH 86/96] Added another test for Rentals, testing if movie is returned and overdue, charge their account. --- test/controllers/rentals.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index caa435d..b17704c 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -234,5 +234,20 @@ describe("Endpoints under /rentals", function() { }); }); }); + + it('charges customer if returned movie is overdue', function(done) { + var db = new sqlite3.Database('db/test.db'); + + db.all("SELECT account_credit FROM customers WHERE id=3;", function(err1, money_before) { + request + .end(function(err, res) { + db.all("SELECT account_credit FROM customers WHERE id=3;", function(err2, money_after) { + assert.notEqual(money_before[0].account_credit, money_after[0].account_credit); + // HOW TO MAKE THIS LESS THAN OR GREATER THAN CONDITIONAL? + done(); + }); + }); + }); + }); }); }); From 63ffbdb8d42e953aafa3240ddd1337b956124711 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 25 Sep 2015 09:08:03 -0700 Subject: [PATCH 87/96] Added/Edited comments. --- controllers/customers.js | 8 +++----- routes/customers.js | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index e2ff886..1031b3d 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -32,8 +32,7 @@ exports.customersController = { }, // GET /customers/by_registered_at?n=XXX&p=XXX - // NOTE: Need to change registered at to a time object? Sorting alphabetally vs. by date! - showByRegistered_at: function(req, res) { + showByRegisteredAt: function(req, res) { var number = req["query"]["n"]; var pages = req["query"]["p"]; Customer.find_by_sorted_date("registered_at", number, pages, function(err, result) { @@ -41,14 +40,13 @@ exports.customersController = { var select = [] var offset = (pages - 1) * number; - // 6 - 10 (page 2 & number 5) - // [5, 6, 7, 8, 9] + // ex. 6 - 10 (page 2 & number 5) + // ex. [5, 6, 7, 8, 9] var selection = Array.apply(null, Array(number)).map(function (_, i) {return offset + i;}); for (var i = selection[0]; i < (selection[0] + selection.length); i++) { select.push(result[i]); } - // console.log(select); return res.status(200).json(select); } else { return res.status(200).json(result); diff --git a/routes/customers.js b/routes/customers.js index bdc39b4..d5c76d2 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -14,7 +14,7 @@ router.get('/by_name', function(req, res, next) { // all customers by registered at (optional query for number (n=#) & page (p=#)) router.get('/by_registered_at', function(req, res, next) { - return customer_exports.customersController.showByRegistered_at(req, res); + return customer_exports.customersController.showByRegisteredAt(req, res); }); // all customers by postal code (optional query for number (n=#) & page (p=#)) From 6c1638674df9fe1b6d8dbe23bcfc84c549b0a05f Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Fri, 25 Sep 2015 10:03:37 -0700 Subject: [PATCH 88/96] Added functionality to deny rental if inventory is not enough to accommodate --- controllers/rentals.js | 4 ++-- models/rentals.js | 30 ++++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 1cfd478..4b6961d 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -120,9 +120,9 @@ exports.rentalsController = { db.check_out(data, function(err, result) { if (err !== null) { console.log(err); - return res.status(500).json({}); + return res.status(500).json(result); } else { - return res.status(200).json({}); + return res.status(200).json(result); } }); } diff --git a/models/rentals.js b/models/rentals.js index 38e563e..d641ddb 100644 --- a/models/rentals.js +++ b/models/rentals.js @@ -26,21 +26,39 @@ Rental.prototype.check_out = function(data, callback){ var id = data.customer_id; var title = data.movie_title due.setDate(now.getDate()+checkoutLengthDays); + var insert_statement = "INSERT INTO rentals (check_out_date, expected_return_date, customer_id, movie_id) VALUES (?,?,?,(SELECT id FROM movies where title LIKE ?))"; + var charge_statement = "UPDATE customers SET account_credit=(account_credit-" +rental_cost+") WHERE id=?"; - db.run(insert_statement, yyyymmdd(now), yyyymmdd(due), id, title, function(err, rows) { - if (err !== null) { - console.log(err); - } - }); - db.run(charge_statement, id, function(err, res) { + var check_inventory_statement = "SELECT movies.inventory-(SELECT COUNT(*) from rentals WHERE rentals.movie_id=movies.id AND check_in_date IS NULL) AS available from movies WHERE title LIKE ?"; + + console.log(title); + + db.all(check_inventory_statement, title, function(err, result){ + console.log(result); + if (result[0].available > 0){ + db.run(insert_statement, yyyymmdd(now), yyyymmdd(due), id, title, function(err, rows) { if (err !== null) { console.log(err); } + }); + db.run(charge_statement, id, function(err, res) { + if (err !== null) { + console.log(err); + } + result = {"result": "Successful", "message": "Rental Created"}; + if (callback) callback(err, result); + db.close(); + }); + } + else { + var res = {"result": "Unsuccessful", "message": "Not enough inventory to complete rental"}; if (callback) callback(err, res); db.close(); + } }); + }; module.exports = Rental; From 018d8e228a87229ce60c5c77efa724a199268d06 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 25 Sep 2015 13:17:39 -0700 Subject: [PATCH 89/96] Fixed bug with sort_by registered date only showing the first record on the page regardless of the number. Apparently I was overcomplicating things\! --- controllers/customers.js | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 1031b3d..5d2a48d 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -39,15 +39,45 @@ exports.customersController = { if (number && pages) { var select = [] var offset = (pages - 1) * number; + var start = parseInt(offset); + var end = parseInt(offset) + parseInt(number); - // ex. 6 - 10 (page 2 & number 5) - // ex. [5, 6, 7, 8, 9] - var selection = Array.apply(null, Array(number)).map(function (_, i) {return offset + i;}); - for (var i = selection[0]; i < (selection[0] + selection.length); i++) { + for (var i = start; i < end; i++) { select.push(result[i]); + // console.log(select); + if (i == (end - 1)) { + return res.status(200).json(select); + } } - return res.status(200).json(select); + // var test = function(callback) { + // var jo = function() { + // var num_large_array = Array.apply(null, Array(number)); + // // var selection = num_large_array.map(function (original_val, i) {return offset + i;}); + // return num_large_array.map(function (original_val, i) {return offset + i;}); + // // callback(selection); + // }; + // console.log(callback) + // var selection = jo(); + // console.log(selection); + // for (var i = selection[0]; i < (selection[0] + selection.length); i++) { + // select.push(result[i]); + // if (i == (selection[0] + selection.length - 1)) { + // return res.status(200).json(select); + // } + // } + // }; + // + // test(); + + // test(function(selection) { + // for (var i = selection[0]; i < (selection[0] + selection.length); i++) { + // select.push(result[i]); + // if (i == (selection[0] + selection.length - 1)) { + // return res.status(200).json(select); + // } + // } + // } } else { return res.status(200).json(result); } From f64c0897a0d4867a6c4f6f09688cab81a5eaeaed Mon Sep 17 00:00:00 2001 From: MisShellyMac Date: Fri, 25 Sep 2015 13:22:28 -0700 Subject: [PATCH 90/96] Updated test for rentals/check_out for appropriate json response --- test/controllers/rentals.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index b17704c..0c9c050 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -187,7 +187,7 @@ describe("Endpoints under /rentals", function() { it('responds with correct data', function(done){ request - .expect('{}', done); + .expect('{"result":"Successful","message":"Rental Created"}', done); }); it('creates a new rental in the database', function(done) { From 164ffdf58c4e8e41bf476fe4bcfa5bb115c35898 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 25 Sep 2015 13:23:04 -0700 Subject: [PATCH 91/96] Cleaned up the sort by registered date. --- controllers/customers.js | 38 ++++---------------------------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 5d2a48d..c524986 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -44,41 +44,11 @@ exports.customersController = { for (var i = start; i < end; i++) { select.push(result[i]); - // console.log(select); - if (i == (end - 1)) { - return res.status(200).json(select); - } } - - // var test = function(callback) { - // var jo = function() { - // var num_large_array = Array.apply(null, Array(number)); - // // var selection = num_large_array.map(function (original_val, i) {return offset + i;}); - // return num_large_array.map(function (original_val, i) {return offset + i;}); - // // callback(selection); - // }; - // console.log(callback) - // var selection = jo(); - // console.log(selection); - // for (var i = selection[0]; i < (selection[0] + selection.length); i++) { - // select.push(result[i]); - // if (i == (selection[0] + selection.length - 1)) { - // return res.status(200).json(select); - // } - // } - // }; - // - // test(); - - // test(function(selection) { - // for (var i = selection[0]; i < (selection[0] + selection.length); i++) { - // select.push(result[i]); - // if (i == (selection[0] + selection.length - 1)) { - // return res.status(200).json(select); - // } - // } - // } - } else { + + return res.status(200).json(select); + } + else { return res.status(200).json(result); } }); From 21243670a8613f5823ea25bbfd6b86a5f48a8f03 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 25 Sep 2015 13:41:52 -0700 Subject: [PATCH 92/96] Refactored the sort by functions. --- controllers/customers.js | 28 +++++----------------------- models/customers.js | 38 ++++++++++++++++---------------------- 2 files changed, 21 insertions(+), 45 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index c524986..dd8026f 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -3,10 +3,10 @@ var customer_instance = require('../models/customers'); var Customer = new customer_instance; -function sortBy(sort_by, req, res) { +function sortBy(the_function, sort_by, req, res) { var number = req["query"]["n"]; var pages = req["query"]["p"]; - Customer.find_by_sorted(sort_by, number, pages, function(err, result) { + the_function(sort_by, number, pages, function(err, result) { return res.status(200).json(result); }); } @@ -28,35 +28,17 @@ exports.customersController = { // GET /customers/by_name?n=XXX&p=XXX showByName: function(req, res) { - sortBy("name", req, res); + sortBy(Customer.find_by_sorted, "name", req, res); }, // GET /customers/by_registered_at?n=XXX&p=XXX showByRegisteredAt: function(req, res) { - var number = req["query"]["n"]; - var pages = req["query"]["p"]; - Customer.find_by_sorted_date("registered_at", number, pages, function(err, result) { - if (number && pages) { - var select = [] - var offset = (pages - 1) * number; - var start = parseInt(offset); - var end = parseInt(offset) + parseInt(number); - - for (var i = start; i < end; i++) { - select.push(result[i]); - } - - return res.status(200).json(select); - } - else { - return res.status(200).json(result); - } - }); + sortBy(Customer.find_by_sorted_date, "registered_at", req, res) }, // GET /customers/by_postal_code?n=XXX&p=XXX showByPostalCode: function(req, res) { - sortBy("postal_code", req, res); + sortBy(Customer.find_by_sorted, "postal_code", req, res); }, // GET /customers/:id/current diff --git a/models/customers.js b/models/customers.js index afc7c28..39605bf 100644 --- a/models/customers.js +++ b/models/customers.js @@ -59,31 +59,25 @@ Customer.prototype.find_by_sorted_date = function(sort_by, number, pages, callba var statement = "SELECT * FROM customers;"; db.all(statement, function(err, res) { + var sorted = res.sort(function(a, b) { + return new Date(a.registered_at) - new Date(b.registered_at); + }); + + var select_sorted; + if (number && pages) { - // var offset = (pages - 1) * number; - - var sorted = res.sort(function(a, b){ - return new Date(a.registered_at) - new Date(b.registered_at) - }); - // sorted[offset] - // sorted[i] - // var select = [] - // - // var selection = Array.apply(null, Array(number)).map(function (_, i) {return offset + i;}); - // for (var i = selection[0]; i < (selection[0] + selection.length); i++) { - // select.push(sorted[i]); - // } - // - // console.log(select); - } - else { - var sorted = res.sort(function(a, b){ - return new Date(a.registered_at) - new Date(b.registered_at) - }); - // console.log(sorted); + select_sorted = []; + var offset = (pages - 1) * number; + var start = parseInt(offset); + var end = parseInt(offset) + parseInt(number); + + for (var i = start; i < end; i++) { + select_sorted.push(sorted[i]); + } } - if (callback) callback(err, sorted); + var result = select_sorted || sorted; + if (callback) callback(err, result); db.close(); }); }; From c4aeae4d15b52fc700013001bfedc894117eeb35 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 25 Sep 2015 13:50:19 -0700 Subject: [PATCH 93/96] Removed random console.logs lying around. --- controllers/movies.js | 4 ++-- controllers/rentals.js | 38 ++++++++++++++++---------------------- models/rentals.js | 3 --- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index 17e2a85..4aa072c 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -98,7 +98,7 @@ exports.moviesController = { db.all("SELECT customers.id, customers.name, customers.phone, rentals.check_out_date FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id INNER JOIN movies ON movies.id = rentals.movie_id WHERE movies.title LIKE ? AND rentals.check_in_date IS NULL", title, function(err, rows) { if (err !== null) { console.log(err); - }console.log(rows); + } res.status(200).json(rows); }); }, @@ -127,7 +127,7 @@ exports.moviesController = { db.all(statement, title, function(err, rows) { if (err !== null) { console.log(err); - }console.log(rows); + } res.status(200).json(rows); }); } diff --git a/controllers/rentals.js b/controllers/rentals.js index 4b6961d..dd6acc3 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -85,29 +85,23 @@ exports.rentalsController = { AND check_in_date IS NULL;" db.all(statement, id, title, function(err, result1) { - console.log(result1); - // if (result == []) { - // res.status(404).json([]); - // } - // else { - var statement_oldest = "UPDATE rentals SET check_in_date=? WHERE id=" + result1[0].id; - db.all(statement_oldest, yyyymmdd(now), function(err, result2) { - if (err !== null) { - console.log(err); - } else { - var statement_late_fee = "UPDATE customers SET account_credit=(account_credit-" + late_fee + ") WHERE id=? AND date((SELECT expected_return_date FROM rentals WHERE id=?)) < date('now');"; + var statement_oldest = "UPDATE rentals SET check_in_date=? WHERE id=" + result1[0].id; + db.all(statement_oldest, yyyymmdd(now), function(err, result2) { + if (err !== null) { + console.log(err); + } else { + var statement_late_fee = "UPDATE customers SET account_credit=(account_credit-" + late_fee + ") WHERE id=? AND date((SELECT expected_return_date FROM rentals WHERE id=?)) < date('now');"; - db.run(statement_late_fee, id, result1[0].id, function(err, result3) { - if (err !== null) { - console.log(err); - } - else { - res.status(200).json([]); - } - }); - } - }) - // } + db.run(statement_late_fee, id, result1[0].id, function(err, result3) { + if (err !== null) { + console.log(err); + } + else { + res.status(200).json([]); + } + }); + } + }) }) }, diff --git a/models/rentals.js b/models/rentals.js index d641ddb..460d255 100644 --- a/models/rentals.js +++ b/models/rentals.js @@ -33,10 +33,7 @@ Rental.prototype.check_out = function(data, callback){ var check_inventory_statement = "SELECT movies.inventory-(SELECT COUNT(*) from rentals WHERE rentals.movie_id=movies.id AND check_in_date IS NULL) AS available from movies WHERE title LIKE ?"; - console.log(title); - db.all(check_inventory_statement, title, function(err, result){ - console.log(result); if (result[0].available > 0){ db.run(insert_statement, yyyymmdd(now), yyyymmdd(due), id, title, function(err, rows) { if (err !== null) { From 0bcb85a38cc9e815adee918b1a17ff1d74df5919 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 25 Sep 2015 13:54:12 -0700 Subject: [PATCH 94/96] Fixed some offset indenting. --- models/rentals.js | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/models/rentals.js b/models/rentals.js index 460d255..2f2383b 100644 --- a/models/rentals.js +++ b/models/rentals.js @@ -34,28 +34,27 @@ Rental.prototype.check_out = function(data, callback){ var check_inventory_statement = "SELECT movies.inventory-(SELECT COUNT(*) from rentals WHERE rentals.movie_id=movies.id AND check_in_date IS NULL) AS available from movies WHERE title LIKE ?"; db.all(check_inventory_statement, title, function(err, result){ - if (result[0].available > 0){ - db.run(insert_statement, yyyymmdd(now), yyyymmdd(due), id, title, function(err, rows) { - if (err !== null) { - console.log(err); - } - }); - db.run(charge_statement, id, function(err, res) { + if (result[0].available > 0) { + db.run(insert_statement, yyyymmdd(now), yyyymmdd(due), id, title, function(err, rows) { if (err !== null) { console.log(err); } - result = {"result": "Successful", "message": "Rental Created"}; - if (callback) callback(err, result); - db.close(); - }); - } + }); + db.run(charge_statement, id, function(err, res) { + if (err !== null) { + console.log(err); + } + result = { "result": "Successful", "message": "Rental created" }; + if (callback) callback(err, result); + db.close(); + }); + } else { - var res = {"result": "Unsuccessful", "message": "Not enough inventory to complete rental"}; + var res = { "result": "Unsuccessful", "message": "Not enough inventory to complete rental" }; if (callback) callback(err, res); db.close(); } }); - }; module.exports = Rental; From 3b2b47b67d4a4740b46dce287a3e04198818e91b Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 25 Sep 2015 13:57:42 -0700 Subject: [PATCH 95/96] Fixed a test. --- test/controllers/rentals.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 0c9c050..42989dc 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -187,7 +187,7 @@ describe("Endpoints under /rentals", function() { it('responds with correct data', function(done){ request - .expect('{"result":"Successful","message":"Rental Created"}', done); + .expect('{"result":"Successful","message":"Rental created"}', done); }); it('creates a new rental in the database', function(done) { From eadeedf8f03bb7dcdf0d07de4c6f3e5450232321 Mon Sep 17 00:00:00 2001 From: Brandi Wilson Date: Fri, 25 Sep 2015 13:58:08 -0700 Subject: [PATCH 96/96] Added nyan command to package.json. --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 88137f0..0bb1217 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "start": "nodemon ./bin/www", "test": "clear; DB=test mocha --recursive;", + "nyan": "clear; DB=test mocha --recursive -R nyan;", "reset": "node ./utils/schema", "seed": "node ./utils/seed", "setup": "npm run reset; npm run seed; DB=test npm run reset"