From ad34c58e6654fa00c562101999899024d06d881a Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Tue, 15 Sep 2015 16:18:35 -0700 Subject: [PATCH 01/78] Created fresh node install --- .gitignore | 1 + app.js | 60 ++++++++++++++++++++++++ bin/www | 90 ++++++++++++++++++++++++++++++++++++ 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 +++ 10 files changed, 212 insertions(+) create mode 100644 app.js create mode 100755 bin/www 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..9daa824 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/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 acebf38bf68c27448297c3a1f14af4c1b81570a1 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Tue, 15 Sep 2015 16:35:36 -0700 Subject: [PATCH 02/78] Changed route names to movies and customers. Added controllers --- app.js | 11 ++++++----- controllers/customers.js | 0 controllers/movies.js | 0 routes/{users.js => customers.js} | 0 routes/{index.js => movies.js} | 0 5 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 controllers/customers.js create mode 100644 controllers/movies.js rename routes/{users.js => customers.js} (100%) rename routes/{index.js => movies.js} (100%) diff --git a/app.js b/app.js index 80a3c36..3ace3c3 100644 --- a/app.js +++ b/app.js @@ -5,9 +5,6 @@ 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 @@ -22,8 +19,12 @@ app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); -app.use('/', routes); -app.use('/users', users); + +var routes = require('./routes/movies'); +app.use('/movies', routes); + +var customers = require('./routes/customers'); +app.use('/customers', customers); // catch 404 and forward to error handler app.use(function(req, res, next) { 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/routes/users.js b/routes/customers.js similarity index 100% rename from routes/users.js rename to routes/customers.js diff --git a/routes/index.js b/routes/movies.js similarity index 100% rename from routes/index.js rename to routes/movies.js From e2209ba1664c4a5726743afe7d459d49fd859919 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Tue, 15 Sep 2015 16:49:08 -0700 Subject: [PATCH 03/78] Adds some pseudo code for routes --- controllers/customers.js | 16 ++++++++++++++++ routes/customers.js | 15 ++++++++++++++- routes/movies.js | 14 +++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index e69de29..d8393f6 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -0,0 +1,16 @@ +"use strict"; + +exports.customerController = { + index: function index(req, res) { + // return list of all customers, GET verb + // var results = { + // zomg: 'zomg it worked!', + // moar: 'zomg moar' + } + // return res.status(200).json(results); + }, + + one_customer: function one_customer(req, res) { + return res.status(200).json({why: "I don't know."}); + } +} diff --git a/routes/customers.js b/routes/customers.js index 623e430..b874ac7 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -1,9 +1,22 @@ var express = require('express'); var router = express.Router(); +var customer_exports = require('../controllers/customers'); + /* GET users listing. */ router.get('/', function(req, res, next) { - res.send('respond with a resource'); + //return list of all customers + // return customer_exports.customerController.index(req, res); +}); + +router.get('/one_customer', function(req, res, next) { + // return one customer based on id + //return customer_exports.customerController.one_customer(req, res); +}); + +router.get('/group_customers', function(req, res, next) { + // return subsets of customers, might be three different endpoints + // return res.status(200).json({ id: req.params.id }) }); module.exports = router; diff --git a/routes/movies.js b/routes/movies.js index ecca96a..8647d94 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -3,7 +3,19 @@ var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { - res.render('index', { title: 'Express' }); + //return list of all movies + // return customer_exports.customerController.index(req, res); }); +router.get('/one_movie', function(req, res, next) { + // return one customer based on title + //return customer_exports.customerController.one_customer(req, res); +}); + +router.get('/group_movies', function(req, res, next) { + // return subsets of movies, might be two different endpoints + // return res.status(200).json({ id: req.params.id }) +}); + + module.exports = router; From 3cb9b52f1e0beee057574397f987c94690ad4349 Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 17 Sep 2015 13:33:00 -0700 Subject: [PATCH 04/78] Installed sqlite3 --- 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 1adb09e7cf4c4d40a7d07a0595cfa332c7a05405 Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 17 Sep 2015 13:33:22 -0700 Subject: [PATCH 05/78] Created seed and schema files. --- utils/schema.js | 28 ++++++++++++++++++++++++++++ utils/seed.js | 0 2 files changed, 28 insertions(+) create mode 100644 utils/schema.js create mode 100644 utils/seed.js diff --git a/utils/schema.js b/utils/schema.js new file mode 100644 index 0000000..ec1938c --- /dev/null +++ b/utils/schema.js @@ -0,0 +1,28 @@ +"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 tables + db.run("CREATE TABLE movies (id INTEGER PRIMARY KEY);"); + // add columns we need to tables + for (var i = 0; i < movie_fields.length; i++) { + var name = movie_fields[i][0], + type = movie_fields[i][1]; + + db.run("ALTER TABLE movies ADD COLUMN " + name + " " + type + ";"); + } +}); + +db.close(); diff --git a/utils/seed.js b/utils/seed.js new file mode 100644 index 0000000..e69de29 From 2e860a1851e7df735624d48da9603d6c44dd2ba1 Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 17 Sep 2015 13:33:48 -0700 Subject: [PATCH 06/78] Our schema file generated a dev.db --- db/development.db | Bin 0 -> 2048 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 db/development.db diff --git a/db/development.db b/db/development.db new file mode 100644 index 0000000000000000000000000000000000000000..8244bf8e6d4633b1e10b52b282623ca6c2f7b93e GIT binary patch literal 2048 zcmWFz^vNtqRY=P(%1ta$FlJz3U}R))P*7lCU|0p(L{;Csm;&wW35vA-^oO2xv|@lv|XV ylbTqZ8lRE~%-|3enR#WYc_sNpl?s`8C8_DDMVg?ziIS^FV`nr3Mnho4ga82h(lzG* literal 0 HcmV?d00001 From ca58149e3f3163eb307ac97f9c5ed0fc1425f51e Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 17 Sep 2015 13:34:02 -0700 Subject: [PATCH 07/78] Started on tests. --- test/database_tests.js | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 test/database_tests.js diff --git a/test/database_tests.js b/test/database_tests.js new file mode 100644 index 0000000..0a70386 --- /dev/null +++ b/test/database_tests.js @@ -0,0 +1,50 @@ +var assert = require("assert"); +var Database = require('../database'); + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development', + db = new sqlite3.Database('db/' + db_env + '.db'); + + +describe("Database", function() { + // "Hoisting" the db var into a higher scope + // However all tests will be using the same object + var db; // could also be db = null + var database_path = "db/test.db" + beforeEach(function() { + db = new Database(database_path); + }) + + it("can be instantiated", function() { + // var db = new Database(); + assert.equal(db instanceof Database, true); + }) + + it("has a test property", function() { + // var db = new Database(); + assert.equal(typeof db.test, "function") + }) + + it("holds onto the `path` of the database", function() { + assert.equal(db.path, database_path); + }) + + describe("user queries", function(){ + before(function() { + // create a users table + db.query("CREATE TABLE IF NOT EXISTS users (name TEXT);"); + + + // insert 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';"; + // var result = db.query(table_exists); + db.query(table_exists, function(result) { + assert.equal(result[0].table_count, 1); + done(); // this MUST be here + }) + }) + }) +}) From 06d0cf1b014e8799b2840fed9f81b6a095cf6cda Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 17 Sep 2015 13:46:14 -0700 Subject: [PATCH 08/78] Created a test db. Seems legit. --- db/test.db | 0 test/database_tests.js | 65 +++++++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 33 deletions(-) create mode 100644 db/test.db diff --git a/db/test.db b/db/test.db new file mode 100644 index 0000000..e69de29 diff --git a/test/database_tests.js b/test/database_tests.js index 0a70386..24074f5 100644 --- a/test/database_tests.js +++ b/test/database_tests.js @@ -1,50 +1,49 @@ +"require strict" + var assert = require("assert"); -var Database = require('../database'); var sqlite3 = require('sqlite3').verbose(), - db_env = process.env.DB || 'development', - db = new sqlite3.Database('db/' + db_env + '.db'); + db_env = 'test' describe("Database", function() { // "Hoisting" the db var into a higher scope // However all tests will be using the same object var db; // could also be db = null - var database_path = "db/test.db" beforeEach(function() { - db = new Database(database_path); + db = new sqlite3.Database('db/' + db_env + '.db'); }) it("can be instantiated", function() { - // var db = new Database(); + var Database = sqlite3.Database assert.equal(db instanceof Database, true); }) - it("has a test property", function() { - // var db = new Database(); - assert.equal(typeof db.test, "function") - }) - - it("holds onto the `path` of the database", function() { - assert.equal(db.path, database_path); - }) - - describe("user queries", function(){ - before(function() { - // create a users table - db.query("CREATE TABLE IF NOT EXISTS users (name TEXT);"); - - - // insert 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';"; - // var result = db.query(table_exists); - db.query(table_exists, function(result) { - assert.equal(result[0].table_count, 1); - done(); // this MUST be here - }) - }) - }) + // it("has a test property", function() { + // // var db = new Database(); + // assert.equal(typeof db.test, "function") + // }) + // + // it("holds onto the `path` of the database", function() { + // assert.equal(db.path, database_path); + // }) + // + // describe("user queries", function(){ + // before(function() { + // // create a users table + // db.query("CREATE TABLE IF NOT EXISTS users (name TEXT);"); + // + // + // // insert 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';"; + // // var result = db.query(table_exists); + // db.query(table_exists, function(result) { + // assert.equal(result[0].table_count, 1); + // done(); // this MUST be here + // }) + // }) + // }) }) From e79f726d8311f16c075b036dcb12467a010bd16b Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 17 Sep 2015 13:53:56 -0700 Subject: [PATCH 09/78] Semicolon. --- test/database_tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/database_tests.js b/test/database_tests.js index 24074f5..c1a6336 100644 --- a/test/database_tests.js +++ b/test/database_tests.js @@ -1,4 +1,4 @@ -"require strict" +"require strict"; var assert = require("assert"); From 708e5b2fd5e4841b938f0246c33a41407bd4fd67 Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 17 Sep 2015 13:59:51 -0700 Subject: [PATCH 10/78] Added db files to git ignore. --- .gitignore | 1 + utils/seed.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/.gitignore b/.gitignore index 9daa824..9432a77 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store node_modules +db diff --git a/utils/seed.js b/utils/seed.js index e69de29..f1babe5 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -0,0 +1,29 @@ +"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'); +var movie_statement = db.prepare( + "INSERT INTO movies(title, overview, inventory, release_date) \ + VALUES (?, ?, ?, ?);" +); + +db.serialize(function() { + for(var i = 0; i < movies.length; i++) { + var movie = movies[i]; + + movie_statement.run( + movie.title, + movie.overview, + movie.inventory, + movie.release_date + ); + } + movie_statement.finalize(); +}); +// loop them movies +// insert each into db +// go home +db.close(); From c67a1bd2c326d379e7f00a789db482075fa1eed8 Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 17 Sep 2015 14:01:53 -0700 Subject: [PATCH 11/78] Untracking db folder. --- db/development.db | Bin 2048 -> 0 bytes db/test.db | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 db/development.db delete mode 100644 db/test.db diff --git a/db/development.db b/db/development.db deleted file mode 100644 index 8244bf8e6d4633b1e10b52b282623ca6c2f7b93e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 zcmWFz^vNtqRY=P(%1ta$FlJz3U}R))P*7lCU|0p(L{;Csm;&wW35vA-^oO2xv|@lv|XV ylbTqZ8lRE~%-|3enR#WYc_sNpl?s`8C8_DDMVg?ziIS^FV`nr3Mnho4ga82h(lzG* diff --git a/db/test.db b/db/test.db deleted file mode 100644 index e69de29..0000000 From d5bc554a3b26fe850f0274c853f203ad439a33cb Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Thu, 17 Sep 2015 14:15:54 -0700 Subject: [PATCH 12/78] Added schema for cumstomers table --- controllers/rentals.js | 1 + routes/movies.js | 3 +++ utils/schema.js | 28 ++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 controllers/rentals.js diff --git a/controllers/rentals.js b/controllers/rentals.js new file mode 100644 index 0000000..9444aff --- /dev/null +++ b/controllers/rentals.js @@ -0,0 +1 @@ +// probably manage join table results diff --git a/routes/movies.js b/routes/movies.js index 8647d94..953ee81 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -17,5 +17,8 @@ router.get('/group_movies', function(req, res, next) { // return res.status(200).json({ id: req.params.id }) }); +// one movies/title/customers will return customer info +// another movie/title will return movie info + module.exports = router; diff --git a/utils/schema.js b/utils/schema.js index ec1938c..984bdca 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -25,4 +25,32 @@ 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 tables + db.run("CREATE TABLE customers (id INTEGER PRIMARY KEY);"); + // add columns we need to tables + for (var i = 0; i < customer_fields.length; i++) { + var name = customer_fields[i][0], + type = customer_fields[i][1]; + + db.run("ALTER TABLE customers ADD COLUMN " + name + " " + type + ";"); + } +}); + db.close(); + + From cb5f63a09a6aa4bd04332a1adfedc9de59e082c1 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Thu, 17 Sep 2015 14:26:37 -0700 Subject: [PATCH 13/78] Added seed code for customers --- utils/seed.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/utils/seed.js b/utils/seed.js index f1babe5..3c39247 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -23,6 +23,31 @@ db.serialize(function() { } 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() { + for(var i = 0; i < customers.length; i++) { + var customer = customers[i]; + + 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(); +}); // loop them movies // insert each into db // go home From 3a9a9560d8467b3880d64eab087de59085c69e52 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Thu, 17 Sep 2015 15:51:27 -0700 Subject: [PATCH 14/78] Added schema for rental table. --- utils/schema.js | 21 +++++++++++++++++++++ utils/seed.js | 8 +++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/utils/schema.js b/utils/schema.js index 984bdca..bd23a59 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -51,6 +51,27 @@ db.serialize(function() { } }); +var rental_fields = [ + ['movie_id', 'integer'], + ['customer_id', 'integer'], + ['returned_date', 'text'], + ['checked_out', 'integer'] +] + +db.serialize(function() { + // drop existing tables + db.run("DROP TABLE IF EXISTS rentals;"); + // create fresh versions of tables + db.run("CREATE TABLE rentals (id INTEGER PRIMARY KEY);"); + // add columns we need to tables + for (var i = 0; i < rental_fields.length; i++) { + var name = rental_fields[i][0], + type = rental_fields[i][1]; + + db.run("ALTER TABLE rentals ADD COLUMN " + name + " " + type + ";"); + } +}); + db.close(); diff --git a/utils/seed.js b/utils/seed.js index 3c39247..0b35523 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -48,7 +48,9 @@ db.serialize(function() { } customer_statement.finalize(); }); -// loop them movies -// insert each into db -// go home + +// INSERT INTO rentals(customer_id, movie_id, returned_date, checked_out) VALUES (2, 3, 'tomorrow', 1); + +// SELECT "movies".* FROM "movies" INNER JOIN "rentals" ON "movies"."id" = "rentals"."movie_id" WHERE "rentals"."movie_id" = 3; + db.close(); From 5f9dc93e40a5f38c13c53723e8d28323b548cd86 Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 17 Sep 2015 15:58:12 -0700 Subject: [PATCH 15/78] Created a models folder. --- models/customer.js | 0 models/movie.js | 0 models/rental.js | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 models/customer.js create mode 100644 models/movie.js create mode 100644 models/rental.js diff --git a/models/customer.js b/models/customer.js new file mode 100644 index 0000000..e69de29 diff --git a/models/movie.js b/models/movie.js new file mode 100644 index 0000000..e69de29 diff --git a/models/rental.js b/models/rental.js new file mode 100644 index 0000000..e69de29 From 8f45370377e67483a60c3928ea5f16ae5b02c9bd Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Fri, 18 Sep 2015 11:26:08 -0700 Subject: [PATCH 16/78] Added customer model. Added database.js file. Added first model test. --- database.js | 20 +++++++++++++++++ models/customer.js | 9 ++++++++ routes/customers.js | 2 +- test/database_tests.js | 49 ----------------------------------------- test/models/customer.js | 36 ++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 50 deletions(-) create mode 100644 database.js create mode 100644 models/customer.js delete mode 100644 test/database_tests.js create mode 100644 test/models/customer.js diff --git a/database.js b/database.js new file mode 100644 index 0000000..a890273 --- /dev/null +++ b/database.js @@ -0,0 +1,20 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development'; + +module.exports = { + 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(); + }); + }, + + + + +} diff --git a/models/customer.js b/models/customer.js new file mode 100644 index 0000000..83043d5 --- /dev/null +++ b/models/customer.js @@ -0,0 +1,9 @@ +"use strict"; + +function Movie() { + this.table_name = "movies"; +} + +Movie.prototype = require('../database'); + +module.exports = Movie diff --git a/routes/customers.js b/routes/customers.js index b874ac7..5814832 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -1,7 +1,7 @@ var express = require('express'); var router = express.Router(); -var customer_exports = require('../controllers/customers'); +var customer_exports = require('../models/customers'); /* GET users listing. */ router.get('/', function(req, res, next) { diff --git a/test/database_tests.js b/test/database_tests.js deleted file mode 100644 index c1a6336..0000000 --- a/test/database_tests.js +++ /dev/null @@ -1,49 +0,0 @@ -"require strict"; - -var assert = require("assert"); - -var sqlite3 = require('sqlite3').verbose(), - db_env = 'test' - - -describe("Database", function() { - // "Hoisting" the db var into a higher scope - // However all tests will be using the same object - var db; // could also be db = null - beforeEach(function() { - db = new sqlite3.Database('db/' + db_env + '.db'); - }) - - it("can be instantiated", function() { - var Database = sqlite3.Database - assert.equal(db instanceof Database, true); - }) - - // it("has a test property", function() { - // // var db = new Database(); - // assert.equal(typeof db.test, "function") - // }) - // - // it("holds onto the `path` of the database", function() { - // assert.equal(db.path, database_path); - // }) - // - // describe("user queries", function(){ - // before(function() { - // // create a users table - // db.query("CREATE TABLE IF NOT EXISTS users (name TEXT);"); - // - // - // // insert 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';"; - // // var result = db.query(table_exists); - // db.query(table_exists, function(result) { - // assert.equal(result[0].table_count, 1); - // done(); // this MUST be here - // }) - // }) - // }) -}) diff --git a/test/models/customer.js b/test/models/customer.js new file mode 100644 index 0000000..5c1f479 --- /dev/null +++ b/test/models/customer.js @@ -0,0 +1,36 @@ +"use strict"; + +var assert = require('assert'), + Customer = require('../../models/customer'), + sqlite3 = require('sqlite3').verbose(); + +describe('Customer', function() { + var customer, + db_cleaner; + + beforeEach(function(done) { + customer = new Customer(); + + db_cleaner = new sqlite3.Database('db/test.db'); + db_cleaner.serialize(function() { + db_cleaner.exec( + "BEGIN; \ + DELETE FROM customers; \ + INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ + VALUES('Mulder', 'yesterday', '123', 'DC', 'DC', '834885', '49583', 5), \ + ('Scully', 'last week', 'DC', 'DC', '2342', '534', 7); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }) + + it("can be instantiated", function(){ + assert(customer instanceof Customer); + }); + + +}) From 74d7ccc9c8368848fa5c699b4faeb836504b21c6 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Fri, 18 Sep 2015 11:42:44 -0700 Subject: [PATCH 17/78] Created customer controller method, and WIP on route --- controllers/customers.js | 18 +++++++----------- database.js | 15 +++++++++++---- models/customer.js | 8 ++++---- npm-debug.log | 36 ++++++++++++++++++++++++++++++++++++ routes/customers.js | 4 ++-- 5 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 npm-debug.log diff --git a/controllers/customers.js b/controllers/customers.js index d8393f6..d7bc08d 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -1,16 +1,12 @@ "use strict"; -exports.customerController = { +var Customer = require('../models/customer'); + +exports.customersController = { index: function index(req, res) { - // return list of all customers, GET verb - // var results = { - // zomg: 'zomg it worked!', - // moar: 'zomg moar' + var customers = new Customer(); + var results = customers.find_all(); + console.log(customers); + return res.status(200).json(results); } - // return res.status(200).json(results); - }, - - one_customer: function one_customer(req, res) { - return res.status(200).json({why: "I don't know."}); } -} diff --git a/database.js b/database.js index a890273..97386e8 100644 --- a/database.js +++ b/database.js @@ -4,17 +4,24 @@ var sqlite3 = require('sqlite3').verbose(), db_env = process.env.DB || 'development'; module.exports = { - find_by: function(column, value, callback) { + find_all: function(callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - var statement = "SELECT * FROM " + this.table_name + " WHERE " + column + "= ?;"; + 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(); }); }, + 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(); + }); + } } diff --git a/models/customer.js b/models/customer.js index 83043d5..d1b1dd4 100644 --- a/models/customer.js +++ b/models/customer.js @@ -1,9 +1,9 @@ "use strict"; -function Movie() { - this.table_name = "movies"; +function Customer() { + this.table_name = "customers"; } -Movie.prototype = require('../database'); +Customer.prototype = require('../database'); -module.exports = Movie +module.exports = Customer diff --git a/npm-debug.log b/npm-debug.log new file mode 100644 index 0000000..fec04b9 --- /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.7.5 +3 info using node@v0.12.2 +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:14:12) +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/lilagarcia/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.2 +16 error npm v2.7.5 +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/customers.js b/routes/customers.js index 5814832..6b7c7dd 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -1,12 +1,12 @@ var express = require('express'); var router = express.Router(); -var customer_exports = require('../models/customers'); +var customer_exports = require('../controllers/customers'); /* GET users listing. */ router.get('/', function(req, res, next) { //return list of all customers - // return customer_exports.customerController.index(req, res); + return customer_exports.customersController.index(req, res); }); router.get('/one_customer', function(req, res, next) { From b03999b056cd8815c6cf0af2c7a0e4e3c323c987 Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 18 Sep 2015 11:51:43 -0700 Subject: [PATCH 18/78] We can now run the npm test command --- npm-debug.log | 36 ------------------------------------ package.json | 3 ++- 2 files changed, 2 insertions(+), 37 deletions(-) delete mode 100644 npm-debug.log diff --git a/npm-debug.log b/npm-debug.log deleted file mode 100644 index fec04b9..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.7.5 -3 info using node@v0.12.2 -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:14:12) -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/lilagarcia/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.2 -16 error npm v2.7.5 -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/package.json b/package.json index 87e6a93..8af053d 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www" + "start": "node ./bin/www", + "test": "clear; DB=test mocha --recursive" }, "dependencies": { "body-parser": "~1.13.2", From e0d43b7826f0791b059d7fc1a1bb565edb340027 Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 18 Sep 2015 11:52:21 -0700 Subject: [PATCH 19/78] Nodemon is now included in npm start command --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8af053d..669bc11 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", "test": "clear; DB=test mocha --recursive" }, "dependencies": { From 5fa5ba58844af50cd7bb55f9810e1437b0f1cde9 Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 18 Sep 2015 13:08:26 -0700 Subject: [PATCH 20/78] Missing brace. --- controllers/customers.js | 1 + 1 file changed, 1 insertion(+) diff --git a/controllers/customers.js b/controllers/customers.js index d7bc08d..06e2800 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -10,3 +10,4 @@ exports.customersController = { return res.status(200).json(results); } } +} From 861947fba92303fdc731312f023ab8bf98f03611 Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 18 Sep 2015 13:08:39 -0700 Subject: [PATCH 21/78] Wrote a test function for the module. --- database.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/database.js b/database.js index 97386e8..4fc7677 100644 --- a/database.js +++ b/database.js @@ -14,6 +14,9 @@ module.exports = { }); }, + test: function() { + console.log("Yay"); + }, find_by: function(column, value, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); From 9895ee65f95037037046e2dc5cccb543624b3856 Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 18 Sep 2015 14:22:44 -0700 Subject: [PATCH 22/78] Got our customers controller to collect the json object from our db. --- controllers/customers.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 06e2800..5ac562a 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -4,10 +4,11 @@ var Customer = require('../models/customer'); exports.customersController = { index: function index(req, res) { - var customers = new Customer(); - var results = customers.find_all(); - console.log(customers); - return res.status(200).json(results); - } + + var customer = new Customer(); + + customer.find_all(function(err, record) { + res.status(200).json({ all_customers: record }); + }) } } From bbc4a06aa3585e7712553485208ef8f84f101a7e Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 18 Sep 2015 14:23:20 -0700 Subject: [PATCH 23/78] Changed variables names so we wouldn't get confused about res. --- database.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database.js b/database.js index 4fc7677..976958f 100644 --- a/database.js +++ b/database.js @@ -8,8 +8,8 @@ module.exports = { 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.all(statement, function(err, record) { + if (callback) callback(err, record); db.close(); }); }, From 139cf52e78863d1803267f15818e0eb3432bcb3e Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 18 Sep 2015 14:23:54 -0700 Subject: [PATCH 24/78] Removed comments.' --- routes/customers.js | 1 - 1 file changed, 1 deletion(-) diff --git a/routes/customers.js b/routes/customers.js index 6b7c7dd..1f260b2 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -5,7 +5,6 @@ var customer_exports = require('../controllers/customers'); /* GET users listing. */ router.get('/', function(req, res, next) { - //return list of all customers return customer_exports.customersController.index(req, res); }); From 0f49e81156c8e76bfa2287b7c611c8c965b2de3c Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 18 Sep 2015 14:24:01 -0700 Subject: [PATCH 25/78] Removed comments.' --- test/models/customer.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/models/customer.js b/test/models/customer.js index 5c1f479..f829e37 100644 --- a/test/models/customer.js +++ b/test/models/customer.js @@ -32,5 +32,7 @@ describe('Customer', function() { assert(customer instanceof Customer); }); + + }) From 0633cf7b6286107b66e120a4e896eb04496fa9c4 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Fri, 18 Sep 2015 14:48:16 -0700 Subject: [PATCH 26/78] Added controller method, prototype method, and route for retrieving subset of customers with limit and offset --- controllers/customers.js | 9 +++++++++ database.js | 10 ++++++++-- routes/customers.js | 3 ++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 5ac562a..abed4ef 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -10,5 +10,14 @@ exports.customersController = { customer.find_all(function(err, record) { res.status(200).json({ all_customers: record }); }) + }, + + subset: function subset(req, res, column) { + + var customer = new Customer(); + + customer.find_subset(column, 5, 0, function(err, record) { + res.status(200).json({ subset_customers: record }); + }) } } diff --git a/database.js b/database.js index 976958f..73632ed 100644 --- a/database.js +++ b/database.js @@ -14,8 +14,14 @@ module.exports = { }); }, - test: function() { - console.log("Yay"); + find_subset: function(column, limit, offset, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT * FROM " + this.table_name + " ORDER BY " + column + " LIMIT " + limit + " OFFSET " + offset + ";"; + + db.all(statement, function(err, record) { + if (callback) callback(err, record); + db.close(); + }); }, find_by: function(column, value, callback) { diff --git a/routes/customers.js b/routes/customers.js index 1f260b2..c96a24f 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -13,9 +13,10 @@ router.get('/one_customer', function(req, res, next) { //return customer_exports.customerController.one_customer(req, res); }); -router.get('/group_customers', function(req, res, next) { +router.get('/:column', function(req, res, next) { // return subsets of customers, might be three different endpoints // return res.status(200).json({ id: req.params.id }) + return customer_exports.customersController.subset(req, res, req.params.column); }); module.exports = router; From 5f57587bf24837fa9e8bbad81aed554d28327fb6 Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 18 Sep 2015 23:39:01 -0700 Subject: [PATCH 27/78] Wrote a offset variable that calculates the amount of records to offset the response by, based on page number. --- controllers/customers.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index abed4ef..3e91ade 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -12,12 +12,14 @@ exports.customersController = { }) }, - subset: function subset(req, res, column) { + subset: function subset(req, res, column, pageNumber) { var customer = new Customer(); - customer.find_subset(column, 5, 0, function(err, record) { - res.status(200).json({ subset_customers: record }); + var offset = pageNumber * 50; + + customer.find_subset(column, 50, offset, function(err, record) { + res.status(200).json({ customer_subset: record }); }) } } From 82ebed46648ec4fefc4e182b02471aad8d263f12 Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 18 Sep 2015 23:39:17 -0700 Subject: [PATCH 28/78] Updated route to include page param, removed excess comments. --- routes/customers.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/routes/customers.js b/routes/customers.js index c96a24f..1ad10ca 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -13,10 +13,9 @@ router.get('/one_customer', function(req, res, next) { //return customer_exports.customerController.one_customer(req, res); }); -router.get('/:column', function(req, res, next) { - // return subsets of customers, might be three different endpoints - // return res.status(200).json({ id: req.params.id }) - return customer_exports.customersController.subset(req, res, req.params.column); +// customers/name/1 +router.get('/:column/:number', function(req, res, next) { + return customer_exports.customersController.subset(req, res, req.params.column, req.params.number); }); module.exports = router; From 2b1ccde51d133d573b237fac97a7be0fa9a305c7 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Sat, 19 Sep 2015 11:41:31 -0700 Subject: [PATCH 29/78] Refactored schema --- utils/schema.js | 65 +++++++++++++++++-------------------------------- 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/utils/schema.js b/utils/schema.js index bd23a59..8fae5b7 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -11,21 +11,6 @@ var movie_fields = [ ['inventory', 'integer'] ] -db.serialize(function() { - // drop existing tables - db.run("DROP TABLE IF EXISTS movies;"); - // create fresh versions of tables - db.run("CREATE TABLE movies (id INTEGER PRIMARY KEY);"); - // add columns we need to tables - for (var i = 0; i < movie_fields.length; i++) { - var name = movie_fields[i][0], - type = movie_fields[i][1]; - - db.run("ALTER TABLE movies ADD COLUMN " + name + " " + type + ";"); - } -}); - - var customer_fields = [ ['name', 'text'], ['registered_at', 'text'], @@ -37,20 +22,6 @@ var customer_fields = [ ['account_credit', 'real'] ] -db.serialize(function() { - // drop existing tables - db.run("DROP TABLE IF EXISTS customers;"); - // create fresh versions of tables - db.run("CREATE TABLE customers (id INTEGER PRIMARY KEY);"); - // add columns we need to tables - for (var i = 0; i < customer_fields.length; i++) { - var name = customer_fields[i][0], - type = customer_fields[i][1]; - - db.run("ALTER TABLE customers ADD COLUMN " + name + " " + type + ";"); - } -}); - var rental_fields = [ ['movie_id', 'integer'], ['customer_id', 'integer'], @@ -58,20 +29,30 @@ var rental_fields = [ ['checked_out', 'integer'] ] -db.serialize(function() { - // drop existing tables - db.run("DROP TABLE IF EXISTS rentals;"); - // create fresh versions of tables - db.run("CREATE TABLE rentals (id INTEGER PRIMARY KEY);"); - // add columns we need to tables - for (var i = 0; i < rental_fields.length; i++) { - var name = rental_fields[i][0], - type = rental_fields[i][1]; - - db.run("ALTER TABLE rentals ADD COLUMN " + name + " " + type + ";"); - } -}); +function set_tables(table, table_fields) { + db.serialize(function() { + // drop existing tables + db.run("DROP TABLE IF EXISTS " + table + ";"); + // create fresh versions of tables + db.run("CREATE TABLE " + table + " (id INTEGER PRIMARY KEY);"); + // add columns we need to tables + for (var i = 0; i < table_fields.length; i++) { + var name = table_fields[i][0], + type = table_fields[i][1]; + + db.run("ALTER TABLE " + table + " ADD COLUMN " + name + " " + type + ";"); + } + }); +} + +set_tables(" movies ", movie_fields); +set_tables(" customers ", customer_fields); +set_tables(" rentals ", rental_fields); db.close(); + + + + From e83d9ddcdc2ff90d61c7833ac17a35a70ae10162 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Sat, 19 Sep 2015 13:59:21 -0700 Subject: [PATCH 30/78] Added movie model, controller methods for index and subset, and routes --- controllers/movies.js | 23 +++++++++++++++++++++++ models/movie.js | 9 +++++++++ routes/movies.js | 8 +++++--- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index e69de29..36aade2 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -0,0 +1,23 @@ +"use strict"; + +var Movie = require('../models/movie'); + +exports.moviesController = { + index: function index(req, res) { + + var movie = new Movie(); + + movie.find_all(function(err, record) { + res.status(200).json({ all_movies: record }); + }) + }, + + subset: function subset(req, res, column) { + + var movie = new Movie(); + + movie.find_subset(column, 5, 0, function(err, record) { + res.status(200).json({ subset_movies: record }); + }) + } +} diff --git a/models/movie.js b/models/movie.js index e69de29..83043d5 100644 --- a/models/movie.js +++ b/models/movie.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 953ee81..ec126bf 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -1,10 +1,12 @@ var express = require('express'); var router = express.Router(); +var movie_exports = require('../controllers/movies'); + /* GET home page. */ router.get('/', function(req, res, next) { //return list of all movies - // return customer_exports.customerController.index(req, res); + return movie_exports.moviesController.index(req, res); }); router.get('/one_movie', function(req, res, next) { @@ -12,9 +14,9 @@ router.get('/one_movie', function(req, res, next) { //return customer_exports.customerController.one_customer(req, res); }); -router.get('/group_movies', function(req, res, next) { +router.get('/:column', function(req, res, next) { // return subsets of movies, might be two different endpoints - // return res.status(200).json({ id: req.params.id }) +return movie_exports.moviesController.subset(req, res, req.params.column); }); // one movies/title/customers will return customer info From eb59de19710d026acac0132b195f29744233d1f6 Mon Sep 17 00:00:00 2001 From: Loraine Date: Mon, 21 Sep 2015 09:25:58 -0700 Subject: [PATCH 31/78] Fixed pagination bug. --- controllers/customers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/customers.js b/controllers/customers.js index 3e91ade..39f13ae 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -16,7 +16,7 @@ exports.customersController = { var customer = new Customer(); - var offset = pageNumber * 50; + var offset = (pageNumber - 1) * 50; customer.find_subset(column, 50, offset, function(err, record) { res.status(200).json({ customer_subset: record }); From f0b03fa10d5a776b1ffb3950c614284aaea6c539 Mon Sep 17 00:00:00 2001 From: Loraine Date: Mon, 21 Sep 2015 09:29:46 -0700 Subject: [PATCH 32/78] Pagination for movies. --- controllers/movies.js | 8 +++++--- routes/movies.js | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index 36aade2..5c87e9f 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -12,12 +12,14 @@ exports.moviesController = { }) }, - subset: function subset(req, res, column) { + subset: function subset(req, res, column, pageNumber) { var movie = new Movie(); - movie.find_subset(column, 5, 0, function(err, record) { - res.status(200).json({ subset_movies: record }); + var offset = (pageNumber - 1) * 50; + + movie.find_subset(column, 50, offset, function(err, record) { + res.status(200).json({ movie_subset: record }); }) } } diff --git a/routes/movies.js b/routes/movies.js index ec126bf..5c0b6ca 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -14,9 +14,9 @@ router.get('/one_movie', function(req, res, next) { //return customer_exports.customerController.one_customer(req, res); }); -router.get('/:column', function(req, res, next) { - // return subsets of movies, might be two different endpoints -return movie_exports.moviesController.subset(req, res, req.params.column); +// movies/name/1 +router.get('/:column/:number', function(req, res, next) { + return movie_exports.moviesController.subset(req, res, req.params.column, req.params.number); }); // one movies/title/customers will return customer info From 771fb84a514c42a96f09ac614449983121e0845d Mon Sep 17 00:00:00 2001 From: Loraine Date: Mon, 21 Sep 2015 09:51:01 -0700 Subject: [PATCH 33/78] Added a comment about what our customer id lookup should do. --- routes/customers.js | 1 + 1 file changed, 1 insertion(+) diff --git a/routes/customers.js b/routes/customers.js index 1ad10ca..7c78852 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -8,6 +8,7 @@ router.get('/', function(req, res, next) { return customer_exports.customersController.index(req, res); }); + // /customers/:id ?? returns info from rentals table router.get('/one_customer', function(req, res, next) { // return one customer based on id //return customer_exports.customerController.one_customer(req, res); From 54cc8ba33b9159ced7d72f23b42a5687b296f77d Mon Sep 17 00:00:00 2001 From: Loraine Date: Mon, 21 Sep 2015 09:51:17 -0700 Subject: [PATCH 34/78] Rentals seed data. --- rentals.json | 38 ++++++++++++++++++++++++++++++++++++++ utils/schema.js | 6 ------ utils/seed.js | 21 +++++++++++++++++++++ 3 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 rentals.json diff --git a/rentals.json b/rentals.json new file mode 100644 index 0000000..9d2c6b3 --- /dev/null +++ b/rentals.json @@ -0,0 +1,38 @@ +[ + { + "movie_id": 1, + "customer_id": 1, + "returned_date": "1960-06-16", + "checked_out": 1 + }, + { + "movie_id": 2, + "customer_id": 1, + "returned_date": "1975-06-19", + "checked_out": 0 + }, + { + "movie_id": 3, + "customer_id": 1, + "returned_date": "1973-12-26", + "checked_out": 1 + }, + { + "movie_id": 4, + "customer_id": 2, + "returned_date": "1959-07-17", + "checked_out": 0 + }, + { + "movie_id": 5, + "customer_id": 3, + "returned_date": "1991-02-14", + "checked_out": 1 + }, + { + "movie_id": 1, + "customer_id": 2, + "returned_date": "1991-03-14", + "checked_out": 1 + } +] diff --git a/utils/schema.js b/utils/schema.js index 8fae5b7..3a95aab 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -50,9 +50,3 @@ set_tables(" customers ", customer_fields); set_tables(" rentals ", rental_fields); db.close(); - - - - - - diff --git a/utils/seed.js b/utils/seed.js index 0b35523..d789a8e 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -49,6 +49,27 @@ db.serialize(function() { customer_statement.finalize(); }); +var rentals = require('../rentals'); +var rental_statement = db.prepare( + "INSERT INTO rentals(movie_id, customer_id, returned_date, checked_out) \ + VALUES (?, ?, ?, ?);" +); + +db.serialize(function() { + for(var i = 0; i < rentals.length; i++) { + var rental = rentals[i]; + + rental_statement.run( + rental.movie_id, + rental.customer_id, + rental.returned_date, + rental.checked_out + ); + } + rental_statement.finalize(); +}); + + // INSERT INTO rentals(customer_id, movie_id, returned_date, checked_out) VALUES (2, 3, 'tomorrow', 1); // SELECT "movies".* FROM "movies" INNER JOIN "rentals" ON "movies"."id" = "rentals"."movie_id" WHERE "rentals"."movie_id" = 3; From 8b6a8ae6534b027230180ae375ab9d309063e98a Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Mon, 21 Sep 2015 10:52:58 -0700 Subject: [PATCH 35/78] Added available column to movies table. Added currently rented route to customer --- controllers/customers.js | 9 +++++++++ database.js | 11 +++++++++++ rentals.json | 24 ++++++++++++------------ routes/customers.js | 5 +++++ utils/schema.js | 5 +++-- utils/seed.js | 11 ++++++++--- 6 files changed, 48 insertions(+), 17 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 39f13ae..ecffa49 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -21,5 +21,14 @@ exports.customersController = { customer.find_subset(column, 50, offset, function(err, record) { res.status(200).json({ customer_subset: record }); }) + }, + + current_rentals: function current_rentals(req, res, customer_id) { + + var customer = new Customer(); + + customer.customer_rentals(customer_id, function(err, record){ + res.status(200).json({ current_rentals: record }); + }) } } diff --git a/database.js b/database.js index 73632ed..281f778 100644 --- a/database.js +++ b/database.js @@ -28,6 +28,17 @@ module.exports = { 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(); + }); + }, + + customer_rentals: function(value, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + var statement = "SELECT 'movies'.* FROM 'movies' INNER JOIN 'rentals' ON 'movies'.'id' = 'rentals'.'movie_id' WHERE 'rentals'.'customer_id' = ? AND 'rentals'.'returned_date' = '';"; + db.all(statement, value, function(err, res) { if (callback) callback(err, res); db.close(); diff --git a/rentals.json b/rentals.json index 9d2c6b3..ad37cf5 100644 --- a/rentals.json +++ b/rentals.json @@ -2,37 +2,37 @@ { "movie_id": 1, "customer_id": 1, - "returned_date": "1960-06-16", - "checked_out": 1 + "returned_date": "", + "checked_out": "2015-09-20" }, { "movie_id": 2, "customer_id": 1, - "returned_date": "1975-06-19", - "checked_out": 0 + "returned_date": "2015-06-19", + "checked_out": "" }, { "movie_id": 3, "customer_id": 1, - "returned_date": "1973-12-26", - "checked_out": 1 + "returned_date": "", + "checked_out": "2015-09-20" }, { "movie_id": 4, "customer_id": 2, - "returned_date": "1959-07-17", - "checked_out": 0 + "returned_date": "2015-07-17", + "checked_out": "" }, { "movie_id": 5, "customer_id": 3, - "returned_date": "1991-02-14", - "checked_out": 1 + "returned_date": "", + "checked_out": "2015-09-20" }, { "movie_id": 1, "customer_id": 2, - "returned_date": "1991-03-14", - "checked_out": 1 + "returned_date": "", + "checked_out": "2015-09-20" } ] diff --git a/routes/customers.js b/routes/customers.js index 7c78852..148ff05 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -14,6 +14,11 @@ router.get('/one_customer', function(req, res, next) { //return customer_exports.customerController.one_customer(req, res); }); +// customers/:id/current_rentals +router.get('/:id/current_rentals', function(req, res, next) { + return customer_exports.customersController.current_rentals(req, res, req.params.id); +}); + // customers/name/1 router.get('/:column/:number', function(req, res, next) { return customer_exports.customersController.subset(req, res, req.params.column, req.params.number); diff --git a/utils/schema.js b/utils/schema.js index 3a95aab..a783580 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -8,7 +8,8 @@ var movie_fields = [ ['title', 'text'], ['overview', 'text'], ['release_date', 'text'], - ['inventory', 'integer'] + ['inventory', 'integer'], + ['available', 'integer'] ] var customer_fields = [ @@ -26,7 +27,7 @@ var rental_fields = [ ['movie_id', 'integer'], ['customer_id', 'integer'], ['returned_date', 'text'], - ['checked_out', 'integer'] + ['checked_out', 'text'] ] function set_tables(table, table_fields) { diff --git a/utils/seed.js b/utils/seed.js index d789a8e..5e74bd5 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -6,8 +6,8 @@ var sqlite3 = require('sqlite3').verbose(), var movies = require('../movies'); var movie_statement = db.prepare( - "INSERT INTO movies(title, overview, inventory, release_date) \ - VALUES (?, ?, ?, ?);" + "INSERT INTO movies(title, overview, release_date, inventory, available) \ + VALUES (?, ?, ?, ?, ?);" ); db.serialize(function() { @@ -17,8 +17,9 @@ db.serialize(function() { movie_statement.run( movie.title, movie.overview, + movie.release_date, movie.inventory, - movie.release_date + movie.inventory ); } movie_statement.finalize(); @@ -74,4 +75,8 @@ db.serialize(function() { // SELECT "movies".* FROM "movies" INNER JOIN "rentals" ON "movies"."id" = "rentals"."movie_id" WHERE "rentals"."movie_id" = 3; +//finds rental based on customer id -> SELECT "rentals".* FROM "rentals" INNER JOIN "customers" ON "customers"."id" = "rentals"."customer_id" WHERE "rentals"."customer_id" = 1; + +// returns movies checkout out by customer 1 -> SELECT "movies".* FROM "movies" INNER JOIN "rentals" ON "movies"."id" = "rentals"."movie_id" WHERE "rentals"."customer_id" = 1 AND "rentals"."returned_date" = ""; + db.close(); From 5a19f0738dc4793ed644ef6cedca32d3552163e5 Mon Sep 17 00:00:00 2001 From: Loraine Date: Mon, 21 Sep 2015 12:03:11 -0700 Subject: [PATCH 36/78] WIP customer history query. --- controllers/customers.js | 9 +++++++++ database.js | 13 +++++++++++++ rentals.json | 6 +++--- routes/customers.js | 5 +++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index ecffa49..4ff5fc1 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -30,5 +30,14 @@ exports.customersController = { customer.customer_rentals(customer_id, function(err, record){ res.status(200).json({ current_rentals: record }); }) + }, + + rental_history: function rental_history(req, res, customer_id) { + + var customer = new Customer(); + + customer.customer_history(customer_id, function(err, record){ + res.status(200).json({ rental_history: record }); + }) } } diff --git a/database.js b/database.js index 281f778..750940e 100644 --- a/database.js +++ b/database.js @@ -43,5 +43,18 @@ module.exports = { if (callback) callback(err, res); db.close(); }); + }, + + customer_history: function(value, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + var statement = "SELECT 'movies'.'title' FROM 'movies' INNER JOIN 'rentals' ON 'movies'.'id' = 'rentals'.'movie_id' WHERE 'rentals'.'customer_id' = ? AND 'rentals'.'returned_date' != '';"; + var statement2 = "SELECT 'rentals'.'returned_date' FROM 'rentals' INNER JOIN 'customers' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'customer_id' = ? AND 'rentals'.'returned_date' != '';"; + + db.all(statement, value, function(err, res) { + if (callback) callback(err, res); + console.log(res); + db.close(); + }); } } diff --git a/rentals.json b/rentals.json index ad37cf5..f630a4c 100644 --- a/rentals.json +++ b/rentals.json @@ -9,7 +9,7 @@ "movie_id": 2, "customer_id": 1, "returned_date": "2015-06-19", - "checked_out": "" + "checked_out": "2015-06-11" }, { "movie_id": 3, @@ -19,9 +19,9 @@ }, { "movie_id": 4, - "customer_id": 2, + "customer_id": 1, "returned_date": "2015-07-17", - "checked_out": "" + "checked_out": "2015-07-10" }, { "movie_id": 5, diff --git a/routes/customers.js b/routes/customers.js index 148ff05..bdc88ac 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -19,6 +19,11 @@ router.get('/:id/current_rentals', function(req, res, next) { return customer_exports.customersController.current_rentals(req, res, req.params.id); }); +// customers/:id/rental_history +router.get('/:id/rental_history', function(req, res, next) { + return customer_exports.customersController.rental_history(req, res, req.params.id); +}); + // customers/name/1 router.get('/:column/:number', function(req, res, next) { return customer_exports.customersController.subset(req, res, req.params.column, req.params.number); From a2a5619a79013009c3f8a4dfd32e16bcce6d8735 Mon Sep 17 00:00:00 2001 From: Loraine Date: Mon, 21 Sep 2015 13:55:18 -0700 Subject: [PATCH 37/78] Endpoint and query for customers who have checked out a specific movie title. --- controllers/movies.js | 9 +++++++++ database.js | 11 +++++++++++ routes/movies.js | 5 +++++ 3 files changed, 25 insertions(+) diff --git a/controllers/movies.js b/controllers/movies.js index 5c87e9f..c3f1c62 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -21,5 +21,14 @@ exports.moviesController = { movie.find_subset(column, 50, offset, function(err, record) { res.status(200).json({ movie_subset: record }); }) + }, + + current_rentals: function current_rentals(req, res, movie_title) { + + var movie = new Movie(); + + movie.movie_current_customers(movie_title, function(err, record) { + res.status(200).json({ movie_current_customers: record }); + }) } } diff --git a/database.js b/database.js index 750940e..f2fb9d2 100644 --- a/database.js +++ b/database.js @@ -56,5 +56,16 @@ module.exports = { console.log(res); db.close(); }); + }, + + movie_current_customers: function(value, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'movie_id' = (SELECT 'movies'.'id' FROM 'movies' WHERE 'movies'.'title' = ? COLLATE NOCASE LIMIT 1);"; + + db.all(statement, value, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); } } diff --git a/routes/movies.js b/routes/movies.js index 5c0b6ca..818afb7 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -14,6 +14,11 @@ router.get('/one_movie', function(req, res, next) { //return customer_exports.customerController.one_customer(req, res); }); +//movies/:title/current_rentals +router.get('/:movie_title/current_rentals', function(req, res, next) { + return movie_exports.moviesController.current_rentals(req, res, req.params.movie_title); +}); + // movies/name/1 router.get('/:column/:number', function(req, res, next) { return movie_exports.moviesController.subset(req, res, req.params.column, req.params.number); From 911768183134b7738be10e87cf7539586d949c37 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Mon, 21 Sep 2015 14:15:53 -0700 Subject: [PATCH 38/78] Added route, query for list of past customers using movie title --- README.md | 22 +++++++++++----------- controllers/movies.js | 9 +++++++++ database.js | 14 +++++++++++++- rentals.json | 6 +++--- routes/movies.js | 7 +++++++ utils/seed.js | 2 ++ 6 files changed, 45 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 51dcbfe..8aa8132 100644 --- a/README.md +++ b/README.md @@ -43,29 +43,29 @@ 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 - - Given a sort column, return _n_ customer records, offset by _p_ records (this will be used to create "pages" of customers) - - Sort columns are +DONE- Retrive a list of all customers +DONE- Retrive a subset of customers + DONE- Given a sort column, return _n_ customer records, offset by _p_ records (this will be used to create "pages" of customers) + DONE- Sort columns are - `name` - `registered_at` - `postal_code` - Given a customer's `id`... - - List the movies they _currently_ have checked out + DONE- List the movies they _currently_ have checked out - List the movies a customer has checked out in the past - ordered by check out date - includes return date ### Movies -- Retrieve a list of all movies -- 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 +DONE- Retrieve a list of all movies +DONE- Retrieve a subset of movies + DONE- Given a sort column, return _n_ movie records, offset by _p_ records (this will be used to create "pages" of movies) + DONE- Sort columns are - `title` - `release_date` - Given a movie's `title`... - - Get a list of customers that have _currently_ checked out a copy of the film - - Get a list of customers that have checked out a copy _in the past_ + DONE- Get a list of customers that have _currently_ checked out a copy of the film + DONE- Get a list of customers that have checked out a copy _in the past_ - ordered by customer `id` - ordered by customer `name` - ordered by check out date diff --git a/controllers/movies.js b/controllers/movies.js index c3f1c62..99e9267 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -30,5 +30,14 @@ exports.moviesController = { movie.movie_current_customers(movie_title, function(err, record) { res.status(200).json({ movie_current_customers: record }); }) + }, + + past_rentals: function current_rentals(req, res, movie_title, column) { + + var movie = new Movie(); + + movie.movie_past_customers(movie_title, column, function(err, record) { + res.status(200).json({ movie_past_customers: record }); + }) } } diff --git a/database.js b/database.js index f2fb9d2..1308148 100644 --- a/database.js +++ b/database.js @@ -61,8 +61,20 @@ module.exports = { movie_current_customers: function(value, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'movie_id' = (SELECT 'movies'.'id' FROM 'movies' WHERE 'movies'.'title' = ? COLLATE NOCASE LIMIT 1);"; + var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'movie_id' = (SELECT 'movies'.'id' FROM 'movies' WHERE 'movies'.'title' = ? COLLATE NOCASE LIMIT 1) AND 'rentals'.'returned_date' = '';"; + db.all(statement, value, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); + }, + + movie_past_customers: function(value, column, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + console.log("value:" + value, "column:" + column); + var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'movie_id' = (SELECT 'movies'.'id' FROM 'movies' WHERE 'movies'.'title' = ? COLLATE NOCASE LIMIT 1) AND 'rentals'.'returned_date' != '' ORDER BY " + column + ";"; + + console.log(statement); db.all(statement, value, function(err, res) { if (callback) callback(err, res); db.close(); diff --git a/rentals.json b/rentals.json index f630a4c..0d90927 100644 --- a/rentals.json +++ b/rentals.json @@ -6,8 +6,8 @@ "checked_out": "2015-09-20" }, { - "movie_id": 2, - "customer_id": 1, + "movie_id": 1, + "customer_id": 7, "returned_date": "2015-06-19", "checked_out": "2015-06-11" }, @@ -18,7 +18,7 @@ "checked_out": "2015-09-20" }, { - "movie_id": 4, + "movie_id": 1, "customer_id": 1, "returned_date": "2015-07-17", "checked_out": "2015-07-10" diff --git a/routes/movies.js b/routes/movies.js index 818afb7..c7955bc 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -14,11 +14,18 @@ router.get('/one_movie', function(req, res, next) { //return customer_exports.customerController.one_customer(req, res); }); +//movies/:title/past_rentals/:column +router.get('/:movie_title/past_rentals/:column', function(req, res, next) { + return movie_exports.moviesController.past_rentals(req, res, req.params.movie_title, req.params.column); +}); + + //movies/:title/current_rentals router.get('/:movie_title/current_rentals', function(req, res, next) { return movie_exports.moviesController.current_rentals(req, res, req.params.movie_title); }); + // movies/name/1 router.get('/:column/:number', function(req, res, next) { return movie_exports.moviesController.subset(req, res, req.params.column, req.params.number); diff --git a/utils/seed.js b/utils/seed.js index 5e74bd5..6f2692c 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -79,4 +79,6 @@ db.serialize(function() { // returns movies checkout out by customer 1 -> SELECT "movies".* FROM "movies" INNER JOIN "rentals" ON "movies"."id" = "rentals"."movie_id" WHERE "rentals"."customer_id" = 1 AND "rentals"."returned_date" = ""; +// + db.close(); From 5e4c3c5a6b0fecf6cb94b3f2f6778e1c643b0a5c Mon Sep 17 00:00:00 2001 From: Loraine Date: Mon, 21 Sep 2015 14:38:10 -0700 Subject: [PATCH 39/78] Rentals routes and model. --- models/rental.js | 9 +++++++++ rentals.js | 0 2 files changed, 9 insertions(+) create mode 100644 rentals.js diff --git a/models/rental.js b/models/rental.js index e69de29..da6f00a 100644 --- a/models/rental.js +++ b/models/rental.js @@ -0,0 +1,9 @@ +"use strict"; + +function Rental() { + this.table_name = "rentals"; +} + +Rental.prototype = require('../database'); + +module.exports = Rental diff --git a/rentals.js b/rentals.js new file mode 100644 index 0000000..e69de29 From 44d2881e8f6109ddce756482e305f35ec23fc8c6 Mon Sep 17 00:00:00 2001 From: Loraine Date: Mon, 21 Sep 2015 14:38:54 -0700 Subject: [PATCH 40/78] Rental routes. --- rentals.js => routes/rentals.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename rentals.js => routes/rentals.js (100%) diff --git a/rentals.js b/routes/rentals.js similarity index 100% rename from rentals.js rename to routes/rentals.js From 0ce4c1f83c8d690ee1d13096aef2037ca9e45c11 Mon Sep 17 00:00:00 2001 From: Loraine Date: Mon, 21 Sep 2015 14:56:29 -0700 Subject: [PATCH 41/78] Rental endpoint and query for looking up a single movie by title. --- app.js | 3 +++ controllers/rentals.js | 15 ++++++++++++++- database.js | 12 ++++++++++-- routes/rentals.js | 11 +++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index 3ace3c3..b7ea318 100644 --- a/app.js +++ b/app.js @@ -26,6 +26,9 @@ app.use('/movies', routes); var customers = require('./routes/customers'); app.use('/customers', customers); +var rentals = require('./routes/rentals'); +app.use('/rentals', rentals); + // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); diff --git a/controllers/rentals.js b/controllers/rentals.js index 9444aff..7335296 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -1 +1,14 @@ -// probably manage join table results +"use strict"; + +var Rental = require('../models/rental'); + +exports.rentalsController = { + find_movie: function find_movie(req, res, movie_title) { + + var rental = new Rental(); + + rental.movie_details(movie_title, function(err, record) { + res.status(200).json({ movie_details: record }); + }) + }, +} diff --git a/database.js b/database.js index 1308148..5b58725 100644 --- a/database.js +++ b/database.js @@ -71,10 +71,18 @@ module.exports = { movie_past_customers: function(value, column, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - console.log("value:" + value, "column:" + column); var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'movie_id' = (SELECT 'movies'.'id' FROM 'movies' WHERE 'movies'.'title' = ? COLLATE NOCASE LIMIT 1) AND 'rentals'.'returned_date' != '' ORDER BY " + column + ";"; - console.log(statement); + db.all(statement, value, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); + }, + + movie_details: function(value, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT * FROM movies WHERE title = ? COLLATE NOCASE;"; + db.all(statement, value, function(err, res) { if (callback) callback(err, res); db.close(); diff --git a/routes/rentals.js b/routes/rentals.js index e69de29..82d5cdb 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -0,0 +1,11 @@ +var express = require('express'); +var router = express.Router(); + +var rental_exports = require('../controllers/rentals'); + +router.get('/:movie_title', function(req, res, next) { + //return list of all movies + return rental_exports.rentalsController.find_movie(req, res, req.params.movie_title); +}); + +module.exports = router; From 0fa87e45f11d0f95a4a69799391621a3ec4870d9 Mon Sep 17 00:00:00 2001 From: Loraine Date: Mon, 21 Sep 2015 15:03:37 -0700 Subject: [PATCH 42/78] Updated to-do list. --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8aa8132..7706c7d 100644 --- a/README.md +++ b/README.md @@ -71,11 +71,11 @@ DONE- Retrieve a subset of movies - ordered by check out date ### Rental -- Look a movie up by title to see +- DONE 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 +- DONE 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` ... - "check out" one of the movie's inventory to the customer @@ -92,4 +92,3 @@ DONE- Retrieve a subset of movies - All endpoints must be tested. - We will use [Mocha](https://mochajs.org/) for tests. - There isn't a coverage requirement for this project, beyond demonstrating that every endpoint is covered by some manner of tests. - From de08676fe2d86f0cc8f265d2e12b28fdcc9e27c9 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Mon, 21 Sep 2015 15:17:43 -0700 Subject: [PATCH 43/78] Added route and methods to return list of customers with current movie rentals given a movie's title --- controllers/rentals.js | 9 +++++++++ database.js | 10 ++++++++++ routes/rentals.js | 6 ++++++ 3 files changed, 25 insertions(+) diff --git a/controllers/rentals.js b/controllers/rentals.js index 7335296..3acf65d 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -11,4 +11,13 @@ exports.rentalsController = { res.status(200).json({ movie_details: record }); }) }, + + find_customers: function find_customers(req, res, movie_title) { + + var rental = new Rental(); + + rental.customers(movie_title, function(err, record) { + res.status(200).json({ rental_customers: record }); + }) + } } diff --git a/database.js b/database.js index 5b58725..ce02cf3 100644 --- a/database.js +++ b/database.js @@ -83,6 +83,16 @@ module.exports = { var db = new sqlite3.Database('db/' + db_env + '.db'); var statement = "SELECT * FROM movies WHERE title = ? COLLATE NOCASE;"; + db.all(statement, value, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); + }, + + customers: function(value, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'movie_id' = (SELECT 'movies'.'id' FROM 'movies' WHERE 'movies'.'title' = ? COLLATE NOCASE LIMIT 1) AND 'rentals'.'returned_date' = '';"; + db.all(statement, value, function(err, res) { if (callback) callback(err, res); db.close(); diff --git a/routes/rentals.js b/routes/rentals.js index 82d5cdb..f2bdbeb 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -8,4 +8,10 @@ router.get('/:movie_title', function(req, res, next) { return rental_exports.rentalsController.find_movie(req, res, req.params.movie_title); }); +//rentals/:movie_title/customers +router.get('/:movie_title/customers', function(req, res, next) { + //return list of all movies + return rental_exports.rentalsController.find_customers(req, res, req.params.movie_title); +}); + module.exports = router; From fe19c0565eac2213a27ff6fc02059bb0aed07291 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Mon, 21 Sep 2015 15:35:30 -0700 Subject: [PATCH 44/78] WIP on overdue customer endpoint --- controllers/rentals.js | 9 +++++++++ database.js | 13 +++++++++++++ routes/rentals.js | 6 ++++++ 3 files changed, 28 insertions(+) diff --git a/controllers/rentals.js b/controllers/rentals.js index 3acf65d..df40dd7 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -19,5 +19,14 @@ exports.rentalsController = { rental.customers(movie_title, function(err, record) { res.status(200).json({ rental_customers: record }); }) + }, + + overdue_customers: function overdue_customers(req, res, movie_title) { + + var rental = new Rental(); + + rental.overdue(function(err, record) { + res.status(200).json({ overdue_customers: record }); + }) } } diff --git a/database.js b/database.js index ce02cf3..43221dc 100644 --- a/database.js +++ b/database.js @@ -93,6 +93,19 @@ module.exports = { var db = new sqlite3.Database('db/' + db_env + '.db'); var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'movie_id' = (SELECT 'movies'.'id' FROM 'movies' WHERE 'movies'.'title' = ? COLLATE NOCASE LIMIT 1) AND 'rentals'.'returned_date' = '';"; + db.all(statement, value, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); + }, + + customers: function(value, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + var today = new Date().toISOString().slice(0, 10); //gets date in SQL format for comparison + + var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'returned_date' = ;" + db.all(statement, value, function(err, res) { if (callback) callback(err, res); db.close(); diff --git a/routes/rentals.js b/routes/rentals.js index f2bdbeb..f5826aa 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -14,4 +14,10 @@ router.get('/:movie_title/customers', function(req, res, next) { return rental_exports.rentalsController.find_customers(req, res, req.params.movie_title); }); +//rentals/overdue +router.get('/overdue', function(req, res, next) { + //return list of all movies + return rental_exports.rentalsController.overdue_customers(req, res); +}); + module.exports = router; From 43ddc7c01a7624ae30847815bba918fe1cb9681a Mon Sep 17 00:00:00 2001 From: Loraine Date: Tue, 22 Sep 2015 13:58:41 -0700 Subject: [PATCH 45/78] Resolved db_cleaner issues. --- database.js | 24 ++++++++++++------------ package.json | 7 ++++++- test/models/customer.js | 17 ++++------------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/database.js b/database.js index 43221dc..94ce9d3 100644 --- a/database.js +++ b/database.js @@ -99,16 +99,16 @@ module.exports = { }); }, - customers: function(value, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - - var today = new Date().toISOString().slice(0, 10); //gets date in SQL format for comparison - - var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'returned_date' = ;" - - db.all(statement, value, function(err, res) { - if (callback) callback(err, res); - db.close(); - }); - } + // customers: function(value, callback) { + // var db = new sqlite3.Database('db/' + db_env + '.db'); + // + // var today = new Date().toISOString().slice(0, 10); //gets date in SQL format for comparison + // + // var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'returned_date' = ;" + // + // db.all(statement, value, function(err, res) { + // if (callback) callback(err, res); + // db.close(); + // }); + // } } diff --git a/package.json b/package.json index 669bc11..59cf4f6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,11 @@ "private": true, "scripts": { "start": "nodemon ./bin/www", - "test": "clear; DB=test mocha --recursive" + "test": "clear; DB=test mocha --recursive", + "db:schema": "node ./utils/schema", + "db:seed": "node ./utils/seed", + "db:setup": "npm run db:schema; npm run db:seed", + "db:test_setup": "DB=test npm run db:schema" }, "dependencies": { "body-parser": "~1.13.2", @@ -12,6 +16,7 @@ "debug": "~2.2.0", "express": "~4.13.1", "jade": "~1.11.0", + "mocha": "^2.3.3", "morgan": "~1.6.1", "serve-favicon": "~2.3.0", "sqlite3": "^3.1.0" diff --git a/test/models/customer.js b/test/models/customer.js index f829e37..4e0aa82 100644 --- a/test/models/customer.js +++ b/test/models/customer.js @@ -1,5 +1,3 @@ -"use strict"; - var assert = require('assert'), Customer = require('../../models/customer'), sqlite3 = require('sqlite3').verbose(); @@ -13,26 +11,19 @@ describe('Customer', function() { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { - db_cleaner.exec( - "BEGIN; \ - DELETE FROM customers; \ - INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ - VALUES('Mulder', 'yesterday', '123', 'DC', 'DC', '834885', '49583', 5), \ - ('Scully', 'last week', 'DC', 'DC', '2342', '534', 7); \ - COMMIT;" - , function(err) { + db_cleaner.exec("BEGIN; DELETE FROM customers; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', 'yesterday', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', 'last week', '12 blah','DC', 'DC', '2342', '534', 7); COMMIT;", function(err) { db_cleaner.close(); done(); } ); }); - }) + }); it("can be instantiated", function(){ assert(customer instanceof Customer); }); - -}) + +}); From 7309154fb6e744155cdaae835b25f9d42a856a3c Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Tue, 22 Sep 2015 14:51:20 -0700 Subject: [PATCH 46/78] WIP on returning overdue customers --- database.js | 29 +++++++++++++++++------------ rentals.json | 4 ++-- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/database.js b/database.js index 94ce9d3..ec46472 100644 --- a/database.js +++ b/database.js @@ -99,16 +99,21 @@ module.exports = { }); }, - // customers: function(value, callback) { - // var db = new sqlite3.Database('db/' + db_env + '.db'); - // - // var today = new Date().toISOString().slice(0, 10); //gets date in SQL format for comparison - // - // var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'returned_date' = ;" - // - // db.all(statement, value, function(err, res) { - // if (callback) callback(err, res); - // db.close(); - // }); - // } + overdue: function(value, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + //var today = new Date().toISOString().slice(0, 10); //gets date in SQL format for comparison + var today = new Date(); // sets today to today + + var date_conversion = today.setDate(today.getDate() - 10); // + + var overdue_date = new Date(date_conversion).toISOString().slice(0, 10); + + var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'returned_date' = '' AND 'rentals'.'checked_out' < '2015-09-12' ;"; + + db.all(statement, value, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); + } } diff --git a/rentals.json b/rentals.json index 0d90927..841d422 100644 --- a/rentals.json +++ b/rentals.json @@ -3,7 +3,7 @@ "movie_id": 1, "customer_id": 1, "returned_date": "", - "checked_out": "2015-09-20" + "checked_out": "2015-09-01" }, { "movie_id": 1, @@ -27,7 +27,7 @@ "movie_id": 5, "customer_id": 3, "returned_date": "", - "checked_out": "2015-09-20" + "checked_out": "2015-08-14" }, { "movie_id": 1, From 3be0604bf4af6ba3f8b1f46415488722665f0f0f Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Tue, 22 Sep 2015 14:56:36 -0700 Subject: [PATCH 47/78] adds functionality for returning overdue customers --- controllers/rentals.js | 2 +- database.js | 7 ++++--- routes/rentals.js | 12 +++++++----- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index df40dd7..0226098 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -21,7 +21,7 @@ exports.rentalsController = { }) }, - overdue_customers: function overdue_customers(req, res, movie_title) { + overdue_customers: function overdue_customers(req, res) { var rental = new Rental(); diff --git a/database.js b/database.js index ec46472..76f61a9 100644 --- a/database.js +++ b/database.js @@ -99,7 +99,7 @@ module.exports = { }); }, - overdue: function(value, callback) { + overdue: function(callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); //var today = new Date().toISOString().slice(0, 10); //gets date in SQL format for comparison @@ -108,10 +108,11 @@ module.exports = { var date_conversion = today.setDate(today.getDate() - 10); // var overdue_date = new Date(date_conversion).toISOString().slice(0, 10); + console.log(overdue_date); - var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'returned_date' = '' AND 'rentals'.'checked_out' < '2015-09-12' ;"; + var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'returned_date' = '' AND 'rentals'.'checked_out' < '" + overdue_date + "';"; - db.all(statement, value, function(err, res) { + db.all(statement, function(err, res) { if (callback) callback(err, res); db.close(); }); diff --git a/routes/rentals.js b/routes/rentals.js index f5826aa..3f39b4e 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -3,6 +3,13 @@ var router = express.Router(); var rental_exports = require('../controllers/rentals'); +//rentals/overdue +router.get('/overdue', function(req, res, next) { + //return list of all movies + return rental_exports.rentalsController.overdue_customers(req, res); +}); + + router.get('/:movie_title', function(req, res, next) { //return list of all movies return rental_exports.rentalsController.find_movie(req, res, req.params.movie_title); @@ -14,10 +21,5 @@ router.get('/:movie_title/customers', function(req, res, next) { return rental_exports.rentalsController.find_customers(req, res, req.params.movie_title); }); -//rentals/overdue -router.get('/overdue', function(req, res, next) { - //return list of all movies - return rental_exports.rentalsController.overdue_customers(req, res); -}); module.exports = router; From 8c8c61c5e26c420dda59bba8643a663d102fe2b0 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Tue, 22 Sep 2015 22:55:31 -0700 Subject: [PATCH 48/78] Added model tests for movies and customers --- test/models/customer.js | 29 +++++++++++++++++++--- test/models/movie.js | 53 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 test/models/movie.js diff --git a/test/models/customer.js b/test/models/customer.js index 4e0aa82..6e23628 100644 --- a/test/models/customer.js +++ b/test/models/customer.js @@ -23,7 +23,30 @@ describe('Customer', function() { assert(customer instanceof Customer); }); - - - + describe("instance methods", function() { + it("can find all customers", function(done) { + customer.find_all(function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 2); + + assert.equal(res[0].name, 'Mulder'); + assert.equal(res[1].name, 'Scully'); + + done(); + }); + }); + + it("can find a subset of customers", function(done) { + customer.find_subset('name', 1, 1, function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + + assert.equal(res[0].name, 'Scully'); + + done(); + }); + }); + }); }); diff --git a/test/models/movie.js b/test/models/movie.js new file mode 100644 index 0000000..abc42e7 --- /dev/null +++ b/test/models/movie.js @@ -0,0 +1,53 @@ + var assert = require('assert'), + Movie = require('../../models/movie'), + sqlite3 = require('sqlite3').verbose(); + +describe("Movie", function() { + var movie, db_cleaner + + beforeEach(function(done) { + movie = new Movie(); + + 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, available) VALUES('X-files: I want to believe', 'Mulder and Scully rock it', '1999', 4, 4), ('The Lone Gunmen', 'misadventures of the best nerds', '2001', 5, 5); COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }) + + it("can be instantiated", function() { + assert(movie instanceof Movie); + }); + + describe("instance methods", function() { + it("can find all movies", function(done) { + movie.find_all(function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 2); + + assert.equal(res[0].title, 'X-files: I want to believe'); + assert.equal(res[1].title, 'The Lone Gunmen'); + + done(); + }); + }); + + it("can find a subset of movies", function(done) { + movie.find_subset('title', 1, 1, function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + + assert.equal(res[0].title, 'X-files: I want to believe'); + + done(); + }); + }); + }); +}); + From 47fe040a8e39ad3e32f1cfd4420a9e83d5af05f3 Mon Sep 17 00:00:00 2001 From: Loraine Date: Tue, 22 Sep 2015 23:42:12 -0700 Subject: [PATCH 49/78] A customer's history can now be found using a single query, yay. --- database.js | 4 +--- rentals.json | 6 ++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/database.js b/database.js index 76f61a9..9a48198 100644 --- a/database.js +++ b/database.js @@ -48,12 +48,10 @@ module.exports = { customer_history: function(value, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - var statement = "SELECT 'movies'.'title' FROM 'movies' INNER JOIN 'rentals' ON 'movies'.'id' = 'rentals'.'movie_id' WHERE 'rentals'.'customer_id' = ? AND 'rentals'.'returned_date' != '';"; - var statement2 = "SELECT 'rentals'.'returned_date' FROM 'rentals' INNER JOIN 'customers' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'customer_id' = ? AND 'rentals'.'returned_date' != '';"; + var statement = "SELECT movies.title, rentals.returned_date FROM movies JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = ?;" db.all(statement, value, function(err, res) { if (callback) callback(err, res); - console.log(res); db.close(); }); }, diff --git a/rentals.json b/rentals.json index 841d422..1a6be3e 100644 --- a/rentals.json +++ b/rentals.json @@ -11,6 +11,12 @@ "returned_date": "2015-06-19", "checked_out": "2015-06-11" }, + { + "movie_id": 7, + "customer_id": 7, + "returned_date": "2015-07-18", + "checked_out": "2015-06-11" + }, { "movie_id": 3, "customer_id": 1, From 303d2e1a7204417f0afe7cecf1daf1f2e1bf5566 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Wed, 23 Sep 2015 10:19:51 -0700 Subject: [PATCH 50/78] WIP on post for new rental --- controllers/rentals.js | 19 +++++++++++++++++++ database.js | 12 ++++++++++++ routes/rentals.js | 8 ++++++++ 3 files changed, 39 insertions(+) diff --git a/controllers/rentals.js b/controllers/rentals.js index 0226098..9f2f5f0 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -28,5 +28,24 @@ exports.rentalsController = { rental.overdue(function(err, record) { res.status(200).json({ overdue_customers: record }); }) + }, + + new_rental: function new_rental(req, res, id, movie_title) { + + var rental = new Rental(); + + // check availablity in movies table first + rental.check_movie_availability(movie_title, function(err, record) { + if (record[0].available > 0) { + console.log("we're getting somewhere"); + // insert new rental into rental table + // charge customer and update customer table + // change inventory and available in movies table + } else { + // fail everything. die. + console.log("wahaaaaaa"); + } + }) + } } diff --git a/database.js b/database.js index 9a48198..b6780e1 100644 --- a/database.js +++ b/database.js @@ -114,5 +114,17 @@ module.exports = { if (callback) callback(err, res); db.close(); }); + }, + + check_movie_availability: function(value, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + console.log(value); + var statement = 'SELECT movies.available FROM movies where title = ? COLLATE NOCASE;'; + + db.all(statement, value, function(err, result) { + if (callback) callback(err, result); + db.close(); + }); } } diff --git a/routes/rentals.js b/routes/rentals.js index 3f39b4e..08ae235 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -3,6 +3,12 @@ var router = express.Router(); var rental_exports = require('../controllers/rentals'); +//rentals/new_rental/:id/:title +router.get('/new_rental/:id/:movie_title', function(req, res, next) { + //return list of all movies + return rental_exports.rentalsController.new_rental(req, res, req.params.id, req.params.movie_title); +}); + //rentals/overdue router.get('/overdue', function(req, res, next) { //return list of all movies @@ -22,4 +28,6 @@ router.get('/:movie_title/customers', function(req, res, next) { }); + + module.exports = router; From 43bf9fa0dbce44a73273c35b74a2c30eed42a9be Mon Sep 17 00:00:00 2001 From: Loraine Date: Wed, 23 Sep 2015 11:18:24 -0700 Subject: [PATCH 51/78] Added a duedate column. --- utils/schema.js | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/schema.js b/utils/schema.js index a783580..2b3034b 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -27,6 +27,7 @@ var rental_fields = [ ['movie_id', 'integer'], ['customer_id', 'integer'], ['returned_date', 'text'], + ['due_date', 'text'], ['checked_out', 'text'] ] From 78d714a969dd5205e7e0d719d441c6a186faccb1 Mon Sep 17 00:00:00 2001 From: Loraine Date: Wed, 23 Sep 2015 11:18:49 -0700 Subject: [PATCH 52/78] Posting new rentals to the database. --- controllers/rentals.js | 9 +++++++-- database.js | 12 +++++++++++- rentals.json | 7 +++++++ routes/rentals.js | 4 ++-- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 9f2f5f0..3835621 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -30,7 +30,7 @@ exports.rentalsController = { }) }, - new_rental: function new_rental(req, res, id, movie_title) { + new_rental: function new_rental(req, res, customer_id, movie_title) { var rental = new Rental(); @@ -38,7 +38,12 @@ exports.rentalsController = { rental.check_movie_availability(movie_title, function(err, record) { if (record[0].available > 0) { console.log("we're getting somewhere"); - // insert new rental into rental table + + // insert new rental into rental table + rental.create_rental(movie_title, customer_id, function(err, record) { + console.log("Maybe there's something in the database! Go check.") + }); + // charge customer and update customer table // change inventory and available in movies table } else { diff --git a/database.js b/database.js index b6780e1..39152ad 100644 --- a/database.js +++ b/database.js @@ -119,12 +119,22 @@ module.exports = { check_movie_availability: function(value, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - console.log(value); var statement = 'SELECT movies.available FROM movies where title = ? COLLATE NOCASE;'; db.all(statement, value, function(err, result) { if (callback) callback(err, result); db.close(); }); + }, + + create_rental: function(movie_title, customer_id, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + var statement = "INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES((select id from movies where title=? COLLATE NOCASE), ?, '2015-12-01', '2015-12-11', '2015-11-15');"; + + db.all(statement, movie_title, customer_id, function(err, result) { + if (callback) callback(err, result); + db.close(); + }); } } diff --git a/rentals.json b/rentals.json index 1a6be3e..2a3ec05 100644 --- a/rentals.json +++ b/rentals.json @@ -3,42 +3,49 @@ "movie_id": 1, "customer_id": 1, "returned_date": "", + "due_date": "2015-09-11", "checked_out": "2015-09-01" }, { "movie_id": 1, "customer_id": 7, "returned_date": "2015-06-19", + "due_date": "2015-06-21", "checked_out": "2015-06-11" }, { "movie_id": 7, "customer_id": 7, "returned_date": "2015-07-18", + "due_date": "2015-06-21", "checked_out": "2015-06-11" }, { "movie_id": 3, "customer_id": 1, "returned_date": "", + "due_date": "2015-09-30", "checked_out": "2015-09-20" }, { "movie_id": 1, "customer_id": 1, "returned_date": "2015-07-17", + "due_date": "2015-07-20", "checked_out": "2015-07-10" }, { "movie_id": 5, "customer_id": 3, "returned_date": "", + "due_date": "2015-08-24", "checked_out": "2015-08-14" }, { "movie_id": 1, "customer_id": 2, "returned_date": "", + "due_date": "2015-09-30", "checked_out": "2015-09-20" } ] diff --git a/routes/rentals.js b/routes/rentals.js index 08ae235..2a7635f 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -4,9 +4,9 @@ var router = express.Router(); var rental_exports = require('../controllers/rentals'); //rentals/new_rental/:id/:title -router.get('/new_rental/:id/:movie_title', function(req, res, next) { +router.get('/new_rental/:customer_id/:movie_title', function(req, res, next) { //return list of all movies - return rental_exports.rentalsController.new_rental(req, res, req.params.id, req.params.movie_title); + return rental_exports.rentalsController.new_rental(req, res, req.params.customer_id, req.params.movie_title); }); //rentals/overdue From cf4495c53d0e65cabd7928eb8fd5eb510a964071 Mon Sep 17 00:00:00 2001 From: Loraine Date: Wed, 23 Sep 2015 11:26:10 -0700 Subject: [PATCH 53/78] Updated our sqlite query for creating a new rental record. --- database.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/database.js b/database.js index 39152ad..df6e7ab 100644 --- a/database.js +++ b/database.js @@ -130,9 +130,17 @@ module.exports = { create_rental: function(movie_title, customer_id, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - var statement = "INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES((select id from movies where title=? COLLATE NOCASE), ?, '2015-12-01', '2015-12-11', '2015-11-15');"; + var ugly_today = new Date(); - db.all(statement, movie_title, customer_id, function(err, result) { + var today = new Date().toISOString().slice(0, 10); + + var date_conversion = ugly_today.setDate(ugly_today.getDate() + 10); + + var due_date = new Date(date_conversion).toISOString().slice(0, 10); + + var statement = "INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES((select id from movies where title=? COLLATE NOCASE), ?, '', ?, ?);"; + + db.all(statement, movie_title, customer_id, due_date, today, function(err, result) { if (callback) callback(err, result); db.close(); }); From 677ef98a81a19fc3a131b50c7ea55b85965811fe Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Wed, 23 Sep 2015 15:50:16 -0700 Subject: [PATCH 54/78] added two more tests for model methods: --- test/models/movie.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/test/models/movie.js b/test/models/movie.js index abc42e7..7035a4d 100644 --- a/test/models/movie.js +++ b/test/models/movie.js @@ -10,7 +10,7 @@ describe("Movie", function() { 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, available) VALUES('X-files: I want to believe', 'Mulder and Scully rock it', '1999', 4, 4), ('The Lone Gunmen', 'misadventures of the best nerds', '2001', 5, 5); COMMIT;" + db_cleaner.exec("BEGIN; DELETE FROM movies; DELETE FROM rentals; INSERT INTO movies(title, overview, release_date, inventory, available) VALUES('X-files: I want to believe', 'Mulder and Scully rock it', '1999', 4, 4), ('The Lone Gunmen', 'misadventures of the best nerds', '2001', 5, 5); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;" , function(err) { db_cleaner.close(); done(); @@ -48,6 +48,30 @@ describe("Movie", function() { done(); }); }); + + it("can find customers who currently have a rental for that movie", function(done) { + movie.movie_current_customers('X-files: I want to believe', function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + + assert.equal(res[0].name, 'Mulder'); + + done(); + }); + }); + + it("can find customers who have a past rental for that movie", function(done) { + movie.movie_past_customers('The Lone Gunmen', 'name', function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + + assert.equal(res[0].name, 'Scully'); + + done(); + }); + }); }); }); From 8e489e8a08ccfc8008cc46d49bd82af90a8a6859 Mon Sep 17 00:00:00 2001 From: Loraine Date: Wed, 23 Sep 2015 16:34:23 -0700 Subject: [PATCH 55/78] Completed the rentals route and functions for processing new rentals. --- controllers/rentals.js | 14 +++++++++++--- database.js | 26 +++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 3835621..8dbb0d7 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -44,11 +44,19 @@ exports.rentalsController = { console.log("Maybe there's something in the database! Go check.") }); - // charge customer and update customer table - // change inventory and available in movies table + // charge customer and update customer table + rental.charge_customer(customer_id, function(err, record) { + res.status(200).json({ new_rental: "You've successfully charged the customer." }); + }); + + // change available in movies table + rental.update_availabile_movies(movie_title, function(err, record) { + console.log("Maybe you updated your availability. Go check!") + }); + } else { // fail everything. die. - console.log("wahaaaaaa"); + res.status(200).json({ new_rental: "Sorry, something went wrong." }); } }) diff --git a/database.js b/database.js index df6e7ab..ab8f939 100644 --- a/database.js +++ b/database.js @@ -144,5 +144,29 @@ module.exports = { if (callback) callback(err, result); db.close(); }); - } + }, + + charge_customer: function(customer_id, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + // We're charging a dollar + var statement = "UPDATE customers SET account_credit = account_credit - 1.0 WHERE id = ?"; + + db.all(statement, customer_id, function(err, result) { + if (callback) callback(err, result); + db.close(); + }); + }, + + + update_availabile_movies: function(movie_title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + var statement = "UPDATE movies SET available = available - 1 WHERE title = ? COLLATE NOCASE"; + + db.all(statement, movie_title, function(err, result) { + if (callback) callback(err, result); + db.close(); + }); + }, } From 43685437a5fbedd52e975aa93a141ab012d4f03a Mon Sep 17 00:00:00 2001 From: Loraine Date: Wed, 23 Sep 2015 19:29:50 -0700 Subject: [PATCH 56/78] Updated query to display and sort by checked out date. Results exclude items that have yet to be returned. --- database.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/database.js b/database.js index ab8f939..034f571 100644 --- a/database.js +++ b/database.js @@ -48,7 +48,8 @@ module.exports = { customer_history: function(value, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - var statement = "SELECT movies.title, rentals.returned_date FROM movies JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = ?;" + var statement = "SELECT movies.title, rentals.returned_date, rentals.checked_out FROM movies JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = ? AND rentals.returned_date != '' ORDER BY rentals.checked_out;" + db.all(statement, value, function(err, res) { if (callback) callback(err, res); From a10ed3db5dcc97c8035fbfef4977f09d70785ca0 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Wed, 23 Sep 2015 21:32:03 -0700 Subject: [PATCH 57/78] Added more instance method tests --- test/models/customer.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/test/models/customer.js b/test/models/customer.js index 6e23628..487eece 100644 --- a/test/models/customer.js +++ b/test/models/customer.js @@ -11,7 +11,7 @@ describe('Customer', function() { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { - db_cleaner.exec("BEGIN; DELETE FROM customers; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', 'yesterday', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', 'last week', '12 blah','DC', 'DC', '2342', '534', 7); COMMIT;", function(err) { + db_cleaner.exec("BEGIN; DELETE FROM customers; DELETE FROM rentals; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', 'yesterday', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', 'last week', '12 blah','DC', 'DC', '2342', '534', 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;", function(err) { db_cleaner.close(); done(); } @@ -48,5 +48,29 @@ describe('Customer', function() { done(); }); }); + + it("can find a customer's current rentals", function(done) { + customer.customer_rentals(1, function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + + assert.equal(res[0].title, 'X-files: I want to believe'); + + done(); + }); + }); + + it("can find a customer's past rentals", function(done) { + customer.customer_history(2, function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + + assert.equal(res[0].title, 'The Lone Gunmen'); + + done(); + }); + }); }); }); From 01060ec3a695c15bc8e6d39d4c2d588dbbd7f604 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Wed, 23 Sep 2015 22:34:30 -0700 Subject: [PATCH 58/78] WIP on rental instance method tests --- test/models/rentals.js | 71 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 test/models/rentals.js diff --git a/test/models/rentals.js b/test/models/rentals.js new file mode 100644 index 0000000..662f9d9 --- /dev/null +++ b/test/models/rentals.js @@ -0,0 +1,71 @@ +var assert = require('assert'), + Rental = require('../../models/rental'), + sqlite3 = require('sqlite3').verbose(); + +describe('Rental', function() { + var rental, + db_cleaner; + + beforeEach(function(done) { + rental = new Rental(); + + db_cleaner = new sqlite3.Database('db/test.db'); + db_cleaner.serialize(function() { + db_cleaner.exec("BEGIN; DELETE FROM customers; DELETE FROM rentals; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', 'yesterday', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', 'last week', '12 blah','DC', 'DC', '2342', '534', 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-10-01', '2015-09-29', '2015-09-19'); COMMIT;", function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + + it("can be instantiated", function() { + assert(rental instanceof Rental); + }); + + describe("instance methods", function() { + it("can find details of a movie", function(done) { + rental.movie_details("X-files: I want to believe", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + + assert.equal(res[0].overview, 'Mulder and Scully rock it'); + done(); + }); + }); + + it("can find current customers of a rental", function(done) { + rental.customers("X-files: I want to believe", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + + assert.equal(res[0].name, 'Mulder'); + done(); + }); + }); + + it("can find customers with overdue accounts", function(done) { + rental.overdue("The Lone Gunmen", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + + assert.equal(res[0].name, 'Scully'); + done(); + }); + }); + + it("can find customers with overdue accounts", function(done) { + rental.check_movie_availability("The Lone Gunmen", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + + assert.equal(res[0].available, 'Scully'); + done(); + }); + }); + }); +}); From dcd027e9863a79f4ab23ac01409c5fe0148ff566 Mon Sep 17 00:00:00 2001 From: Loraine Date: Wed, 23 Sep 2015 23:33:56 -0700 Subject: [PATCH 59/78] Got some endpoint tests started. --- package.json | 3 +- routes/customers.js | 6 ---- test/controllers/customer.js | 55 ++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 test/controllers/customer.js diff --git a/package.json b/package.json index 59cf4f6..16a84ee 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "mocha": "^2.3.3", "morgan": "~1.6.1", "serve-favicon": "~2.3.0", - "sqlite3": "^3.1.0" + "sqlite3": "^3.1.0", + "supertest": "^1.1.0" } } diff --git a/routes/customers.js b/routes/customers.js index bdc88ac..85466e1 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -8,12 +8,6 @@ router.get('/', function(req, res, next) { return customer_exports.customersController.index(req, res); }); - // /customers/:id ?? returns info from rentals table -router.get('/one_customer', function(req, res, next) { - // return one customer based on id - //return customer_exports.customerController.one_customer(req, res); -}); - // customers/:id/current_rentals router.get('/:id/current_rentals', function(req, res, next) { return customer_exports.customersController.current_rentals(req, res, req.params.id); diff --git a/test/controllers/customer.js b/test/controllers/customer.js new file mode 100644 index 0000000..c5ccdec --- /dev/null +++ b/test/controllers/customer.js @@ -0,0 +1,55 @@ +var request = require('supertest'), + assert = require('assert'), + app = require('../../app'), + sqlite3 = require('sqlite3').verbose(), + agent = request.agent(app); + +describe("customers controller", function(){ + + describe("GET /", function(){ + it("knows about the route", function(done) { + agent.get("/customers").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + done(); + }) + }) + + it("can find a single customer's current rentals", function(done) { + agent.get("/customers/1/current_rentals").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.current_rentals.length, 1); + var keys = ["id", "title", "overview", "release_date", "inventory", "available"]; + assert.deepEqual(Object.keys(result.body.current_rentals[0]), keys); + done(); + }) + }) + + it("can find a single customer's rental history", function(done) { + agent.get("/customers/2/rental_history").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.rental_history.length, 1); + var keys = ["title", "returned_date", "checked_out"]; + assert.deepEqual(Object.keys(result.body.rental_history[0]), keys); + done(); + }) + }) + + + it.only("finds customer subset pages sorted by column", function(done) { + agent.get("/customers/name/1").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.customer_subset[1].name, "Scully"); + assert.equal(result.body.customer_subset[0].name, "Mulder"); + done(); + }) + }) + }) +}) From cf5b148a8756ff57fe5a92c9592dbd608b997487 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Thu, 24 Sep 2015 10:13:17 -0700 Subject: [PATCH 60/78] changed new rental to a post request and created function inception --- controllers/rentals.js | 20 +++++++++----------- database.js | 6 +++--- routes/rentals.js | 8 +++++++- test/controllers/customer.js | 2 +- test/models/rentals.js | 11 ----------- 5 files changed, 20 insertions(+), 27 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 8dbb0d7..18f1a2b 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -39,19 +39,17 @@ exports.rentalsController = { if (record[0].available > 0) { console.log("we're getting somewhere"); - // insert new rental into rental table - rental.create_rental(movie_title, customer_id, function(err, record) { - console.log("Maybe there's something in the database! Go check.") - }); - - // charge customer and update customer table - rental.charge_customer(customer_id, function(err, record) { - res.status(200).json({ new_rental: "You've successfully charged the customer." }); - }); + //nested function inception :( - // change available in movies table + // change available in movies table rental.update_availabile_movies(movie_title, function(err, record) { - console.log("Maybe you updated your availability. Go check!") + // insert new rental into rental table + rental.create_rental(movie_title, customer_id, function(err, record) + // charge customer and update customer table + {rental.charge_customer(customer_id, function(err, record) { + res.status(200).json({ new_rental: "You've successfully charged the customer." }); + }); + }); }); } else { diff --git a/database.js b/database.js index 034f571..a680766 100644 --- a/database.js +++ b/database.js @@ -109,10 +109,10 @@ module.exports = { var overdue_date = new Date(date_conversion).toISOString().slice(0, 10); console.log(overdue_date); - var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'returned_date' = '' AND 'rentals'.'checked_out' < '" + overdue_date + "';"; + var statement = 'SELECT customers.* FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE rentals.returned_date = "" AND rentals.checked_out < ? ;'; - db.all(statement, function(err, res) { - if (callback) callback(err, res); + db.all(statement, overdue_date, function(err, result) { + if (callback) callback(err, result); db.close(); }); }, diff --git a/routes/rentals.js b/routes/rentals.js index 2a7635f..112ed47 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -4,11 +4,17 @@ var router = express.Router(); var rental_exports = require('../controllers/rentals'); //rentals/new_rental/:id/:title -router.get('/new_rental/:customer_id/:movie_title', function(req, res, next) { +router.post('/new_rental/:customer_id/:movie_title', function(req, res, next) { //return list of all movies return rental_exports.rentalsController.new_rental(req, res, req.params.customer_id, req.params.movie_title); }); +//rentals/check_in/:id/:title +router.get('/check_in/:customer_id/:movie_title', function(req, res, next) { + //return list of all movies + return rental_exports.rentalsController.find_customers(req, res, req.params.customer_id, req.params.movie_title); +}); + //rentals/overdue router.get('/overdue', function(req, res, next) { //return list of all movies diff --git a/test/controllers/customer.js b/test/controllers/customer.js index c5ccdec..8b8baa7 100644 --- a/test/controllers/customer.js +++ b/test/controllers/customer.js @@ -41,7 +41,7 @@ describe("customers controller", function(){ }) - it.only("finds customer subset pages sorted by column", function(done) { + it("finds customer subset pages sorted by column", function(done) { agent.get("/customers/name/1").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ diff --git a/test/models/rentals.js b/test/models/rentals.js index 662f9d9..04b8fda 100644 --- a/test/models/rentals.js +++ b/test/models/rentals.js @@ -56,16 +56,5 @@ describe('Rental', function() { done(); }); }); - - it("can find customers with overdue accounts", function(done) { - rental.check_movie_availability("The Lone Gunmen", function(err, res) { - assert.equal(err, undefined); - assert(res instanceof Array); - assert.equal(res.length, 1); - - assert.equal(res[0].available, 'Scully'); - done(); - }); - }); }); }); From 7a2d5261f44aee29b62c5a25f79d686ae2279e1e Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 24 Sep 2015 13:43:46 -0700 Subject: [PATCH 61/78] Route and endpoint for checking in videos. --- controllers/rentals.js | 18 ++++++++++++++++++ database.js | 22 ++++++++++++++++++++++ routes/rentals.js | 4 ++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 18f1a2b..0ab8e8f 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -58,5 +58,23 @@ exports.rentalsController = { } }) + }, + + check_in: function check_in(req, res, customer_id, movie_title) { + + var rental = new Rental(); + + + // update the movie's available column + rental.check_movie_in(movie_title, function(err, record) { + // update today's date to return Date + + res.status(200).json({ new_rental: "You've successfully updated the availability." }); + + rental.update_return_date(customer_id, movie_title, function(err, record) { + }); + + }) + } } diff --git a/database.js b/database.js index a680766..b3e19ee 100644 --- a/database.js +++ b/database.js @@ -170,4 +170,26 @@ module.exports = { db.close(); }); }, + + update_return_date: function(customer_id, movie_title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + var statement = "UPDATE rentals SET returned_date = date('now') WHERE customer_id = ? AND movie_id = (SELECT id FROM movies WHERE title = ? COLLATE NOCASE) AND returned_date ='' ;"; + + db.all(statement, customer_id, movie_title, function(err, result) { + if (callback) callback(err, result); + db.close(); + }); + }, + + check_movie_in: function(movie_title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + + var statement = "UPDATE movies SET available = available + 1 WHERE title = ? COLLATE NOCASE"; + + db.all(statement, movie_title, function(err, result) { + if (callback) callback(err, result); + db.close(); + }); + }, } diff --git a/routes/rentals.js b/routes/rentals.js index 112ed47..666806a 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -10,9 +10,9 @@ router.post('/new_rental/:customer_id/:movie_title', function(req, res, next) { }); //rentals/check_in/:id/:title -router.get('/check_in/:customer_id/:movie_title', function(req, res, next) { +router.put('/check_in/:customer_id/:movie_title', function(req, res, next) { //return list of all movies - return rental_exports.rentalsController.find_customers(req, res, req.params.customer_id, req.params.movie_title); + return rental_exports.rentalsController.check_in(req, res, req.params.customer_id, req.params.movie_title); }); //rentals/overdue From 0585a9097858c0b53f336ac3a82c8bbff45774f4 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Thu, 24 Sep 2015 15:16:00 -0700 Subject: [PATCH 62/78] Added endpoint tests for movies controller: --- README.md | 16 ++++++++--- controllers/movies.js | 2 +- database.js | 2 +- routes/movies.js | 5 ---- test/controllers/movies.js | 56 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 test/controllers/movies.js diff --git a/README.md b/README.md index 7706c7d..0fb33e4 100644 --- a/README.md +++ b/README.md @@ -76,14 +76,14 @@ DONE- Retrieve a subset of movies - release date - and inventory total - DONE 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` ... +- DONE See a list of customers that have _currently_ checked out any of the movie's inventory +- DONE Given a customer's `id` and a movie's `title` ... - "check out" one of the movie's inventory to the customer - Establish a return date - Charge the customer's account (cost up to you) - - "check in" one of customer's rentals + - DONE "check in" one of customer's rentals - return the movie to its inventory -- See a list of customers with overdue movies +- DONE See a list of customers with overdue movies ### Interface - This part of the project is purely an API; all interactions should happen over HTTP requests. There is no front-end, user-facing interface. @@ -92,3 +92,11 @@ DONE- Retrieve a subset of movies - All endpoints must be tested. - We will use [Mocha](https://mochajs.org/) for tests. - There isn't a coverage requirement for this project, beyond demonstrating that every endpoint is covered by some manner of tests. + +### Things to fix +- accomadate white space in 'given a movie's title' endpoints +- account for negative customer balances +- add late fees? +- account for negative availability +- possibly refactor database.js + diff --git a/controllers/movies.js b/controllers/movies.js index 99e9267..e4527d6 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -32,7 +32,7 @@ exports.moviesController = { }) }, - past_rentals: function current_rentals(req, res, movie_title, column) { + past_rentals: function past_rentals(req, res, movie_title, column) { var movie = new Movie(); diff --git a/database.js b/database.js index b3e19ee..dc2e14a 100644 --- a/database.js +++ b/database.js @@ -70,7 +70,7 @@ module.exports = { movie_past_customers: function(value, column, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'movie_id' = (SELECT 'movies'.'id' FROM 'movies' WHERE 'movies'.'title' = ? COLLATE NOCASE LIMIT 1) AND 'rentals'.'returned_date' != '' ORDER BY " + column + ";"; + var statement = "SELECT 'customers'.* FROM 'customers' INNER JOIN 'rentals' ON 'customers'.'id' = 'rentals'.'customer_id' WHERE 'rentals'.'movie_id' = (SELECT 'movies'.'id' FROM 'movies' WHERE 'movies'.'title' = ? COLLATE NOCASE LIMIT 1) AND 'rentals'.'returned_date' != '' ORDER BY '" + column + "';"; db.all(statement, value, function(err, res) { if (callback) callback(err, res); diff --git a/routes/movies.js b/routes/movies.js index c7955bc..0b672c3 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -9,11 +9,6 @@ router.get('/', function(req, res, next) { return movie_exports.moviesController.index(req, res); }); -router.get('/one_movie', function(req, res, next) { - // return one customer based on title - //return customer_exports.customerController.one_customer(req, res); -}); - //movies/:title/past_rentals/:column router.get('/:movie_title/past_rentals/:column', function(req, res, next) { return movie_exports.moviesController.past_rentals(req, res, req.params.movie_title, req.params.column); diff --git a/test/controllers/movies.js b/test/controllers/movies.js new file mode 100644 index 0000000..acdf3bf --- /dev/null +++ b/test/controllers/movies.js @@ -0,0 +1,56 @@ +var request = require('supertest'), + assert = require('assert'), + app = require('../../app'), + sqlite3 = require('sqlite3').verbose(), + agent = request.agent(app); + +describe("movies controller", function(){ + describe("GET /", function(){ + it("knows about the route", function(done) { + agent.get("/movies").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + done(); + }); + }); + }); + + it("returns customers who have rented movie in the past", function(done) { + agent.get("/movies/The%20Lone%20Gunmen/past_rentals/title").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.movie_past_customers.length, 1); + var keys = ["id", "name", "registered_at", "address", "city", "state", "postal_code", "phone", "account_credit"]; + assert.deepEqual(Object.keys(result.body.movie_past_customers[0]), keys); + assert.equal(result.body.movie_past_customers[0].name, "Scully"); + done(); + }); + }); + + it("returns customers who currently have movie rented", function(done) { + agent.get("/movies/X-files:%20I%20want%20to%20believe/current_rentals").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.movie_current_customers.length, 1); + var keys = ["id", "name", "registered_at", "address", "city", "state", "postal_code", "phone", "account_credit"]; + assert.deepEqual(Object.keys(result.body.movie_current_customers[0]), keys); + assert.equal(result.body.movie_current_customers[0].name, "Mulder"); + done(); + }); + }); + + it("returns subset of movies", function(done) { + agent.get("/movies/title/1").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.movie_subset.length, 2); + var keys = ["id", "title", "overview", "release_date", "inventory", "available"]; + assert.deepEqual(Object.keys(result.body.movie_subset[0]), keys); + done(); + }); + }); +}); From 61a9cbd7836f642ea0e31af6d44b7d0f5633b20e Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Thu, 24 Sep 2015 15:55:00 -0700 Subject: [PATCH 63/78] WIP on rentals get endpoint tests --- test/controllers/rentals.js | 34 ++++++++++++++++++++++++++++++++++ test/models/customer.js | 4 ++-- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 test/controllers/rentals.js diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js new file mode 100644 index 0000000..7eb00a3 --- /dev/null +++ b/test/controllers/rentals.js @@ -0,0 +1,34 @@ +var request = require('supertest'), + assert = require('assert'), + app = require('../../app'), + sqlite3 = require('sqlite3').verbose(), + agent = request.agent(app); + +describe("rentals controller", function(){ + it("returns customers with overdue rentals", function(done) { + agent.get("/rentals/overdue").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.overdue_customers.length, 1); + var keys = ["id", "name", "registered_at", "address", "city", "state", "postal_code", "phone", "account_credit"]; + assert.deepEqual(Object.keys(result.body.overdue_customers[0]), keys); + done(); + }); + }); + + it("returns movie details", function(done) { + agent.get("/rentals/The%20Lone%20Gunmen").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.movie_details.length, 1); + var keys = ["id", "title", "overview", "release_date", "inventory", "available"]; + assert.deepEqual(Object.keys(result.body.movie_details[0]), keys); + assert.equal(result.body.movie_details[0].inventory, 5) + assert.equal(result.body.movie_details[0].overview,'misadventures of the best nerds') + + done(); + }); + }); +}); diff --git a/test/models/customer.js b/test/models/customer.js index 487eece..dcf57b6 100644 --- a/test/models/customer.js +++ b/test/models/customer.js @@ -11,7 +11,7 @@ describe('Customer', function() { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { - db_cleaner.exec("BEGIN; DELETE FROM customers; DELETE FROM rentals; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', 'yesterday', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', 'last week', '12 blah','DC', 'DC', '2342', '534', 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;", function(err) { + db_cleaner.exec("BEGIN; DELETE FROM customers; DELETE FROM rentals; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', 'yesterday', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', 'last week', '12 blah','DC', 'DC', '2342', '534', 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'), (2, 1, '', '2015-09-01', '2015-08-22'); COMMIT;", function(err) { db_cleaner.close(); done(); } @@ -53,7 +53,7 @@ describe('Customer', function() { customer.customer_rentals(1, function(err, res) { assert.equal(err, undefined); assert(res instanceof Array); - assert.equal(res.length, 1); + assert.equal(res.length, 2); assert.equal(res[0].title, 'X-files: I want to believe'); From 303328e0739238f009c846b7ecdd87316f6d7d5f Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Thu, 24 Sep 2015 16:11:01 -0700 Subject: [PATCH 64/78] WIP on rental controller tests --- routes/rentals.js | 2 +- test/controllers/rentals.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/routes/rentals.js b/routes/rentals.js index 666806a..a790889 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -29,7 +29,7 @@ router.get('/:movie_title', function(req, res, next) { //rentals/:movie_title/customers router.get('/:movie_title/customers', function(req, res, next) { - //return list of all movies + //return list of a movie's current rental customers return rental_exports.rentalsController.find_customers(req, res, req.params.movie_title); }); diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 7eb00a3..1d493ff 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -31,4 +31,18 @@ describe("rentals controller", function(){ done(); }); }); + + it("returns movie details", function(done) { + agent.get("/rentals/X-files:%20I%20want%20to%20believe/customers").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.rental_customers.length, 1); + var keys = ["id", "name", "registered_at", "address", "city", "state", "postal_code", "phone", "account_credit"]; + assert.deepEqual(Object.keys(result.body.rental_customers[0]), keys); + assert.equal(result.body.rental_customers[0].name, "Mulder") + // assert.equal(result.body.customers[0].overview,'misadventures of the best nerds') + done(); + }); + }); }); From fb101a7ed7b187e5ad90e688cd7861d6d8b6898d Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 24 Sep 2015 16:14:24 -0700 Subject: [PATCH 65/78] Updated page routes for clarity. --- routes/customers.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/routes/customers.js b/routes/customers.js index 85466e1..b7eba63 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -18,8 +18,10 @@ router.get('/:id/rental_history', function(req, res, next) { return customer_exports.customersController.rental_history(req, res, req.params.id); }); -// customers/name/1 -router.get('/:column/:number', function(req, res, next) { +// customers/name/page1 +// customers/registered_at/page1 +// customers/postal_code/page1 +router.get('/:column/page:number', function(req, res, next) { return customer_exports.customersController.subset(req, res, req.params.column, req.params.number); }); From d093fe89dd958997c5b087d6ac0a158c64f0f294 Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 24 Sep 2015 16:14:44 -0700 Subject: [PATCH 66/78] Updated endpoint to include page. --- test/controllers/customer.js | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/test/controllers/customer.js b/test/controllers/customer.js index 8b8baa7..d4209e6 100644 --- a/test/controllers/customer.js +++ b/test/controllers/customer.js @@ -41,13 +41,36 @@ describe("customers controller", function(){ }) - it("finds customer subset pages sorted by column", function(done) { - agent.get("/customers/name/1").set('Accept', 'application/json') + it("finds customer subset pages sorted by name", function(done) { + agent.get("/customers/name/page1").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined); - assert.equal(result.body.customer_subset[1].name, "Scully"); assert.equal(result.body.customer_subset[0].name, "Mulder"); + assert.equal(result.body.customer_subset[1].name, "Scully"); + done(); + }) + }) + + it("finds customer subset pages sorted by registered_at", function(done) { + agent.get("/customers/registered_at/page1").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + console.log(result.body); + assert.equal(result.body.customer_subset[0].registered_at, "2013-12-23"); + assert.equal(result.body.customer_subset[1].registered_at, "2015-09-16"); + done(); + }) + }) + + it("finds customer subset pages sorted by postal_code", function(done) { + agent.get("/customers/postal_code/page1").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.customer_subset[0].postal_code, "2342"); + assert.equal(result.body.customer_subset[1].postal_code, "834885"); done(); }) }) From 0e1749769f3d0922dd2141063af11d295496e432 Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 24 Sep 2015 16:14:53 -0700 Subject: [PATCH 67/78] Updated the test db seed data. --- test/models/customer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/customer.js b/test/models/customer.js index 487eece..95770e4 100644 --- a/test/models/customer.js +++ b/test/models/customer.js @@ -11,7 +11,7 @@ describe('Customer', function() { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { - db_cleaner.exec("BEGIN; DELETE FROM customers; DELETE FROM rentals; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', 'yesterday', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', 'last week', '12 blah','DC', 'DC', '2342', '534', 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;", function(err) { + db_cleaner.exec("BEGIN; DELETE FROM customers; DELETE FROM rentals; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', '2013-12-23', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', '2015-09-16', '12 blah','DC', 'DC', '2342', '534', 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;", function(err) { db_cleaner.close(); done(); } From 62c66fa634a02b6985936e852b2da44e205255ee Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 24 Sep 2015 16:26:21 -0700 Subject: [PATCH 68/78] Fixed seed data to accomodate registered dates. --- test/models/customer.js | 2 +- test/models/rentals.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/models/customer.js b/test/models/customer.js index af8ade4..0c1dcd1 100644 --- a/test/models/customer.js +++ b/test/models/customer.js @@ -55,7 +55,7 @@ describe('Customer', function() { customer.customer_rentals(1, function(err, res) { assert.equal(err, undefined); assert(res instanceof Array); - assert.equal(res.length, 2); + assert.equal(res.length, 1); assert.equal(res[0].title, 'X-files: I want to believe'); diff --git a/test/models/rentals.js b/test/models/rentals.js index 04b8fda..35a42a2 100644 --- a/test/models/rentals.js +++ b/test/models/rentals.js @@ -11,7 +11,7 @@ describe('Rental', function() { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { - db_cleaner.exec("BEGIN; DELETE FROM customers; DELETE FROM rentals; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', 'yesterday', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', 'last week', '12 blah','DC', 'DC', '2342', '534', 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-10-01', '2015-09-29', '2015-09-19'); COMMIT;", function(err) { + db_cleaner.exec("BEGIN; DELETE FROM customers; DELETE FROM rentals; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', '2013-12-23', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', '2015-09-16', '12 blah','DC', 'DC', '2342', '534', 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-10-01', '2015-09-29', '2015-09-19'); COMMIT;", function(err) { db_cleaner.close(); done(); } From 84006337cd29c14de0a1c16819fa399367ccf986 Mon Sep 17 00:00:00 2001 From: Loraine Date: Thu, 24 Sep 2015 16:32:50 -0700 Subject: [PATCH 69/78] Updated controller tests for subsets. --- test/controllers/movies.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/test/controllers/movies.js b/test/controllers/movies.js index acdf3bf..51e4dfb 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -42,15 +42,28 @@ describe("movies controller", function(){ }); }); - it("returns subset of movies", function(done) { + it("returns subset of movies sorted by title", function(done) { agent.get("/movies/title/1").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined); assert.equal(result.body.movie_subset.length, 2); - var keys = ["id", "title", "overview", "release_date", "inventory", "available"]; - assert.deepEqual(Object.keys(result.body.movie_subset[0]), keys); + assert.equal(result.body.movie_subset[0].title, "The Lone Gunmen") + assert.equal(result.body.movie_subset[1].title, "X-files: I want to believe") done(); }); }); + + it("returns subset of movies sorted by release_date", function(done) { + agent.get("/movies/release_date/1").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.movie_subset.length, 2); + assert.equal(result.body.movie_subset[0].release_date, "1999") + assert.equal(result.body.movie_subset[1].release_date, "2001") + done(); + }); + }); + }); From 74ced5443eb77742dec5838a293dbe09dfba9b35 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Thu, 24 Sep 2015 16:35:32 -0700 Subject: [PATCH 70/78] WIP on rental controller tests --- test/controllers/movies.js | 12 ++++++++++++ test/controllers/rentals.js | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/test/controllers/movies.js b/test/controllers/movies.js index acdf3bf..9547a20 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -53,4 +53,16 @@ describe("movies controller", function(){ done(); }); }); + + it("creates a new movie rental", function(done) { + agent.get("/movies/title/1").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.movie_subset.length, 2); + var keys = ["id", "title", "overview", "release_date", "inventory", "available"]; + assert.deepEqual(Object.keys(result.body.movie_subset[0]), keys); + done(); + }); + }); }); diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 1d493ff..8430039 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -33,7 +33,7 @@ describe("rentals controller", function(){ }); it("returns movie details", function(done) { - agent.get("/rentals/X-files:%20I%20want%20to%20believe/customers").set('Accept', 'application/json') + agent.post("/rentals/X-files:%20I%20want%20to%20believe/customers").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined); From e313bc1c1c97d9f26e8eadb29422c1ad2e13be8a Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Thu, 24 Sep 2015 16:45:49 -0700 Subject: [PATCH 71/78] Fixed rentals controller tests --- test/controllers/rentals.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 8430039..3e6e752 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -32,16 +32,16 @@ describe("rentals controller", function(){ }); }); - it("returns movie details", function(done) { - agent.post("/rentals/X-files:%20I%20want%20to%20believe/customers").set('Accept', 'application/json') + it("returns current customers who are renting movie", function(done) { + agent.get("/rentals/X-files:%20I%20want%20to%20believe/customers").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ + console.log(result.body); assert.equal(error, undefined); assert.equal(result.body.rental_customers.length, 1); var keys = ["id", "name", "registered_at", "address", "city", "state", "postal_code", "phone", "account_credit"]; assert.deepEqual(Object.keys(result.body.rental_customers[0]), keys); assert.equal(result.body.rental_customers[0].name, "Mulder") - // assert.equal(result.body.customers[0].overview,'misadventures of the best nerds') done(); }); }); From 2997e3129bf9261c220a0cc04e08e481a261993a Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Fri, 25 Sep 2015 10:21:04 -0700 Subject: [PATCH 72/78] Fixed some failing tests after updating test seed data. WIP on post endpoint test --- controllers/customers.js | 4 ++-- controllers/movies.js | 3 ++- test/controllers/customer.js | 6 +++--- test/controllers/movies.js | 16 +++++++++------- test/controllers/rentals.js | 25 ++++++++++++++++++++++++- test/models/movie.js | 11 +++++------ 6 files changed, 45 insertions(+), 20 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 4ff5fc1..cd4ed47 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -15,8 +15,8 @@ exports.customersController = { subset: function subset(req, res, column, pageNumber) { var customer = new Customer(); - - var offset = (pageNumber - 1) * 50; + //pagination begins at 0 + var offset = pageNumber * 50; customer.find_subset(column, 50, offset, function(err, record) { res.status(200).json({ customer_subset: record }); diff --git a/controllers/movies.js b/controllers/movies.js index e4527d6..2445b70 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -16,7 +16,8 @@ exports.moviesController = { var movie = new Movie(); - var offset = (pageNumber - 1) * 50; + //pagination begins at 0 + var offset = pageNumber * 50; movie.find_subset(column, 50, offset, function(err, record) { res.status(200).json({ movie_subset: record }); diff --git a/test/controllers/customer.js b/test/controllers/customer.js index d4209e6..613d419 100644 --- a/test/controllers/customer.js +++ b/test/controllers/customer.js @@ -42,7 +42,7 @@ describe("customers controller", function(){ it("finds customer subset pages sorted by name", function(done) { - agent.get("/customers/name/page1").set('Accept', 'application/json') + agent.get("/customers/name/page0").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined); @@ -53,7 +53,7 @@ describe("customers controller", function(){ }) it("finds customer subset pages sorted by registered_at", function(done) { - agent.get("/customers/registered_at/page1").set('Accept', 'application/json') + agent.get("/customers/registered_at/page0").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined); @@ -65,7 +65,7 @@ describe("customers controller", function(){ }) it("finds customer subset pages sorted by postal_code", function(done) { - agent.get("/customers/postal_code/page1").set('Accept', 'application/json') + agent.get("/customers/postal_code/page0").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined); diff --git a/test/controllers/movies.js b/test/controllers/movies.js index 23aac87..55b1446 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -43,25 +43,27 @@ describe("movies controller", function(){ }); it("returns subset of movies sorted by title", function(done) { - agent.get("/movies/title/1").set('Accept', 'application/json') + agent.get("/movies/title/0").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined); - assert.equal(result.body.movie_subset.length, 2); - assert.equal(result.body.movie_subset[0].title, "The Lone Gunmen") - assert.equal(result.body.movie_subset[1].title, "X-files: I want to believe") + assert.equal(result.body.movie_subset.length, 3); + assert.equal(result.body.movie_subset[0].title, "Fight the Future") + assert.equal(result.body.movie_subset[1].title, "The Lone Gunmen") + assert.equal(result.body.movie_subset[2].title, "X-files: I want to believe") done(); }); }); it("returns subset of movies sorted by release_date", function(done) { - agent.get("/movies/release_date/1").set('Accept', 'application/json') + agent.get("/movies/release_date/0").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined); - assert.equal(result.body.movie_subset.length, 2); - assert.equal(result.body.movie_subset[0].release_date, "1999") + assert.equal(result.body.movie_subset.length, 3); + assert.equal(result.body.movie_subset[0].release_date, "1998") assert.equal(result.body.movie_subset[1].release_date, "2001") + assert.equal(result.body.movie_subset[2].release_date, "2007") done(); }); }); diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 3e6e752..f309f93 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -36,7 +36,6 @@ describe("rentals controller", function(){ agent.get("/rentals/X-files:%20I%20want%20to%20believe/customers").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ - console.log(result.body); assert.equal(error, undefined); assert.equal(result.body.rental_customers.length, 1); var keys = ["id", "name", "registered_at", "address", "city", "state", "postal_code", "phone", "account_credit"]; @@ -45,4 +44,28 @@ describe("rentals controller", function(){ done(); }); }); + + describe("rentals check-in", function(){ + it.only("updates a movie's availability", function(done) { + agent.post("/rentals/new_rental/1/Fight%20The%20Future").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + console.log(result.body); + assert.equal(error, undefined); + + var new_availability + var db = new sqlite3.Database('db/test.db'); + + db.serialize (function() { + db.all("SELECT available FROM movies WHERE title= 'Fight the Future';", function(err, record) { + if (err) { + console.log(err); + } else + console.log(record); + }); + }); + done(); + }); + }); + }); }); diff --git a/test/models/movie.js b/test/models/movie.js index 7035a4d..58ef597 100644 --- a/test/models/movie.js +++ b/test/models/movie.js @@ -10,7 +10,7 @@ describe("Movie", function() { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { - db_cleaner.exec("BEGIN; DELETE FROM movies; DELETE FROM rentals; INSERT INTO movies(title, overview, release_date, inventory, available) VALUES('X-files: I want to believe', 'Mulder and Scully rock it', '1999', 4, 4), ('The Lone Gunmen', 'misadventures of the best nerds', '2001', 5, 5); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;" + db_cleaner.exec("BEGIN; DELETE FROM movies; DELETE FROM rentals; INSERT INTO movies(title, overview, release_date, inventory, available) VALUES('X-files: I want to believe', 'Mulder and Scully rock it', '2007', 4, 4), ('The Lone Gunmen', 'misadventures of the best nerds', '2001', 5, 5), ('Fight the Future', 'a bee ruins everything', '1998', 7, 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;" , function(err) { db_cleaner.close(); done(); @@ -28,7 +28,7 @@ describe("Movie", function() { movie.find_all(function(err, res) { assert.equal(err, undefined); assert(res instanceof Array); - assert.equal(res.length, 2); + assert.equal(res.length, 3); assert.equal(res[0].title, 'X-files: I want to believe'); assert.equal(res[1].title, 'The Lone Gunmen'); @@ -38,12 +38,11 @@ describe("Movie", function() { }); it("can find a subset of movies", function(done) { - movie.find_subset('title', 1, 1, function(err, res) { + movie.find_subset('release_date', 50, 0, function(err, res) { assert.equal(err, undefined); assert(res instanceof Array); - assert.equal(res.length, 1); - - assert.equal(res[0].title, 'X-files: I want to believe'); + assert.equal(res.length, 3); + assert.equal(res[0].title, 'Fight the Future'); done(); }); From 9c291395c2b989ba7f37046af2f0a112af5afed4 Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 25 Sep 2015 10:21:06 -0700 Subject: [PATCH 73/78] WIP rental model tests. --- test/models/rentals.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/models/rentals.js b/test/models/rentals.js index 35a42a2..cfe8d01 100644 --- a/test/models/rentals.js +++ b/test/models/rentals.js @@ -56,5 +56,17 @@ describe('Rental', function() { done(); }); }); + + it("checks movie availability", function(done) { + rental.check_movie_availability("The Lone Gunmen", function(err, res) { + console.log(res); + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(Object.keys(res[0]), "available"); + assert.equal(res[0].available, 5) + done(); + }); + }); }); }); From 82042f6590e019bc65dbd793a3d0b8c9300b1daa Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 25 Sep 2015 13:28:51 -0700 Subject: [PATCH 74/78] You can now use underscores to indicate spaces in titles. --- README.md | 8 ++++++++ controllers/movies.js | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/README.md b/README.md index 0fb33e4..35c3b93 100644 --- a/README.md +++ b/README.md @@ -100,3 +100,11 @@ DONE- Retrieve a subset of movies - account for negative availability - possibly refactor database.js +# Endpoints + +## Movies + +- Show all movies: http://localhost:3000/movies +- Look up past rentals for a movie: http://localhost:3000/movies/alien/past_rentals/id +- Look up current rentals for a movie +http://localhost:3000/movies/psycho/current_rentals diff --git a/controllers/movies.js b/controllers/movies.js index e4527d6..b896a09 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -2,7 +2,12 @@ var Movie = require('../models/movie'); +function titleSpaces(title) { + return title.replace("_", " "); +} + exports.moviesController = { + index: function index(req, res) { var movie = new Movie(); @@ -25,6 +30,8 @@ exports.moviesController = { current_rentals: function current_rentals(req, res, movie_title) { + movie_title = titleSpaces(movie_title); + var movie = new Movie(); movie.movie_current_customers(movie_title, function(err, record) { @@ -34,6 +41,8 @@ exports.moviesController = { past_rentals: function past_rentals(req, res, movie_title, column) { + movie_title = titleSpaces(movie_title); + var movie = new Movie(); movie.movie_past_customers(movie_title, column, function(err, record) { From 64e4e45d531976ce45c37ea4397a12fb117f7de5 Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 25 Sep 2015 13:32:14 -0700 Subject: [PATCH 75/78] You can now use underscores to indicate spaces in titles. --- controllers/rentals.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/controllers/rentals.js b/controllers/rentals.js index 0ab8e8f..79306c9 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -2,11 +2,17 @@ var Rental = require('../models/rental'); +function titleSpaces(title) { + return title.replace("_", " "); +} + exports.rentalsController = { find_movie: function find_movie(req, res, movie_title) { + movie_title = titleSpaces(movie_title); var rental = new Rental(); + rental.movie_details(movie_title, function(err, record) { res.status(200).json({ movie_details: record }); }) @@ -14,6 +20,7 @@ exports.rentalsController = { find_customers: function find_customers(req, res, movie_title) { + movie_title = titleSpaces(movie_title); var rental = new Rental(); rental.customers(movie_title, function(err, record) { @@ -32,6 +39,7 @@ exports.rentalsController = { new_rental: function new_rental(req, res, customer_id, movie_title) { + movie_title = titleSpaces(movie_title); var rental = new Rental(); // check availablity in movies table first @@ -39,6 +47,7 @@ exports.rentalsController = { if (record[0].available > 0) { console.log("we're getting somewhere"); + movie_title = titleSpaces(movie_title); //nested function inception :( // change available in movies table @@ -62,12 +71,15 @@ exports.rentalsController = { check_in: function check_in(req, res, customer_id, movie_title) { + movie_title = titleSpaces(movie_title); + var rental = new Rental(); // update the movie's available column rental.check_movie_in(movie_title, function(err, record) { // update today's date to return Date + movie_title = titleSpaces(movie_title); res.status(200).json({ new_rental: "You've successfully updated the availability." }); From a1f83bf49913ed7c7867a2b18315fc637d061491 Mon Sep 17 00:00:00 2001 From: Loraine Date: Fri, 25 Sep 2015 13:47:40 -0700 Subject: [PATCH 76/78] Documented movies and rental endpoints. --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 35c3b93..9ea04e2 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,22 @@ DONE- Retrieve a subset of movies ## Movies -- Show all movies: http://localhost:3000/movies +- Show all movies: +http://localhost:3000/movies - Look up past rentals for a movie: http://localhost:3000/movies/alien/past_rentals/id - Look up current rentals for a movie http://localhost:3000/movies/psycho/current_rentals +- Pagination for name +??????? +______ +## Rentals +- Check out a new title +curl -X POST http://localhost:3000/rentals/new_rental/4/the_exorcist +- Check in a title +curl -X PUT http://localhost:3000/rentals/check_in/4/the_exorcist +- Check overdue rentals +http://localhost:3000/rentals/overdue +- Look at the movie's details +http://localhost:3000/rentals/the_exorcist +- Find a movie's current customer rentals +http://localhost:3000/rentals/the_exorcist/customers From 68a49f09ac38fd702158c3213269f372b151ce75 Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Fri, 25 Sep 2015 14:05:21 -0700 Subject: [PATCH 77/78] Added final endpoint tests --- controllers/rentals.js | 2 +- routes/rentals.js | 1 - test/controllers/customer.js | 1 - test/controllers/rentals.js | 108 +++++++++++++++++++++++++++++------ test/models/customer.js | 2 +- test/models/movie.js | 2 +- 6 files changed, 93 insertions(+), 23 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 0ab8e8f..792361e 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -37,7 +37,7 @@ exports.rentalsController = { // check availablity in movies table first rental.check_movie_availability(movie_title, function(err, record) { if (record[0].available > 0) { - console.log("we're getting somewhere"); + // console.log("we're getting somewhere"); //nested function inception :( diff --git a/routes/rentals.js b/routes/rentals.js index a790889..99a9d05 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -35,5 +35,4 @@ router.get('/:movie_title/customers', function(req, res, next) { - module.exports = router; diff --git a/test/controllers/customer.js b/test/controllers/customer.js index 613d419..b3da29e 100644 --- a/test/controllers/customer.js +++ b/test/controllers/customer.js @@ -57,7 +57,6 @@ describe("customers controller", function(){ .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined); - console.log(result.body); assert.equal(result.body.customer_subset[0].registered_at, "2013-12-23"); assert.equal(result.body.customer_subset[1].registered_at, "2015-09-16"); done(); diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index f309f93..bc77578 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -4,6 +4,27 @@ var request = require('supertest'), sqlite3 = require('sqlite3').verbose(), agent = request.agent(app); +// describe('Rental', function() { +// var rental, +// db_cleaner; + +// afterEach(function(done) { +// rental = new Rental(); + +// db_cleaner = new sqlite3.Database('db/test.db'); +// db_cleaner.serialize(function() { + +// db_cleaner.exec("BEGIN; DELETE FROM rentals; COMMIT;", function(err) { + +// db_cleaner.close(); +// done(); +// } +// ); +// }); +// }); +// }); + + describe("rentals controller", function(){ it("returns customers with overdue rentals", function(done) { agent.get("/rentals/overdue").set('Accept', 'application/json') @@ -45,27 +66,78 @@ describe("rentals controller", function(){ }); }); - describe("rentals check-in", function(){ - it.only("updates a movie's availability", function(done) { - agent.post("/rentals/new_rental/1/Fight%20The%20Future").set('Accept', 'application/json') - .expect('Content-Type', /application\/json/) - .expect(200, function(error, result){ - console.log(result.body); - assert.equal(error, undefined); + describe("rentals check-in", function(){ + it("updates a movie's availability", function(done) { + agent.post("/rentals/new_rental/1/Fight%20The%20Future").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); - var new_availability - var db = new sqlite3.Database('db/test.db'); + var db = new sqlite3.Database('db/test.db'); - db.serialize (function() { + db.serialize (function () { db.all("SELECT available FROM movies WHERE title= 'Fight the Future';", function(err, record) { - if (err) { - console.log(err); - } else - console.log(record); + new_value = (record[0].available); + assert.equal(new_value, 6) + done(); }); }); - done(); - }); + }); + }); + }); + + it("inserts a new rental into the rental database", function(done) { + agent.post("/rentals/new_rental/1/The%20Lone%20Gunmen").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + + var db = new sqlite3.Database('db/test.db'); + + db.serialize (function () { + db.all("SELECT * FROM rentals;", function(err, record) { + assert.equal(record.length, 3); + done(); + }); + }); + }); + }); + + it("charges the customer", function(done) { + agent.post("/rentals/new_rental/2/X-files:%20I%20want%20to%20believe").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + assert.equal(result.body.new_rental, "You've successfully charged the customer."); + + var db = new sqlite3.Database('db/test.db'); + + db.serialize (function () { + db.all("SELECT account_credit FROM customers WHERE id=2;", function(err, record) { + assert.equal(record[0].account_credit, 6.0); + done(); + }); + }); + }); + }); + + + it("checks in a movie and updates movie availability", function(done) { + agent.put("/rentals/check_in/1/X-files:%20I%20want%20to%20believe").set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result){ + assert.equal(error, undefined); + + var db = new sqlite3.Database('db/test.db'); + + db.serialize (function () { + db.all("SELECT * FROM rentals WHERE customer_id= 1 AND movie_id =(SELECT id FROM movies WHERE title='X-files: I want to believe');", function(err, record) { + var today = new Date().toISOString().slice(0, 10); + assert.equal(record[0].returned_date, today); + done(); + }); + }); + }); + }); }); - }); -}); + diff --git a/test/models/customer.js b/test/models/customer.js index 0c1dcd1..d9e93b9 100644 --- a/test/models/customer.js +++ b/test/models/customer.js @@ -12,7 +12,7 @@ describe('Customer', function() { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { - db_cleaner.exec("BEGIN; DELETE FROM customers; DELETE FROM rentals; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', '2013-12-23', '123', 'DC', 'DC', '834885', '49583', 5), ('Scully', '2015-09-16', '12 blah','DC', 'DC', '2342', '534', 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;", function(err) { + db_cleaner.exec("BEGIN; DELETE FROM customers; DELETE FROM rentals; INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) VALUES('Mulder', '2013-12-23', '123', 'DC', 'DC', '834885', '49583', 5.0), ('Scully', '2015-09-16', '12 blah','DC', 'DC', '2342', '534', 7.0); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;", function(err) { db_cleaner.close(); done(); diff --git a/test/models/movie.js b/test/models/movie.js index 58ef597..5a1db37 100644 --- a/test/models/movie.js +++ b/test/models/movie.js @@ -10,7 +10,7 @@ describe("Movie", function() { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { - db_cleaner.exec("BEGIN; DELETE FROM movies; DELETE FROM rentals; INSERT INTO movies(title, overview, release_date, inventory, available) VALUES('X-files: I want to believe', 'Mulder and Scully rock it', '2007', 4, 4), ('The Lone Gunmen', 'misadventures of the best nerds', '2001', 5, 5), ('Fight the Future', 'a bee ruins everything', '1998', 7, 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;" + db_cleaner.exec("BEGIN; DELETE FROM movies; DELETE FROM rentals; INSERT INTO movies(title, overview, release_date, inventory, available) VALUES('X-files: I want to believe', 'Mulder and Scully rock it', '2007', 4, 3), ('The Lone Gunmen', 'misadventures of the best nerds', '2001', 5, 5), ('Fight the Future', 'a bee ruins everything', '1998', 7, 7); INSERT INTO rentals(movie_id, customer_id, returned_date, due_date, checked_out) VALUES(1, 1, '', '2015-09-10', '2015-09-01'), (2, 2, '2015-09-30', '2015-10-01', '2015-09-15'); COMMIT;" , function(err) { db_cleaner.close(); done(); From 2a5b82845f209a8f7831d1518171ce7f8910d26f Mon Sep 17 00:00:00 2001 From: Lila Garcia Date: Fri, 25 Sep 2015 14:17:37 -0700 Subject: [PATCH 78/78] updated readme --- README.md | 18 ++++++++++++++++-- routes/movies.js | 2 +- test/controllers/movies.js | 4 ++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9ea04e2..4ba6ed9 100644 --- a/README.md +++ b/README.md @@ -109,9 +109,21 @@ http://localhost:3000/movies - Look up past rentals for a movie: http://localhost:3000/movies/alien/past_rentals/id - Look up current rentals for a movie http://localhost:3000/movies/psycho/current_rentals -- Pagination for name -??????? +- Pagination for title +http://localhost:3000/movies/title/page1 ______ + +## Customers +-Show all customers: +http://localhost:3000/customers +- Loop at subset of customers sorted by name, registered at, postal_code +http://localhost:3000/customers/name/page1 +- Show customers current rentals +http://localhost:3000/customers/1/current_rentals +- Customers past rentals +http://localhost:3000/customers/2/current_rentals + + ## Rentals - Check out a new title curl -X POST http://localhost:3000/rentals/new_rental/4/the_exorcist @@ -123,3 +135,5 @@ http://localhost:3000/rentals/overdue http://localhost:3000/rentals/the_exorcist - Find a movie's current customer rentals http://localhost:3000/rentals/the_exorcist/customers + + diff --git a/routes/movies.js b/routes/movies.js index 0b672c3..0f98f54 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -22,7 +22,7 @@ router.get('/:movie_title/current_rentals', function(req, res, next) { // movies/name/1 -router.get('/:column/:number', function(req, res, next) { +router.get('/:column/page:number', function(req, res, next) { return movie_exports.moviesController.subset(req, res, req.params.column, req.params.number); }); diff --git a/test/controllers/movies.js b/test/controllers/movies.js index 55b1446..a4fe8d8 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -43,7 +43,7 @@ describe("movies controller", function(){ }); it("returns subset of movies sorted by title", function(done) { - agent.get("/movies/title/0").set('Accept', 'application/json') + agent.get("/movies/title/page0").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined); @@ -56,7 +56,7 @@ describe("movies controller", function(){ }); it("returns subset of movies sorted by release_date", function(done) { - agent.get("/movies/release_date/0").set('Accept', 'application/json') + agent.get("/movies/release_date/page0").set('Accept', 'application/json') .expect('Content-Type', /application\/json/) .expect(200, function(error, result){ assert.equal(error, undefined);