From 9f2e721d5ecc4d24f0aaf5ab844a7dabde8999fb Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Tue, 15 Sep 2015 16:39:31 -0700 Subject: [PATCH 01/75] Fresh node install. --- .gitignore | 3 ++ app/app.js | 60 +++++++++++++++++++++ app/bin/www | 90 ++++++++++++++++++++++++++++++++ app/package.json | 17 ++++++ app/public/stylesheets/style.css | 8 +++ app/routes/index.js | 9 ++++ app/routes/users.js | 9 ++++ app/views/error.jade | 6 +++ app/views/index.jade | 5 ++ app/views/layout.jade | 7 +++ 10 files changed, 214 insertions(+) create mode 100644 app/app.js create mode 100755 app/bin/www create mode 100644 app/package.json create mode 100644 app/public/stylesheets/style.css create mode 100644 app/routes/index.js create mode 100644 app/routes/users.js create mode 100644 app/views/error.jade create mode 100644 app/views/index.jade create mode 100644 app/views/layout.jade diff --git a/.gitignore b/.gitignore index e43b0f9..2f17085 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ .DS_Store +node_modules +app/node_modules +npm-debug.log diff --git a/app/app.js b/app/app.js new file mode 100644 index 0000000..80a3c36 --- /dev/null +++ b/app/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/app/bin/www b/app/bin/www new file mode 100755 index 0000000..a8c2d36 --- /dev/null +++ b/app/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('app: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/app/package.json b/app/package.json new file mode 100644 index 0000000..64e5d9a --- /dev/null +++ b/app/package.json @@ -0,0 +1,17 @@ +{ + "name": "app", + "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" + } +} diff --git a/app/public/stylesheets/style.css b/app/public/stylesheets/style.css new file mode 100644 index 0000000..9453385 --- /dev/null +++ b/app/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/app/routes/index.js b/app/routes/index.js new file mode 100644 index 0000000..ecca96a --- /dev/null +++ b/app/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/app/routes/users.js b/app/routes/users.js new file mode 100644 index 0000000..623e430 --- /dev/null +++ b/app/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/app/views/error.jade b/app/views/error.jade new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/app/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/app/views/index.jade b/app/views/index.jade new file mode 100644 index 0000000..3d63b9a --- /dev/null +++ b/app/views/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p Welcome to #{title} diff --git a/app/views/layout.jade b/app/views/layout.jade new file mode 100644 index 0000000..15af079 --- /dev/null +++ b/app/views/layout.jade @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content From 03673d664a89fc4b6888a57c3623a24213c74007 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Tue, 15 Sep 2015 16:43:28 -0700 Subject: [PATCH 02/75] Added scaffolding notes so we both have access to them. --- videostore_scaffolding.md | 51 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 videostore_scaffolding.md diff --git a/videostore_scaffolding.md b/videostore_scaffolding.md new file mode 100644 index 0000000..6677c74 --- /dev/null +++ b/videostore_scaffolding.md @@ -0,0 +1,51 @@ +### Customers +- Retrieve a list of all customers +GET /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) +GET /customers/:column/:p + +-Given a customer's id... +GET /customers/:id + +-List the movies they currently have checked out +GET /customers/:id/movies + +-List the movies a customer has checked out in the past +Get /customers/:id/history + +### Movies +- Retrieve a list of all movies +GET /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) +GET /movies/:column/:p + +- Get a list of customers that have _currently_ checked out a copy of the film +GET /movies/:title/customers + + - Get a list of customers that have checked out a copy _in the past_ +GET /movies/:title/history + +### Rental +- Look a movie up by title to see +GET /movies/:title + +- Know if a movie has any inventory available to rent +GET /movies/:title/:checked_out + +- See a list of customers that have _currently_ checked out any of the movie's inventory +`This is identical to the requirements under movie` +GET /movies/:title + +- Given a customer's `id` and a movie's `title` ... + - "check out" one of the movie's inventory to the customer + POST /customers/:id/:title + + - "check in" one of customer's rentals + PATCH /customers/:id/:title + +- See a list of customers with overdue movies +GET /customers/overdue From ae08ed164912f3c8bdf5efbbba67c4f798df1bd7 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Tue, 15 Sep 2015 16:53:00 -0700 Subject: [PATCH 03/75] Set up practice route and controller to return zomg. --- app/controllers/index.js | 12 ++++++++++++ app/routes/index.js | 5 +++-- 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 app/controllers/index.js diff --git a/app/controllers/index.js b/app/controllers/index.js new file mode 100644 index 0000000..3a9cbfe --- /dev/null +++ b/app/controllers/index.js @@ -0,0 +1,12 @@ +"use strict"; + +exports.indexController = { + zomg: function zomg(req,res) { + var results = { + zomg: "zomg it WORKED!", + moar: "zomg moar" + }; + + return res.status(200).json(results); + }, +} diff --git a/app/routes/index.js b/app/routes/index.js index ecca96a..1231b24 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -1,9 +1,10 @@ var express = require('express'); var router = express.Router(); +var index_exports = require('../controllers/index'); -/* GET home page. */ +/* GET zomg for practice. */ router.get('/', function(req, res, next) { - res.render('index', { title: 'Express' }); + return index_exports.indexController.zomg(req,res); }); module.exports = router; From fcb55f534bf75bd81c9812c69560b2a23f1b862e Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Thu, 17 Sep 2015 13:32:47 -0700 Subject: [PATCH 04/75] Added database.js, movies controller, and movies routes files. --- app/controllers/movies.js | 10 ++++++++++ app/database.js | 9 +++++++++ app/routes/{users.js => movies.js} | 4 ++-- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 app/controllers/movies.js create mode 100644 app/database.js rename app/routes/{users.js => movies.js} (64%) diff --git a/app/controllers/movies.js b/app/controllers/movies.js new file mode 100644 index 0000000..0338f0d --- /dev/null +++ b/app/controllers/movies.js @@ -0,0 +1,10 @@ +"use strict"; + +exports.moviesController = { + database_test: function(req, res) { + var db = new Database(); // instantiates Database object + db.test(); + + return res.status(200).json(results); + }, +} diff --git a/app/database.js b/app/database.js new file mode 100644 index 0000000..f4b6eff --- /dev/null +++ b/app/database.js @@ -0,0 +1,9 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(); + +function Database(path) { + this.path = path; +} + +module.exports = Database; diff --git a/app/routes/users.js b/app/routes/movies.js similarity index 64% rename from app/routes/users.js rename to app/routes/movies.js index 623e430..0d4642b 100644 --- a/app/routes/users.js +++ b/app/routes/movies.js @@ -1,9 +1,9 @@ var express = require('express'); var router = express.Router(); -/* GET users listing. */ +/* GET /movies */ router.get('/', function(req, res, next) { - res.send('respond with a resource'); + return movies_exports.moviesController.movies(req, res); }); module.exports = router; From eeec08dfab0ab2113ee40bbf814add388af25ddb Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Thu, 17 Sep 2015 13:44:34 -0700 Subject: [PATCH 05/75] Added mocha for testing, wrote a coupel preliminary tests, wrote initial query method for movies table. --- app/database.js | 11 +++++++++++ app/package.json | 1 + app/test/database_tests.js | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 app/test/database_tests.js diff --git a/app/database.js b/app/database.js index f4b6eff..bf6840d 100644 --- a/app/database.js +++ b/app/database.js @@ -6,4 +6,15 @@ function Database(path) { this.path = path; } +Database.prototype = { + query: function() { + var db = new sqlite3.Database(this.path); + + db.serialize(function() { + var movies = db.run("SELECT * FROM movies;"); + }); + db.close(); + } +} + module.exports = Database; diff --git a/app/package.json b/app/package.json index 64e5d9a..d6b9af7 100644 --- a/app/package.json +++ b/app/package.json @@ -11,6 +11,7 @@ "debug": "~2.2.0", "express": "~4.13.1", "jade": "~1.11.0", + "mocha": "^2.3.2", "morgan": "~1.6.1", "serve-favicon": "~2.3.0" } diff --git a/app/test/database_tests.js b/app/test/database_tests.js new file mode 100644 index 0000000..a9ea0b4 --- /dev/null +++ b/app/test/database_tests.js @@ -0,0 +1,19 @@ +var assert = require("assert"); +var Database = require("../database"); + +describe("Database", function () { + var db; + + beforeEach(function() { + db = new Database(); + }); + + it("can be instantiated", function() { + assert.equal(db instanceof Database, true) + }); + + it("has a 'query' property that is a function", function() { + assert.equal(typeof db.query, "function"); + }); + +}); From b4c36e9240abac1e78aecb66017824d82e236ebc Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Thu, 17 Sep 2015 14:35:09 -0700 Subject: [PATCH 06/75] Created schema and seed functionality for customers table, then seeded. --- app/db/development.db | Bin 0 -> 73728 bytes app/utils/customers.json | 2202 ++++++++++++++++++++++++++++++++++++++ app/utils/movies.json | 602 +++++++++++ app/utils/schema.js | 48 + app/utils/seed.js | 77 ++ 5 files changed, 2929 insertions(+) create mode 100644 app/db/development.db create mode 100644 app/utils/customers.json create mode 100644 app/utils/movies.json create mode 100644 app/utils/schema.js create mode 100644 app/utils/seed.js diff --git a/app/db/development.db b/app/db/development.db new file mode 100644 index 0000000000000000000000000000000000000000..69cc20d15d7978d4f3815f67bbc45ecf22ff34ad GIT binary patch literal 73728 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 ys1lO6xR#dQ2Nc5R Date: Thu, 17 Sep 2015 14:37:47 -0700 Subject: [PATCH 07/75] moved seed files --- customers.json | 2202 ------------------------------------------------ movies.json | 602 ------------- 2 files changed, 2804 deletions(-) delete mode 100644 customers.json delete mode 100644 movies.json diff --git a/customers.json b/customers.json deleted file mode 100644 index a615fdd..0000000 --- a/customers.json +++ /dev/null @@ -1,2202 +0,0 @@ -[ - { - "id": "1", - "name": "Shelley Rocha", - "registered_at": "Wed, 29 Apr 2015 07:54:14 -0700", - "address": "Ap #292-5216 Ipsum Rd.", - "city": "Hillsboro", - "state": "OR", - "postal_code": "24309", - "phone": "(322) 510-8695", - "account_credit": 13.15 - }, - { - "id": "2", - "name": "Curran Stout", - "registered_at": "Wed, 16 Apr 2014 21:40:20 -0700", - "address": "Ap #658-1540 Erat Rd.", - "city": "San Francisco", - "state": "California", - "postal_code": "94267", - "phone": "(908) 949-6758", - "account_credit": 35.66 - }, - { - "id": "3", - "name": "Roanna Robinson", - "registered_at": "Fri, 28 Nov 2014 13:14:08 -0800", - "address": "Ap #561-4214 Eget St.", - "city": "Harrisburg", - "state": "PA", - "postal_code": "15867", - "phone": "(323) 336-1841", - "account_credit": 50.39 - }, - { - "id": "4", - "name": "Carolyn Chandler", - "registered_at": "Fri, 04 Jul 2014 11:05:11 -0700", - "address": "133-8707 Arcu. Avenue", - "city": "Fort Wayne", - "state": "IN", - "postal_code": "73684", - "phone": "(234) 837-2886", - "account_credit": 21.79 - }, - { - "id": "5", - "name": "Aquila Riddle", - "registered_at": "Thu, 27 Aug 2015 08:17:24 -0700", - "address": "Ap #187-9582 Primis St.", - "city": "Tacoma", - "state": "WA", - "postal_code": "73251", - "phone": "(925) 161-2223", - "account_credit": 17.82 - }, - { - "id": "6", - "name": "Phyllis Russell", - "registered_at": "Wed, 02 Apr 2014 21:44:46 -0700", - "address": "746-8511 Ipsum Ave", - "city": "Boise", - "state": "Idaho", - "postal_code": "76759", - "phone": "(961) 964-5158", - "account_credit": 88.67 - }, - { - "id": "7", - "name": "Rajah Riggs", - "registered_at": "Tue, 28 Jan 2014 22:28:45 -0800", - "address": "Ap #881-3920 Malesuada Avenue", - "city": "Norman", - "state": "OK", - "postal_code": "36134", - "phone": "(540) 515-2339", - "account_credit": 30.14 - }, - { - "id": "8", - "name": "Amanda Curtis", - "registered_at": "Tue, 18 Nov 2014 00:43:15 -0800", - "address": "Ap #773-125 Nunc St.", - "city": "Iowa City", - "state": "Iowa", - "postal_code": "18538", - "phone": "(253) 271-5290", - "account_credit": 47.22 - }, - { - "id": "9", - "name": "Jacqueline Perry", - "registered_at": "Thu, 23 Jul 2015 10:18:35 -0700", - "address": "Ap #288-7228 Dis Rd.", - "city": "Anchorage", - "state": "AK", - "postal_code": "99789", - "phone": "(479) 207-8414", - "account_credit": 96.28 - }, - { - "id": "10", - "name": "Quinlan Rich", - "registered_at": "Fri, 10 Jul 2015 15:23:06 -0700", - "address": "Ap #727-9607 Nibh Avenue", - "city": "Hilo", - "state": "HI", - "postal_code": "63747", - "phone": "(521) 124-5753", - "account_credit": 68.41 - }, - { - "id": "11", - "name": "Ciara Summers", - "registered_at": "Thu, 09 Jul 2015 22:12:11 -0700", - "address": "Ap #412-1462 Molestie St.", - "city": "Grand Rapids", - "state": "Michigan", - "postal_code": "44906", - "phone": "(473) 496-4835", - "account_credit": 56.88 - }, - { - "id": "12", - "name": "Alfreda Hines", - "registered_at": "Wed, 19 Aug 2015 23:18:27 -0700", - "address": "P.O. Box 754, 627 Erat Avenue", - "city": "Anchorage", - "state": "Alaska", - "postal_code": "99915", - "phone": "(921) 910-1283", - "account_credit": 55.59 - }, - { - "id": "13", - "name": "Eugenia Roberson", - "registered_at": "Sun, 23 Feb 2014 10:19:11 -0800", - "address": "Ap #781-1953 Suspendisse Road", - "city": "Jackson", - "state": "MS", - "postal_code": "67415", - "phone": "(900) 501-6947", - "account_credit": 22.71 - }, - { - "id": "14", - "name": "Ferris Robles", - "registered_at": "Mon, 16 Mar 2015 16:45:12 -0700", - "address": "P.O. Box 344, 4911 Semper Rd.", - "city": "Independence", - "state": "Missouri", - "postal_code": "46428", - "phone": "(569) 834-1872", - "account_credit": 4.91 - }, - { - "id": "15", - "name": "Sopoline Fisher", - "registered_at": "Sun, 18 May 2014 18:25:58 -0700", - "address": "543-8042 Porttitor Avenue", - "city": "Knoxville", - "state": "TN", - "postal_code": "23142", - "phone": "(603) 919-2974", - "account_credit": 53.63 - }, - { - "id": "16", - "name": "Vivien Justice", - "registered_at": "Mon, 22 Sep 2014 16:07:07 -0700", - "address": "790-3681 Lobortis Rd.", - "city": "Sterling Heights", - "state": "MI", - "postal_code": "54505", - "phone": "(563) 349-0325", - "account_credit": 83.76 - }, - { - "id": "17", - "name": "Ginger Heath", - "registered_at": "Fri, 27 Feb 2015 03:10:39 -0800", - "address": "Ap #395-9452 Quisque St.", - "city": "Billings", - "state": "Montana", - "postal_code": "25054", - "phone": "(572) 140-2058", - "account_credit": 89.69 - }, - { - "id": "18", - "name": "Kieran Calhoun", - "registered_at": "Sun, 24 Aug 2014 03:03:45 -0700", - "address": "Ap #854-9111 Nunc, Road", - "city": "Savannah", - "state": "GA", - "postal_code": "47373", - "phone": "(909) 486-8575", - "account_credit": 61.8 - }, - { - "id": "19", - "name": "Winter Stephenson", - "registered_at": "Fri, 07 Aug 2015 08:09:11 -0700", - "address": "P.O. Box 887, 4257 Lorem Rd.", - "city": "Salt Lake City", - "state": "Utah", - "postal_code": "63684", - "phone": "(466) 617-0803", - "account_credit": 1.41 - }, - { - "id": "20", - "name": "Mallory Weaver", - "registered_at": "Sat, 12 Jul 2014 18:15:55 -0700", - "address": "7297 Tortor, Avenue", - "city": "Houston", - "state": "Texas", - "postal_code": "89807", - "phone": "(727) 342-1336", - "account_credit": 65.24 - }, - { - "id": "21", - "name": "Audra Vance", - "registered_at": "Sat, 01 Nov 2014 01:37:40 -0700", - "address": "P.O. Box 906, 9067 A Street", - "city": "Columbus", - "state": "Ohio", - "postal_code": "43007", - "phone": "(832) 502-4114", - "account_credit": 76.71 - }, - { - "id": "22", - "name": "Aladdin Fowler", - "registered_at": "Mon, 25 May 2015 02:50:55 -0700", - "address": "Ap #548-6390 Ornare Av.", - "city": "Aurora", - "state": "IL", - "postal_code": "92483", - "phone": "(201) 728-7318", - "account_credit": 90.12 - }, - { - "id": "23", - "name": "Dominique Battle", - "registered_at": "Sat, 25 Jan 2014 01:47:14 -0800", - "address": "P.O. Box 753, 5236 At Rd.", - "city": "Gaithersburg", - "state": "MD", - "postal_code": "49893", - "phone": "(385) 326-1715", - "account_credit": 88.51 - }, - { - "id": "24", - "name": "Kimberly Savage", - "registered_at": "Sat, 20 Sep 2014 02:37:33 -0700", - "address": "Ap #888-6281 Aliquam Av.", - "city": "Virginia Beach", - "state": "VA", - "postal_code": "50164", - "phone": "(285) 195-0154", - "account_credit": 41.86 - }, - { - "id": "25", - "name": "Branden Craig", - "registered_at": "Mon, 22 Sep 2014 21:05:52 -0700", - "address": "768-8145 Elit Road", - "city": "Hattiesburg", - "state": "MS", - "postal_code": "99128", - "phone": "(972) 938-4626", - "account_credit": 92.64 - }, - { - "id": "26", - "name": "Hammett Beach", - "registered_at": "Sat, 23 Aug 2014 13:57:12 -0700", - "address": "206-6384 Morbi Road", - "city": "Butte", - "state": "MT", - "postal_code": "54656", - "phone": "(833) 249-0504", - "account_credit": 60.65 - }, - { - "id": "27", - "name": "Dai Meadows", - "registered_at": "Sun, 17 Aug 2014 03:38:21 -0700", - "address": "1083 Enim, St.", - "city": "Sioux City", - "state": "IA", - "postal_code": "63549", - "phone": "(204) 993-4985", - "account_credit": 87.9 - }, - { - "id": "28", - "name": "Grady Chang", - "registered_at": "Mon, 18 May 2015 04:03:19 -0700", - "address": "8819 Nam St.", - "city": "Sacramento", - "state": "CA", - "postal_code": "90337", - "phone": "(306) 153-3636", - "account_credit": 75.94 - }, - { - "id": "29", - "name": "Cody Woodard", - "registered_at": "Tue, 24 Jun 2014 01:42:54 -0700", - "address": "P.O. Box 990, 1927 Quis Ave", - "city": "Gaithersburg", - "state": "Maryland", - "postal_code": "68459", - "phone": "(606) 363-0837", - "account_credit": 97.75 - }, - { - "id": "30", - "name": "Ulysses Whitfield", - "registered_at": "Thu, 20 Nov 2014 19:38:20 -0800", - "address": "906-7966 Adipiscing Street", - "city": "Laramie", - "state": "Wyoming", - "postal_code": "95684", - "phone": "(371) 627-1105", - "account_credit": 93.18 - }, - { - "id": "31", - "name": "Olympia Dyer", - "registered_at": "Wed, 25 Jun 2014 16:02:49 -0700", - "address": "152-525 Odio St.", - "city": "Sandy", - "state": "Utah", - "postal_code": "25061", - "phone": "(124) 172-2031", - "account_credit": 55.17 - }, - { - "id": "32", - "name": "Kristen Snyder", - "registered_at": "Fri, 13 Feb 2015 18:00:19 -0800", - "address": "P.O. Box 610, 7930 Vivamus Av.", - "city": "West Jordan", - "state": "UT", - "postal_code": "50965", - "phone": "(977) 906-9656", - "account_credit": 61.89 - }, - { - "id": "33", - "name": "Mira Stokes", - "registered_at": "Tue, 01 Apr 2014 06:42:52 -0700", - "address": "Ap #630-1483 Luctus Rd.", - "city": "Columbia", - "state": "MD", - "postal_code": "66923", - "phone": "(473) 271-3425", - "account_credit": 95.92 - }, - { - "id": "34", - "name": "Ulla Skinner", - "registered_at": "Mon, 21 Jul 2014 11:28:05 -0700", - "address": "318-7550 Placerat St.", - "city": "Colorado Springs", - "state": "Colorado", - "postal_code": "91540", - "phone": "(718) 770-3057", - "account_credit": 41.64 - }, - { - "id": "35", - "name": "Amelia Brock", - "registered_at": "Thu, 21 May 2015 09:58:26 -0700", - "address": "499-4567 Metus Av.", - "city": "Jackson", - "state": "Mississippi", - "postal_code": "19969", - "phone": "(313) 638-8556", - "account_credit": 29.1 - }, - { - "id": "36", - "name": "Dexter Frank", - "registered_at": "Sat, 01 Aug 2015 20:01:22 -0700", - "address": "P.O. Box 413, 407 Senectus St.", - "city": "Wyoming", - "state": "Wyoming", - "postal_code": "71026", - "phone": "(753) 112-2298", - "account_credit": 83.79 - }, - { - "id": "37", - "name": "Yoshi Willis", - "registered_at": "Sun, 02 Mar 2014 05:18:40 -0800", - "address": "9648 Magna Rd.", - "city": "Sioux City", - "state": "Iowa", - "postal_code": "57062", - "phone": "(592) 873-3593", - "account_credit": 56.74 - }, - { - "id": "38", - "name": "Marah Ballard", - "registered_at": "Sat, 24 Jan 2015 01:05:36 -0800", - "address": "6452 Integer Av.", - "city": "Juneau", - "state": "AK", - "postal_code": "99933", - "phone": "(482) 351-7984", - "account_credit": 68.42 - }, - { - "id": "39", - "name": "Eugenia Cherry", - "registered_at": "Wed, 15 Jul 2015 14:04:05 -0700", - "address": "P.O. Box 749, 4159 Aliquam Rd.", - "city": "Stamford", - "state": "Connecticut", - "postal_code": "29863", - "phone": "(318) 627-4305", - "account_credit": 75.71 - }, - { - "id": "40", - "name": "Porter Mclean", - "registered_at": "Mon, 27 Jan 2014 05:32:30 -0800", - "address": "Ap #450-3061 Turpis St.", - "city": "New Orleans", - "state": "Louisiana", - "postal_code": "70087", - "phone": "(764) 362-7391", - "account_credit": 44.94 - }, - { - "id": "41", - "name": "Philip Patton", - "registered_at": "Tue, 24 Jun 2014 01:28:07 -0700", - "address": "P.O. Box 210, 857 Non, Street", - "city": "Aurora", - "state": "Illinois", - "postal_code": "88138", - "phone": "(188) 787-8862", - "account_credit": 17.53 - }, - { - "id": "42", - "name": "Charlotte Turner", - "registered_at": "Mon, 26 May 2014 21:16:12 -0700", - "address": "8543 Cubilia Avenue", - "city": "Bridgeport", - "state": "CT", - "postal_code": "26116", - "phone": "(629) 711-4885", - "account_credit": 73.15 - }, - { - "id": "43", - "name": "Camden Aguirre", - "registered_at": "Fri, 17 Oct 2014 00:21:57 -0700", - "address": "P.O. Box 100, 8703 Libero Ave", - "city": "Nampa", - "state": "ID", - "postal_code": "13381", - "phone": "(277) 267-0388", - "account_credit": 76.4 - }, - { - "id": "44", - "name": "Samuel Santana", - "registered_at": "Sun, 22 Mar 2015 02:28:48 -0700", - "address": "1605 Quis St.", - "city": "Bellevue", - "state": "Washington", - "postal_code": "67560", - "phone": "(678) 717-4843", - "account_credit": 71.72 - }, - { - "id": "45", - "name": "Sheila Olsen", - "registered_at": "Wed, 18 Feb 2015 17:11:30 -0800", - "address": "2058 Tristique Av.", - "city": "Eugene", - "state": "Oregon", - "postal_code": "63846", - "phone": "(574) 608-9527", - "account_credit": 49.09 - }, - { - "id": "46", - "name": "Acton Gilliam", - "registered_at": "Thu, 26 Feb 2015 20:00:53 -0800", - "address": "Ap #508-8214 Senectus Av.", - "city": "Portland", - "state": "Oregon", - "postal_code": "62594", - "phone": "(903) 973-1984", - "account_credit": 48.64 - }, - { - "id": "47", - "name": "Carla Fox", - "registered_at": "Fri, 16 Jan 2015 21:56:04 -0800", - "address": "4092 Duis St.", - "city": "Biloxi", - "state": "MS", - "postal_code": "67389", - "phone": "(438) 573-5618", - "account_credit": 25.7 - }, - { - "id": "48", - "name": "Ursa Harrell", - "registered_at": "Fri, 21 Nov 2014 23:21:44 -0800", - "address": "8070 Nec Rd.", - "city": "Henderson", - "state": "NV", - "postal_code": "87045", - "phone": "(951) 243-9155", - "account_credit": 41.1 - }, - { - "id": "49", - "name": "Stephanie Foley", - "registered_at": "Mon, 19 May 2014 22:06:51 -0700", - "address": "6806 Volutpat. Street", - "city": "Sioux City", - "state": "IA", - "postal_code": "48520", - "phone": "(562) 674-5565", - "account_credit": 2.94 - }, - { - "id": "50", - "name": "Isabelle Riley", - "registered_at": "Thu, 24 Jul 2014 22:30:47 -0700", - "address": "365-2351 Metus. St.", - "city": "San Antonio", - "state": "Texas", - "postal_code": "42972", - "phone": "(592) 610-6185", - "account_credit": 38.76 - }, - { - "id": "51", - "name": "Olivia Guy", - "registered_at": "Wed, 14 May 2014 08:39:33 -0700", - "address": "8409 Libero Rd.", - "city": "San Francisco", - "state": "California", - "postal_code": "90775", - "phone": "(373) 139-6846", - "account_credit": 44.63 - }, - { - "id": "52", - "name": "Kenneth Rowland", - "registered_at": "Fri, 13 Jun 2014 21:21:50 -0700", - "address": "Ap #862-3617 Cursus Avenue", - "city": "Chattanooga", - "state": "TN", - "postal_code": "54509", - "phone": "(650) 912-9706", - "account_credit": 88.74 - }, - { - "id": "53", - "name": "Zorita Buchanan", - "registered_at": "Sat, 12 Jul 2014 22:22:47 -0700", - "address": "3413 Lectus Avenue", - "city": "Richmond", - "state": "Virginia", - "postal_code": "49611", - "phone": "(109) 544-5498", - "account_credit": 73.2 - }, - { - "id": "54", - "name": "Galvin Daniels", - "registered_at": "Wed, 08 Jan 2014 03:33:40 -0800", - "address": "506-7584 Adipiscing Street", - "city": "Birmingham", - "state": "Alabama", - "postal_code": "36049", - "phone": "(863) 203-7464", - "account_credit": 99.37 - }, - { - "id": "55", - "name": "Hamilton Hunter", - "registered_at": "Tue, 17 Jun 2014 12:08:25 -0700", - "address": "Ap #353-2344 Sodales Street", - "city": "Honolulu", - "state": "Hawaii", - "postal_code": "18980", - "phone": "(531) 196-0181", - "account_credit": 47.93 - }, - { - "id": "56", - "name": "Dieter Frye", - "registered_at": "Mon, 01 Sep 2014 01:11:16 -0700", - "address": "P.O. Box 572, 4852 Nec, Rd.", - "city": "Los Angeles", - "state": "California", - "postal_code": "93004", - "phone": "(843) 603-1249", - "account_credit": 0.19 - }, - { - "id": "57", - "name": "Anne Mclean", - "registered_at": "Sun, 05 Oct 2014 16:05:52 -0700", - "address": "Ap #642-6158 Convallis St.", - "city": "Lawton", - "state": "OK", - "postal_code": "34188", - "phone": "(703) 764-9176", - "account_credit": 52.81 - }, - { - "id": "58", - "name": "Gretchen Gray", - "registered_at": "Fri, 25 Jul 2014 05:15:39 -0700", - "address": "4557 Arcu Ave", - "city": "Virginia Beach", - "state": "VA", - "postal_code": "15836", - "phone": "(629) 782-2033", - "account_credit": 29.02 - }, - { - "id": "59", - "name": "Theodore Ingram", - "registered_at": "Sun, 13 Apr 2014 15:08:45 -0700", - "address": "P.O. Box 362, 9274 Nibh. St.", - "city": "Tucson", - "state": "AZ", - "postal_code": "86869", - "phone": "(227) 651-0229", - "account_credit": 55.08 - }, - { - "id": "60", - "name": "Otto Leblanc", - "registered_at": "Sun, 12 Apr 2015 00:56:48 -0700", - "address": "P.O. Box 210, 6616 Ipsum Ave", - "city": "Detroit", - "state": "Michigan", - "postal_code": "27552", - "phone": "(974) 976-6329", - "account_credit": 38.44 - }, - { - "id": "61", - "name": "Pearl Blackwell", - "registered_at": "Mon, 04 May 2015 20:38:13 -0700", - "address": "797-3332 Nam St.", - "city": "Sterling Heights", - "state": "Michigan", - "postal_code": "51429", - "phone": "(960) 110-2636", - "account_credit": 64.18 - }, - { - "id": "62", - "name": "Caesar Stanley", - "registered_at": "Fri, 31 Jul 2015 01:59:58 -0700", - "address": "Ap #295-1886 Lorem St.", - "city": "Saint Paul", - "state": "MN", - "postal_code": "10029", - "phone": "(841) 157-1769", - "account_credit": 49.14 - }, - { - "id": "63", - "name": "Rebekah Conrad", - "registered_at": "Wed, 01 Jul 2015 10:38:00 -0700", - "address": "112-656 Duis Ave", - "city": "Davenport", - "state": "IA", - "postal_code": "76937", - "phone": "(691) 802-4154", - "account_credit": 67.99 - }, - { - "id": "64", - "name": "Robert Harmon", - "registered_at": "Wed, 08 Apr 2015 21:49:26 -0700", - "address": "333-2529 Duis Road", - "city": "Kaneohe", - "state": "Hawaii", - "postal_code": "58444", - "phone": "(165) 718-1361", - "account_credit": 27.08 - }, - { - "id": "65", - "name": "Maris Puckett", - "registered_at": "Thu, 22 May 2014 19:01:18 -0700", - "address": "Ap #422-3446 A Road", - "city": "Gaithersburg", - "state": "MD", - "postal_code": "39939", - "phone": "(952) 204-5010", - "account_credit": 96.49 - }, - { - "id": "66", - "name": "Lara Ellison", - "registered_at": "Tue, 30 Sep 2014 09:34:25 -0700", - "address": "660-756 Arcu. St.", - "city": "Cedar Rapids", - "state": "Iowa", - "postal_code": "96377", - "phone": "(928) 139-4812", - "account_credit": 60.97 - }, - { - "id": "67", - "name": "Dai Baldwin", - "registered_at": "Thu, 02 Apr 2015 21:28:28 -0700", - "address": "5574 Varius Ave", - "city": "South Bend", - "state": "Indiana", - "postal_code": "27284", - "phone": "(642) 404-1198", - "account_credit": 6.51 - }, - { - "id": "68", - "name": "Mira Lyons", - "registered_at": "Tue, 18 Feb 2014 10:31:37 -0800", - "address": "P.O. Box 176, 9193 Enim Road", - "city": "Topeka", - "state": "KS", - "postal_code": "30606", - "phone": "(355) 309-3105", - "account_credit": 66.25 - }, - { - "id": "69", - "name": "Laurel Diaz", - "registered_at": "Thu, 27 Feb 2014 08:24:02 -0800", - "address": "501 Eu St.", - "city": "Fayetteville", - "state": "Arkansas", - "postal_code": "72463", - "phone": "(382) 883-9819", - "account_credit": 50.13 - }, - { - "id": "70", - "name": "Breanna Kim", - "registered_at": "Fri, 06 Feb 2015 14:42:21 -0800", - "address": "752-6391 Quis Ave", - "city": "Little Rock", - "state": "AR", - "postal_code": "71072", - "phone": "(182) 564-6516", - "account_credit": 58.31 - }, - { - "id": "71", - "name": "Hayes Levine", - "registered_at": "Wed, 13 May 2015 17:46:32 -0700", - "address": "646-9160 Ultrices St.", - "city": "Grand Island", - "state": "NE", - "postal_code": "89643", - "phone": "(624) 302-2419", - "account_credit": 77.3 - }, - { - "id": "72", - "name": "Taylor Spence", - "registered_at": "Wed, 09 Jul 2014 14:10:42 -0700", - "address": "7109 In St.", - "city": "Portland", - "state": "Oregon", - "postal_code": "91240", - "phone": "(993) 724-6663", - "account_credit": 24.11 - }, - { - "id": "73", - "name": "Camille Walton", - "registered_at": "Thu, 19 Mar 2015 01:25:46 -0700", - "address": "718-6981 Libero Road", - "city": "Boise", - "state": "Idaho", - "postal_code": "72346", - "phone": "(332) 249-7842", - "account_credit": 21.88 - }, - { - "id": "74", - "name": "Yardley Mckenzie", - "registered_at": "Mon, 22 Jun 2015 05:10:11 -0700", - "address": "8911 Justo Rd.", - "city": "Huntsville", - "state": "AL", - "postal_code": "36334", - "phone": "(731) 311-1108", - "account_credit": 95.41 - }, - { - "id": "75", - "name": "Rachel Munoz", - "registered_at": "Sun, 04 May 2014 08:20:55 -0700", - "address": "8466 Aliquam Ave", - "city": "Madison", - "state": "Wisconsin", - "postal_code": "56718", - "phone": "(651) 904-9661", - "account_credit": 80.08 - }, - { - "id": "76", - "name": "Bevis Jimenez", - "registered_at": "Sun, 11 May 2014 07:35:02 -0700", - "address": "Ap #222-2891 Magnis St.", - "city": "Columbus", - "state": "Georgia", - "postal_code": "35209", - "phone": "(526) 934-4237", - "account_credit": 25.63 - }, - { - "id": "77", - "name": "Malik Barber", - "registered_at": "Sat, 14 Feb 2015 10:24:50 -0800", - "address": "Ap #364-1684 Quam. St.", - "city": "Waterbury", - "state": "Connecticut", - "postal_code": "75696", - "phone": "(575) 915-7794", - "account_credit": 92.24 - }, - { - "id": "78", - "name": "Nell Bishop", - "registered_at": "Fri, 01 May 2015 18:59:31 -0700", - "address": "7623 Torquent Street", - "city": "Minneapolis", - "state": "MN", - "postal_code": "27078", - "phone": "(819) 107-0728", - "account_credit": 9.35 - }, - { - "id": "79", - "name": "Leigh Anderson", - "registered_at": "Tue, 22 Jul 2014 13:05:46 -0700", - "address": "Ap #149-1154 Cras Rd.", - "city": "Montgomery", - "state": "Alabama", - "postal_code": "36037", - "phone": "(176) 966-1214", - "account_credit": 86.77 - }, - { - "id": "80", - "name": "Chava Kirby", - "registered_at": "Wed, 25 Jun 2014 13:45:50 -0700", - "address": "570-6835 Ac Ave", - "city": "Allentown", - "state": "PA", - "postal_code": "84384", - "phone": "(795) 896-0405", - "account_credit": 5.45 - }, - { - "id": "81", - "name": "Inez Gamble", - "registered_at": "Mon, 09 Feb 2015 17:28:45 -0800", - "address": "471-8542 Et Ave", - "city": "Virginia Beach", - "state": "VA", - "postal_code": "23365", - "phone": "(288) 595-2741", - "account_credit": 32.92 - }, - { - "id": "82", - "name": "Jacob Villarreal", - "registered_at": "Mon, 16 Mar 2015 06:03:28 -0700", - "address": "3480 Amet, Street", - "city": "Grand Island", - "state": "NE", - "postal_code": "53804", - "phone": "(676) 686-4808", - "account_credit": 76.99 - }, - { - "id": "83", - "name": "Velma Mcfadden", - "registered_at": "Wed, 13 Aug 2014 17:48:11 -0700", - "address": "164-557 At St.", - "city": "Juneau", - "state": "AK", - "postal_code": "99806", - "phone": "(520) 661-1866", - "account_credit": 4.31 - }, - { - "id": "84", - "name": "Berk Carroll", - "registered_at": "Mon, 09 Jun 2014 07:18:28 -0700", - "address": "1640 Blandit. Rd.", - "city": "Frankfort", - "state": "Kentucky", - "postal_code": "88958", - "phone": "(937) 237-7054", - "account_credit": 55.15 - }, - { - "id": "85", - "name": "Serina Collins", - "registered_at": "Wed, 12 Aug 2015 11:48:57 -0700", - "address": "6117 Lorem, Avenue", - "city": "South Bend", - "state": "Indiana", - "postal_code": "39108", - "phone": "(216) 221-5456", - "account_credit": 55.52 - }, - { - "id": "86", - "name": "Larissa Soto", - "registered_at": "Wed, 04 Mar 2015 06:32:01 -0800", - "address": "597-5077 Purus St.", - "city": "Tampa", - "state": "Florida", - "postal_code": "19281", - "phone": "(693) 833-8618", - "account_credit": 98.77 - }, - { - "id": "87", - "name": "Erin Mckenzie", - "registered_at": "Fri, 17 Apr 2015 09:24:27 -0700", - "address": "P.O. Box 822, 6254 Etiam Rd.", - "city": "Madison", - "state": "WI", - "postal_code": "94031", - "phone": "(646) 241-7827", - "account_credit": 78.13 - }, - { - "id": "88", - "name": "Katell Lewis", - "registered_at": "Fri, 06 Jun 2014 00:36:28 -0700", - "address": "P.O. Box 794, 8686 Libero St.", - "city": "San Antonio", - "state": "TX", - "postal_code": "90724", - "phone": "(307) 332-5251", - "account_credit": 1.13 - }, - { - "id": "89", - "name": "Yeo Humphrey", - "registered_at": "Mon, 14 Jul 2014 03:21:54 -0700", - "address": "121 Porta Ave", - "city": "Bear", - "state": "DE", - "postal_code": "61381", - "phone": "(770) 120-6205", - "account_credit": 42.14 - }, - { - "id": "90", - "name": "Brynne Stuart", - "registered_at": "Tue, 16 Jun 2015 07:18:47 -0700", - "address": "778-6903 Urna Rd.", - "city": "Jonesboro", - "state": "AR", - "postal_code": "72921", - "phone": "(949) 800-1135", - "account_credit": 84.26 - }, - { - "id": "91", - "name": "Brynne Fuentes", - "registered_at": "Tue, 19 May 2015 01:36:10 -0700", - "address": "8106 Habitant Av.", - "city": "Minneapolis", - "state": "Minnesota", - "postal_code": "23965", - "phone": "(535) 656-2981", - "account_credit": 76.08 - }, - { - "id": "92", - "name": "Giacomo Strong", - "registered_at": "Sat, 13 Dec 2014 10:01:42 -0800", - "address": "1121 Vivamus Av.", - "city": "Madison", - "state": "Wisconsin", - "postal_code": "18820", - "phone": "(938) 428-0683", - "account_credit": 62.64 - }, - { - "id": "93", - "name": "Ruth Nelson", - "registered_at": "Sun, 07 Dec 2014 03:40:07 -0800", - "address": "P.O. Box 324, 7958 Rutrum Avenue", - "city": "Lewiston", - "state": "Maine", - "postal_code": "35597", - "phone": "(821) 465-3951", - "account_credit": 22.11 - }, - { - "id": "94", - "name": "Alexander Brennan", - "registered_at": "Fri, 20 Feb 2015 10:58:42 -0800", - "address": "P.O. Box 778, 9617 Sapien, Avenue", - "city": "San Antonio", - "state": "Texas", - "postal_code": "74395", - "phone": "(452) 676-2428", - "account_credit": 94.6 - }, - { - "id": "95", - "name": "Eagan Lynch", - "registered_at": "Tue, 08 Apr 2014 15:32:50 -0700", - "address": "Ap #209-5829 Gravida St.", - "city": "Dallas", - "state": "Texas", - "postal_code": "45352", - "phone": "(874) 234-9834", - "account_credit": 4.26 - }, - { - "id": "96", - "name": "Charity Buckley", - "registered_at": "Mon, 13 Jul 2015 09:05:22 -0700", - "address": "Ap #822-4239 Aliquam Rd.", - "city": "San Antonio", - "state": "Texas", - "postal_code": "48690", - "phone": "(580) 120-8164", - "account_credit": 5.49 - }, - { - "id": "97", - "name": "Aspen Le", - "registered_at": "Mon, 19 May 2014 22:41:26 -0700", - "address": "Ap #373-9486 A Ave", - "city": "Essex", - "state": "Vermont", - "postal_code": "53433", - "phone": "(179) 428-6526", - "account_credit": 27.07 - }, - { - "id": "98", - "name": "Jana Foster", - "registered_at": "Sat, 31 May 2014 16:18:00 -0700", - "address": "521-938 Odio. Rd.", - "city": "Clarksville", - "state": "TN", - "postal_code": "41791", - "phone": "(828) 240-0643", - "account_credit": 88.61 - }, - { - "id": "99", - "name": "Basia Contreras", - "registered_at": "Sat, 11 Oct 2014 06:25:54 -0700", - "address": "P.O. Box 325, 3668 Donec St.", - "city": "Independence", - "state": "Missouri", - "postal_code": "44890", - "phone": "(847) 205-9126", - "account_credit": 74.62 - }, - { - "id": "100", - "name": "Barbara Jacobson", - "registered_at": "Mon, 03 Nov 2014 07:33:03 -0800", - "address": "489-4471 Commodo Avenue", - "city": "Duluth", - "state": "Minnesota", - "postal_code": "59354", - "phone": "(823) 257-9965", - "account_credit": 12.41 - }, - { - "id": "101", - "name": "Ria Little", - "registered_at": "Wed, 01 Apr 2015 17:10:16 -0700", - "address": "P.O. Box 423, 7795 Aenean St.", - "city": "Athens", - "state": "GA", - "postal_code": "88306", - "phone": "(496) 600-9071", - "account_credit": 0.84 - }, - { - "id": "102", - "name": "Jael Hoover", - "registered_at": "Sun, 12 Apr 2015 04:10:37 -0700", - "address": "P.O. Box 817, 1753 Ac Rd.", - "city": "Seattle", - "state": "Washington", - "postal_code": "17749", - "phone": "(953) 751-2907", - "account_credit": 95.32 - }, - { - "id": "103", - "name": "Howard Meyer", - "registered_at": "Sun, 14 Dec 2014 21:19:41 -0800", - "address": "2813 Pede. Rd.", - "city": "Colchester", - "state": "Vermont", - "postal_code": "11479", - "phone": "(735) 816-9513", - "account_credit": 43.79 - }, - { - "id": "104", - "name": "Brian Yates", - "registered_at": "Mon, 10 Mar 2014 00:26:55 -0700", - "address": "2961 Integer Ave", - "city": "Kearney", - "state": "NE", - "postal_code": "49867", - "phone": "(292) 138-3176", - "account_credit": 9.51 - }, - { - "id": "105", - "name": "Amber Nicholson", - "registered_at": "Thu, 13 Feb 2014 11:15:19 -0800", - "address": "1666 Urna Ave", - "city": "Knoxville", - "state": "Tennessee", - "postal_code": "57653", - "phone": "(154) 850-1394", - "account_credit": 84.42 - }, - { - "id": "106", - "name": "Silas Barton", - "registered_at": "Fri, 06 Feb 2015 00:37:52 -0800", - "address": "Ap #441-4537 Vitae Road", - "city": "Gulfport", - "state": "MS", - "postal_code": "72241", - "phone": "(817) 405-3562", - "account_credit": 5.98 - }, - { - "id": "107", - "name": "Justina Weber", - "registered_at": "Sun, 26 Jul 2015 09:22:06 -0700", - "address": "9004 Dui Rd.", - "city": "Cleveland", - "state": "OH", - "postal_code": "35970", - "phone": "(653) 921-2923", - "account_credit": 35.95 - }, - { - "id": "108", - "name": "Raven Cote", - "registered_at": "Wed, 29 Apr 2015 09:17:30 -0700", - "address": "P.O. Box 944, 5312 Donec Street", - "city": "Savannah", - "state": "GA", - "postal_code": "56882", - "phone": "(212) 164-3612", - "account_credit": 54.27 - }, - { - "id": "109", - "name": "Ahmed Massey", - "registered_at": "Sat, 13 Sep 2014 10:01:23 -0700", - "address": "675-7569 Neque. Rd.", - "city": "Metairie", - "state": "Louisiana", - "postal_code": "74601", - "phone": "(798) 424-7871", - "account_credit": 31.59 - }, - { - "id": "110", - "name": "Thomas Mcbride", - "registered_at": "Sun, 28 Dec 2014 03:52:26 -0800", - "address": "Ap #911-5536 Proin Road", - "city": "Little Rock", - "state": "AR", - "postal_code": "71114", - "phone": "(557) 571-0355", - "account_credit": 62.9 - }, - { - "id": "111", - "name": "April Humphrey", - "registered_at": "Tue, 04 Feb 2014 14:31:31 -0800", - "address": "P.O. Box 153, 5975 Molestie Ave", - "city": "Olathe", - "state": "Kansas", - "postal_code": "84858", - "phone": "(795) 813-1088", - "account_credit": 18.44 - }, - { - "id": "112", - "name": "Sierra Rosa", - "registered_at": "Thu, 15 May 2014 12:18:28 -0700", - "address": "Ap #753-7173 Purus St.", - "city": "Knoxville", - "state": "Tennessee", - "postal_code": "86369", - "phone": "(433) 397-7483", - "account_credit": 12.75 - }, - { - "id": "113", - "name": "Sara Gay", - "registered_at": "Fri, 27 Feb 2015 08:26:18 -0800", - "address": "6311 Felis, Rd.", - "city": "Knoxville", - "state": "Tennessee", - "postal_code": "60949", - "phone": "(239) 940-6734", - "account_credit": 44.11 - }, - { - "id": "114", - "name": "Alexis Ward", - "registered_at": "Mon, 27 Apr 2015 21:02:39 -0700", - "address": "888 Feugiat Rd.", - "city": "Miami", - "state": "Florida", - "postal_code": "65771", - "phone": "(189) 124-7774", - "account_credit": 84.48 - }, - { - "id": "115", - "name": "Justina Dixon", - "registered_at": "Fri, 17 Jul 2015 03:14:57 -0700", - "address": "P.O. Box 279, 5229 Mattis Street", - "city": "Green Bay", - "state": "Wisconsin", - "postal_code": "28463", - "phone": "(488) 172-0802", - "account_credit": 48.41 - }, - { - "id": "116", - "name": "Scott Wise", - "registered_at": "Sat, 20 Dec 2014 10:18:05 -0800", - "address": "P.O. Box 237, 9683 Elit, Road", - "city": "Dover", - "state": "DE", - "postal_code": "80375", - "phone": "(744) 266-9954", - "account_credit": 11.75 - }, - { - "id": "117", - "name": "Cameran Terry", - "registered_at": "Thu, 19 Feb 2015 16:38:52 -0800", - "address": "133-7353 Eu Avenue", - "city": "Rutland", - "state": "VT", - "postal_code": "13964", - "phone": "(232) 667-7186", - "account_credit": 74.33 - }, - { - "id": "118", - "name": "Cooper Suarez", - "registered_at": "Mon, 10 Nov 2014 10:16:37 -0800", - "address": "P.O. Box 632, 4595 Nec Rd.", - "city": "Montpelier", - "state": "Vermont", - "postal_code": "21186", - "phone": "(792) 641-6482", - "account_credit": 20.07 - }, - { - "id": "119", - "name": "Karleigh Ingram", - "registered_at": "Sun, 21 Sep 2014 23:49:59 -0700", - "address": "3480 Nulla Road", - "city": "San Diego", - "state": "CA", - "postal_code": "92064", - "phone": "(819) 878-4232", - "account_credit": 7.66 - }, - { - "id": "120", - "name": "Fiona Santana", - "registered_at": "Thu, 11 Dec 2014 22:20:46 -0800", - "address": "P.O. Box 950, 8105 Gravida. Ave", - "city": "Independence", - "state": "MO", - "postal_code": "64612", - "phone": "(364) 302-8535", - "account_credit": 47.27 - }, - { - "id": "121", - "name": "Cheryl Shelton", - "registered_at": "Mon, 07 Jul 2014 08:34:34 -0700", - "address": "145-5466 Nec Rd.", - "city": "Anchorage", - "state": "AK", - "postal_code": "99971", - "phone": "(666) 421-3975", - "account_credit": 27.65 - }, - { - "id": "122", - "name": "Raya Burgess", - "registered_at": "Fri, 01 May 2015 01:45:27 -0700", - "address": "9695 Lacus. Avenue", - "city": "Owensboro", - "state": "KY", - "postal_code": "72801", - "phone": "(118) 782-5871", - "account_credit": 31.05 - }, - { - "id": "123", - "name": "Hakeem Stokes", - "registered_at": "Fri, 31 Jul 2015 07:26:43 -0700", - "address": "975-799 Sit Street", - "city": "Helena", - "state": "MT", - "postal_code": "67768", - "phone": "(285) 662-1132", - "account_credit": 60.43 - }, - { - "id": "124", - "name": "Macon Crosby", - "registered_at": "Sun, 27 Apr 2014 14:02:28 -0700", - "address": "4714 Aliquet. Road", - "city": "Hartford", - "state": "Connecticut", - "postal_code": "56565", - "phone": "(347) 348-8116", - "account_credit": 66.21 - }, - { - "id": "125", - "name": "Brittany Harris", - "registered_at": "Wed, 19 Mar 2014 05:09:44 -0700", - "address": "183-9407 A Road", - "city": "Bozeman", - "state": "MT", - "postal_code": "56384", - "phone": "(489) 746-9013", - "account_credit": 8.05 - }, - { - "id": "126", - "name": "Galena Ford", - "registered_at": "Fri, 04 Sep 2015 11:09:52 -0700", - "address": "8088 Eget Road", - "city": "Gary", - "state": "IN", - "postal_code": "25479", - "phone": "(538) 724-6020", - "account_credit": 82.15 - }, - { - "id": "127", - "name": "Nehru Smith", - "registered_at": "Sun, 04 Jan 2015 00:43:42 -0800", - "address": "317 Arcu. Avenue", - "city": "Austin", - "state": "TX", - "postal_code": "83794", - "phone": "(127) 566-2347", - "account_credit": 60.36 - }, - { - "id": "128", - "name": "Craig Higgins", - "registered_at": "Mon, 13 Jul 2015 01:16:50 -0700", - "address": "Ap #592-2711 Non, Ave", - "city": "Cambridge", - "state": "Massachusetts", - "postal_code": "50503", - "phone": "(123) 194-5906", - "account_credit": 46.3 - }, - { - "id": "129", - "name": "Ria Goodwin", - "registered_at": "Thu, 29 Jan 2015 07:14:41 -0800", - "address": "860-5993 Vivamus Road", - "city": "Augusta", - "state": "Maine", - "postal_code": "25217", - "phone": "(251) 172-1155", - "account_credit": 88 - }, - { - "id": "130", - "name": "Griffith Key", - "registered_at": "Mon, 10 Feb 2014 02:08:23 -0800", - "address": "152-5468 Ac Road", - "city": "Nampa", - "state": "Idaho", - "postal_code": "51195", - "phone": "(624) 463-6111", - "account_credit": 71.11 - }, - { - "id": "131", - "name": "Kasper Fischer", - "registered_at": "Wed, 13 May 2015 17:02:25 -0700", - "address": "6153 Sed Road", - "city": "Independence", - "state": "Missouri", - "postal_code": "91560", - "phone": "(319) 149-4379", - "account_credit": 40.96 - }, - { - "id": "132", - "name": "Stuart Goodwin", - "registered_at": "Tue, 01 Sep 2015 14:57:31 -0700", - "address": "P.O. Box 689, 2792 Quis, St.", - "city": "Augusta", - "state": "Georgia", - "postal_code": "71303", - "phone": "(538) 387-3287", - "account_credit": 88.19 - }, - { - "id": "133", - "name": "Dawn Carlson", - "registered_at": "Sat, 18 Apr 2015 07:51:41 -0700", - "address": "5366 Id Street", - "city": "Aurora", - "state": "Illinois", - "postal_code": "79365", - "phone": "(994) 905-9769", - "account_credit": 78.41 - }, - { - "id": "134", - "name": "Natalie Schroeder", - "registered_at": "Wed, 24 Jun 2015 01:04:02 -0700", - "address": "392-2462 Luctus Road", - "city": "Boston", - "state": "Massachusetts", - "postal_code": "99200", - "phone": "(891) 649-2871", - "account_credit": 95.95 - }, - { - "id": "135", - "name": "Justine Goodwin", - "registered_at": "Mon, 20 Oct 2014 22:26:35 -0700", - "address": "Ap #406-6268 Morbi Av.", - "city": "Columbus", - "state": "Ohio", - "postal_code": "85028", - "phone": "(155) 830-0119", - "account_credit": 71.42 - }, - { - "id": "136", - "name": "Wilma Velez", - "registered_at": "Sun, 06 Apr 2014 16:31:42 -0700", - "address": "4400 Aliquam Rd.", - "city": "Virginia Beach", - "state": "Virginia", - "postal_code": "36713", - "phone": "(279) 153-9870", - "account_credit": 7.6 - }, - { - "id": "137", - "name": "Chiquita Burks", - "registered_at": "Tue, 18 Feb 2014 20:20:50 -0800", - "address": "Ap #979-8936 Egestas. St.", - "city": "Dover", - "state": "DE", - "postal_code": "48328", - "phone": "(264) 440-3911", - "account_credit": 84.17 - }, - { - "id": "138", - "name": "Christian Mclaughlin", - "registered_at": "Sun, 19 Apr 2015 09:47:16 -0700", - "address": "765 Tristique Avenue", - "city": "Des Moines", - "state": "Iowa", - "postal_code": "35850", - "phone": "(962) 941-9645", - "account_credit": 8.08 - }, - { - "id": "139", - "name": "Aurelia Giles", - "registered_at": "Sun, 07 Dec 2014 21:43:39 -0800", - "address": "P.O. Box 745, 1594 Ante. Rd.", - "city": "Wyoming", - "state": "WY", - "postal_code": "51587", - "phone": "(724) 380-8095", - "account_credit": 62.69 - }, - { - "id": "140", - "name": "Josephine Browning", - "registered_at": "Fri, 12 Dec 2014 06:36:20 -0800", - "address": "459-9737 Donec Rd.", - "city": "Davenport", - "state": "Iowa", - "postal_code": "21255", - "phone": "(436) 817-2557", - "account_credit": 21.97 - }, - { - "id": "141", - "name": "Kasper Morton", - "registered_at": "Tue, 21 Oct 2014 22:31:15 -0700", - "address": "3938 Cursus. Street", - "city": "Philadelphia", - "state": "Pennsylvania", - "postal_code": "56267", - "phone": "(191) 710-5107", - "account_credit": 65.15 - }, - { - "id": "142", - "name": "Renee Higgins", - "registered_at": "Sat, 07 Jun 2014 22:19:01 -0700", - "address": "P.O. Box 523, 9963 Arcu. Road", - "city": "Newport News", - "state": "VA", - "postal_code": "25802", - "phone": "(933) 431-7021", - "account_credit": 67.97 - }, - { - "id": "143", - "name": "Brody Coleman", - "registered_at": "Sat, 22 Feb 2014 06:39:59 -0800", - "address": "Ap #269-5956 Proin Rd.", - "city": "Rutland", - "state": "Vermont", - "postal_code": "72539", - "phone": "(482) 790-5904", - "account_credit": 68.91 - }, - { - "id": "144", - "name": "Jennifer Greer", - "registered_at": "Sun, 12 Jul 2015 08:51:24 -0700", - "address": "923-7286 Dui. Rd.", - "city": "Virginia Beach", - "state": "Virginia", - "postal_code": "97476", - "phone": "(547) 641-6594", - "account_credit": 71.19 - }, - { - "id": "145", - "name": "Gannon Abbott", - "registered_at": "Wed, 24 Sep 2014 14:47:00 -0700", - "address": "Ap #754-9349 Nec Road", - "city": "Rochester", - "state": "Minnesota", - "postal_code": "22689", - "phone": "(363) 394-9351", - "account_credit": 27.97 - }, - { - "id": "146", - "name": "Adrian Nguyen", - "registered_at": "Mon, 28 Apr 2014 10:51:17 -0700", - "address": "956-1243 Libero Av.", - "city": "Fort Smith", - "state": "Arkansas", - "postal_code": "71182", - "phone": "(109) 817-4149", - "account_credit": 92.54 - }, - { - "id": "147", - "name": "Carter Morris", - "registered_at": "Mon, 08 Sep 2014 21:10:38 -0700", - "address": "P.O. Box 304, 5040 Malesuada Rd.", - "city": "Kaneohe", - "state": "Hawaii", - "postal_code": "26814", - "phone": "(450) 765-0057", - "account_credit": 81.11 - }, - { - "id": "148", - "name": "Basia Ratliff", - "registered_at": "Wed, 01 Jan 2014 19:21:29 -0800", - "address": "Ap #907-6837 Diam Ave", - "city": "Knoxville", - "state": "Tennessee", - "postal_code": "80562", - "phone": "(734) 180-1477", - "account_credit": 67.26 - }, - { - "id": "149", - "name": "Genevieve Nieves", - "registered_at": "Tue, 13 May 2014 04:26:45 -0700", - "address": "Ap #864-1195 Sit Street", - "city": "Wichita", - "state": "KS", - "postal_code": "17313", - "phone": "(660) 218-7246", - "account_credit": 38.71 - }, - { - "id": "150", - "name": "Axel Morton", - "registered_at": "Fri, 02 May 2014 02:32:29 -0700", - "address": "459-6656 Ultricies Av.", - "city": "West Jordan", - "state": "Utah", - "postal_code": "99969", - "phone": "(929) 552-4291", - "account_credit": 48.18 - }, - { - "id": "151", - "name": "Montana Wynn", - "registered_at": "Sun, 03 Aug 2014 01:01:44 -0700", - "address": "Ap #236-806 Sem, Av.", - "city": "Springfield", - "state": "Missouri", - "postal_code": "41345", - "phone": "(697) 916-8606", - "account_credit": 33.85 - }, - { - "id": "152", - "name": "Allistair Bradley", - "registered_at": "Fri, 22 May 2015 08:03:48 -0700", - "address": "P.O. Box 384, 7086 At Avenue", - "city": "Juneau", - "state": "Alaska", - "postal_code": "99972", - "phone": "(627) 610-6902", - "account_credit": 68.34 - }, - { - "id": "153", - "name": "Jacob Foley", - "registered_at": "Mon, 17 Mar 2014 17:44:22 -0700", - "address": "785-7522 Duis St.", - "city": "Little Rock", - "state": "AR", - "postal_code": "72550", - "phone": "(310) 834-5542", - "account_credit": 52.03 - }, - { - "id": "154", - "name": "Noelani Burton", - "registered_at": "Sat, 15 Mar 2014 01:00:31 -0700", - "address": "428-8345 Enim. St.", - "city": "Burlington", - "state": "VT", - "postal_code": "83655", - "phone": "(461) 724-9721", - "account_credit": 81.67 - }, - { - "id": "155", - "name": "Abigail Lara", - "registered_at": "Wed, 12 Aug 2015 03:21:43 -0700", - "address": "P.O. Box 388, 1190 Donec St.", - "city": "Shreveport", - "state": "Louisiana", - "postal_code": "41243", - "phone": "(235) 178-3417", - "account_credit": 88.56 - }, - { - "id": "156", - "name": "Driscoll Shepard", - "registered_at": "Sat, 12 Apr 2014 03:01:43 -0700", - "address": "Ap #375-2818 Ac St.", - "city": "Minneapolis", - "state": "MN", - "postal_code": "30682", - "phone": "(433) 449-9825", - "account_credit": 13.79 - }, - { - "id": "157", - "name": "Elaine Carney", - "registered_at": "Thu, 22 May 2014 07:13:57 -0700", - "address": "P.O. Box 495, 1408 Laoreet, Rd.", - "city": "Miami", - "state": "Florida", - "postal_code": "78257", - "phone": "(213) 954-9127", - "account_credit": 82.97 - }, - { - "id": "158", - "name": "Jonas Galloway", - "registered_at": "Sun, 25 Jan 2015 06:05:43 -0800", - "address": "Ap #190-5298 Ornare, Rd.", - "city": "Bloomington", - "state": "MN", - "postal_code": "86280", - "phone": "(113) 365-9867", - "account_credit": 56.1 - }, - { - "id": "159", - "name": "Abel Oneil", - "registered_at": "Sat, 19 Apr 2014 16:26:15 -0700", - "address": "P.O. Box 129, 2669 Arcu. Avenue", - "city": "Colorado Springs", - "state": "CO", - "postal_code": "52301", - "phone": "(857) 528-9424", - "account_credit": 89.69 - }, - { - "id": "160", - "name": "Maia Brock", - "registered_at": "Sat, 13 Jun 2015 04:54:46 -0700", - "address": "Ap #354-4024 Cubilia Road", - "city": "Essex", - "state": "Vermont", - "postal_code": "67149", - "phone": "(392) 863-4448", - "account_credit": 74.13 - }, - { - "id": "161", - "name": "Alden Cabrera", - "registered_at": "Tue, 18 Feb 2014 01:57:47 -0800", - "address": "P.O. Box 904, 6349 Tortor Ave", - "city": "Rutland", - "state": "Vermont", - "postal_code": "96595", - "phone": "(535) 175-9355", - "account_credit": 31.45 - }, - { - "id": "162", - "name": "Kerry Steele", - "registered_at": "Thu, 24 Jul 2014 23:24:08 -0700", - "address": "441-2182 Turpis Av.", - "city": "Anchorage", - "state": "AK", - "postal_code": "99922", - "phone": "(178) 897-7367", - "account_credit": 63.9 - }, - { - "id": "163", - "name": "Charissa Browning", - "registered_at": "Wed, 11 Mar 2015 11:00:37 -0700", - "address": "873-2320 Et, Street", - "city": "Jacksonville", - "state": "Florida", - "postal_code": "14335", - "phone": "(840) 128-0317", - "account_credit": 5.28 - }, - { - "id": "164", - "name": "Darius Mendez", - "registered_at": "Fri, 25 Jul 2014 21:31:44 -0700", - "address": "P.O. Box 505, 730 Nonummy Road", - "city": "Casper", - "state": "WY", - "postal_code": "51369", - "phone": "(335) 359-1497", - "account_credit": 63.72 - }, - { - "id": "165", - "name": "Megan Gates", - "registered_at": "Mon, 09 Mar 2015 05:43:43 -0700", - "address": "955-5227 Nunc Av.", - "city": "Reading", - "state": "PA", - "postal_code": "81062", - "phone": "(443) 918-1564", - "account_credit": 2.86 - }, - { - "id": "166", - "name": "Paloma Horne", - "registered_at": "Mon, 21 Apr 2014 05:04:50 -0700", - "address": "7419 Quis, St.", - "city": "North Las Vegas", - "state": "NV", - "postal_code": "43059", - "phone": "(293) 295-3992", - "account_credit": 55.75 - }, - { - "id": "167", - "name": "Alec Schneider", - "registered_at": "Fri, 05 Sep 2014 06:54:39 -0700", - "address": "958 Arcu. Street", - "city": "Newport News", - "state": "Virginia", - "postal_code": "90428", - "phone": "(378) 745-6478", - "account_credit": 94.93 - }, - { - "id": "168", - "name": "Keegan Porter", - "registered_at": "Tue, 15 Jul 2014 05:47:49 -0700", - "address": "2383 Fusce St.", - "city": "Omaha", - "state": "Nebraska", - "postal_code": "36496", - "phone": "(235) 797-5965", - "account_credit": 83.54 - }, - { - "id": "169", - "name": "Dorian Brooks", - "registered_at": "Thu, 08 Jan 2015 05:35:34 -0800", - "address": "863 Nisi Av.", - "city": "Cedar Rapids", - "state": "Iowa", - "postal_code": "21997", - "phone": "(543) 949-5105", - "account_credit": 85.74 - }, - { - "id": "170", - "name": "Xyla Oneal", - "registered_at": "Wed, 17 Jun 2015 04:22:58 -0700", - "address": "625-1521 Adipiscing Avenue", - "city": "Tuscaloosa", - "state": "Alabama", - "postal_code": "35503", - "phone": "(586) 384-9718", - "account_credit": 92.1 - }, - { - "id": "171", - "name": "Urielle Brock", - "registered_at": "Mon, 11 May 2015 16:37:45 -0700", - "address": "P.O. Box 248, 1197 Adipiscing St.", - "city": "Newport News", - "state": "VA", - "postal_code": "96073", - "phone": "(374) 344-9156", - "account_credit": 97.75 - }, - { - "id": "172", - "name": "Hadley Snow", - "registered_at": "Tue, 04 Feb 2014 06:50:21 -0800", - "address": "Ap #795-8212 Erat. Av.", - "city": "Fort Collins", - "state": "Colorado", - "postal_code": "41558", - "phone": "(290) 857-4604", - "account_credit": 35.67 - }, - { - "id": "173", - "name": "Jenna Conley", - "registered_at": "Wed, 24 Jun 2015 12:00:49 -0700", - "address": "9806 In Rd.", - "city": "South Bend", - "state": "Indiana", - "postal_code": "27537", - "phone": "(965) 898-4616", - "account_credit": 90.28 - }, - { - "id": "174", - "name": "Hermione Combs", - "registered_at": "Thu, 13 Feb 2014 14:01:18 -0800", - "address": "Ap #571-9079 Lobortis Street", - "city": "Cambridge", - "state": "MA", - "postal_code": "77897", - "phone": "(711) 537-2715", - "account_credit": 14.77 - }, - { - "id": "175", - "name": "Scarlet Bridges", - "registered_at": "Tue, 07 Oct 2014 03:48:37 -0700", - "address": "P.O. Box 684, 1366 Cras St.", - "city": "Atlanta", - "state": "GA", - "postal_code": "85419", - "phone": "(303) 449-3873", - "account_credit": 4.05 - }, - { - "id": "176", - "name": "Christopher Santana", - "registered_at": "Fri, 28 Mar 2014 11:26:28 -0700", - "address": "Ap #401-3610 Porta St.", - "city": "Bridgeport", - "state": "Connecticut", - "postal_code": "31517", - "phone": "(916) 183-3805", - "account_credit": 71.54 - }, - { - "id": "177", - "name": "Linus Benjamin", - "registered_at": "Fri, 23 Jan 2015 22:31:42 -0800", - "address": "Ap #480-9547 Morbi Rd.", - "city": "Olathe", - "state": "Kansas", - "postal_code": "85407", - "phone": "(970) 802-1283", - "account_credit": 62.99 - }, - { - "id": "178", - "name": "Abbot Mcclain", - "registered_at": "Tue, 24 Feb 2015 16:47:48 -0800", - "address": "P.O. Box 159, 5873 Auctor Rd.", - "city": "Carson City", - "state": "NV", - "postal_code": "64780", - "phone": "(808) 310-5874", - "account_credit": 13.81 - }, - { - "id": "179", - "name": "Griffin Silva", - "registered_at": "Tue, 14 Oct 2014 10:57:04 -0700", - "address": "6307 Nulla Avenue", - "city": "Juneau", - "state": "AK", - "postal_code": "99838", - "phone": "(679) 747-9281", - "account_credit": 47.03 - }, - { - "id": "180", - "name": "Chloe Shepard", - "registered_at": "Sun, 03 Aug 2014 21:38:38 -0700", - "address": "P.O. Box 198, 4549 Pellentesque Rd.", - "city": "Kapolei", - "state": "HI", - "postal_code": "41472", - "phone": "(130) 324-9334", - "account_credit": 24.78 - }, - { - "id": "181", - "name": "Ori Russo", - "registered_at": "Wed, 11 Mar 2015 03:57:38 -0700", - "address": "Ap #795-182 Commodo Av.", - "city": "Lewiston", - "state": "ME", - "postal_code": "88250", - "phone": "(309) 634-1120", - "account_credit": 46.52 - }, - { - "id": "182", - "name": "Shad Campbell", - "registered_at": "Mon, 20 Oct 2014 11:03:44 -0700", - "address": "8296 Eu, Road", - "city": "Chesapeake", - "state": "VA", - "postal_code": "59563", - "phone": "(109) 812-1478", - "account_credit": 34.45 - }, - { - "id": "183", - "name": "Nomlanga Pugh", - "registered_at": "Sat, 11 Oct 2014 11:44:45 -0700", - "address": "Ap #948-7387 Euismod Street", - "city": "Fort Worth", - "state": "TX", - "postal_code": "54834", - "phone": "(603) 124-9087", - "account_credit": 59.54 - }, - { - "id": "184", - "name": "Damian Nixon", - "registered_at": "Thu, 11 Sep 2014 03:34:13 -0700", - "address": "386-6885 Velit. Rd.", - "city": "Minneapolis", - "state": "MN", - "postal_code": "34740", - "phone": "(996) 763-0457", - "account_credit": 53.6 - }, - { - "id": "185", - "name": "Azalia Bennett", - "registered_at": "Sat, 25 Jan 2014 03:12:08 -0800", - "address": "498-9892 Vehicula Ave", - "city": "Portland", - "state": "ME", - "postal_code": "12829", - "phone": "(233) 218-0724", - "account_credit": 94.45 - }, - { - "id": "186", - "name": "Tyler Sweet", - "registered_at": "Fri, 14 Mar 2014 11:46:41 -0700", - "address": "Ap #558-5634 Semper Rd.", - "city": "Paradise", - "state": "Nevada", - "postal_code": "10272", - "phone": "(401) 227-4119", - "account_credit": 58.12 - }, - { - "id": "187", - "name": "Kyla Sears", - "registered_at": "Sat, 01 Nov 2014 06:22:29 -0700", - "address": "P.O. Box 522, 2866 Lectus St.", - "city": "Casper", - "state": "Wyoming", - "postal_code": "77130", - "phone": "(926) 988-6271", - "account_credit": 40.39 - }, - { - "id": "188", - "name": "Kiona Wagner", - "registered_at": "Wed, 02 Jul 2014 06:16:58 -0700", - "address": "173 Tristique Road", - "city": "Aurora", - "state": "Colorado", - "postal_code": "20338", - "phone": "(976) 299-0296", - "account_credit": 95.61 - }, - { - "id": "189", - "name": "Celeste Hernandez", - "registered_at": "Fri, 13 Jun 2014 03:43:17 -0700", - "address": "4405 Cursus Av.", - "city": "Ketchikan", - "state": "AK", - "postal_code": "99982", - "phone": "(637) 226-8697", - "account_credit": 87.37 - }, - { - "id": "190", - "name": "Stuart Stevenson", - "registered_at": "Sun, 28 Jun 2015 16:34:34 -0700", - "address": "P.O. Box 244, 3411 Urna Road", - "city": "Paradise", - "state": "Nevada", - "postal_code": "54968", - "phone": "(884) 752-9559", - "account_credit": 99.54 - }, - { - "id": "191", - "name": "Yael Potter", - "registered_at": "Thu, 25 Dec 2014 10:43:46 -0800", - "address": "P.O. Box 802, 4280 Tellus. Av.", - "city": "Augusta", - "state": "GA", - "postal_code": "94978", - "phone": "(838) 450-7880", - "account_credit": 89.08 - }, - { - "id": "192", - "name": "Sarah Price", - "registered_at": "Thu, 20 Nov 2014 05:28:59 -0800", - "address": "P.O. Box 695, 4792 Sagittis. Street", - "city": "Jefferson City", - "state": "Missouri", - "postal_code": "68837", - "phone": "(694) 232-5802", - "account_credit": 65.06 - }, - { - "id": "193", - "name": "Keane Schroeder", - "registered_at": "Thu, 26 Mar 2015 19:51:39 -0700", - "address": "3750 Ultrices. St.", - "city": "Wichita", - "state": "KS", - "postal_code": "32895", - "phone": "(771) 777-3480", - "account_credit": 55.08 - }, - { - "id": "194", - "name": "Gloria Cabrera", - "registered_at": "Mon, 17 Feb 2014 11:59:32 -0800", - "address": "Ap #918-2687 Arcu Avenue", - "city": "Reading", - "state": "PA", - "postal_code": "20080", - "phone": "(872) 752-3660", - "account_credit": 37.86 - }, - { - "id": "195", - "name": "Audra Beck", - "registered_at": "Fri, 23 Jan 2015 20:42:53 -0800", - "address": "311-6634 Et St.", - "city": "Bellevue", - "state": "WA", - "postal_code": "81533", - "phone": "(473) 949-2594", - "account_credit": 30.33 - }, - { - "id": "196", - "name": "Dolan Newton", - "registered_at": "Wed, 15 Jan 2014 14:08:05 -0800", - "address": "P.O. Box 588, 3911 Proin Road", - "city": "Auburn", - "state": "ME", - "postal_code": "19968", - "phone": "(214) 790-1643", - "account_credit": 58.03 - }, - { - "id": "197", - "name": "Jolie Ashley", - "registered_at": "Sat, 24 May 2014 19:19:57 -0700", - "address": "901-461 Pharetra St.", - "city": "Jefferson City", - "state": "MO", - "postal_code": "76963", - "phone": "(157) 795-0499", - "account_credit": 50.3 - }, - { - "id": "198", - "name": "Judith Ewing", - "registered_at": "Sun, 06 Apr 2014 15:46:40 -0700", - "address": "P.O. Box 666, 7743 Mauris Road", - "city": "Knoxville", - "state": "TN", - "postal_code": "47671", - "phone": "(200) 706-8284", - "account_credit": 13.91 - }, - { - "id": "199", - "name": "Scarlett Rojas", - "registered_at": "Fri, 06 Feb 2015 11:31:26 -0800", - "address": "P.O. Box 161, 9318 Non, Ave", - "city": "Boise", - "state": "Idaho", - "postal_code": "81837", - "phone": "(669) 244-0896", - "account_credit": 27.69 - }, - { - "id": "200", - "name": "Kane Johnston", - "registered_at": "Fri, 22 May 2015 09:56:42 -0700", - "address": "P.O. Box 940, 1583 At, Street", - "city": "Austin", - "state": "Texas", - "postal_code": "94282", - "phone": "(270) 219-2853", - "account_credit": 62.7 - } -] diff --git a/movies.json b/movies.json deleted file mode 100644 index c11f516..0000000 --- a/movies.json +++ /dev/null @@ -1,602 +0,0 @@ -[ - { - "title": "Psycho", - "overview": "When larcenous real estate clerk Marion Crane goes on the lam with a wad of cash and hopes of starting a new life, she ends up at the notorious Bates Motel, where manager Norman Bates cares for his housebound mother. The place seems quirky, but fine… until Marion decides to take a shower.", - "release_date": "1960-06-16", - "inventory": 8 - }, - { - "title": "Jaws", - "overview": "An insatiable great white shark terrorizes the townspeople of Amity Island, The police chief, an oceanographer and a grizzled shark hunter seek to destroy the bloodthirsty beast.", - "release_date": "1975-06-19", - "inventory": 6 - }, - { - "title": "The Exorcist", - "overview": "12-year-old Regan MacNeil begins to adapt an explicit new personality as strange events befall the local area of Georgetown. Her mother becomes torn between science and superstition in a desperate bid to save her daughter, and ultimately turns to her last hope: Father Damien Karras, a troubled priest who is struggling with his own faith.", - "release_date": "1973-12-26", - "inventory": 7 - }, - { - "title": "North by Northwest", - "overview": "Madison Avenue advertising man Roger Thornhill finds himself thrust into the world of spies when he is mistaken for a man by the name of George Kaplan. Foreign spy Philip Vandamm and his henchman Leonard try to eliminate him but when Thornhill tries to make sense of the case, he is framed for murder. Now on the run from the police, he manages to board the 20th Century Limited bound for Chicago where he meets a beautiful blond, Eve Kendall, who helps him to evade the authorities. His world is turned upside down yet again when he learns that Eve isn't the innocent bystander he thought she was. Not all is as it seems however, leading to a dramatic rescue and escape at the top of Mt. Rushmore.", - "release_date": "1959-07-17", - "inventory": 10 - }, - { - "title": "The Silence of the Lambs", - "overview": "FBI trainee Clarice Starling ventures into a maximum-security asylum to pick the diseased brain of Hannibal Lecter, a psychiatrist turned homicidal cannibal. Starling needs clues to help her capture a serial killer. Unfortunately, her Faustian relationship with Lecter soon leads to his escape, and now two deranged killers are on the loose.", - "release_date": "1991-02-14", - "inventory": 3 - }, - { - "title": "Alien", - "overview": "During its return to the earth, commercial spaceship Nostromo intercepts a distress signal from a distant planet. When a three-member team of the crew discovers a chamber containing thousands of eggs on the planet, a creature inside one of the eggs attacks an explorer. The entire crew is unaware of the impending nightmare set to descend upon them when the alien parasite planted inside its unfortunate host is birthed.", - "release_date": "1979-05-25", - "inventory": 4 - }, - { - "title": "The Birds", - "overview": "Chic socialite Melanie Daniels enjoys a passing flirtation with an eligible attorney in a San Francisco pet shop and, on an impulse, follows him to his hometown bearing a gift of lovebirds. But upon her arrival, the bird population runs amok. Suddenly, the townsfolk face a massive avian onslaught, with the feathered fiends inexplicably attacking people all over Bodega Bay.", - "release_date": "1963-03-28", - "inventory": 1 - }, - { - "title": "The French Connection", - "overview": "A pair of NYC cops in the Narcotics Bureau stumble onto a drug smuggling job with a French connection.", - "release_date": "1971-10-07", - "inventory": 8 - }, - { - "title": "Rosemary's Baby", - "overview": "A young couple moves into an infamous New York apartment building to start a family. Things become frightening as Rosemary begins to suspect her unborn baby isn't safe around their strange neighbors.", - "release_date": "1968-06-12", - "inventory": 2 - }, - { - "title": "Raiders of the Lost Ark", - "overview": "When Dr. Indiana Jones – the tweed-suited professor who just happens to be a celebrated archaeologist – is hired by the government to locate the legendary Ark of the Covenant, he finds himself up against the entire Nazi regime.", - "release_date": "1981-06-12", - "inventory": 9 - }, - { - "title": "The Godfather", - "overview": "The story spans the years from 1945 to 1955 and chronicles the fictional Italian-American Corleone crime family. When organized crime family patriarch Vito Corleone barely survives an attempt on his life, his youngest son, Michael, steps in to take care of the would-be killers, launching a campaign of bloody revenge.", - "release_date": "1972-03-15", - "inventory": 5 - }, - { - "title": "King Kong", - "overview": "An adventure film about a film crew in search of a monster on a remote island. The crew finds King Kong and decides to take him back to New York as a money making spectacle. The film is a masterpiece of Stop-Motion in filmmaking history and inspired a line of King Kong films.", - "release_date": "1933-03-02", - "inventory": 10 - }, - { - "title": "Bonnie and Clyde", - "overview": "Bonnie and Clyde is based on the true stories of the gangster pair Bonnie Parker and Clyde Barrow who in the 1930s began robbing banks in U.S. cities until they were eventually killed. The film is a major landmark in the aesthetic movement known as the New Hollywood.", - "release_date": "1967-08-04", - "inventory": 4 - }, - { - "title": "Rear Window", - "overview": "Professional photographer L.B. \"Jeff\" Jeffries breaks his leg while getting an action shot at an auto race. Confined to his New York apartment, he spends his time looking out of the rear window observing the neighbors. He begins to suspect that a man across the courtyard may have murdered his wife. Jeff enlists the help of his high society fashion-consultant girlfriend Lisa Freemont and his visiting nurse Stella to investigate.", - "release_date": "1954-08-01", - "inventory": 10 - }, - { - "title": "Deliverance", - "overview": "The Cahulawassee River valley in Northern Georgia is one of the last natural pristine areas of the state, which will soon change with the imminent building of a dam on the river, which in turn will flood much of the surrounding land. As such, four Atlanta city slickers - alpha male Lewis Medlock, generally even-keeled Ed Gentry, slightly condescending Bobby Trippe, and wide-eyed Drew Ballinger - decide to take a multi-day canoe trip on the river, which turns into a trip they'll never forget into the dangerous American back-country.", - "release_date": "1972-07-30", - "inventory": 2 - }, - { - "title": "Chinatown", - "overview": "Private eye Jake Gittes lives off the murky moral climate of sunbaked, pre-World War II Southern California. Hired by a beautiful socialite to investigate her husband's extra-marital affair, Gittes is swept into a maelstrom of double dealings and deadly deceits, uncovering a web of personal and political scandals that come crashing together.", - "release_date": "1974-06-20", - "inventory": 6 - }, - { - "title": "The Manchurian Candidate", - "overview": "The Manchurian Candidate is a political thriller from American director John Frankenheimer. An American soldier is brainwashed into being a killer for the communist Russians during the Korean War.", - "release_date": "1962-10-24", - "inventory": 1 - }, - { - "title": "Vertigo", - "overview": "A retired San Francisco detective suffering from acrophobia investigates the strange activities of an old friend's wife, all the while becoming dangerously obsessed with her.", - "release_date": "1958-05-28", - "inventory": 10 - }, - { - "title": "The Great Escape", - "overview": "The Nazis, exasperated at the number of escapes from their prison camps by a relatively small number of Allied prisoners, relocates them to a high-security \"escape-proof\" camp to sit out the remainder of the war. Undaunted, the prisoners plan one of the most ambitious escape attempts of World War II. Based on a true story.", - "release_date": "1963-07-04", - "inventory": 4 - }, - { - "title": "High Noon", - "overview": "High Noon is about a recently freed leader of a gang of bandits in the desert who is looking to get revenge on the Sheriff who put him in jail. A legendary western film from the Austrian director Fred Zinnemann.", - "release_date": "1952-07-24", - "inventory": 4 - }, - { - "title": "A Clockwork Orange", - "overview": "The head of a gang of toughs, in an insensitive futuristic society, is conditioned to become physically ill at sex and violence during a prison sentence. When he is released, he's brutally beaten by all of his old adversaries.", - "release_date": "1971-12-18", - "inventory": 4 - }, - { - "title": "Taxi Driver", - "overview": "Robert De Niro stars as Travis Bickle in this oppressive psychodrama about a Vietnam veteran who rebels against the decadence and immorality of big city life in New York while working the nightshift as a taxi driver.", - "release_date": "1976-02-08", - "inventory": 4 - }, - { - "title": "Lawrence of Arabia", - "overview": "Lawrence of Arabia is the classic film from David Lean starring Peter O’Toole and based on the autobiography from Thomas Edward Lawrence who during the first World War was on assignment by the British Empire in Arabia. The film would become a cult classic and is known today as a masterpiece.", - "release_date": "1962-12-10", - "inventory": 6 - }, - { - "title": "Double Indemnity", - "overview": "Unsuspecting Mr. Dietrichson becomes increasingly accident prone after his icily calculating wife encourages him to sign a double indemnity policy proposed by a smooth-talking insurance agent. Against a backdrop of distinctly California settings, the partners in crime plan the perfect murder to collect the insurance. Perfect until a claims manager gets a familiar feeling of foul play and pursues the matter relentlessly.", - "release_date": "1944-04-24", - "inventory": 5 - }, - { - "title": "Titanic", - "overview": "84 years later, a 101-year-old woman named Rose DeWitt Bukater tells the story to her granddaughter Lizzy Calvert, Brock Lovett, Lewis Bodine, Bobby Buell and Anatoly Mikailavich on the Keldysh about her life set in April 10th 1912, on a ship called Titanic when young Rose boards the departing ship with the upper-class passengers and her mother, Ruth DeWitt Bukater, and her fiancé, Caledon Hockley. Meanwhile, a drifter and artist named Jack Dawson and his best friend Fabrizio De Rossi win third-class tickets to the ship in a game. And she explains the whole story from departure until the death of Titanic on its first and last voyage April 15th, 1912 at 2:20 in the morning.", - "release_date": "1997-12-19", - "inventory": 5 - }, - { - "title": "The Maltese Falcon", - "overview": "Spade and Archer is the name of a San Francisco detective agency. That's for Sam Spade and Miles Archer. The two men are partners, but Sam doesn't like Miles much. A knockout, who goes by the name of Miss Wanderly, walks into their office; and by that night everything's changed. Miles is dead. And so is a man named Floyd Thursby. It seems Miss Wanderly is surrounded by dangerous men. There's Joel Cairo, who uses gardenia-scented calling cards. There's Kasper Gutman, with his enormous girth and feigned civility. Her only hope of protection comes from Sam, who is suspected by the police of one or the other murder. More murders are yet to come.", - "release_date": "1941-11-18", - "inventory": 2 - }, - { - "title": "Star Wars: Episode IV - A New Hope", - "overview": "Princess Leia is captured and held hostage by the evil Imperial forces in their effort to take over the galactic Empire. Venturesome Luke Skywalker and dashing captain Han Solo team together with the loveable robot duo R2-D2 and C-3PO to rescue the beautiful princess and restore peace and justice in the Empire.", - "release_date": "1977-05-25", - "inventory": 2 - }, - { - "title": "Fatal Attraction", - "overview": "A married man's one night stand comes back to haunt him when that lover begins to stalk him and his family.", - "release_date": "1987-09-11", - "inventory": 8 - }, - { - "title": "The Shining", - "overview": "Jack Torrance accepts a caretaker job at the Overlook Hotel, where he, along with his wife Wendy and their son Danny, must live isolated from the rest of the world for the winter. But they aren't prepared for the madness that lurks within.", - "release_date": "1980-05-22", - "inventory": 3 - }, - { - "title": "The Deer Hunter", - "overview": "A group of working-class friends decides to enlist in the Army during the Vietnam War and finds it to be hellish chaos -- not the noble venture they imagined. Before they left, Steven married his pregnant girlfriend -- and Michael and Nick were in love with the same woman. But all three are different men upon their return.", - "release_date": "1978-12-08", - "inventory": 4 - }, - { - "title": "Close Encounters of the Third Kind", - "overview": "After an encounter with UFOs, a line worker feels undeniably drawn to an isolated area in the wilderness where something spectacular is about to happen.", - "release_date": "1977-11-16", - "inventory": 3 - }, - { - "title": "Strangers on a Train", - "overview": "A psychotic socialite confronts a pro tennis star with a theory on how two complete strangers can get away with murder...a theory that he plans to implement.", - "release_date": "1951-06-30", - "inventory": 9 - }, - { - "title": "The Fugitive", - "overview": "Dr. Richard Kimble, unjustly accused of murdering his wife, must find the real killer while being the target of a nationwide manhunt.", - "release_date": "1993-08-06", - "inventory": 9 - }, - { - "title": "The Night of the Hunter", - "overview": "Harry Powell marries and murders widows for their money, believing he is helping God do away with women who arouse men's carnal instincts. Arrested for auto theft, he shares a cell with condemned killer Ben Harper and tries to get him to reveal the whereabouts of the $10,000 he stole. Only Ben's nine-year-old son, John, and four-year-old daughter, Pearl, know the money is in Pearl's doll; and they have sworn to their father to keep this secret. After Ben is executed, Preacher goes to Cresap's Landing to court Ben's widow, Willa. When he overwhelms her with his Scripture quoting, sermons, and hymns, she agrees to marry him. On their wedding night, he tells her they will never have sex because it is sinful.", - "release_date": "1955-07-26", - "inventory": 9 - }, - { - "title": "Jurassic Park", - "overview": "A wealthy entrepreneur secretly creates a theme park featuring living dinosaurs drawn from prehistoric DNA. Before opening day, he invites a team of experts and his two eager grandchildren to experience the park and help calm anxious investors. However, the park is anything but amusing as the security systems go off-line and the dinosaurs escape.", - "release_date": "1993-06-08", - "inventory": 4 - }, - { - "title": "Bullitt", - "overview": "Bullitt is an American action thriller from director Peter Yates from 1968. Steven Mcqueen plays the leading role as a mafia-chasing police officer who must protect a valuable witness. The film’s ten minute high speed pursuit is legendary.", - "release_date": "1968-10-17", - "inventory": 8 - }, - { - "title": "Casablanca", - "overview": "Casablanca is a classic and one of the most revered films of all time. Starring Humphrey Bogart and Ingrid Bergman in a love triangle in the city of Casablanca which is a refuge for many fleeing foreigners looking for a new life during the war. Political romance with a backdrop of war conflict between democracy and totalitarianism. A landmark in film history.", - "release_date": "1942-11-26", - "inventory": 8 - }, - { - "title": "Notorious", - "overview": "Released shortly after the war, this classic Hitchcock film illustrates the battle between German Nazis and American spies in Rio de Janeiro where a German businessman keeps a wine cellar with uranium ore.", - "release_date": "1946-08-15", - "inventory": 1 - }, - { - "title": "Die Hard", - "overview": "NYPD cop John McClane's plan to reconcile with his estranged wife, Holly, is thrown for a serious loop when minutes after he arrives at her office, the entire building is overtaken by a group of pitiless terrorists. With little help from the LAPD, wisecracking McClane sets out to single-handedly rescue the hostages and bring the bad guys down.", - "release_date": "1988-07-14", - "inventory": 4 - }, - { - "title": "2001: A Space Odyssey", - "overview": "Humanity finds a mysterious object buried beneath the lunar surface and sets off to find its origins with the help of HAL 9000, the world's most advanced super computer.", - "release_date": "1968-04-05", - "inventory": 7 - }, - { - "title": "Dirty Harry", - "overview": "When a madman dubbed the \"Scorpio Killer\" terrorizes San Francisco, hard-boiled cop Harry Callahan -- famous for his take-no-prisoners approach to law enforcement -- is tasked with hunting down the psychopath. Harry eventually collars Scorpio in the process of rescuing a kidnap victim, only to see him walk on technicalities. Now, the maverick detective is determined to nail the maniac himself.", - "release_date": "1971-12-22", - "inventory": 4 - }, - { - "title": "The Terminator", - "overview": "In the post-apocalyptic future, reigning tyrannical supercomputers teleport a cyborg assassin known as the \"Terminator\" back to 1984 to kill Sarah Connor, whose unborn son is destined to lead insurgents against 21st century mechanical hegemony. Meanwhile, the human-resistance movement dispatches a lone warrior to safeguard Sarah. Can he stop the virtually indestructible killing machine?", - "release_date": "1984-10-26", - "inventory": 7 - }, - { - "title": "The Wizard of Oz", - "overview": "One of the most famous musical films and the first film from Hollywood to use color. Young Dorothy finds herself in a magical world where she makes friends with a lion, a scarecrow and a tin man as they make their way along the yellow brick road to talk with the Wizard and ask for the things they miss most in their lives. The Wicked Witch of the West is the only thing that could stop them.", - "release_date": "1939-08-25", - "inventory": 1 - }, - { - "title": "E.T. the Extra-Terrestrial", - "overview": "A science fiction fairytale about an extra-terrestrial who is left behind on Earth and is found by a young boy who befriends him. This heart-warming fantasy from Director Steven Spielberg became one of the most commercially successful films of all time.", - "release_date": "1982-06-11", - "inventory": 2 - }, - { - "title": "Saving Private Ryan", - "overview": "As U.S. troops storm the beaches of Normandy, three brothers lie dead on the battlefield, with a fourth trapped behind enemy lines. Ranger captain John Miller and seven men are tasked with penetrating German-held territory and bringing the boy home.", - "release_date": "1998-07-24", - "inventory": 2 - }, - { - "title": "Carrie", - "overview": "Carrie may be ostracized, but the shy teen has the ability to move objects with her mind. So when the high school \"in crowd\" torments her with a sick joke at the prom, she lashes out with devastating -- and deadly -- power.", - "release_date": "1976-11-03", - "inventory": 3 - }, - { - "title": "Invasion of the Body Snatchers", - "overview": "A small-town doctor learns that the population of his community is being replaced by emotionless alien duplicates.", - "release_date": "1956-02-05", - "inventory": 1 - }, - { - "title": "Dial M for Murder", - "overview": "An ex-tennis pro carries out a plot to have his wife murdered after discovering she is having an affair, and assumes she will soon leave him for the other man anyway. When things go wrong, he improvises a new plan - to frame her for murder instead.", - "release_date": "1954-05-29", - "inventory": 6 - }, - { - "title": "Ben-Hur", - "overview": "Ben-Hur is a 1959 epic film directed by William Wyler, the third film version of Lew Wallace's 1880 novel Ben-Hur: A Tale of the Christ. It premiered at Loew's State Theatre in New York City on November 18, 1959. The film went on to win a record of eleven Academy Awards, including Best Picture, a feat equaled only by Titanic in 1998 and The Lord of the Rings: The Return of the King in 2004. It was also the last film to win the Oscar for both Best Actor and Best Supporting Actor, until nearly 44 years later when Mystic River achieved the same feat.The movie revolves around a Jewish prince who is betrayed and sent into slavery by a Roman friend and how he regains his freedom and comes back for revenge.", - "release_date": "1959-11-18", - "inventory": 5 - }, - { - "title": "Marathon Man", - "overview": "A graduate student and obsessive runner in New York is drawn into a mysterious plot involving his brother, a member of the secretive Division. This film, famous for its excruciating \"Is it safe?\" torture scene by a Nazi dentist, is a spy classic with an all star cast.", - "release_date": "1976-10-06", - "inventory": 1 - }, - { - "title": "Raging Bull", - "overview": "An emotionally self-destructive boxer's journey through life, as the violence and temper that leads him to the top in the ring, destroys his life outside it.", - "release_date": "1980-11-14", - "inventory": 2 - }, - { - "title": "Rocky", - "overview": "When world heavyweight boxing champ Apollo Creed wants to give an unknown fighter a shot at the title as a publicity stunt, his handlers pick palooka Rocky Balboa, an uneducated collector for a Philadelphia loan shark.", - "release_date": "1976-11-21", - "inventory": 10 - }, - { - "title": "Pulp Fiction", - "overview": "A burger-loving hit man, his philosophical partner, a drug-addled gangster's moll and a washed-up boxer converge in this sprawling, comedic crime caper. Their adventures unfurl in three stories that ingeniously trip back and forth in time.", - "release_date": "1994-10-14", - "inventory": 10 - }, - { - "title": "Butch Cassidy and the Sundance Kid", - "overview": "In late 1890s Wyoming, Butch Cassidy is the affable, clever, talkative leader of the outlaw Hole in the Wall Gang. His closest companion is the laconic dead-shot \"Sundance Kid\". As the west rapidly becomes civilized, the law finally catches up to Butch, Sundance and their gang. Chased doggedly by a special posse, the two decide to make their way to South America in hopes of evading their pursuers once and for all.", - "release_date": "1969-09-23", - "inventory": 5 - }, - { - "title": "Wait Until Dark", - "overview": "After a flight back home, Sam Hendrix returns with a doll he innocently acquired along the way. As it turns out, the doll is actually stuffed with heroin, and a group of criminals led by the ruthless Roat has followed Hendrix back to his place to retrieve it. When Hendrix leaves for business, the crooks make their move -- and find his blind wife, Susy, alone in the apartment. Soon, a life-threatening game begins between Susy and the thugs.", - "release_date": "1967-10-26", - "inventory": 6 - }, - { - "title": "Frankenstein", - "overview": "Henry Frankenstein is a doctor who is trying to discover a way to make the dead walk. He succeeds and creates a monster that has to deal with living again.", - "release_date": "1931-11-21", - "inventory": 8 - }, - { - "title": "All the President's Men", - "overview": "In the run-up to the 1972 elections, Washington Post reporter Bob Woodward covers what seems to be a minor break-in at the Democratic Party National headquarters. He is surprised to find top lawyers already on the defense case, and the discovery of names and addresses of Republican fund organizers on the accused further arouses his suspicions. The editor of the Post is prepared to run with the story and assigns Woodward and Carl Bernstein to it. They find the trail leading higher and higher in the Republican Party, and eventually into the White House itself.", - "release_date": "1976-04-04", - "inventory": 4 - }, - { - "title": "The Bridge on the River Kwai", - "overview": "A classic story of English POWs in Burma forced to build a bridge to aid the war effort of their Japanese captors. British and American intelligence officers conspire to blow up the structure, but Col. Nicholson , the commander who supervised the bridge's construction, has acquired a sense of pride in his creation and tries to foil their plans.", - "release_date": "1957-10-02", - "inventory": 9 - }, - { - "title": "Planet of the Apes", - "overview": "Taylor and two other astronauts come out of deep hibernation to find that their ship has crashed. Escaping with little more than clothes they find that they have landed on a planet where men are pre-lingual and uncivilized while apes have learned speech and technology. Taylor is captured and taken to the city of the apes after damaging his throat so that he is silent and cannot communicate with the apes.", - "release_date": "1968-02-07", - "inventory": 10 - }, - { - "title": "The Sixth Sense", - "overview": "A psychological thriller about an eight year old boy named Cole Sear who believes he can see into the world of the dead. A child psychologist named Malcolm Crowe comes to Cole to help him deal with his problem, learning that he really can see ghosts of dead people.", - "release_date": "1999-08-02", - "inventory": 6 - }, - { - "title": "Cape Fear", - "overview": "Sam Bowden, witnesses a rape committed by Max Cady and testifies against him. When released after 8 years in prison, Cady stalks Bowden and his family but is always clever enough not to violate the law. Bowden enlists the aid of a local police chief, a private detective and then hires thugs to harass Cady all to no avail. The film climaxes pitting Bowden and his family against Cady.", - "release_date": "1962-04-12", - "inventory": 3 - }, - { - "title": "Spartacus", - "overview": "Spartacus is a 1960 American historical drama film directed by Stanley Kubrick and based on the novel of the same name by Howard Fast about the historical life of Spartacus and the Third Servile War. The film stars Kirk Douglas as the rebellious slave Spartacus who leads a violent revolt against the decadent Roman empire. The film was awarded four Oscars and stands today as one of the greatest classics of the Sword and Sandal genre.", - "release_date": "1960-10-06", - "inventory": 4 - }, - { - "title": "What Ever Happened to Baby Jane?", - "overview": "Two aging film actresses live as virtual recluses in an old Hollywood mansion. Jane Hudson, a successful child star, cares for her crippled sister Blanche, whose career in later years eclipsed that of Jane. Now the two live together, their relationship affected by simmering subconscious thoughts of mutual envy, hate and revenge.", - "release_date": "1962-10-31", - "inventory": 7 - }, - { - "title": "Touch of Evil", - "overview": "Stark, perverse story of murder, kidnapping, and police corruption in Mexican border town.", - "release_date": "1958-04-23", - "inventory": 5 - }, - { - "title": "The Dirty Dozen", - "overview": "Classic World War II action drama about a group of 12 American military prisoners, who are ordered to infiltrate a well-guarded enemy château and kill the Nazi officers vacationing there. The soldiers, most of whom are facing death sentences for a variety of violent crimes, agree to the mission and the possible commuting of their sentences.", - "release_date": "1967-06-15", - "inventory": 10 - }, - { - "title": "The Matrix", - "overview": "Thomas A. Anderson is a man living two lives. By day he is an average computer programmer and by night a malevolent hacker known as Neo, who finds himself targeted by the police when he is contacted by Morpheus, a legendary computer hacker, who reveals the shocking truth about our reality.", - "release_date": "1999-03-30", - "inventory": 1 - }, - { - "title": "The Treasure of the Sierra Madre", - "overview": "Fred C. Dobbs and Bob Curtin, both down on their luck in Tampico, Mexico in 1925, meet up with a grizzled prospector named Howard and decide to join with him in search of gold in the wilds of central Mexico. Through enormous difficulties, they eventually succeed in finding gold, but bandits, the elements, and most especially greed threaten to turn their success into disaster.", - "release_date": "1948-01-24", - "inventory": 4 - }, - { - "title": "Halloween", - "overview": "A psychotic murderer institutionalized since childhood for the murder of his sister, escapes and stalks a bookish teenage girl and her friends while his doctor chases him through the streets.", - "release_date": "1978-10-25", - "inventory": 4 - }, - { - "title": "The Wild Bunch", - "overview": "Aging outlaw Pike Bishop (William Holden) prepares to retire after one final robbery. Joined by his gang, which includes Dutch Engstrom (Ernest Borgnine) and brothers Lyle (Warren Oates) and Tector Gorch (Ben Johnson), Bishop discovers the heist is a setup orchestrated in part by his old partner, Deke Thornton (Robert Ryan). As the remaining gang takes refuge in Mexican territory, Thornton trails them, resulting in fierce gunfights with plenty of casualties", - "release_date": "1969-06-17", - "inventory": 2 - }, - { - "title": "Dog Day Afternoon", - "overview": "A man robs a bank to pay for his lover's operation; it turns into a hostage situation and a media circus.", - "release_date": "1975-09-21", - "inventory": 9 - }, - { - "title": "Goldfinger", - "overview": "Bond is in Miami on holiday when M tells him to observe Auric Goldfinger. Bond steals Goldfinger's girlfriend, Jill Masterson, but after being knocked out, he awakes to find her dead and covered in gold paint. Upon returning to London, Bond is told to further investigate Goldfinger who is believed to be smuggling gold out of Britain, but warned he will be replaced if he turns the mission into a personal vendetta. After failing to befriend Goldfinger, Bond is caught spying and taken to America as a captive. Bond learns of Goldfinger's plan, codenamed Operation Grand Slam, which involves attacking Fort Knox to increase his gold riches. Can 007 find a way to stop Goldfinger despite being held prisoner? This is the third film from the legendary James Bond series starring Sean Connery as the British super agent.", - "release_date": "1964-09-17", - "inventory": 1 - }, - { - "title": "Platoon", - "overview": "Chris Taylor, a young, naive recruit in Vietnam, faces a moral crisis when confronted with the horrors of war and the duality of man.", - "release_date": "1986-12-18", - "inventory": 1 - }, - { - "title": "Laura", - "overview": "A police detective falls in love with the woman whose murder he's investigating.", - "release_date": "1944-10-11", - "inventory": 5 - }, - { - "title": "Blade Runner", - "overview": "In the smog-choked dystopian Los Angeles of 2019, blade runner Rick Deckard is called out of retirement to kill a quartet of replicants who have escaped to Earth seeking their creator for a way to extend their short life spans.", - "release_date": "1982-06-25", - "inventory": 9 - }, - { - "title": "The Third Man", - "overview": "An American pulp writer arrives in post-WWII Vienna only to find that the friend who waited for him is killed under mysterious circumstances. The ensuing mystery entangles him in his friend's involvement in the black market, with the multinational police, and with his Czech girlfriend.", - "release_date": "1949-08-31", - "inventory": 9 - }, - { - "title": "Thelma & Louise", - "overview": "Whilst on a short weekend getaway, Louise shoots a man who had tried to rape Thelma. Due to the incriminating circumstances, they make a run for it and thus a cross country chase ensues for the two fugitives. Along the way, both women rediscover the strength of their friendship and surprising aspects of their personalities and self-strengths in the trying times.", - "release_date": "1991-05-24", - "inventory": 4 - }, - { - "title": "Terminator 2: Judgment Day", - "overview": "Nearly 10 years have passed since Sarah Connor was targeted for termination by a cyborg from the future. Now her son, John, the future leader of the resistance, is the target for a newer, more deadly terminator. Once again, the resistance has managed to send a protector back to attempt to save John and his mother Sarah.", - "release_date": "1991-07-01", - "inventory": 1 - }, - { - "title": "Gaslight", - "overview": "In the late 19th century, Paula Alquist is studying music in Italy, but ends up abandoning her classes because she's fallen in love with the gallant Gregory Anton. The couple marries and moves to England to live in a home inherited by Paula from her aunt, herself a famous singer, who was mysteriously murdered in the house ten years before. Once they have moved in, Gregory, who is in reality a jewel thief and the murderer of Paula's aunt, launches a campaign of terror designed to drive his new bride insane. Though Paula is certain that she sees the house's gaslights dim every evening and that there are strange noises coming from the attic, Gregory convinces Paula that she's imagining things. Gregory's efforts to make Paula unstable are aided by an impertinent maid, Nancy. Meanwhile, a Scotland Yard inspector, Brian Cameron, becomes suspicious of Gregory and sympathetic to Paula's plight.", - "release_date": "1944-05-04", - "inventory": 8 - }, - { - "title": "The Magnificent Seven", - "overview": "The Magnificent Seven is a western film from John Sturges and a remake of the Akira Kurosawa's film The Seven Samurai from 1954.", - "release_date": "1960-10-23", - "inventory": 10 - }, - { - "title": "Rebecca", - "overview": "A self-conscious bride is tormented by the memory of her husband's dead first wife.", - "release_date": "1940-04-12", - "inventory": 3 - }, - { - "title": "The Omen", - "overview": "Immediately after their miscarriage, the US diplomat Robert Thorn adopts the newborn Damien without the knowledge of his wife. Yet what he doesn’t know is that their new son is the son of the devil. A classic horror film with Gregory Peck from 1976.", - "release_date": "1976-06-25", - "inventory": 1 - }, - { - "title": "The Day the Earth Stood Still", - "overview": "An alien and a robot land on earth after World War II and tell mankind to be peaceful or face destruction. A classic science fiction film from Robert Wise with an exceptional message.", - "release_date": "1951-09-17", - "inventory": 4 - }, - { - "title": "The Phantom of the Opera", - "overview": "A grotesquely disfigured composer known as the \"Phantom\" haunts Paris' opera house, where he's secretly grooming Christine Daae to be an opera diva. Luring her to his underground lair, the Phantom declares his love. But Christine loves Raoul de Chagny and plans to elope with him after her next performance. When the Phantom finds out, he abducts Christine, incurring the wrath of Raoul -- and a horde of rabid Parisians.", - "release_date": "1925-09-06", - "inventory": 4 - }, - { - "title": "Poltergeist", - "overview": "Craig T. Nelson stars as Steve Freeling, the main protagonist, who lives with his wife, Diane, (JoBeth Williams) and their three children, Dana (Dominique Dunne), Robbie (Oliver Robins), and Carol Anne (Heather O'Rourke), in Southern California where he sells houses for the company that built the neighborhood. It starts with just a few odd occurrences, such as broken dishes and furniture moving around by itself. However, a tree comes alive and takes Robbie through his bedroom window, and Carol Anne is abducted by ghosts. Realizing that something evil haunts his home, Steve calls in a team of parapsychologists led by Dr. Lesh (Beatrice Straight) to investigate, hoping to get Carol Anne back, so he can remove his family from the house before it's too late.", - "release_date": "1982-06-04", - "inventory": 4 - }, - { - "title": "Dracula", - "overview": "The legend of vampire Count Dracula begins here with this original 1931 Dracula film from Bela Lugosi.", - "release_date": "1931-02-12", - "inventory": 9 - }, - { - "title": "The Picture of Dorian Gray", - "overview": "Dorian Gray, wishing to remain young and handsome for eternity, essentially sells his soul so that a portrait can age instead of him. Over the course of the years, Dorian commits every sort of sin, heavily influenced by his friend Lord Henry Wotton. But as his life goes on, he slowly realises the emptiness and evil which he has succumbed to.", - "release_date": "1945-03-01", - "inventory": 8 - }, - { - "title": "The Thing from Another World", - "overview": "Scientists and American Air Force officials fend off a blood-thirsty alien organism while at a remote arctic outpost.", - "release_date": "1951-04-29", - "inventory": 10 - }, - { - "title": "12 Angry Men", - "overview": "The defense and the prosecution have rested and the jury is filing into the jury room to decide if a young Spanish-American is guilty or innocent of murdering his father. What begins as an open and shut case soon becomes a mini-drama of each of the jurors' prejudices and preconceptions about the trial, the accused, and each other.", - "release_date": "1957-04-10", - "inventory": 9 - }, - { - "title": "The Guns of Navarone", - "overview": "A team of allied saboteurs are assigned an impossible mission: infiltrate an impregnable Nazi-held island and destroy the two enormous long-range field guns that prevent the rescue of 2,000 trapped British soldiers.", - "release_date": "1961-06-22", - "inventory": 3 - }, - { - "title": "The Poseidon Adventure", - "overview": "The Poseidon Adventure was one of the first Catastrophe films and began the Disaster Film genre. Director Neame tells the story of a group of people that must fight for their lives aboard a sinking ship. Based on the novel by Paul Gallico.", - "release_date": "1972-12-12", - "inventory": 3 - }, - { - "title": "Braveheart", - "overview": "Enraged at the slaughter of Murron, his new bride and childhood love, legendary Scottish warrior William Wallace slays a platoon of the local English lord's soldiers. This leads the village to revolt and, eventually, the entire country to rise up against English rule.", - "release_date": "1995-05-24", - "inventory": 9 - }, - { - "title": "Body Heat", - "overview": "In the midst of a searing Florida heat wave, a woman convinces her lover, a small-town lawyer, to murder her rich husband.", - "release_date": "1981-08-28", - "inventory": 5 - }, - { - "title": "Night of the Living Dead", - "overview": "A group of people try to survive an attack of bloodthirsty zombies while trapped in a rural Pennsylvania farmhouse. Although not the first zombie film, Night of the Living Dead is the progenitor of the contemporary \"zombie apocalypse\" horror film, and it greatly influenced the modern pop-culture zombie archetype.", - "release_date": "1968-10-01", - "inventory": 9 - }, - { - "title": "The China Syndrome", - "overview": "While doing a series of reports on alternative energy sources, an opportunistic reporter Kimberly Wells witnesses an accident at a nuclear power plant. Wells is determined to publicise the incident but soon finds herself entangled in a sinister conspiracy to keep the full impact of the incident a secret.", - "release_date": "1979-03-16", - "inventory": 4 - }, - { - "title": "Full Metal Jacket", - "overview": "A pragmatic U.S. Marine observes the dehumanizing effects the U.S.-Vietnam War has on his fellow recruits from their brutal boot camp training to the bloody street fighting in Hue.", - "release_date": "1987-05-31", - "inventory": 3 - }, - { - "title": "Blue Velvet", - "overview": "The discovery of a severed human ear found in a field leads a young man on an investigation related to a beautiful, mysterious nightclub singer and a group of criminals who have kidnapped her child.", - "release_date": "1986-08-01", - "inventory": 7 - }, - { - "title": "Safety Last!", - "overview": "When a store clerk organizes a contest to climb the outside of a tall building, circumstances force him to make the perilous climb himself.", - "release_date": "1923-04-01", - "inventory": 6 - }, - { - "title": "Blood Simple", - "overview": "A rich but jealous man hires a private investigator to kill his cheating wife and her new man. But, when blood is involved, nothing is simple.", - "release_date": "1984-09-07", - "inventory": 4 - }, - { - "title": "Speed", - "overview": "Los Angeles SWAT cop Jack Traven is up against bomb expert Howard Payne, who's after major ransom money. First it's a rigged elevator in a very tall building. Then it's a rigged bus--if it slows, it will blow, bad enough any day, but a nightmare in LA traffic. And that's still not the end.", - "release_date": "1994-06-09", - "inventory": 10 - }, - { - "title": "The Adventures of Robin Hood", - "overview": "Robin Hood (Errol Flynn) fights nobly for justice against the evil Sir Guy of Gisbourne (Basil Rathbone) while striving to win the hand of the beautiful Maid Marian (Olivia de Havilland).", - "release_date": "1938-05-14", - "inventory": 3 - } -] From aa9440ce4af9f5df85ba23f0488bddfe3e10fe8e Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Thu, 17 Sep 2015 15:41:15 -0700 Subject: [PATCH 08/75] added number available to movie schema --- app/db/development.db | Bin 73728 -> 73728 bytes app/utils/schema.js | 3 ++- app/utils/seed.js | 15 +++++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/db/development.db b/app/db/development.db index 69cc20d15d7978d4f3815f67bbc45ecf22ff34ad..33e6d757b12bbeb5f0e6088539f6d7c99a02b890 100644 GIT binary patch delta 3261 zcmb7GZBSI_6+Z8K@9y5ccVSr&0r>_I`A}3uP((yU{KQX!s1b>uh@!-(u?F$pyNgCN zsokn=8k4H2jz5|-+}boV+FBb;&2%!Frm42E6E)Gys5Q1TZ6_JA&$+=)|8{52!`{pL zp7)&RJmzumloci5C@$w-NO@n!00#n(rn=z>}?Z<&zvDOO0+t%MfALS-tbygLZg)M z0zB{ctn9+xx1gJ~_ zR3!r@3-5R;?G zGlv2Pn_0kIll^C#>^95PfSD$M(w_&UZ33jM1q@sc2rdHXa{<$sgHaO!W7%!a2ta_H zR%8LH*=21Uz^lc?;EzI`B+rR|P-iq0xAFfele6DbCb~GRCm$w{tq{iA7y`?KF^Rb_ zrZ5YZ31cSHV5uBAkwkRQ(RIxtMP(`^lkygWnK4bHRJij;Q?wuW>+3Yi z-q(@sciz?NlvuaSVm2uU<;!9=8oXNQR`pDc^25{NaOvrCVfZa&1|qV#{a*dWH@d%d zx<*OnFg(8gPK)#S9k1%6K9cR!7Y(KTUAH#O)~F^D#2Nb8HNqd9#qq6zyY0W)Eri;; zQdPZzmJuz3t`_RMGwU@&uP7h;9KeJ;{8F+-wXU0iJ_X2Bed%B>hYH@|<>dHlXt^p)3x;qqVA^E(xOfATCfo`o|#DgvmYc_qn63m);jT+UO z+u-E-ACDNi?Rko+tHc8PlTI1u+KYvNvMO z&ZkvjXjW$~v=FJqi=Jg$xOks>RSiiU7FGR8nN7_al~`Ngb<<~8pvT5#8jTFIj~O@S z2vlnI)8I0KK%HYZmx+)|wn{rlNtWxxyR-w`wCPsm3aBbP53BZlUMdXT9R3XVK>_^! z?u!$KY8JKdb1t5@-9B!3%~i`mxSfLM+&kBu$9Ftxih|i7w~8KjL=ah9@}ZGPHGF0- z+JI2ZwL`#}osVWX+;r3L%L8MPX8hY++=Xmi6)5qf#5pG6qC&QUQ_>&Y zavneMXqptAq!fuxaMmGoyQlzhbTjXJ8;J=fhjdn|DNvbc;l%NIpfUK-3Z4E-cb$Sa&*v ze|pv%!k=G=4c!(k4H?y@1$Nu)cWv;?6?ma8ai4{sQH>Z%O73lxfw?2?iq z2yUBheW!+-odx_-#-L-VUe;|e4H=s&;6!iV4N8mpX=KFDpl2yCFem?&wcMjMtTfh$s0s z0imXOp~0pxV5A!p+9?@xMS$mE8GN`Lrd9Yvf2~9Y$v?;eA_KePaM0$_XgQmUQ#|%A zI&OR^h<9(AtZ_d#q*XWyPB2mY&h>Ex!tp-Wr#R|(sjB}gijkNYJuJVWHCLtK`BpU* zBr0&oaBx(cf(3h9uwe4`vogkAAY~;fOJpSyE|I#GJ_0>pb3N})O$761PKid-P25t^ zjA=g#xcSm8l5f+kXejMZx;-d||XbnCe|_;%Z3$-ec- zFkBHtFng*I@a6p@A0b=>B%7)2)#KoD(j?nw8%#;7!d2&u>3o96H#@OvUTapUu?$^N=or?l4x!A^DMb ziyU;%PjqwpaQxi1XCklj(;i}?XARS+)b7HbGt-j=gi%zCYbxx+i|aFTg^<0k;#NQt zw~1^0O>D07L$r1(e0=@mn}#%l8it~KU4C&CJ#5GOn2{aO)|O)jg!c@|7w8N!|Cw%A fc_GX026(^p#%XR|;o%FU94~gC*e--}ELr^zRY8@e delta 2759 zcmZXV3rtkm8OOhK?=W``4380z_v0`kjDn)P1VlmJE+~i!s0h{vSWwpotJb=B?;QrK zcDLqcOKrPbH@4d*wYKHDPTj3t*KKTU+E`m_sMTbncD32HTTOH~sonN}gh`ro5`LLG zoclfg=YPI)=%VA$MaMUir?Im{)QG>(C+m3LeEDnsM-h?uO;OH}x>q@4d-@kCs$Q>H zc3|FepkNs=rx{S2fV>7Erw(w{0K6Iq zUj#%f1R~3Us0BcD3E-IzOq&P9765U1!1P%}!<3MVuZh_}k{3wH0#eg~v=ksC8OTfm zL;~QA17>)D>}X)7l*Shh%+i3_vhREc5T-sCjbey?CP8_6T9Za8MuOn2gB$kj*s;B) zf7jOCnbyqIBd(T4jl{8?!akqcpt@y{L{$nyjkeqMk~-X=SK*;vm)+Fqvi@3KR$ZfK zf=l#7uv(XCs&p5)SO;j)KA`eNprRjG&PQ)3b+#w7jB%r~2HpAFgni{q zDIWJN(P;Kag|J^eyNg9l#x5dd4*ishV3L`x{nZ-f=+(lCIJcV{U#-%pWkd-3Yv*2K z++4m`qm00iuwVP-6*iR(Z~uuEAzLmMq%M*RqJ_QnSKmaoS(V7<&k%OX`!lB2Q;?J) z3XXXa*=bkBLXGAHP|eayZ{uxOg+_HF)mZ*JgN^^%;czK*kJMVahqfoUzq?$cio;0% zqu+NZTrVrrDBGwJ*1$D;vKVS0WhOPCkqU0ETY%)Fs<3^3yn)~yr5d#b+J&9^=W8rg zcJ829Qm!ir%!@BXMq~-%nFGT9{D#K3zOz`P1QSZ+{^et?mltW|H5!DKe)B9he1%x* z&ldLWn?82R`Juy+K`a9z#4|p!em=Z*G(p%of16OkWhSQFA>|HE?}WmQlzAG>H4h5A z?jP|ieX@{v6vAxmay(WO>7qcRCLJer^QYh8`rf%3C7CaXu?ueYh#Tp1G%7TQMeuwi zON7e4e2uF8nh4&CV&0Id;aq_c0IL$(41EDjzE2c@Br$LEWT$i(O$Vbz7d=WiD@) zbVh=(dJq#RcmJ%)Jq zxZzHR8qyU{f8j)9k!jFU--uxEjB;Zz6~X-2%MghIeUFF7>IOLK-+#+UnCgfzQvSdgvOM8tbF{S9fCy?~>@r%) zk3v?zR|F@VEGMM@T2daeuhUwjXyL}(NTl!=i(rq7`S41&TbhH5pv74So?{|l2Xn0m zJ_%>xA$RQ|rH$>uF7%_9HFdJ{2w|0-zRu0OT8y*+6L#WH-eTus7?gNK${@Q%k5J=X zuJ?z-5@w1Rdm6{?V8c1=uXl;DyYXz4n;w_!_<#rwO=riM^CBrP(?z^^mYWqC21a0& z2wqNP7-zsuJoY>cxhw=A&uLF$rFY6?T8Ym>M%V-yV>nPmW1vj+DN!FHlmac*YIi?sY_V>wflJ>X%)P8EKJy+)W)h)S6?3~Ut!m&56io_ z@#QWlAqL+-<0kmV+llK)-z%(}O|NrP?T`}St}>P$WK(T Date: Thu, 17 Sep 2015 16:28:10 -0700 Subject: [PATCH 09/75] added foreign keys to rental tables --- app/db/development.db | Bin 73728 -> 73728 bytes app/utils/schema.js | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/app/db/development.db b/app/db/development.db index 33e6d757b12bbeb5f0e6088539f6d7c99a02b890..60d8bae379a15981636b3353a737147235b977c7 100644 GIT binary patch delta 972 zcmY+=O-vI(7zW_o&af=9AcX>@1sxEimGV`w77U1_V1fxrDRg5SOH0Z^xRs3_ zJgPO(L`_I)A_ou3nqZ8F9z1yPpmz@*jPc;ni-w@@1W2UG`)uc%nQtbum8V;Ide>1- z9}9vofgJx{-Sc$XP;LEQT!I=Aw*|{X(kpJ8R@NqZ4c%5)?R1K_M)b&1LQ88&J(5^E z`p`f~_0Oqn&ObV(vcqCFNt~Iqrmv@y;b=tHn67Q=9=4L&h-=|^l*N;}c0)^h*z)?C zo?6k;CyOy{`KA^Pr`C10lu9MENYcZCS3~OM@o6@xUUwb$akG#bR72`?K%G5o?utj< zM{C=U7XNp|iS@^IzQt|Sm1nJ%r^E_)11h>fwHMesfU^x;XaOT`(AUh* zR2o4;1L&*=6LsK}160+38at@10%t1#D+BeV;G6=^7Xh~fS}2f60ko406bej5-XNJ) z!-v7R!S56__$>m43yvBL`VHRSXYjVeh75-cAPj7Ru2s+&1CB+|KM%TRKr?@X5+AVf zwkq#>i8npXKpk({#5)$sCHz7HHLWp`WEuN?f5+(!pfZZ^m-8X~@rIBAqzh?B_?z$! zm59Tf+IdS%N%=!|ZItHdYvdg@=?9UT1^K_kq%#(3O79Oyj()`47i0nRpDcvO7UBwDbBCbbZOs zdcn6oL*)??Lu%2+j@bmCZ9FK<(GFCinDHQe$SUGPHgUdgp*d*_EAJc>=ja&r-RAoq M@UGh!z1b)K0Kfvz3;+NC delta 1019 zcmYk4J4{ny6o7m0|8raDZ7EQoKnvylDo`lz@+fZ-l@QU035h0}$l%~$3|qN|K@$f| z7h}|z)C31(3|AwA1A~JxE+&o+4#qe*=;lC*-_gY;-*^Ah|K4-Yf6m=L)Z2%8x3=8; zyZe73D1I z+_?H^)Va29RoTcT_Nyr%?X{ z8XQMMqiA>-jSQmkel(Fp^S!8}8`XEB+ID$oWeW;5A#Wq!!%@IMjoAI zF$a=x0p$Bx0x3x6&RLtqH`AuqQ?s+y=)SKSG6;?T!u^QWdHojN`11M#d|~~G>sPKj z@I&uu+hFkku4`8(Or5tbYu8#WsJx!w-#hRb4%mHXvh%&5T>V>CKMP)0ADMd33K{y9 zWfc5-IxN{# Date: Thu, 17 Sep 2015 16:49:31 -0700 Subject: [PATCH 10/75] Implemented a few more tests. WIP movies table initial tests. --- app/db/development.db | Bin 73728 -> 73728 bytes app/db/test.db | 0 app/test/database_tests.js | 27 +++++++++++++++++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 app/db/test.db diff --git a/app/db/development.db b/app/db/development.db index 60d8bae379a15981636b3353a737147235b977c7..d593fbba4c72cf61ff37c6fa00f4d5e25fb998d4 100644 GIT binary patch delta 747 zcmXxgKTH#07=ZD9cVEu~3RY-KsYMDFDN?bm6>F_fuwoO@5dS0{NNl15g9C#x3?}6g z2L}gC7h_B`ITIZm)YFu~fq}unK@un8;Nalk;9!g~r15zNn>@d}-hF-VzOHTRwN1Sq z>-F#We7-9E|7<--=M4YO>-wBh{Y_W>R^jF&z6YHUigKUbqH_mtcPl zqF15+GW1@8eHWqU0(6`QTb_}ghsg?LXW{rXOqHNigh~NYQ*a;;!7Lojz?n%Hoq)aL zaB@tZc{T~55f~eW{2&x#kQ{(xQ8*QW={_h2VYUb60&uPaj#x0E!EgF8YBtbkc>(*j z*%)`qd^zOEI~{c7Ery*GCY%HgIWj-)$k+kL#)t#H&Q++cz{oPp)S<5iU5k*B|KLO! z!ZLPHrgqEFSOQMV$a$H#$L{u2z|@`&8M!{*niz@VrZqW;ROHb(~Eiv$+JR&ahHsq|{ zHd{KbcFi{l&59IdXpz29l5X;=ysTZ32d;AE2Hjx~_c$(dw`^$FO4GXSSs(tI{{Yem BgO&gQ delta 750 zcmXxgKTH#G6u|Lb?@5z(#3rI4{z*EJ*hB{g2L@x<$|VjC z4wyO^G125qaBvXMLsI5;>s7~{}1exHdX-wy}xckeE@*^teKY(;~z z?eTcZ^#5n~UTV@S+q>10VT9|B@!JU2A9^1fp?co@XiT_%88&NyYaH*n3Wru9S%JkX zP`CsqFT(T%IB^~_=OC@m7+-?aB3Sd#F$bLm=+47|90aE!l!d+wMAC3@9FC2_=~2jy z=rjEZ7#f1fK`0Nvz9{teLw^Kfy>K`L@c;~V!x29m?SN4qj0yP6HjJ1x^t8Et>y}wN zZWsCEtgY{~Wb0cj*hwteah$hxf6>;pbGC)EHh5+>U}_x_YY?qMz5>}57}0OgRfMpv zJ)>Js>C*ji7|@l&y0P8rat*&JbqV)n7WhYr^n(>izu7F!&=gIOehR&@hobIsc+Yet z;1$;wX_<~R#E}p5jXue12^c#1+~Uv=y}GW4QVjh629I=bQwJ+L_`+RxsX%-5j{eAw zSOyp0=_fsoZ|MCStxi`~^=e(8b%)t~X78KkUq*|E3jhEB diff --git a/app/db/test.db b/app/db/test.db new file mode 100644 index 0000000..e69de29 diff --git a/app/test/database_tests.js b/app/test/database_tests.js index a9ea0b4..0c8a06b 100644 --- a/app/test/database_tests.js +++ b/app/test/database_tests.js @@ -3,17 +3,40 @@ var Database = require("../database"); describe("Database", function () { var db; + var database_path = "db/test.db"; beforeEach(function() { - db = new Database(); + db = new Database(database_path); }); it("can be instantiated", function() { - assert.equal(db instanceof Database, true) + assert.equal(db instanceof Database, true); + }); + + it("holds onto the 'path' to the database", function() { + assert.equal(db.path, database_path); }); it("has a 'query' property that is a function", function() { assert.equal(typeof db.query, "function"); }); + // describe("Movie queries", function() { + // before(function() { + // // create a movies table + // db.query("CREATE TABLE IF NOT EXISTS movies (id INTEGER PRIMARY KEY, title TEXT);"); + // // insert some movies + // db.query("INSERT INTO movies(title) VALUES('Lockjaw');"); + // }); + // + // it("has a movies table", function(done) { + // var table_exists = "SELECT count(*) AS table_count FROM sqlite_master WHERE type='table' AND name='movies';"; + // + // db.query(table_exists, function(result) { + // assert.equal(result[0].table_count, 1); + // done(); + // }); + // }); + // }); + }); From 03adb9191064ed08a3e96d153332866301d99dc4 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Fri, 18 Sep 2015 10:30:14 -0700 Subject: [PATCH 11/75] reorganized file structure and updated package.json --- app/app.js => app.js | 4 ++-- app/db/test.db | 0 {app/bin => bin}/www | 0 {app/controllers => controllers}/index.js | 0 {app/controllers => controllers}/movies.js | 0 app/database.js => database.js | 0 {app/db => db}/development.db | Bin 73728 -> 73728 bytes app/package.json => package.json | 6 +++++- {app/public => public}/stylesheets/style.css | 0 {app/routes => routes}/index.js | 0 {app/routes => routes}/movies.js | 0 {app/test => test}/database_tests.js | 0 {app/utils => utils}/customers.json | 0 {app/utils => utils}/movies.json | 0 {app/utils => utils}/schema.js | 0 {app/utils => utils}/seed.js | 0 {app/views => views}/error.jade | 0 {app/views => views}/index.jade | 0 {app/views => views}/layout.jade | 0 19 files changed, 7 insertions(+), 3 deletions(-) rename app/app.js => app.js (95%) delete mode 100644 app/db/test.db rename {app/bin => bin}/www (100%) rename {app/controllers => controllers}/index.js (100%) rename {app/controllers => controllers}/movies.js (100%) rename app/database.js => database.js (100%) rename {app/db => db}/development.db (68%) rename app/package.json => package.json (59%) rename {app/public => public}/stylesheets/style.css (100%) rename {app/routes => routes}/index.js (100%) rename {app/routes => routes}/movies.js (100%) rename {app/test => test}/database_tests.js (100%) rename {app/utils => utils}/customers.json (100%) rename {app/utils => utils}/movies.json (100%) rename {app/utils => utils}/schema.js (100%) rename {app/utils => utils}/seed.js (100%) rename {app/views => views}/error.jade (100%) rename {app/views => views}/index.jade (100%) rename {app/views => views}/layout.jade (100%) diff --git a/app/app.js b/app.js similarity index 95% rename from app/app.js rename to app.js index 80a3c36..cc90857 100644 --- a/app/app.js +++ b/app.js @@ -6,7 +6,7 @@ var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var routes = require('./routes/index'); -var users = require('./routes/users'); +var movies = require('./routes/movies'); var app = express(); @@ -23,7 +23,7 @@ app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); -app.use('/users', users); +app.use('/movies', movies); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/app/db/test.db b/app/db/test.db deleted file mode 100644 index e69de29..0000000 diff --git a/app/bin/www b/bin/www similarity index 100% rename from app/bin/www rename to bin/www diff --git a/app/controllers/index.js b/controllers/index.js similarity index 100% rename from app/controllers/index.js rename to controllers/index.js diff --git a/app/controllers/movies.js b/controllers/movies.js similarity index 100% rename from app/controllers/movies.js rename to controllers/movies.js diff --git a/app/database.js b/database.js similarity index 100% rename from app/database.js rename to database.js diff --git a/app/db/development.db b/db/development.db similarity index 68% rename from app/db/development.db rename to db/development.db index d593fbba4c72cf61ff37c6fa00f4d5e25fb998d4..33e6d757b12bbeb5f0e6088539f6d7c99a02b890 100644 GIT binary patch delta 1010 zcmYk4J4{ni7=Z7+=g=0oEu|DF&_a2?3KYt_Jj$EINQh{}#6%KJWN>gWhOJz~pos&f zi!o|UYNCTNhHJ#Zfx*ET7k38-V;mfGb0DqXkBc|?zI)HT=lthC|9^Ln^zM<~uMb(j z4Z~Q45-=fkFEJ!<`@Wa^t(S&n1q>^o#@tH#v8kMx$~~|iY3AL@rB%$-xeMy5a+Y;& zQhhcXTwAxRY~(WEYcHYjMO3wkLg!HB1`3=({xwv78kL?xKFOeS86_4`{~Surpus6L zJc&le(dZ}|8%C3ZXex;o`%zafYV1b!ow8?j8w$1{Z!;Q*p;SFe*P-bMnyEpVDl`{F z^8vJAqvcYx;z50KP_3ji5tYS8uWS2ms%(#wVbJYJP92V9(e8BNHYbi-9f{xUNZ7dJ z!%Yq{Vml~$9o224nk`hZiOSZ|s?=a8gC-N?8!&ojk zz0d=vfD}Ul*MgKI3{sI0R6+$vUHniEWgyj&Gi5tb0wizg zfg~(l83Jk12%Pkb`vgcArJd4YIhS;&5u`2EAcvFsdtm@lAeBhNG|2xj3mKS`rSm*2 zfCO9u`F~bG64JTzp6$|GY0GQW?QJx>A44N1L-W7kK}2g;-#4{e5;c9Ur>mgydRXUm z5;DQO-t^`5HqTG>p$?jsc0GS&$`@88WVBaMuKp_P-xt-Pj+)2npiQ%29L_RpOJ-dw zcwN0?*{BqDR(XWhQO~`_8gAj6Z?PT{*%4!lf56x>Kn59 oie#}){3%oCOYXA&+aljSNG3mueEUV>$H8YhZ1V7miSLfpUsVv4AOHXW delta 958 zcmY+=KTH#G6bJCT-mgc20xf?FE%F0FS}A{u2#5$Ra0LS*DVShFQVPA;#?q2<5C)TS zadA{@qJt*HYQo@PJQElh92^`paWKZg!59Yz2M0|E_;o_MjG7NT_Kw zsYMbiM-Mg}QUWsyp9u_2DEzRPO-jy8TGdw5$#68Hsa#XnH7{REt;N-FJj&xqO}(L} zy?k+XMN2KI>668nx_DEKhEuB=Ur41AY9#69!K)$V^5`TVSFXE{=XiKX2`V9Fa#)!@ z9PW-sJx9ImN6r6jaiagYPD?y`ZAI2@dLrq;%50zXLF_cFtVzmP7jYZCVQ_X1IA?+5 z8mO8Er6FLS1jScC{y4DEwR(e~Z3OrN;QRpS?g#ySV5AqgyTPe0VDo|Y4lvvXnp!}K z2V7{TJ(WgK-T<2GL02v4s{xJG;G6?otONsPz;6SAVlZR{qxqm!1}zMjB{OtL87Rnx z)v_jKJh~sr8J)iAv`$}9ue%}FIjqxZzDuXE)w%^%>Od%12V={iAqEELLD?)QoB|zm z2R(jJL1SxaY7q^s;ouUD4AR6rOA&pLzzlm#l(L-veQIU*x12sYC`Z>nIWTov{Ex zvpW%VBXmaEVbGY^+L3asoEgkzvKaF6KC(t+b0%iUUdr4o$23&FiOeu}9F*kPS5(#! zev83wQQsHp8$)FSl}{#?lkZp!d7i2du<{43e0-2+FbDnnc!2sdbWb2&;{78N+m;<7 zwZA~=C);K&aZh^nnjwp!;TJ92p{-|;MJanrLw@7^JH#JLj?J*=Otcy7J#9aQfi`g; IJ0|v|f6eU8qyPW_ diff --git a/app/package.json b/package.json similarity index 59% rename from app/package.json rename to package.json index d6b9af7..e2332d8 100644 --- a/app/package.json +++ b/package.json @@ -3,7 +3,11 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www" + "start": "nodemon ./bin/www", + "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" }, "dependencies": { "body-parser": "~1.13.2", diff --git a/app/public/stylesheets/style.css b/public/stylesheets/style.css similarity index 100% rename from app/public/stylesheets/style.css rename to public/stylesheets/style.css diff --git a/app/routes/index.js b/routes/index.js similarity index 100% rename from app/routes/index.js rename to routes/index.js diff --git a/app/routes/movies.js b/routes/movies.js similarity index 100% rename from app/routes/movies.js rename to routes/movies.js diff --git a/app/test/database_tests.js b/test/database_tests.js similarity index 100% rename from app/test/database_tests.js rename to test/database_tests.js diff --git a/app/utils/customers.json b/utils/customers.json similarity index 100% rename from app/utils/customers.json rename to utils/customers.json diff --git a/app/utils/movies.json b/utils/movies.json similarity index 100% rename from app/utils/movies.json rename to utils/movies.json diff --git a/app/utils/schema.js b/utils/schema.js similarity index 100% rename from app/utils/schema.js rename to utils/schema.js diff --git a/app/utils/seed.js b/utils/seed.js similarity index 100% rename from app/utils/seed.js rename to utils/seed.js diff --git a/app/views/error.jade b/views/error.jade similarity index 100% rename from app/views/error.jade rename to views/error.jade diff --git a/app/views/index.jade b/views/index.jade similarity index 100% rename from app/views/index.jade rename to views/index.jade diff --git a/app/views/layout.jade b/views/layout.jade similarity index 100% rename from app/views/layout.jade rename to views/layout.jade From 64b73a398f63886df466d3f0a33dceb0741b92e5 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Fri, 18 Sep 2015 13:15:54 -0700 Subject: [PATCH 12/75] WIP relationship between movies model and controller --- .gitignore | 1 - controllers/movies.js | 11 ++++++++++- database.js | 11 ++++++----- db/development.db | Bin 73728 -> 73728 bytes models/movies.js | 9 +++++++++ package.json | 8 ++++---- routes/movies.js | 4 +++- 7 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 models/movies.js diff --git a/.gitignore b/.gitignore index 2f17085..7595163 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ .DS_Store node_modules -app/node_modules npm-debug.log diff --git a/controllers/movies.js b/controllers/movies.js index 0338f0d..76b6bd0 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -1,4 +1,5 @@ "use strict"; +var Movie = require('../models/movies'); //class needs to be instantiated exports.moviesController = { database_test: function(req, res) { @@ -7,4 +8,12 @@ exports.moviesController = { return res.status(200).json(results); }, -} + + index: function(req, res) { + var db = new Movie(); + db.find_all(function(err, result) { + + return res.status(200).json(result); + }); + } +}; diff --git a/database.js b/database.js index bf6840d..5494c00 100644 --- a/database.js +++ b/database.js @@ -7,13 +7,14 @@ function Database(path) { } Database.prototype = { - query: function() { + find_all: function(callback) { var db = new sqlite3.Database(this.path); + var statement = "SELECT * FROM " + this.table_name + ";"; - db.serialize(function() { - var movies = db.run("SELECT * FROM movies;"); - }); - db.close(); + db.all(statement, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); } } diff --git a/db/development.db b/db/development.db index 33e6d757b12bbeb5f0e6088539f6d7c99a02b890..14a299ea5d9ceefecec03be510cee0215d5ddc54 100644 GIT binary patch delta 1005 zcmY+CKTH!*9LIaT*FQk{Qz%eckOzXaQvMVXDx$Q&6%2@^V1fxrDfD6+OH0Z@7>wnj zgM$OwK?hBUHG#pwcp4oX7#tiNG;wfna4^P!!NEZd0l&WhiCpsi+`aGnzVE$zxz#PU zy2aKUrKWA2PB#o4UN`P~I&5%Tz84h26NPo1{=V2PtZP=@DtJ|;#8l~Y3OD1F?sHq91W+I6h50uCFDrb!-JPX(uJWhJ|bOl9rn0+ND4|JX>356 z*e`d*qwa%j+d=rhR~*S7`n1HY))Zx}`bVM~EY9|bABA?!!WzX)%^XgnFbo8zfx0Q6 z<1%2G0GuJfJ_b}?1d2w0JUUiS5NI6)P6vSA^T1#)P|^dm`GA2gps^E>yg*Ys5NHLC zHv@fcpu36Qd9DHQ)dS`_psNNr<^XI}K&Kt(sQ^xu0cT5q^F@H)0u1E=Ek>Z30S3_k z+Qkg0Giny|vY2tJehf~iv?s38E^1X5SgmrfN~QjMm1>7oGgz+zy0R6ZU;!wP0gf5q z$TTFfz+~ffk@2 z&>(oCl_IqbhsXy03}5kxi+nsk7(QCFRcO z?2!6kR(g(ZP?^XD_RG$r@G>f1LZLILXb}ZYA^$uoIEnI(BcD{zG=t((sAC)@Mp4%= z>KQ`41E{YL_4lBmE;O7#Qyr+e4IOJi6;1Nal6n-ZMY%PoGm4TGC{>O|B51S}rHj#c z5KRQoq=RPi(5#Kx<)B(gYa%LxjW*BmT~(P@H_c6pD>XH`QbmK?jO*PPu5%@SjVozm zt`Aqc$cV0^sx?%;ib_{d;S$PUKy%WA?lc;dw6zK3NYa5A8k3aML1g>6N-b> zEi;gUWh&huBkF~}^WuLHWQsCQnXsHorgIErEF~a^lm6#ICnP~Sk%AGB?_mtmFfNZy za4`vza2n+MnFT3GXV2QJdDl`_u2H_ZSmV77^_tw8|K09JwBzX>OM752V8^%tib{yA5HD$yh3)fJT=GiZ`jm(y2?CI zyY)6(rw^5kIxDwj@1do$cDN)Pc9PzF_ysY~N%9!p6Z_rLd$wcB zqxV?40>ki9?`R)y)?1Q!K(;@#6qHg=z#X>UNqJw6c*RY*dc&Umjp$zzec Date: Fri, 18 Sep 2015 13:23:06 -0700 Subject: [PATCH 13/75] First endpoint (to get all movies) is working. YAY. --- database.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/database.js b/database.js index 5494c00..4485c97 100644 --- a/database.js +++ b/database.js @@ -1,14 +1,11 @@ "use strict"; var sqlite3 = require('sqlite3').verbose(); +var db_env = process.env.DB || 'development'; -function Database(path) { - this.path = path; -} - -Database.prototype = { +var Database = { find_all: function(callback) { - var db = new sqlite3.Database(this.path); + var db = new sqlite3.Database('db/' + db_env + '.db'); var statement = "SELECT * FROM " + this.table_name + ";"; db.all(statement, function(err, res) { From da3013e35df3775627172788df42285942de6138 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Fri, 18 Sep 2015 14:53:43 -0700 Subject: [PATCH 14/75] Set up schema in test.db and wrote test for /movies endpoint. --- controllers/movies.js | 4 +-- db/development.db | Bin 73728 -> 73728 bytes db/test.db | Bin 0 -> 4096 bytes models/{movies.js => movie.js} | 0 test/database_tests.js | 42 ------------------------------ test/movies.js | 45 +++++++++++++++++++++++++++++++++ 6 files changed, 47 insertions(+), 44 deletions(-) create mode 100644 db/test.db rename models/{movies.js => movie.js} (100%) delete mode 100644 test/database_tests.js create mode 100644 test/movies.js diff --git a/controllers/movies.js b/controllers/movies.js index 76b6bd0..d2146e1 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -1,5 +1,5 @@ "use strict"; -var Movie = require('../models/movies'); //class needs to be instantiated +var Movie = require('../models/movie'); //class needs to be instantiated exports.moviesController = { database_test: function(req, res) { @@ -10,7 +10,7 @@ exports.moviesController = { }, index: function(req, res) { - var db = new Movie(); + var db = new Movie(); db.find_all(function(err, result) { return res.status(200).json(result); diff --git a/db/development.db b/db/development.db index 14a299ea5d9ceefecec03be510cee0215d5ddc54..383f7266be9d363ef8de1cbec4028bae87575d65 100644 GIT binary patch delta 356 zcmWmAIZi@R6vpv;;R;WDf)5lPpbRRCf`AMTDD$ADOK>NUxBb>{LtBZP1X{U#rxI7d=XQiL1a O!2|VUTWi~rJO3Ubfge8r delta 913 zcmd7QPe>F|90%~3{jR#2t-D$_n%2`a|8M@wHdAxWe^5%9g;3B=>vP?hc9xwX^`Pq{ zLJ&clhaidwA&3tBkqElvA%ZSlx^(H%r4C*q@Y1F41f9D!@IDN@_kQ#HGs~OaE7k6+AH?V>wEWn0|E0Bod0?y+MPGJNC=tUSE z2xTLcnd=sOO6_V#m8wq8N-;EVreg`qZfkE@kb1hsG^WLbjO$4;rpLx*!Vs5bJdw17 zZ3=x_PuYT7az14wVhLL$<(x>#v}GoBBVjKH-4d3a){}85PCcz~1TAyivbaYGKc5j}anmtL>80Lr4`*;Icj Ui&@9~um7hNE%;gss^9&;0gOG+rT_o{ diff --git a/db/test.db b/db/test.db new file mode 100644 index 0000000000000000000000000000000000000000..23fe533a47c08ec4f894f35113ede5608fedfcd6 GIT binary patch literal 4096 zcmeHI&2AGh5Vm(C1yLb!snRG#F}JQ1PCNjF%Bj+y0GmiC;;^{8Zew+KUD@8098(^G zD=))~aNs$ZP1a5JP$YUQvL&y_Gvo1m-`MN%$5UZAxsWPjhP*}%gfV(c2tsHNdIP#` z&q3IpV{7=!xQAZ--gyQNKK_CHFWz?;T>A$Gmd0dz{2>eBE_$608 z5*OOYjH|kG#^WoVM6xjCT*{QQyhjG_LpnSfm7x!8oPdOMKtnn@q~mpPNG7QJZtYNW zxB7BLupD^JR=109Kd)e0o4ynL8uUB${or$!S=5SO3T=SPB!V-)W`ZS&;#ya;SeQj6 zYO|s1TEZ-iVwu=b*E5-0nZ>azaudZ6SQv7VN@jxP3*2nA+xT{O1!P5(UVptBgthMe z{EaZF-AT^5g2LTYDJl*X(R{nGBA>%ak!rE2Y+hs$n=_G?=g6vq@@{(mPvrlCk86$r z$H3!bpyM^sZmWy&8N1P+;3e19VT+x{J_chOjK^Rc&zQQ}Sf4&A?| Date: Fri, 18 Sep 2015 15:21:08 -0700 Subject: [PATCH 15/75] Added endpoint to select column and return movie info for n movies offset by p records. --- app.js | 1 + controllers/movies.js | 14 +++++++------- database.js | 13 ++++++++++++- db/development.db | Bin 73728 -> 73728 bytes routes/movies.js | 3 +++ 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/app.js b/app.js index cc90857..c015370 100644 --- a/app.js +++ b/app.js @@ -24,6 +24,7 @@ app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/movies', movies); +app.use('/movies/:column/:n/:p', movies); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/controllers/movies.js b/controllers/movies.js index d2146e1..a031e03 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -2,17 +2,17 @@ var Movie = require('../models/movie'); //class needs to be instantiated exports.moviesController = { - database_test: function(req, res) { - var db = new Database(); // instantiates Database object - db.test(); - - return res.status(200).json(results); - }, - index: function(req, res) { var db = new Movie(); db.find_all(function(err, result) { + return res.status(200).json(result); + }); + }, + + by_column: function(req, res) { + var db = new Movie(); + db.by_column(req.params.column, req.params.n, req.params.p, function(err, result) { return res.status(200).json(result); }); } diff --git a/database.js b/database.js index 4485c97..9c1dbe5 100644 --- a/database.js +++ b/database.js @@ -12,7 +12,18 @@ var Database = { if (callback) callback(err, res); db.close(); }); - } + }, + + by_column: function(column, number, page, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT " + column + " FROM " + this.table_name + " LIMIT " + number + " OFFSET " + page + ";"; + + db.all(statement, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); + } + } module.exports = Database; diff --git a/db/development.db b/db/development.db index 383f7266be9d363ef8de1cbec4028bae87575d65..af9db1c2d14872077ef8c3cfc8841b304c684f53 100644 GIT binary patch delta 1167 zcmd7Q+e;Kt90%~3`JJ8CGFx-ARo6O}mX|bdnU$87rI1RNg;3B=>$Gl6JIn5n3Ykt9 z5GrWvp&kl~?MgxBbR&X%=%FAYsD~a3B7%C5D2j*@?R)wMdTrtR*_q$Y{Lb&p?9dn+ z8e=E2(^5JlNoqmN=nDAzyV4U1i z!I7#wS?=u7`T9OH77WL&iptV{U5k~PMmOKAhqMT9(}L}K*xA~h~CSidMs{6G$U;Fb1lx}R!ob8bgu8yBUT)D@74^1TUg34gPP&zT1?lt zxtllZW-O#zW^bg7x9Bmx*R&j8dZsdn-PZ@f@||Ge4$#;I7He%$f%IHZoDJq=ff+uKkqKHdz;qADN(25>uqXu-si1@bmBfqnk=U8!`p1jC>7i?s zq;q($2|7wgXfV;}b2@z`e{V0f8_=WK7F%hs#qg``Lb%H2u*w!=t+d57)wUaYZ6M9- z12s`l+XL1FKtUI1+5}R>qswUkGez5c(X~)C&E{Z%XvsxKWtw}GF?Nc1=bp;(R5|V5 zyEL7o0ZAE?zexiL+x*}ET%Q$3^-Yq)9xCpn`iVK}GjUd@;ON~HIj$E|lw?0yl64`k z+)4HU--nS_=CCgcORD4So|-C8;7?bc@P<%s-4ukEk?=jV=*=PfSg7*pmtR0|ZDQApigX delta 607 zcmWmBFKiQG7{~GZ^YnUyqr1WirF4O9Ep)Jrl|TbYMPVH@S;fS}#KZ&wfj}VUR)IiF zv>5_{SaM4?F#&x^T7jrQAP@)y0)aqGEChi-T-tpf@wt2Nd7t<9zIWFeNNXVNT*@z6 zmeoK4^-ihc_{9&Kdu}%ni6jssLF{%`lj$YqZ($x!P}|Lhm2GQ=;X~ZOGBi$GZzDt< zRoue@<}ij7E+LC62yh2ec#LzH#3GV-gaXEK9vAVzTCuDWgEG>%i5xOGiwl^BzTX*K zMjlsj4c9RX4`Q;JKhCZfX39FPZQ8EObh*Z8oW|;zbPGM7o-=2fVc(4;%hwv%ViMnM ziM-!pyzfJ|C!wviA0s+W_@+E%ge~P2g9+P@ Date: Fri, 18 Sep 2015 15:25:42 -0700 Subject: [PATCH 16/75] created endpoints for all customers and subset of customers --- app.js | 3 +++ controllers/customers.js | 19 +++++++++++++++++++ models/customer.js | 9 +++++++++ routes/customers.js | 14 ++++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 controllers/customers.js create mode 100644 models/customer.js create mode 100644 routes/customers.js diff --git a/app.js b/app.js index c015370..7f88743 100644 --- a/app.js +++ b/app.js @@ -7,6 +7,7 @@ var bodyParser = require('body-parser'); var routes = require('./routes/index'); var movies = require('./routes/movies'); +var customers = require('./routes/customers'); var app = express(); @@ -25,6 +26,8 @@ app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/movies', movies); app.use('/movies/:column/:n/:p', movies); +app.use('/customers', customers); +app.use('/customers/:column/:n/:p', 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..4c4b824 --- /dev/null +++ b/controllers/customers.js @@ -0,0 +1,19 @@ +"use strict"; +var Customer = require('../models/customer'); //class needs to be instantiated + +exports.customersController = { + index: function(req, res) { + var db = new Customer(); + db.find_all(function(err, result) { + + return res.status(200).json(result); + }); + }, + + by_column: function(req, res) { + var db = new Customer(); + db.by_column(req.params.column, req.params.n, req.params.p, function(err, result) { + return res.status(200).json(result); + }); + } +}; diff --git a/models/customer.js b/models/customer.js new file mode 100644 index 0000000..55445ed --- /dev/null +++ b/models/customer.js @@ -0,0 +1,9 @@ +"use strict"; + +function Customer() { + this.table_name = "customers"; +} + +Customer.prototype = require('../database'); + +module.exports = Customer; diff --git a/routes/customers.js b/routes/customers.js new file mode 100644 index 0000000..bd1ff7d --- /dev/null +++ b/routes/customers.js @@ -0,0 +1,14 @@ +var express = require('express'); +var router = express.Router(); +var customers_exports = require('../controllers/customers'); + +/* GET /customers */ +router.get('/', function(req, res, next) { + return customers_exports.customersController.index(req, res); +}); + +router.get('/:column/:n/:p', function(req, res, next) { + return customers_exports.customersController.by_column(req, res); +}); + +module.exports = router; From f4aad09b203c5a1129317d425a8bc4d532838ba5 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Fri, 18 Sep 2015 15:31:20 -0700 Subject: [PATCH 17/75] tests for customer --- test/customers.js | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 test/customers.js diff --git a/test/customers.js b/test/customers.js new file mode 100644 index 0000000..ac71eca --- /dev/null +++ b/test/customers.js @@ -0,0 +1,45 @@ +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('Beetlejuice', '10/10/2010', 'Yesterday', '123 street', 'Burlington', 'WA', 98233, 3604216650, 5.25), \ + ('Juice', '10/10/2010', 'Yesterday', '123 street', 'Burlington', 'WA', 98233, 3604216650, 5.55); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + + it("can be instantiated", function() { + assert(customer instanceof Customer); + }); + + describe("instance methods", function() { + context("GET #find_all", function() { + it("retrieves all customer records", 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, 'Beetlejuice'); + done(); + }); + }); + }); + }); +}); From 0168ceaa49e304f386fadce9e705dc8ebcf02231 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Fri, 18 Sep 2015 16:44:24 -0700 Subject: [PATCH 18/75] wip rental checkout --- app.js | 1 + controllers/rentals.js | 12 ++++++++++++ models/rental.js | 22 ++++++++++++++++++++++ routes/customers.js | 4 ++++ 4 files changed, 39 insertions(+) create mode 100644 controllers/rentals.js create mode 100644 models/rental.js diff --git a/app.js b/app.js index 7f88743..50cccb4 100644 --- a/app.js +++ b/app.js @@ -28,6 +28,7 @@ app.use('/movies', movies); app.use('/movies/:column/:n/:p', movies); app.use('/customers', customers); app.use('/customers/:column/:n/:p', customers); +app.use('/customers/checkout/:id/:title', customers); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/controllers/rentals.js b/controllers/rentals.js new file mode 100644 index 0000000..ace7a5d --- /dev/null +++ b/controllers/rentals.js @@ -0,0 +1,12 @@ +"use strict"; +var Rental = require('../models/rental'); //class needs to be instantiated + +exports.rentalsController = { + check_out: function(req, res) { + var db = new Rental(); + db.check_out(req.params.id, req.params.title, function(err, result) { + + return res.status(200).json(result); + }); + } +}; diff --git a/models/rental.js b/models/rental.js new file mode 100644 index 0000000..d1db17e --- /dev/null +++ b/models/rental.js @@ -0,0 +1,22 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(); +var db_env = process.env.DB || 'development'; + +function Rental() { + this.table_name = "rentals"; +} + +// Rental.prototype = require('../database'); +Rental = { + check_out: function(id, title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var daysOffset = 7; + var return_date = new Date(Date.now() + (daysOffset * 24 * 60 * 60 * 1000)); + var movie_id = "SELECT id FROM movies WHERE title =" + title + " ;"; + var statement = "INSERT INTO " + this.table_name + "(return_date, movie_id, customer_id, checked_out) " + "VALUES (" + return_date + ", " + movie_id + ", " + id + "'true'); "; + } +}; + + +module.exports = Rental; diff --git a/routes/customers.js b/routes/customers.js index bd1ff7d..3ab0708 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -11,4 +11,8 @@ router.get('/:column/:n/:p', function(req, res, next) { return customers_exports.customersController.by_column(req, res); }); +router.post('/checkout/:id/:title', function(req, res, next) { + return customers_exports.customersController.check_out(req, res); +}); + module.exports = router; From 8a12d82bea1fc1b9dcb477ec09f29cfca7f551d5 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Sat, 19 Sep 2015 13:29:25 -0700 Subject: [PATCH 19/75] WIP checkout functionality. --- app.js | 5 ++--- controllers/rentals.js | 3 +-- database.js | 20 ++++++++++---------- models/rental.js | 26 ++++++++++++++++++++------ routes/customers.js | 5 +---- routes/rentals.js | 15 +++++++++++++++ 6 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 routes/rentals.js diff --git a/app.js b/app.js index 50cccb4..188a288 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,7 @@ var bodyParser = require('body-parser'); var routes = require('./routes/index'); var movies = require('./routes/movies'); var customers = require('./routes/customers'); +var rentals = require('./routes/rentals'); var app = express(); @@ -25,10 +26,8 @@ app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/movies', movies); -app.use('/movies/:column/:n/:p', movies); app.use('/customers', customers); -app.use('/customers/:column/:n/:p', customers); -app.use('/customers/checkout/:id/:title', customers); +app.use('/rentals', rentals); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/controllers/rentals.js b/controllers/rentals.js index ace7a5d..72a79ad 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -2,10 +2,9 @@ var Rental = require('../models/rental'); //class needs to be instantiated exports.rentalsController = { - check_out: function(req, res) { + create: function(req, res) { var db = new Rental(); db.check_out(req.params.id, req.params.title, function(err, result) { - return res.status(200).json(result); }); } diff --git a/database.js b/database.js index 9c1dbe5..94fab68 100644 --- a/database.js +++ b/database.js @@ -11,18 +11,18 @@ var Database = { db.all(statement, function(err, res) { if (callback) callback(err, res); db.close(); - }); - }, + }); + }, - by_column: function(column, number, page, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - var statement = "SELECT " + column + " FROM " + this.table_name + " LIMIT " + number + " OFFSET " + page + ";"; + by_column: function(column, number, page, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT " + column + " FROM " + this.table_name + " LIMIT " + number + " OFFSET " + page + ";"; - db.all(statement, function(err, res) { - if (callback) callback(err, res); - db.close(); - }); - } + db.all(statement, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); + } } diff --git a/models/rental.js b/models/rental.js index d1db17e..7fa1b9b 100644 --- a/models/rental.js +++ b/models/rental.js @@ -8,15 +8,29 @@ function Rental() { } // Rental.prototype = require('../database'); -Rental = { +Rental.prototype = { check_out: function(id, title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - var daysOffset = 7; - var return_date = new Date(Date.now() + (daysOffset * 24 * 60 * 60 * 1000)); - var movie_id = "SELECT id FROM movies WHERE title =" + title + " ;"; - var statement = "INSERT INTO " + this.table_name + "(return_date, movie_id, customer_id, checked_out) " + "VALUES (" + return_date + ", " + movie_id + ", " + id + "'true'); "; + var rental_duration_days = 7; + var return_date = new Date(Date.now() + (rental_duration_days * 24 * 60 * 60 * 1000)); + // var movie_id = "SELECT id FROM movies WHERE title = '" + title + "';"; + + // have to actually *run* the sqlite3 query and get result... above doesn't do that... + // not sure if this works either. Seems to return a db connection object...WIP + var movie_id = db.get("SELECT id FROM movies WHERE title = '" + title + "';"); + + var statement = "INSERT INTO " + this.table_name + " (return_date, movie_id, customer_id, checked_out) " + "VALUES (" + return_date + ", " + movie_id + ", " + id + ", 'true'); "; + + db.run(statement, function(err) { + callback(err, { inserted_id: this.lastID, changed: this.changes }); + db.close(); + }); + // + // db.all(statement, function(err, res) { + // if (callback) callback(err, res); + // db.close(); + // }); } }; - module.exports = Rental; diff --git a/routes/customers.js b/routes/customers.js index 3ab0708..e7f8e72 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -7,12 +7,9 @@ router.get('/', function(req, res, next) { return customers_exports.customersController.index(req, res); }); +/* GET /customers/:column/:n/:p */ router.get('/:column/:n/:p', function(req, res, next) { return customers_exports.customersController.by_column(req, res); }); -router.post('/checkout/:id/:title', function(req, res, next) { - return customers_exports.customersController.check_out(req, res); -}); - module.exports = router; diff --git a/routes/rentals.js b/routes/rentals.js new file mode 100644 index 0000000..2437316 --- /dev/null +++ b/routes/rentals.js @@ -0,0 +1,15 @@ +var express = require('express'); +var router = express.Router(); +var rentals_exports = require('../controllers/rentals'); + +/* POST /rentals/checkout/:id/:title */ +/* keeps looking for a GET... WIP */ +// router.get('/checkout/:id/:title', function(req, res, next) { +// return rentals_exports.rentalsController.create(req, res); +// }); + +router.post('/checkout/:id/:title', function(req, res, next) { + return rentals_exports.rentalsController.create(req, res); +}); + +module.exports = router; From 8cf32b0a9937787dc41e086abb646ee2e4b1a06e Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Mon, 21 Sep 2015 10:15:15 -0700 Subject: [PATCH 20/75] WIP post to rentals. Not working yet. Moving on to something else till we can get some help. --- models/rental.js | 28 ++++++++++++++++++++++------ routes/rentals.js | 3 ++- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/models/rental.js b/models/rental.js index 7fa1b9b..97aa1ac 100644 --- a/models/rental.js +++ b/models/rental.js @@ -13,18 +13,34 @@ Rental.prototype = { var db = new sqlite3.Database('db/' + db_env + '.db'); var rental_duration_days = 7; var return_date = new Date(Date.now() + (rental_duration_days * 24 * 60 * 60 * 1000)); - // var movie_id = "SELECT id FROM movies WHERE title = '" + title + "';"; + var movie_id = 1; // have to actually *run* the sqlite3 query and get result... above doesn't do that... // not sure if this works either. Seems to return a db connection object...WIP - var movie_id = db.get("SELECT id FROM movies WHERE title = '" + title + "';"); - var statement = "INSERT INTO " + this.table_name + " (return_date, movie_id, customer_id, checked_out) " + "VALUES (" + return_date + ", " + movie_id + ", " + id + ", 'true'); "; - db.run(statement, function(err) { - callback(err, { inserted_id: this.lastID, changed: this.changes }); + // var movie_id = function() { + // db.get("SELECT id FROM movies WHERE title = '" + title + "';"); + // return this.lastID; //in callback? + // }; + // console.log(movie_id()); + + + // db.serialize(function() { + // db.run("SELECT id FROM movies WHERE title = '" + title + "';"), function(err) { + // // console.log(this.lastID); + // callback(err, { movie_id: this.lastID }); + // }; + // + var statement = "INSERT INTO " + this.table_name + " (return_date, movie_id, customer_id, checked_out) " + "VALUES (" + return_date + ", " + movie_id + ", " + id + ", 'true'); "; + + db.run(statement, function(err) { + callback(err, { inserted_id: this.lastID, changed: this.changes }); + }); db.close(); - }); + // }) + + // // db.all(statement, function(err, res) { // if (callback) callback(err, res); diff --git a/routes/rentals.js b/routes/rentals.js index 2437316..b80dd9c 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -5,10 +5,11 @@ var rentals_exports = require('../controllers/rentals'); /* POST /rentals/checkout/:id/:title */ /* keeps looking for a GET... WIP */ // router.get('/checkout/:id/:title', function(req, res, next) { -// return rentals_exports.rentalsController.create(req, res); + // return rentals_exports.rentalsController.create(req, res); // }); router.post('/checkout/:id/:title', function(req, res, next) { + console.log("id: " + req.param(id)); return rentals_exports.rentalsController.create(req, res); }); From c94aa5f4b87218663b49fd5bdeb3836d990cd85a Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Mon, 21 Sep 2015 10:19:50 -0700 Subject: [PATCH 21/75] cleaning up a bit of the unfinished checkout stuff. --- models/rental.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/models/rental.js b/models/rental.js index 97aa1ac..402f0d9 100644 --- a/models/rental.js +++ b/models/rental.js @@ -13,17 +13,17 @@ Rental.prototype = { var db = new sqlite3.Database('db/' + db_env + '.db'); var rental_duration_days = 7; var return_date = new Date(Date.now() + (rental_duration_days * 24 * 60 * 60 * 1000)); - var movie_id = 1; + // var movie_id = 1; // have to actually *run* the sqlite3 query and get result... above doesn't do that... // not sure if this works either. Seems to return a db connection object...WIP - // var movie_id = function() { - // db.get("SELECT id FROM movies WHERE title = '" + title + "';"); - // return this.lastID; //in callback? - // }; - // console.log(movie_id()); + var movie_id = function() { + db.get("SELECT id FROM movies WHERE title = '" + title + "';"); + return this.lastID; //in callback? + }; + console.log(movie_id()); // db.serialize(function() { From 5675827b97a8ef5ac94dee518173f7f5442e58c6 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Mon, 21 Sep 2015 14:40:12 -0700 Subject: [PATCH 22/75] not customers rentals.. got a list of customers that has checked out that movie's title --- controllers/customers.js | 1 - controllers/movies.js | 7 +++++++ database.js | 16 ++++++++++++++-- db/development.db | Bin 73728 -> 73728 bytes db/development.sqlite3 | 0 db/test.db | Bin 4096 -> 4096 bytes models/customer.js | 22 ++++++++++++++++++++++ routes/movies.js | 6 ++++++ 8 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 db/development.sqlite3 diff --git a/controllers/customers.js b/controllers/customers.js index 4c4b824..54a0e62 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -5,7 +5,6 @@ exports.customersController = { index: function(req, res) { var db = new Customer(); db.find_all(function(err, result) { - return res.status(200).json(result); }); }, diff --git a/controllers/movies.js b/controllers/movies.js index a031e03..fc5a969 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -15,5 +15,12 @@ exports.moviesController = { db.by_column(req.params.column, req.params.n, req.params.p, function(err, result) { return res.status(200).json(result); }); + }, + + customers_by_movie_current: function(req, res) { + var db = new Movie(); + db.customers_by_movie_current(req.params.title, function(err, result) { + return res.status(200).json(result); + }); } }; diff --git a/database.js b/database.js index 94fab68..cef3792 100644 --- a/database.js +++ b/database.js @@ -22,8 +22,20 @@ var Database = { if (callback) callback(err, res); db.close(); }); - } + }, + + customers_by_movie_current: function(title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all customers' rentals for that movie + var get_rentals_statement = "SELECT * 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.checked_out = 'true'; "; + + db.all(get_rentals_statement, title, function(err, rows) { -} + callback(err, rows); + db.close(); + }); + } + // } +}; module.exports = Database; diff --git a/db/development.db b/db/development.db index af9db1c2d14872077ef8c3cfc8841b304c684f53..f527545b14aa559d80e685f38c33703cd06a61ce 100644 GIT binary patch delta 106 zcmZoTz|wGlWr8$g$V3@u)({5WXRI4j7I1ShGaq4K{=|HX`N(ELo^8xFBFt diff --git a/db/development.sqlite3 b/db/development.sqlite3 new file mode 100644 index 0000000..e69de29 diff --git a/db/test.db b/db/test.db index 23fe533a47c08ec4f894f35113ede5608fedfcd6..eb066989622cff4f766b75f729bba04dab474b81 100644 GIT binary patch delta 17 YcmZorXi%6S%_uWb#+gxOW5NP{04o~=)&Kwi delta 17 YcmZorXi%6S%_uQZ#+gxKW5NP{04m=E&Hw-a diff --git a/models/customer.js b/models/customer.js index 55445ed..1b6215f 100644 --- a/models/customer.js +++ b/models/customer.js @@ -1,9 +1,31 @@ "use strict"; +var sqlite3 = require('sqlite3').verbose(); +var db_env = process.env.DB || 'development'; + function Customer() { this.table_name = "customers"; } Customer.prototype = require('../database'); +// var customerVariable = { +// checked_out_movies: function(id, callback) { +// var db = new sqlite3.Database('db/' + db_env + '.db'); +// var get_rentals_statement = "SELECT movie_id FROM rentals INNER JOIN customers ON rentals.customer_id = customers.id WHERE customer_id = " + id + " ;"; +// var get_movies_statement = "SELECT * FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE movie_id = ?;"; +// +// db.serialize(function() { +// // var data = {}; +// var rowset = db.each(get_rentals_statement, function(err, row) { +// db.get(get_movies_statement, row.movie_id, function(err, row) { +// callback(err); +// +// }); +// }); +// console.log(rowset); +// }); +// } +// // var data = '{ "' + row.movie_id + '" }'; +// }; module.exports = Customer; diff --git a/routes/movies.js b/routes/movies.js index b59c103..c295c63 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -7,8 +7,14 @@ router.get('/', function(req, res, next) { return movies_exports.moviesController.index(req, res); }); +/* GET /movies/:column/:n/:p */ router.get('/:column/:n/:p', function(req, res, next) { return movies_exports.moviesController.by_column(req, res); }); +/* GET /movies/:title/customers */ +router.get('/:title/customers', function(req, res, next) { + return movies_exports.moviesController.customers_by_movie_current(req, res); +}); + module.exports = router; From dce88c86b4ce1c3e35f75f450de66b32e29856cd Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Mon, 21 Sep 2015 15:52:01 -0700 Subject: [PATCH 23/75] Added endpoint to checkout history for a given customer id. --- controllers/customers.js | 14 +++++++++++ database.js | 40 ++++++++++++++++++++++++------ db/development.db | Bin 73728 -> 73728 bytes models/customer.js | 19 --------------- routes/customers.js | 10 ++++++++ utils/rentals.json | 51 +++++++++++++++++++++++++++++++++++++++ utils/schema.js | 3 ++- utils/seed.js | 22 +++++++++++++++++ 8 files changed, 131 insertions(+), 28 deletions(-) create mode 100644 utils/rentals.json diff --git a/controllers/customers.js b/controllers/customers.js index 54a0e62..bf1d18c 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -14,5 +14,19 @@ exports.customersController = { db.by_column(req.params.column, req.params.n, req.params.p, function(err, result) { return res.status(200).json(result); }); + }, + + movies_by_customer_current: function(req, res) { + var db = new Customer(); + db.movies_by_customer_current(req.params.customer_id, function(err, result) { + return res.status(200).json(result); + }); + }, + + movies_by_customer_history: function(req, res) { + var db = new Customer(); + db.movies_by_customer_history(req.params.customer_id, function(err, result) { + return res.status(200).json(result); + }); } }; diff --git a/database.js b/database.js index cef3792..1d3e618 100644 --- a/database.js +++ b/database.js @@ -24,18 +24,42 @@ var Database = { }); }, + // Called by Movies controller: customers_by_movie_current: function(title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - // all customers' rentals for that movie - var get_rentals_statement = "SELECT * 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.checked_out = 'true'; "; + // all customers who currently have the movie checked out + 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.checked_out = 'true'; "; - db.all(get_rentals_statement, title, function(err, rows) { + db.all(statement, title, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, + + // Called by Customers controller: + movies_by_customer_current: function(customer_id, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all movies currently checked out by that customer + var statement = "SELECT 'movies'.* FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = (SELECT customers.id FROM customers WHERE customers.id = ? COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'true'; "; + + db.all(statement, customer_id, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, + + movies_by_customer_history: function(customer_id, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all movies checked out by that customer in the past + var statement = "SELECT 'movies'.*, rentals.checkout_date, rentals.return_date FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = (SELECT customers.id FROM customers WHERE customers.id = ? COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'false' ORDER BY rentals.checkout_date; "; - callback(err, rows); - db.close(); - }); - } - // } + db.all(statement, customer_id, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, }; + + module.exports = Database; diff --git a/db/development.db b/db/development.db index f527545b14aa559d80e685f38c33703cd06a61ce..2d59941f630fedd34405c25dda126c5c2e7388ba 100644 GIT binary patch delta 999 zcmZ{iO-NKx7>4h;=X35{9d#UkMn`Avs559~&YwEtPd1u~kVW(ZE+iEl6B3dd!9}3A zTC{LsOi)BnF@@14=q|=Z3xgIdS`@Ts(V`$Cszr+yEe7fRhA9y0GVe3@zUTYibI&<< zZJXA%X~W}klq!lc1{E(MuXjXi;O_riRt`^!bw#}?<6_;aa(G1PWqVL_H#UkZXETq* zuxoZ9HGA&-a(ZfRCY|!9Q!DArSMfx&W^Su@MIh5B-w54uP*AQ0W|7uD1^6d{!3n^A z8aQwg7&-y89Rm&@1)N8K0e-E{QJ`Z4a1Q~FK_EH+c>92G0x)`j;Vz&q0z|?cVy zX6OCaq@l=<^10OSOH)qEq%?34x?D9hO)}Rj zxX}MM?iGdpe~oAIl}03n_46t7(fS}hXWp_P#9xFC@gDK9@& zQIp8arxS#y_mCf&gT6!UP#6l3Me8bAwyQfbOG|LN;3QSb+E(EHVs`}2B|%n62Vnce z)*7s9+_u0^r_i<=b#x!TG?> w_>PvPFL3hEYpld61U)R_mq-Z8*+}eYIjRv{dxyK!O=;AaUeegaG;PxwOTa2cD`Y5GP@#iEkq8}x z=Fq{xp>m=kf`Josaq*CJaLACs!J&eKh@*&L2N4H{(D?lo1jBtl_wIM^{qpYBTcX|) zJE1}6sw7DjisjlKhD0Si_2`Db}Ocf_8s6%x=#c580xz&t5UV z@kD;c0!D#D0-!AFYcur5i89fT8bXro-X=YY;K#vZjku5O23Gy3YejSWgL3sr@ z>9fKm(3b~s>YAXYp(q%mmQm_xcN`uzZ%h0a|IAt28i+D(XzH81hbvOd>GY5}UHHl=1;LMHNqfWYJXI?0{Qhjb3cfi|3g7#bJs&xF?aeXo?8y z@Yi{Pr#ccxR?Do=Pi>IGV PG;M-GC2;t8i4Ok@IHZ_i diff --git a/models/customer.js b/models/customer.js index 1b6215f..c44a37c 100644 --- a/models/customer.js +++ b/models/customer.js @@ -9,23 +9,4 @@ function Customer() { Customer.prototype = require('../database'); -// var customerVariable = { -// checked_out_movies: function(id, callback) { -// var db = new sqlite3.Database('db/' + db_env + '.db'); -// var get_rentals_statement = "SELECT movie_id FROM rentals INNER JOIN customers ON rentals.customer_id = customers.id WHERE customer_id = " + id + " ;"; -// var get_movies_statement = "SELECT * FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE movie_id = ?;"; -// -// db.serialize(function() { -// // var data = {}; -// var rowset = db.each(get_rentals_statement, function(err, row) { -// db.get(get_movies_statement, row.movie_id, function(err, row) { -// callback(err); -// -// }); -// }); -// console.log(rowset); -// }); -// } -// // var data = '{ "' + row.movie_id + '" }'; -// }; module.exports = Customer; diff --git a/routes/customers.js b/routes/customers.js index e7f8e72..18db491 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -12,4 +12,14 @@ router.get('/:column/:n/:p', function(req, res, next) { return customers_exports.customersController.by_column(req, res); }); +/* GET /customers/:id/movies */ +router.get('/:customer_id/movies', function(req, res, next) { + return customers_exports.customersController.movies_by_customer_current(req, res); +}); + +/* GET /customers/:id/history */ +router.get('/:customer_id/history', function(req, res, next) { + return customers_exports.customersController.movies_by_customer_history(req, res); +}); + module.exports = router; diff --git a/utils/rentals.json b/utils/rentals.json new file mode 100644 index 0000000..f914e09 --- /dev/null +++ b/utils/rentals.json @@ -0,0 +1,51 @@ +[ + { + "checkout_date": "9/23/2015", + "return_date": "9/30/2015", + "movie_id": 1, + "customer_id": 1, + "checked_out": "true" + }, + { + "checkout_date": "9/23/2015", + "return_date": "9/30/2015", + "movie_id": 2, + "customer_id": 1, + "checked_out": "true" + }, + { + "checkout_date": "9/23/2015", + "return_date": "9/30/2015", + "movie_id": 1, + "customer_id": 2, + "checked_out": "true" + }, + { + "checkout_date": "7/25/2015", + "return_date": "8/1/2015", + "movie_id": 3, + "customer_id": 1, + "checked_out": "false" + }, + { + "checkout_date": "7/30/2015", + "return_date": "8/1/2015", + "movie_id": 3, + "customer_id": 2, + "checked_out": "false" + }, + { + "checkout_date": "6/20/2015", + "return_date": "7/1/2015", + "movie_id": 4, + "customer_id": 1, + "checked_out": "false" + }, + { + "checkout_date": "7/20/2015", + "return_date": "8/1/2015", + "movie_id": 18, + "customer_id": 2, + "checked_out": "false" + } +] diff --git a/utils/schema.js b/utils/schema.js index 8a92f1d..08cbc9b 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -27,6 +27,7 @@ var customer_fields = [ var rental_table = "rentals"; var rental_fields = [ + ['checkout_date', 'text'], ['return_date', 'text'], ['movie_id', 'integer'], ['customer_id', 'integer'], @@ -57,7 +58,7 @@ function create_rentals_table(table_name) { db.run("DROP TABLE IF EXISTS " + table_name + ";"); // create fresh version of table with id as primary key - db.run("CREATE TABLE rentals (id INTEGER PRIMARY KEY, return_date text, movie_id integer, customer_id integer, checked_out boolean, FOREIGN KEY(movie_id) REFERENCES movie(id), FOREIGN KEY(customer_id) REFERENCES customer(id));"); + db.run("CREATE TABLE rentals (id INTEGER PRIMARY KEY, checkout_date text, return_date text, movie_id integer, customer_id integer, checked_out boolean, FOREIGN KEY(movie_id) REFERENCES movie(id), FOREIGN KEY(customer_id) REFERENCES customer(id));"); }); } diff --git a/utils/seed.js b/utils/seed.js index 85fcf58..cc091e0 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -53,6 +53,28 @@ db.serialize(function() { customer_statement.finalize(); }); +var rentals = require('./rentals'); +var rental_statement = db.prepare( + "INSERT INTO rentals(checkout_date, return_date, movie_id, customer_id, checked_out) \ + VALUES (?, ?, ?, ?, ?);" +); + +db.serialize(function() { + // loop through rentals + for(var i = 0; i < rentals.length; i++) { + var rental = rentals[i]; + // insert each one into the db + rental_statement.run( + rental.checkout_date, + rental.return_date, + rental.movie_id, + rental.customer_id, + rental.checked_out + ); + } + rental_statement.finalize(); +}); + // close db db.close(); From be6c43efa863eb6516c38d190e76a7c2559162a4 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Mon, 21 Sep 2015 18:41:23 -0700 Subject: [PATCH 24/75] fixed subset queries for movies and customers so all columns are returned and results are sorted by specified column. --- database.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database.js b/database.js index 1d3e618..60ce55c 100644 --- a/database.js +++ b/database.js @@ -16,7 +16,7 @@ var Database = { by_column: function(column, number, page, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - var statement = "SELECT " + column + " FROM " + this.table_name + " LIMIT " + number + " OFFSET " + page + ";"; + var statement = "SELECT * FROM " + this.table_name + " ORDER BY " + column + " LIMIT " + number + " OFFSET " + page + ";"; db.all(statement, function(err, res) { if (callback) callback(err, res); From 4e7335982f503fe8c5e4c006eaedd17e587a2b16 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Mon, 21 Sep 2015 19:44:01 -0700 Subject: [PATCH 25/75] Reformatted dates in rental seed file. Created endpoint for list of customers with overdue movies. --- controllers/customers.js | 7 +++++++ database.js | 11 ++++++++++ db/development.db | Bin 73728 -> 73728 bytes routes/customers.js | 5 +++++ utils/rentals.json | 44 ++++++++++++++++++++++++++------------- 5 files changed, 52 insertions(+), 15 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index bf1d18c..4093559 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -28,5 +28,12 @@ exports.customersController = { db.movies_by_customer_history(req.params.customer_id, function(err, result) { return res.status(200).json(result); }); + }, + + customers_overdue: function(req, res) { + var db = new Customer(); + db.customers_overdue(function(err, result) { + return res.status(200).json(result); + }); } }; diff --git a/database.js b/database.js index 1d3e618..a6c34fe 100644 --- a/database.js +++ b/database.js @@ -58,6 +58,17 @@ var Database = { db.close(); }); }, + + customers_overdue: function(callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all customers who currently have the movie checked out + var statement = "SELECT 'customers'.* FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE date(rentals.return_date) < date('now') AND rentals.checked_out = 'true'; "; + + db.all(statement, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, }; diff --git a/db/development.db b/db/development.db index 2d59941f630fedd34405c25dda126c5c2e7388ba..a1695e22ed04be2f6ee36ea85f838604414c1c1c 100644 GIT binary patch delta 1051 zcmZXSOGs346vpTOn3s+^j_*suK=}V*)Dv*x8#s2Cq&$or^FQvv066#*EAzexF4%1L7@fuzj*qq|I~ikDUfa zW`WoYPW2Y+2xuAr`b=OV4h+TsRR@MN zpgaN$9002J0c~A_V1Ea2I0X1rKx+j?gFvteFdBhF^+2Kq821C!mB4;`)14LRJr)JW zt!}W>Qoy7|kF;Cl?6o{#zycgf3g}t_niqhwIiO_*I5-9P=(R$lK%EIxQ0g#+b}K+5 zMb=QF+fxC0dCnm|ikG6|u1JY#VTek;$#b^qd&1MI*X>YM#_9}B?+a`FVcpm{nR~_Z z#mn=m=P!#HHnfsO(?gsrA$P&jP-rA}EM{2K1N_37#Y^*wEAR0ZC&lxgG!0F_B=a%O ze`2D=NfaXrF{&)Y?2hUy49$BAlLT43yYFN~OAAM}{Jsh=?h-FG{K9ZO$h%6FX;fBF zS!Qz0>1W$0eMae)d?bAg2NS&qOxn(lZDGsD+;6+y(Q~uty@E#NbIGXx9dNy%Ru1KE w=sI*2+CrA3tPN-#7Y|*o;8074dzkQ$wtSC(*A(y-l?g7_T#eYrcBX!c-;nad*8l(j delta 960 zcmZ{iJ!n&56o&72zmuPvrfr)3B#lXK+9tGWY5v;gr?I9QOTj9^AIMNNMO!*_C|aR| zkX&$Z5UkWeL{N!RSG_|!I8<;&LC4&->q&?GQe06Y_ba~w$IfIt?Ar2%~uI5G@$#esMX z=pF*{2Z6);fqngBU~d>m^#UV3fHwe4`hZL~(B=gWbOBB6K)VZ=Y5^SPS6fY1#taTl z8UtX~2!X=}9|;=l95w7<+5nWu3Q$-Anil|H8R#nk(IU{oKdUDXxYIxfryk|d))3Ii zk$z6J*_)YCSL7%8LTV4CAz{6Qes=Nl zT+muKXr9qOhE&5q^}cTT8<5-^AR7VH2*8AqJrm^o>^YtwVbC?vnTaNnbweiFh*Fm? zU6~82+!xya`TB<~oOW$C)o7S% zRDvEs@1Zkf(t=7g>mZrdd%LnmepFwgT2yJ>+96Pmad`&iDzpSWM|*$|g`pKVrr1$N z^}3)9i(hQZXFmzXYtTn%5&8gKg>FM3dQ3>B2W%%H5c9-kTEBD58}z?HThKdNCnvg; zgEnb{>_Wx3!mc#wB7a-u6U%V9*fovF*IZ6>`7@qgVT$F;FFgG~{|RQ%y^L GTmA-o0j~N0 diff --git a/routes/customers.js b/routes/customers.js index 18db491..6d3b0bd 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -22,4 +22,9 @@ router.get('/:customer_id/history', function(req, res, next) { return customers_exports.customersController.movies_by_customer_history(req, res); }); +/* GET /customers/overdue */ +router.get('/overdue', function(req, res, next) { + return customers_exports.customersController.customers_overdue(req, res); +}); + module.exports = router; diff --git a/utils/rentals.json b/utils/rentals.json index f914e09..c2dc114 100644 --- a/utils/rentals.json +++ b/utils/rentals.json @@ -1,51 +1,65 @@ [ { - "checkout_date": "9/23/2015", - "return_date": "9/30/2015", + "checkout_date": "2015-09-23", + "return_date": "2015-09-30", "movie_id": 1, "customer_id": 1, "checked_out": "true" }, { - "checkout_date": "9/23/2015", - "return_date": "9/30/2015", + "checkout_date": "2015-09-23", + "return_date": "2015-09-30", "movie_id": 2, "customer_id": 1, "checked_out": "true" }, { - "checkout_date": "9/23/2015", - "return_date": "9/30/2015", + "checkout_date": "2015-09-23", + "return_date": "2015-09-30", "movie_id": 1, "customer_id": 2, "checked_out": "true" }, { - "checkout_date": "7/25/2015", - "return_date": "8/1/2015", + "checkout_date": "2015-07-25", + "return_date": "2015-08-01", "movie_id": 3, "customer_id": 1, "checked_out": "false" }, { - "checkout_date": "7/30/2015", - "return_date": "8/1/2015", + "checkout_date": "2015-07-30", + "return_date": "2015-08-01", "movie_id": 3, "customer_id": 2, "checked_out": "false" }, { - "checkout_date": "6/20/2015", - "return_date": "7/1/2015", + "checkout_date": "2015-06-20", + "return_date": "2015-07-01", "movie_id": 4, "customer_id": 1, - "checked_out": "false" + "checked_out": "true" }, { - "checkout_date": "7/20/2015", - "return_date": "8/1/2015", + "checkout_date": "2015-07-20", + "return_date": "2015-08-01", "movie_id": 18, "customer_id": 2, "checked_out": "false" + }, + { + "checkout_date": "2015-08-20", + "return_date": "2015-09-01", + "movie_id": 34, + "customer_id": 2, + "checked_out": "true" + }, + { + "checkout_date": "2015-09-12", + "return_date": "2015-09-18", + "movie_id": 38, + "customer_id": 3, + "checked_out": "true" } ] From 8483a1345cfe07c1e358e6cd76dcbe9dfcf5afe3 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Mon, 21 Sep 2015 21:53:35 -0700 Subject: [PATCH 26/75] look up movie by title --- controllers/movies.js | 7 +++++++ database.js | 12 ++++++++++++ routes/movies.js | 4 ++++ 3 files changed, 23 insertions(+) diff --git a/controllers/movies.js b/controllers/movies.js index fc5a969..a120308 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -22,5 +22,12 @@ exports.moviesController = { db.customers_by_movie_current(req.params.title, function(err, result) { return res.status(200).json(result); }); + }, + + movie_info: function(req, res) { + var db = new Movie(); + db.movie_info(req.params.title, function(err, result) { + return res.status(200).json(result); + }); } }; diff --git a/database.js b/database.js index 1d3e618..f9ac9ef 100644 --- a/database.js +++ b/database.js @@ -58,6 +58,18 @@ var Database = { db.close(); }); }, + + movie_info: function(title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all movies checked out by that customer in the past + var statement = "SELECT 'movies'.* FROM movies where movies.title = ? COLLATE NOCASE LIMIT 1; "; + + db.all(statement, title, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, + }; diff --git a/routes/movies.js b/routes/movies.js index c295c63..043c404 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -17,4 +17,8 @@ router.get('/:title/customers', function(req, res, next) { return movies_exports.moviesController.customers_by_movie_current(req, res); }); +/* GET /movies/:title/customers */ +router.get('/:title', function(req, res, next) { + return movies_exports.moviesController.movie_info(req, res); +}); module.exports = router; From 228a15725429c1d1351e572d18e785ce85ca4175 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Mon, 21 Sep 2015 22:39:27 -0700 Subject: [PATCH 27/75] customers by movie history ordered --- controllers/movies.js | 7 +++++++ database.js | 12 ++++++++++-- routes/movies.js | 8 +++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index a120308..d0a50df 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -29,5 +29,12 @@ exports.moviesController = { db.movie_info(req.params.title, function(err, result) { return res.status(200).json(result); }); + }, + + customers_by_movie_history: function(req, res) { + var db = new Movie(); + db.customers_by_movie_history(req.params.title, function(err, result) { + return res.status(200).json(result); + }); } }; diff --git a/database.js b/database.js index f9ac9ef..2d7a7a1 100644 --- a/database.js +++ b/database.js @@ -70,8 +70,16 @@ var Database = { }); }, -}; - + customers_by_movie_history: function(title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all customers who have checked out this movie in the past + 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.checked_out = 'false' ORDER BY customers.id, customers.name, rentals.checkout_date; "; + db.all(statement, title, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, +}; module.exports = Database; diff --git a/routes/movies.js b/routes/movies.js index 043c404..88b6f5b 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -17,8 +17,14 @@ router.get('/:title/customers', function(req, res, next) { return movies_exports.moviesController.customers_by_movie_current(req, res); }); -/* GET /movies/:title/customers */ +/* GET /movies/:title */ router.get('/:title', function(req, res, next) { return movies_exports.moviesController.movie_info(req, res); }); + +/* GET /movies/:title/history */ +router.get('/:title/history', function(req, res, next) { + return movies_exports.moviesController.customers_by_movie_history(req, res); +}); + module.exports = router; From 9269e255389b6f3b3d33c9298e8caaa5c525da10 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Mon, 21 Sep 2015 23:53:47 -0700 Subject: [PATCH 28/75] started some wip tests for movies_by_customer_history --- db/test.db | Bin 4096 -> 4096 bytes test/movies.js | 7 +++++++ 2 files changed, 7 insertions(+) diff --git a/db/test.db b/db/test.db index eb066989622cff4f766b75f729bba04dab474b81..7fb12534631c1ab5fe553d74dbb82ec13d1965f3 100644 GIT binary patch delta 17 YcmZorXi%6S%_uif#+gxWW5NP{04q5J+5i9m delta 17 YcmZorXi%6S%_uWb#+gxOW5NP{04o~=)&Kwi diff --git a/test/movies.js b/test/movies.js index c2743f8..1fe45aa 100644 --- a/test/movies.js +++ b/test/movies.js @@ -41,5 +41,12 @@ describe("Movie", function() { }); }); }); + context("GET #movies_by_customer_history", function() { + it("retrieves all past movie records from that customer", function(done) { + movie.movies_by_customer_history(function(err,res) { + done(); + }); + }); + }); }); }); From 6c7db6766aea37799210efd6578a21573723bbad Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Tue, 22 Sep 2015 11:18:52 -0700 Subject: [PATCH 29/75] added different sort columns for movie's history --- controllers/movies.js | 7 +++++++ database.js | 13 ++++++++++++- routes/movies.js | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/controllers/movies.js b/controllers/movies.js index d0a50df..d2c8854 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -36,5 +36,12 @@ exports.moviesController = { db.customers_by_movie_history(req.params.title, function(err, result) { return res.status(200).json(result); }); + }, + + customers_by_movie_history_sorted: function(req, res) { + var db = new Movie(); + db.customers_by_movie_history_sorted(req.params.title, req.params.column, function(err, result) { + return res.status(200).json(result); + }); } }; diff --git a/database.js b/database.js index 2d7a7a1..641998f 100644 --- a/database.js +++ b/database.js @@ -73,13 +73,24 @@ var Database = { customers_by_movie_history: function(title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); // all customers who have checked out this movie in the past - 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.checked_out = 'false' ORDER BY customers.id, customers.name, rentals.checkout_date; "; + 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.checked_out = 'false' "; db.all(statement, title, function(err, rows) { callback(err, rows); db.close(); }); }, + + customers_by_movie_history_sorted: function(title, column, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all customers who have checked out this movie in the past + 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.checked_out = 'false' ORDER BY " + column + " ;"; + + db.all(statement, title, column, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, }; module.exports = Database; diff --git a/routes/movies.js b/routes/movies.js index 88b6f5b..0232e10 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -27,4 +27,8 @@ router.get('/:title/history', function(req, res, next) { return movies_exports.moviesController.customers_by_movie_history(req, res); }); +/* GET /movies/:title/history/:column */ +router.get('/:title/history/:column', function(req, res, next) { + return movies_exports.moviesController.customers_by_movie_history_sorted(req, res); +}); module.exports = router; From b5bed27f74606e413f1aac236463566099c68992 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Tue, 22 Sep 2015 12:12:10 -0700 Subject: [PATCH 30/75] movie history and info --- controllers/movies.js | 7 ------- database.js | 13 +------------ routes/movies.js | 4 ---- 3 files changed, 1 insertion(+), 23 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index d2c8854..8a3b681 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -37,11 +37,4 @@ exports.moviesController = { return res.status(200).json(result); }); }, - - customers_by_movie_history_sorted: function(req, res) { - var db = new Movie(); - db.customers_by_movie_history_sorted(req.params.title, req.params.column, function(err, result) { - return res.status(200).json(result); - }); - } }; diff --git a/database.js b/database.js index 641998f..3e386da 100644 --- a/database.js +++ b/database.js @@ -73,24 +73,13 @@ var Database = { customers_by_movie_history: function(title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); // all customers who have checked out this movie in the past - 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.checked_out = 'false' "; + 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.checked_out = 'false'; "; db.all(statement, title, function(err, rows) { callback(err, rows); db.close(); }); }, - - customers_by_movie_history_sorted: function(title, column, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - // all customers who have checked out this movie in the past - 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.checked_out = 'false' ORDER BY " + column + " ;"; - - db.all(statement, title, column, function(err, rows) { - callback(err, rows); - db.close(); - }); - }, }; module.exports = Database; diff --git a/routes/movies.js b/routes/movies.js index 0232e10..88b6f5b 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -27,8 +27,4 @@ router.get('/:title/history', function(req, res, next) { return movies_exports.moviesController.customers_by_movie_history(req, res); }); -/* GET /movies/:title/history/:column */ -router.get('/:title/history/:column', function(req, res, next) { - return movies_exports.moviesController.customers_by_movie_history_sorted(req, res); -}); module.exports = router; From b30fc886fb6075b8a9c0362d3762d5e8487813e9 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Tue, 22 Sep 2015 12:12:32 -0700 Subject: [PATCH 31/75] sorting customers that previously checked out specified movie. --- controllers/movies.js | 7 +++++++ database.js | 13 +++++++++++++ routes/movies.js | 5 +++++ 3 files changed, 25 insertions(+) diff --git a/controllers/movies.js b/controllers/movies.js index fc5a969..55f81de 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -22,5 +22,12 @@ exports.moviesController = { db.customers_by_movie_current(req.params.title, function(err, result) { return res.status(200).json(result); }); + }, + + customers_by_movie_history_sorted: function(req, res) { + var db = new Movie(); + db.customers_by_movie_history_sorted(req.params.title, req.params.column, function(err, result) { + return res.status(200).json(result); + }); } }; diff --git a/database.js b/database.js index 3c8f9a9..f971d0f 100644 --- a/database.js +++ b/database.js @@ -36,6 +36,19 @@ var Database = { }); }, + customers_by_movie_history_sorted: function(title, column, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all customers who have checked out specified movie in the past sorted by specified column + var statement = "SELECT * 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.checked_out = 'false' ORDER BY customers.id; "; + + // SELECT * FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE rentals.movie_id = (SELECT movies.id FROM movies WHERE movies.title = 'Vertigo' COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'false' ORDER BY customers.id; + + db.all(statement, title, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, + // Called by Customers controller: movies_by_customer_current: function(customer_id, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); diff --git a/routes/movies.js b/routes/movies.js index c295c63..3610727 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -17,4 +17,9 @@ router.get('/:title/customers', function(req, res, next) { return movies_exports.moviesController.customers_by_movie_current(req, res); }); +/* GET /movies/:title/:column */ +router.get('/:title/:column', function(req, res, next) { + return movies_exports.moviesController.customers_by_movie_history_sorted(req, res); +}); + module.exports = router; From 7038991bcd0b3442fe81d1acfbc261c43ea6d9b5 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Tue, 22 Sep 2015 14:17:02 -0700 Subject: [PATCH 32/75] Refined endpoints to get customer who checked out specified movie in the past, sorting on rentals or customer info. --- controllers/movies.js | 2 +- database.js | 49 +++++++++++++++++++++--------------------- db/development.db | Bin 73728 -> 73728 bytes routes/movies.js | 2 +- utils/rentals.json | 7 ++++++ 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index d2c8854..7d6d741 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -40,7 +40,7 @@ exports.moviesController = { customers_by_movie_history_sorted: function(req, res) { var db = new Movie(); - db.customers_by_movie_history_sorted(req.params.title, req.params.column, function(err, result) { + db.customers_by_movie_history_sorted(req.params.title, req.params.table, req.params.column, function(err, result) { return res.status(200).json(result); }); } diff --git a/database.js b/database.js index 5040b53..08e1d7e 100644 --- a/database.js +++ b/database.js @@ -36,12 +36,10 @@ var Database = { }); }, - customers_by_movie_history_sorted: function(title, column, callback) { + movie_info: function(title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - // all customers who have checked out specified movie in the past sorted by specified column - var statement = "SELECT * 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.checked_out = 'false' ORDER BY customers.id; "; - - // SELECT * FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE rentals.movie_id = (SELECT movies.id FROM movies WHERE movies.title = 'Vertigo' COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'false' ORDER BY customers.id; + // information about specified movie + var statement = "SELECT 'movies'.* FROM movies where movies.title = ? COLLATE NOCASE LIMIT 1; "; db.all(statement, title, function(err, rows) { callback(err, rows); @@ -49,57 +47,58 @@ var Database = { }); }, - // Called by Customers controller: - movies_by_customer_current: function(customer_id, callback) { + customers_by_movie_history: function(title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - // all movies currently checked out by that customer - var statement = "SELECT 'movies'.* FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = (SELECT customers.id FROM customers WHERE customers.id = ? COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'true'; "; + // all customers who have checked out this movie in the past + 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.checked_out = 'false'; "; - db.all(statement, customer_id, function(err, rows) { + db.all(statement, title, function(err, rows) { callback(err, rows); db.close(); }); }, - movies_by_customer_history: function(customer_id, callback) { + customers_by_movie_history_sorted: function(title, table, column, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - // all movies checked out by that customer in the past - var statement = "SELECT 'movies'.*, rentals.checkout_date, rentals.return_date FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = (SELECT customers.id FROM customers WHERE customers.id = ? COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'false' ORDER BY rentals.checkout_date; "; + // all customers who have checked out specified movie in the past sorted by specified column - db.all(statement, customer_id, function(err, rows) { + var statement = "SELECT * 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.checked_out = 'false' ORDER BY " + table + "." + column + ";"; + + db.all(statement, title, function(err, rows) { callback(err, rows); db.close(); }); }, - customers_overdue: function(callback) { + // Called by Customers controller: + movies_by_customer_current: function(customer_id, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - // all customers who currently have the movie checked out - var statement = "SELECT 'customers'.* FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE date(rentals.return_date) < date('now') AND rentals.checked_out = 'true'; "; + // all movies currently checked out by that customer + var statement = "SELECT 'movies'.* FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = (SELECT customers.id FROM customers WHERE customers.id = ? COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'true'; "; - db.all(statement, function(err, rows) { + db.all(statement, customer_id, function(err, rows) { callback(err, rows); db.close(); }); }, - movie_info: function(title, callback) { + movies_by_customer_history: function(customer_id, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); // all movies checked out by that customer in the past - var statement = "SELECT 'movies'.* FROM movies where movies.title = ? COLLATE NOCASE LIMIT 1; "; + var statement = "SELECT 'movies'.*, rentals.checkout_date, rentals.return_date FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = (SELECT customers.id FROM customers WHERE customers.id = ? COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'false' ORDER BY rentals.checkout_date; "; - db.all(statement, title, function(err, rows) { + db.all(statement, customer_id, function(err, rows) { callback(err, rows); db.close(); }); }, - customers_by_movie_history: function(title, callback) { + customers_overdue: function(callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - // all customers who have checked out this movie in the past - 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.checked_out = 'false'; "; + // all customers who currently have the movie checked out + var statement = "SELECT * FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE date(rentals.return_date) < date('now') AND rentals.checked_out = 'true'; "; - db.all(statement, title, function(err, rows) { + db.all(statement, function(err, rows) { callback(err, rows); db.close(); }); diff --git a/db/development.db b/db/development.db index a1695e22ed04be2f6ee36ea85f838604414c1c1c..1a70e6ec7d7f8eccf0a3f16689e201ec97015387 100644 GIT binary patch delta 882 zcmX}pOK1~O6b9hA_nu59G3})3D}C8an!fDABqn`XYx=MjtWwlU7X>SdbkRk@2SJ2p zz=eWfWj0b2g;?ssg*ugXQLqaaMO-Mj6m{W3P{D-@7a{dOAO`*~GiT16dq{HIl-s7| z+E6H`Y1#zx?<202dF6Ll^Kaz(yLjPPgE!4iF8-IzbhI4 zf0dLM&n;YXKA9~pRY-F5U}d5VEAao-i;N&ign!=*!khD^qewr}h?wqVa8tPy7UX&s zcU7LYDNh%Wx8%~GpuFb`p1j*d&mZoY0s4ocH&0*Dbb~g?5E7+dMRfd-l-J|PZDb79 z`$bGF&>96Xi6-bJ31PUNNgndMsMe^0>!*>&m=qR#!fW2552a_wW#kF6j%^(X%bo7_2%y9^)D Ni3664UYB+X>Mw1>qTc`j delta 850 zcmXZZK}b_^90&0I-~adC-fZq|x^(KSx6P&IQa6_~TRO{ZkcE`d4nm_kch~Iuvy15ZIwZP(gNasP@C^$F*io@V=7R1sZKL~d9 zgV8=<^@6?K{GEroz_B<8#=u}FD71t2Hjs&cqb(rU45or06af4EV4n~48laDWA$1s$ zi_oLHe)F1KJm3^CoN)M=_Bi|$!%h!OIyRhixIf`=?SNy#CI@)z3g}({9rK`}45B4) zWCr;8H;5O&ZmwzOG zTGjo6&oATrY8?$r-0+zovPi+K(iePY5Y2j# p-|7#h5;x3p!wpO$e0K$}O%-9f`V2 Date: Tue, 22 Sep 2015 15:42:51 -0700 Subject: [PATCH 33/75] Post to checkout a movie. YAY --- controllers/rentals.js | 15 ++++++++++----- database.js | 20 ++++++++++---------- db/development.db | Bin 73728 -> 73728 bytes models/movie.js | 16 ++++++++++++++++ models/rental.js | 38 +++++++------------------------------- routes/rentals.js | 16 ++++++++-------- 6 files changed, 51 insertions(+), 54 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 72a79ad..6d1e097 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -1,11 +1,16 @@ "use strict"; var Rental = require('../models/rental'); //class needs to be instantiated -exports.rentalsController = { - create: function(req, res) { - var db = new Rental(); - db.check_out(req.params.id, req.params.title, function(err, result) { - return res.status(200).json(result); +var rentalsController = { + create: function(request, response, next) { + var customer_id = request.body.id, + movie_title = request.body.title, + db = new Rental(); + + db.check_out(customer_id, movie_title, function(err, result) { + return response.status(200).json(result); }); } }; + +module.exports = rentalsController; diff --git a/database.js b/database.js index 08e1d7e..b66e26d 100644 --- a/database.js +++ b/database.js @@ -36,16 +36,16 @@ var Database = { }); }, - movie_info: function(title, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - // information about specified movie - var statement = "SELECT 'movies'.* FROM movies where movies.title = ? COLLATE NOCASE LIMIT 1; "; - - db.all(statement, title, function(err, rows) { - callback(err, rows); - db.close(); - }); - }, + // movie_info: function(title, callback) { + // var db = new sqlite3.Database('db/' + db_env + '.db'); + // // information about specified movie + // var statement = "SELECT 'movies'.* FROM movies where movies.title = ? COLLATE NOCASE LIMIT 1; "; + // + // db.all(statement, title, function(err, rows) { + // callback(err, rows); + // db.close(); + // }); + // }, customers_by_movie_history: function(title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); diff --git a/db/development.db b/db/development.db index 1a70e6ec7d7f8eccf0a3f16689e201ec97015387..dbc3f48b9c3b1a13f3d8eb938dd01a74b7791c73 100644 GIT binary patch delta 284 zcmZoTz|wGlWr8$g^F$eE#^#L)OSt8D8Ba4X-)G*#Jd3%4Ih5IunV;!3(+Q@fOwCN{ zjHfp%@~mX6kK$!#h>m7p6b&g&RR~TkP%tu5FfuSSRWLNQGBUF=woq{Q4be3)H!x7p z2yh9}ge$YetBk3ns5CW-2V^!QCswmftqhG6+@lE^4pE1q3~aapH#>u(BG7P0-vhh@nge(PRRb{t4+84~$O5Ia Q5j=?kgQX6)r49jG5h8;T`~Uy| diff --git a/models/movie.js b/models/movie.js index d12ec50..81ba940 100644 --- a/models/movie.js +++ b/models/movie.js @@ -1,9 +1,25 @@ "use strict"; +var sqlite3 = require('sqlite3').verbose(); +var db_env = process.env.DB || 'development'; + function Movie() { this.table_name = "movies"; } Movie.prototype = require('../database'); +// Movie.prototype - extend to validation functions (e.g., is_a_movie) + +Movie.prototype.movie_info = function(title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // information about specified movie + var statement = "SELECT 'movies'.* FROM movies where movies.title = ? COLLATE NOCASE LIMIT 1; "; + + db.all(statement, title, function(err, rows) { + callback(err, rows); + db.close(); + }); +} + module.exports = Movie; diff --git a/models/rental.js b/models/rental.js index 402f0d9..c3b398e 100644 --- a/models/rental.js +++ b/models/rental.js @@ -9,43 +9,19 @@ function Rental() { // Rental.prototype = require('../database'); Rental.prototype = { - check_out: function(id, title, callback) { + check_out: function(customer_id, movie_title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); var rental_duration_days = 7; + var checkout_date = new Date(Date.now()); var return_date = new Date(Date.now() + (rental_duration_days * 24 * 60 * 60 * 1000)); - // var movie_id = 1; - // have to actually *run* the sqlite3 query and get result... above doesn't do that... - // not sure if this works either. Seems to return a db connection object...WIP + var statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "'), " + customer_id + ", 'true');"; + console.log(statement); - - var movie_id = function() { - db.get("SELECT id FROM movies WHERE title = '" + title + "';"); - return this.lastID; //in callback? - }; - console.log(movie_id()); - - - // db.serialize(function() { - // db.run("SELECT id FROM movies WHERE title = '" + title + "';"), function(err) { - // // console.log(this.lastID); - // callback(err, { movie_id: this.lastID }); - // }; - // - var statement = "INSERT INTO " + this.table_name + " (return_date, movie_id, customer_id, checked_out) " + "VALUES (" + return_date + ", " + movie_id + ", " + id + ", 'true'); "; - - db.run(statement, function(err) { - callback(err, { inserted_id: this.lastID, changed: this.changes }); - }); + db.run(statement, function(err) { + callback(err, { inserted_id: this.lastID, changed: this.changes }); db.close(); - // }) - - - // - // db.all(statement, function(err, res) { - // if (callback) callback(err, res); - // db.close(); - // }); + }); } }; diff --git a/routes/rentals.js b/routes/rentals.js index b80dd9c..6a580cf 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -2,15 +2,15 @@ var express = require('express'); var router = express.Router(); var rentals_exports = require('../controllers/rentals'); -/* POST /rentals/checkout/:id/:title */ -/* keeps looking for a GET... WIP */ -// router.get('/checkout/:id/:title', function(req, res, next) { - // return rentals_exports.rentalsController.create(req, res); +// router.get('/checkout/:customer_id/:title', function(req, res, next) { +// return rentals_exports.rentalsController.create(req, res); // }); -router.post('/checkout/:id/:title', function(req, res, next) { - console.log("id: " + req.param(id)); - return rentals_exports.rentalsController.create(req, res); -}); +router.post('/checkout', rentals_exports.create); + +// router.post('/checkout', function(req, res, next) { +// +// return rentals_exports.rentalsController.create(req, res); +// }); module.exports = router; From cb0e751d37e62491c10cc4604b523988f3b74498 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Tue, 22 Sep 2015 16:39:37 -0700 Subject: [PATCH 34/75] checkout out a rental subtracts account credit --- db/development.db | Bin 73728 -> 75776 bytes models/rental.js | 12 +++++++++--- routes/rentals.js | 9 --------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/db/development.db b/db/development.db index dbc3f48b9c3b1a13f3d8eb938dd01a74b7791c73..6005707cb382ba68f148b3c15e1167c43ca94c60 100644 GIT binary patch delta 892 zcmZoTz|wGmWr8$oHv8~Au~VIYo-%S zOPQLP)EQ4R<}nH~Y+(qWY{;Xl7%j-o5FO3PC>m0lst}x7pkQRAU}Ruus$ghlWnf`t zVmA2=uYxUEq(qHADoV4$E8;1Z%K#8gsLni?&D#{_dL6C;=jAU1Xr`01U@__7+aZIf=rMBY6r2gny~pauK^P%>^ucG3AAxDhBUWJZ*P}otYp#R1&RtX zgflSTXWqj+Ycxb5p-4=KS}}1ly<}is%w>CJ*RD;c++R%End+RQ4@$jx}Axm|jDyEJ1Z3jq2-7%Bh& diff --git a/models/rental.js b/models/rental.js index c3b398e..fd77c8a 100644 --- a/models/rental.js +++ b/models/rental.js @@ -15,13 +15,19 @@ Rental.prototype = { var checkout_date = new Date(Date.now()); var return_date = new Date(Date.now() + (rental_duration_days * 24 * 60 * 60 * 1000)); - var statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "'), " + customer_id + ", 'true');"; - console.log(statement); + var create_statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "'), " + customer_id + ", 'true')"; - db.run(statement, function(err) { + var charge_statement = "UPDATE customers SET account_credit = (account_credit - 1.0) WHERE ID = " + customer_id + " ;"; + + db.run(create_statement, function(err) { callback(err, { inserted_id: this.lastID, changed: this.changes }); db.close(); }); + + db.run(charge_statement, function(err) { + callback(err, { changed: this.changes }); + db.close(); + }); } }; diff --git a/routes/rentals.js b/routes/rentals.js index 6a580cf..d050eca 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -2,15 +2,6 @@ var express = require('express'); var router = express.Router(); var rentals_exports = require('../controllers/rentals'); -// router.get('/checkout/:customer_id/:title', function(req, res, next) { -// return rentals_exports.rentalsController.create(req, res); -// }); - router.post('/checkout', rentals_exports.create); -// router.post('/checkout', function(req, res, next) { -// -// return rentals_exports.rentalsController.create(req, res); -// }); - module.exports = router; From 308db04e0111c6294f7486a1e8742af1c961fb7a Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Tue, 22 Sep 2015 16:42:57 -0700 Subject: [PATCH 35/75] rental cost as variable --- db/development.db | Bin 75776 -> 75776 bytes models/rental.js | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/db/development.db b/db/development.db index 6005707cb382ba68f148b3c15e1167c43ca94c60..648aa119eb8d79d0977b7e1e889d6e88b1ac8e1f 100644 GIT binary patch delta 149 zcmZp;z|wGmWr8$g-$WT_#=eaS%cYn+Ha2rgZ|9U|{LR6~%B0W0yqMXI=_OMSlm2Ew z8(Ai%XtBu!yi%+tMplMKllysyHXL5(&?<~jK2Z0uqJ2# delta 61 zcmV-D0K)%(&;)?c1dtm6i;)~d0gJI Date: Tue, 22 Sep 2015 21:47:26 -0700 Subject: [PATCH 36/75] Finished check out functionality - updates customer credit and number of copies available. --- database.js | 13 +------------ db/development.db | Bin 75776 -> 75776 bytes models/rental.js | 15 +++++++++------ utils/seed.js | 12 ++++++++++++ 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/database.js b/database.js index b66e26d..1b27899 100644 --- a/database.js +++ b/database.js @@ -36,17 +36,6 @@ var Database = { }); }, - // movie_info: function(title, callback) { - // var db = new sqlite3.Database('db/' + db_env + '.db'); - // // information about specified movie - // var statement = "SELECT 'movies'.* FROM movies where movies.title = ? COLLATE NOCASE LIMIT 1; "; - // - // db.all(statement, title, function(err, rows) { - // callback(err, rows); - // db.close(); - // }); - // }, - customers_by_movie_history: function(title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); // all customers who have checked out this movie in the past @@ -95,7 +84,7 @@ var Database = { customers_overdue: function(callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); - // all customers who currently have the movie checked out + // all customers who currently have the movie checked out and past return_date var statement = "SELECT * FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE date(rentals.return_date) < date('now') AND rentals.checked_out = 'true'; "; db.all(statement, function(err, rows) { diff --git a/db/development.db b/db/development.db index 648aa119eb8d79d0977b7e1e889d6e88b1ac8e1f..a9fca871e645184bd750654597d8e874c157312b 100644 GIT binary patch delta 1275 zcmZvbOGs2v7{~9q=Qv)+nRKQxN5^tB9Uo0PnKz< z0&P4F6%IpzAt)~c8N7q8B(#ZTBdl7=qRAlC!ID8%%r@LSl3QHSXLZ2wIPe+K|N zj=j(g8UWv|2e1wLKr7%CgaO~L8RUXOuoZYf8}NYus0UjBZ!Zt9r^b2P>>+lB0oX8X ztWMAcc=K-H1?($!3;T)vQw3@PpNQ`g13LiUtrRo@HW9lu2||Ef$`)f+7qApttpqp$ z3kCt3zY_39lpXZE)16Wq)3h-e6VEJ9$w_d_zhvnBrdjKF!ZVqFZ3&8d8$ zZ1q`JwqtTt&ZtpDm+&bozJ}-=qCrN(jH=a)dZFf&A@E}YL%mKZvaP(-*BSL1pWcC+ z_&lVm8OJN|LCrf{f@L3LXc=4pr@?}nRjks2=_Op?!J4#H1-G%n`AZo42GZaj=Ctd| za`*}?Uw+Kq>wAJ3H?R?AszXe_zb5CEPcZ)r^DiSW3{HTzn3Unjk5#PkoWDL{wX8*+ rDS`=4K@c1VyFn7AvAa3tXZ@p0xVtJXExHg?C@7}i|B?(6#=VOUd_T_r zob!F>+`0Fh#TB)UO*n9{u-Ur%7fxZ!-e;5et2D*lT%0VD* z0o55GkpgxlfZYbrr~|2fpmqn)(+doB)0&|!puQ6bb^trufYxT9YBSK?1ZWLFv=(@$ z1{kgewg!Ryl|al7>`;JD`oJc+05ZQD416RPdhHyFZ8q&`yG^@@*gfEgt$}Hq^7q&j zYuW*@*#=l{4$xm;mki`78K@|4s4f}eRx(S5 zAzF@#vWCe}1uGO7ug}j;Yva>1nrUjLZX`7$X_+Z2o}q}H>&1o$@1Z7xl)x*?CL}Gx zdrXTGs3@19ZK_}$9Y~;sV|q4bnx$4&xL2wtIekm-MM9ut^GrP8PuV0s~GxPDA%8RC5viB71a|+hrUp*x-QhRU-4I%G*%^fl@lI+UQ}1rH3hT!oqQQ2 z_@+?$?^A1VRW7R#%xJeUH8e&=NEQJ%bjZ$H@4L7WFAE@SLZ=ri@53UD+=q0>++3_sBNL2vzgYFmUIWAYDqUtawG#Jm+J<^+$@VeyFp zCW~@J{3Fhb0XH($CPblO{fbDKYp0VgA+OkYI;D4O)t3wg&hh#sl%S%#p>Ev}fBn|- qiVcRfd$E=b71%{QVa1&rA&quK?Kj+`(b58#6Q>=utr_BF7x)iO^Ows2 diff --git a/models/rental.js b/models/rental.js index 2959a05..a600d22 100644 --- a/models/rental.js +++ b/models/rental.js @@ -20,15 +20,18 @@ Rental.prototype = { var charge_statement = "UPDATE customers SET account_credit = (account_credit - " + rental_cost + ") WHERE ID = " + customer_id + " ;"; - db.run(create_statement, function(err) { - callback(err, { inserted_id: this.lastID, changed: this.changes }); - db.close(); - }); + var availability_statement = "UPDATE movies SET num_available = (num_available - 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; + + db.serialize(function(err) { + db.run(create_statement, function(err) { + callback(err, { inserted_id: this.lastID, changed: this.changes }); + }); + db.run(charge_statement); + db.run(availability_statement); - db.run(charge_statement, function(err) { - callback(err, { changed: this.changes }); db.close(); }); + } }; diff --git a/utils/seed.js b/utils/seed.js index cc091e0..c7b400b 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -58,6 +58,15 @@ var rental_statement = db.prepare( "INSERT INTO rentals(checkout_date, return_date, movie_id, customer_id, checked_out) \ VALUES (?, ?, ?, ?, ?);" ); +// var adjust_num_available_statement = db.prepare( +// "CASE WHEN rentals.checked_out = 'true' AND rentals.movie_id = 1 THEN UPDATE movies SET num_available = (num_available - 1) WHERE id = 1; " +// +// "UPDATE movies SET num_available = CASE WHEN (SELECT * FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE checked_out = 'true' AND movie_id = 1 LIMIT 1) THEN (num_available - 1) ELSE num_available END WHERE id = 1; " + + // SELECT * FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE checked_out = 'true' + + // UPDATE movies SET num_available = (num_available - 1) WHERE id = 1 AND (SELECT checked_out FROM rentals WHERE rentals.movie_id = 1 AND rentals.checked_out = 'true'); +); db.serialize(function() { // loop through rentals @@ -71,8 +80,11 @@ db.serialize(function() { rental.customer_id, rental.checked_out ); + // decrease number of copies available in movies table if checked out. + // adjust_num_available_statement.run(rental.movie_id); } rental_statement.finalize(); + // adjust_num_available_statement.finalize(); }); // close db From cb2054e0de0cd589a9b28787947ecf016a00c6c9 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Wed, 23 Sep 2015 00:53:07 -0700 Subject: [PATCH 37/75] movie controller tests --- db/test.db | Bin 4096 -> 4096 bytes package.json | 3 ++- test/movies.js | 65 +++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 57 insertions(+), 11 deletions(-) diff --git a/db/test.db b/db/test.db index 7fb12534631c1ab5fe553d74dbb82ec13d1965f3..43a9479b2706a8ef95d62e9e9a848f11b818705a 100644 GIT binary patch delta 17 YcmZorXi%6S%@{vX#+fmGW5NP{051pyTmS$7 delta 17 YcmZorXi%6S%_uif#+gxWW5NP{04q5J+5i9m diff --git a/package.json b/package.json index c2520c7..ee8245d 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "jade": "~1.11.0", "mocha": "^2.3.2", "morgan": "~1.6.1", - "serve-favicon": "~2.3.0" + "serve-favicon": "~2.3.0", + "supertest": "^1.1.0" } } diff --git a/test/movies.js b/test/movies.js index 1fe45aa..4b56546 100644 --- a/test/movies.js +++ b/test/movies.js @@ -1,13 +1,15 @@ var assert = require('assert'), Movie = require('../models/movie'), - sqlite3 = require('sqlite3').verbose(); + sqlite3 = require('sqlite3').verbose(), + request = require('supertest'), + app = require('../app'), + agent = request.agent(app); -describe("Movie", function() { +describe("Endpoints under /movies", 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( @@ -25,24 +27,67 @@ describe("Movie", function() { }); }); - it("can be instantiated", function() { - assert(movie instanceof Movie); - }); + describe("movie instance methods", function() { + context("GET #INDEX", function() { + var movie_request; + beforeEach(function(done) { + movie_request = agent.get('/movies').set('Accept', 'application/json'); + done(); + }); + + it("can be instantiated", function() { + assert(movie instanceof Movie); + }); + + it("responds with json", function(done) { + movie_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); - describe("instance methods", function() { - context("GET #find_all", function() { it("retrieves all movie records", 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, 'Jaws'); + assert.equal(res.length, 100); + assert.equal(res[0].title, 'Psycho'); + done(); + }); + }); + + it('knows about the route', function(done) { + movie_request + .expect('Content-Type', /application\/json/) + .expect(200, function(err,res) { + assert.equal(err, undefined); + done(); + }); + }); + + it("returns an array of movie objects", function(done) { + movie_request + .expect(200, function(error, result) { + console.log(result.body); + assert.equal(result.body.length, 100); + var keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'num_available']; + assert.deepEqual(Object.keys(result.body[0]), keys); done(); }); }); }); + context("POST", function() { + it ("can make a post", function(done) { + agent.post('/movies').set('Accept', 'application/json') + .field('title', 'RoboJaws') + .field('release_date', 'Tomorrow') + .expect(); + done(); + }); + }); + context("GET #movies_by_customer_history", function() { it("retrieves all past movie records from that customer", function(done) { + movie_request movie.movies_by_customer_history(function(err,res) { done(); }); From ad44ab68fd7a970ce195d78f6b97b3cca595066d Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Wed, 23 Sep 2015 01:14:50 -0700 Subject: [PATCH 38/75] movies controller tests wip --- db/test.db | Bin 4096 -> 4096 bytes test/{ => controllers}/movies.js | 73 ++++++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 7 deletions(-) rename test/{ => controllers}/movies.js (50%) diff --git a/db/test.db b/db/test.db index 43a9479b2706a8ef95d62e9e9a848f11b818705a..eab864dbbf1b13e328d01fe62247dc9b918e2484 100644 GIT binary patch delta 17 YcmZorXi%6S&A4fzj5Fh=jR_0*0W;+W0ssI2 delta 17 YcmZorXi%6S%@{vX#+fmGW5NP{051pyTmS$7 diff --git a/test/movies.js b/test/controllers/movies.js similarity index 50% rename from test/movies.js rename to test/controllers/movies.js index 4b56546..eb1caa8 100644 --- a/test/movies.js +++ b/test/controllers/movies.js @@ -28,13 +28,16 @@ describe("Endpoints under /movies", function() { }); describe("movie instance methods", function() { - context("GET #INDEX", function() { + context("GET /movies", function() { var movie_request; + var keys; + beforeEach(function(done) { movie_request = agent.get('/movies').set('Accept', 'application/json'); + keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'num_available']; done(); }); - + it("can be instantiated", function() { assert(movie instanceof Movie); }); @@ -69,12 +72,12 @@ describe("Endpoints under /movies", function() { .expect(200, function(error, result) { console.log(result.body); assert.equal(result.body.length, 100); - var keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'num_available']; assert.deepEqual(Object.keys(result.body[0]), keys); done(); }); }); }); + context("POST", function() { it ("can make a post", function(done) { agent.post('/movies').set('Accept', 'application/json') @@ -85,13 +88,69 @@ describe("Endpoints under /movies", function() { }); }); - context("GET #movies_by_customer_history", function() { - it("retrieves all past movie records from that customer", function(done) { + context("GET /movies/:title ", function() { + var keys; + beforeEach(function(done) { + keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'num_available']; + done(); + }); + + it("can find Jaws", function(done) { + var movie_request = agent.get('/movies/Jaws').set('Accept', 'application/json'); + movie_request + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result) { + assert.equal(result.body.length, 1); + assert.deepEqual(Object.keys(result.body[0]), keys); + assert.equal(result.body[0].title, 'Jaws'); + done(); + }); + }); + }); + + context("GET /movies/:title/history ", function() { + it("can see Jaws customer history", function(done) { + var movie_request = agent.get('/movies/Jaws/history').set('Accept', 'application/json'); + done(); movie_request - movie.movies_by_customer_history(function(err,res) { + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result) { + assert.equal(result.body.length, 1); + assert.deepEqual(Object.keys(result.body[0]), keys); + assert.equal(result.body[0].title, 'Jaws'); + done(); + }); + }); + }); + + context("GET /movies/:column/:p ", function() { + it("can see Jaws customer history", function(done) { + var movie_request = agent.get('/movies/title/1').set('Accept', 'application/json'); done(); + movie_request + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result) { + assert.equal(result.body.length, 1); + assert.deepEqual(Object.keys(result.body[0]), keys); + assert.equal(result.body[0].title, 'Jaws'); + done(); + }); + }); + }); + + context("GET /movies/:title/customers ", function() { + it("can see Jaws customer history", function(done) { + var movie_request = agent.get('/movies/Jaws/history').set('Accept', 'application/json'); + done(); + movie_request + .expect('Content-Type', /application\/json/) + .expect(200, function(error, result) { + assert.equal(result.body.length, 1); + assert.deepEqual(Object.keys(result.body[0]), keys); + assert.equal(result.body[0].title, 'Jaws'); + done(); + }); }); }); }); - }); }); From 5739bb86b6c1670f3f1c8b2cdcb2de34c5d8e449 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Wed, 23 Sep 2015 01:58:57 -0700 Subject: [PATCH 39/75] separated controller and model tests wip --- db/test.db | Bin 4096 -> 4096 bytes test/{controllers => }/movies.js | 33 ++++++------------------------- 2 files changed, 6 insertions(+), 27 deletions(-) rename test/{controllers => }/movies.js (84%) diff --git a/db/test.db b/db/test.db index eab864dbbf1b13e328d01fe62247dc9b918e2484..58084b4174f27d642bbb671191c6890c3491bd99 100644 GIT binary patch delta 17 YcmZorXi%6S&A4x(j5FiDjR_0*0W_Hg8UO$Q delta 17 YcmZorXi%6S&A4fzj5Fh=jR_0*0W;+W0ssI2 diff --git a/test/controllers/movies.js b/test/movies.js similarity index 84% rename from test/controllers/movies.js rename to test/movies.js index eb1caa8..5a1180c 100644 --- a/test/controllers/movies.js +++ b/test/movies.js @@ -10,6 +10,7 @@ describe("Endpoints under /movies", function() { beforeEach(function(done) { movie = new Movie(); + db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { db_cleaner.exec( @@ -17,7 +18,10 @@ describe("Endpoints under /movies", function() { DELETE FROM movies; \ INSERT INTO movies(title, overview, release_date, inventory, num_available) \ VALUES('Jaws', 'Shark!', 'Yesterday', 10, 8), \ - ('Maws', 'Worm!', 'Yesterday', 11, 4); \ + ('Maws', 'Worm!', 'Yesterday', 11, 4), \ + ('Claws', 'Cat!', 'Yesterday', 12), \ + ('Paws', 'Bear!', 'Yesterday', 13), \ + ('Gauze', 'Ouch!', 'Yesterday', 14); \ COMMIT;" , function(err) { db_cleaner.close(); @@ -38,26 +42,12 @@ describe("Endpoints under /movies", function() { done(); }); - it("can be instantiated", function() { - assert(movie instanceof Movie); - }); - it("responds with json", function(done) { movie_request .expect('Content-Type', /application\/json/) .expect(200, done); }); - it("retrieves all movie records", function(done) { - movie.find_all(function(err, res) { - assert.equal(err, undefined); - assert(res instanceof Array); - assert.equal(res.length, 100); - assert.equal(res[0].title, 'Psycho'); - done(); - }); - }); - it('knows about the route', function(done) { movie_request .expect('Content-Type', /application\/json/) @@ -70,7 +60,6 @@ describe("Endpoints under /movies", function() { it("returns an array of movie objects", function(done) { movie_request .expect(200, function(error, result) { - console.log(result.body); assert.equal(result.body.length, 100); assert.deepEqual(Object.keys(result.body[0]), keys); done(); @@ -78,16 +67,6 @@ describe("Endpoints under /movies", function() { }); }); - context("POST", function() { - it ("can make a post", function(done) { - agent.post('/movies').set('Accept', 'application/json') - .field('title', 'RoboJaws') - .field('release_date', 'Tomorrow') - .expect(); - done(); - }); - }); - context("GET /movies/:title ", function() { var keys; beforeEach(function(done) { @@ -150,7 +129,7 @@ describe("Endpoints under /movies", function() { assert.equal(result.body[0].title, 'Jaws'); done(); }); - }); }); }); + }); }); From 08b86682d6fdd9415c0765e35c5330a93bcec84b Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Wed, 23 Sep 2015 09:45:14 -0700 Subject: [PATCH 40/75] changed some test pathing issues --- db/test.db | Bin 4096 -> 73728 bytes test/{ => controllers}/movies.js | 11 ++- test/models/movies.js | 137 +++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+), 6 deletions(-) rename test/{ => controllers}/movies.js (94%) create mode 100644 test/models/movies.js diff --git a/db/test.db b/db/test.db index 58084b4174f27d642bbb671191c6890c3491bd99..544c3815109b97d40427437cd4cf5074c9df0b43 100644 GIT binary patch literal 73728 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

IGex_u8BmfL!}xkhG&b`)j< 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 delta 192 zcmZoTz|x>FK}v{W9|Hpe3lPJAz(gG*5um87&GGn2Id5&>5L0DEAr?uay6DP zvx`ehGd9~#p2p}j`3>V*MyAQLm`*S;PT1in&BV?i zDlX5+=$lwx9G+j4s~DMDT#{Opl32;jBEtxjlmtq80VRVo5{t4CvRoV>>ls*}CjDeX G&@hew diff --git a/test/movies.js b/test/controllers/movies.js similarity index 94% rename from test/movies.js rename to test/controllers/movies.js index 5a1180c..f32eeba 100644 --- a/test/movies.js +++ b/test/controllers/movies.js @@ -1,15 +1,14 @@ var assert = require('assert'), - Movie = require('../models/movie'), sqlite3 = require('sqlite3').verbose(), request = require('supertest'), - app = require('../app'), + app = require('../../app'), + movie_controller = require('../../controllers/movies'), agent = request.agent(app); describe("Endpoints under /movies", function() { var movie, db_cleaner; beforeEach(function(done) { - movie = new Movie(); db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { @@ -57,10 +56,10 @@ describe("Endpoints under /movies", function() { }); }); - it("returns an array of movie objects", function(done) { + it.only("returns an array of movie objects", function(done) { movie_request .expect(200, function(error, result) { - assert.equal(result.body.length, 100); + assert.equal(result.body.length, 5); assert.deepEqual(Object.keys(result.body[0]), keys); done(); }); @@ -116,7 +115,7 @@ describe("Endpoints under /movies", function() { }); }); }); - +//db run/execute INSERT new values ...db serialize context("GET /movies/:title/customers ", function() { it("can see Jaws customer history", function(done) { var movie_request = agent.get('/movies/Jaws/history').set('Accept', 'application/json'); diff --git a/test/models/movies.js b/test/models/movies.js new file mode 100644 index 0000000..6a36ad9 --- /dev/null +++ b/test/models/movies.js @@ -0,0 +1,137 @@ +var assert = require('assert'), + Movie = require('../../models/movie'), + app = require('../../app'), + 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) \ + VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ + ('Maws', 'Worm!', 'Yesterday', 11), \ + ('Claws', 'Cat!', 'Yesterday', 12), \ + ('Paws', 'Bear!', 'Yesterday', 13), \ + ('Gauze', 'Ouch!', 'Yesterday', 14); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }) + + it("can be instantiated", function() { + assert(movie instanceof Movie); + }) + + describe("instance methods", function() { + it("retrieves all movie records", function(done) { + + // it("retrieves all movie records", function(done) { + // movie.find_all(function(err, res) { + // assert.equal(err, undefined); + // assert(res instanceof Array); + // assert.equal(res.length, 100); + // assert.equal(res[0].title, 'Psycho'); + // done(); + // }); + // }); + + movie.find_all(function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 5); //jaws maws claws paws gauze + + assert.equal(res[0].title, 'Jaws'); + assert.equal(res[1].title, 'Maws'); + + done(); + }) + }) + + it("can find some of the movies", function(done) { + movie.some(2, 3, function(error, result) { + assert.equal(error, undefined); + assert(result instanceof Array); + assert.equal(result.length, 2); //paws gauze + + assert.equal(result[0].title, 'Paws'); + assert.equal(result[1].title, 'Gauze'); + + done(); + }) + }) + + it("can find a movie by id", function(done){ + movie.find_by("id", 1, function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(res[0].id, 1); + done(); + }) + }) + + it("can find a movie by title", function(done) { + movie.find_by("title", "Jaws", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(res[0].title, 'Jaws'); + done(); + }) + }) + + it("can save changes to a movie", function(done) { + movie.find_by("title", "Jaws", function(err, res) { + var original_title = res[0].title; + var id = res[0].id; + movie.save({title: "Jaws 2: Jawsier", id: id}, function(err, res) { + assert.equal(err, undefined); + assert.equal(res.inserted_id, 0); //it didn't insert any records + assert.equal(res.changed, 1); //it updated one record + done(); + }) + }) + }); + + context("POST", function() { + it ("can make a post", function(done) { + agent.post('/movies').set('Accept', 'application/json') + .field('title', 'RoboJaws') + .field('release_date', 'Tomorrow') + .expect(); + done(); + }); + }); + + it("can save a new movie to the database", function(done) { + var data = { + title: "RoboJaws", + overview: "Jaws is hunted by RoboJaws", + release_date: "Tomorrow", + inventory: 10 + } +// insert into mocha tests + movie.create(data, function(err, res) { + assert.equal(res.inserted_id, 6); //it inserted a new record + assert.equal(res.changed, 1); //one record was changed + + movie.find_by("title", "RoboJaws", function(err, res) { + assert.equal(res.length, 1); + assert.equal(res[0].title, 'RoboJaws'); //we found our new movie + done(); + }) + }) + }); + }) +}) From 63031e3e580e7d4d40c2d86806f83f8c93f2d833 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Wed, 23 Sep 2015 10:50:38 -0700 Subject: [PATCH 41/75] Customer model tests --- db/test.db | Bin 73728 -> 73728 bytes models/customer.js | 1 + models/rental.js | 2 - test/controllers/customers.js | 0 test/controllers/movies.js | 2 +- test/customers.js | 45 ------------ test/models/customers.js | 124 ++++++++++++++++++++++++++++++++++ utils/seed.js | 2 +- 8 files changed, 127 insertions(+), 49 deletions(-) create mode 100644 test/controllers/customers.js delete mode 100644 test/customers.js create mode 100644 test/models/customers.js diff --git a/db/test.db b/db/test.db index 544c3815109b97d40427437cd4cf5074c9df0b43..1e22e7e40cf3100ce93c2093500032bf50ebd6ec 100644 GIT binary patch delta 5657 zcmeI0TWl0n7{||Ly0?~X7btCa7ditiP-tOidZEj;Ed@#ixfL(b1WH+j*c8~d0TPpe zsL=rYi%LO!^#a}nnSsS`ZFdH%o|af1g2 zy5##?g}lz>9eG_olqY0TZkKTxl}y|b*Tt|nE)Iz8qESToD8Iw6@nL?9AK)Flkw@4l z`+;3!=h-o~pLNKc@;UjG+#)xGje#$`ky*Nz6_=HB*4}xrciW!MPOC<3f9GhuuG-mb%X3%=N$z;tz(>yhc~-1#iioM1kloi9C;uBKJky<&~N+}zr+VnKbv?p z1n#1G2H8=z{Xli#5>&d5WLOM^b|k4qz`0RO|%NDT#daeFnc$O5nqtOaVj1vGE+bL_rCd1_HnjmV-E00vbR)uz(3-U=gSW3qciQHk*exm7oI50XirLvp@ud zK^d3<^1&L=1eSrhpb#ttb)W{!2eZLUPzuyjX*!q+LZAo)fht9>`nC^m@__0RTT|0R z_r+F&b)>t%5C2UUi1{+F$6eqgt?&P`3oKQamQP00m(Z|0E)U>7-zcN0&^<2Ir53Jo zI?nkn?PPeK6PfE4sdOS0Zjm`o-#XhRa*7w|viS&xrvXFVF% zQl9P+c}e3!8}$5+tzSoEO53Bhe!DvJ+dkF}?qr zhuHcGpWg(}gB##;a1~qu&mj4U@TEK-tM7GS=Tt8>1L{6`@w}vTsmp!{0-o2`mS77>nU=HJGn0jj%4&q<)4bRrRQrED}G9 zo8r89T_nV6q4N=bn}5pR;{ALZH+hiVV_&j!>^0VP>S(2{Z*?ABZXM_r`r)?OX&J_K zpg9fbCMPkj6}GcYh5jUIvXM5~K$<*}Yohi)zAJAhP1e&UZKTP%bdNgjq~x5FwWP@! z+N5=I6Faj$SnWjIOj<~jX4<6bQ4>3-DM+tWR*@zvNs|?{$?~*`J@L9qt-SPQq{&j! zBubrwxL>0&AWRI}1V3&PCgmz&yZ)YopFatcnY0OhAf4Pq IQ}?Dn0p3TpUjP6A delta 5169 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 JKx*ma?*KbJg?<14 diff --git a/models/customer.js b/models/customer.js index c44a37c..fa7e0b5 100644 --- a/models/customer.js +++ b/models/customer.js @@ -8,5 +8,6 @@ function Customer() { } Customer.prototype = require('../database'); +// Customer.prototype. module.exports = Customer; diff --git a/models/rental.js b/models/rental.js index a600d22..ad5fddf 100644 --- a/models/rental.js +++ b/models/rental.js @@ -17,9 +17,7 @@ Rental.prototype = { var rental_cost = 1.0; var create_statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "'), " + customer_id + ", 'true')"; - var charge_statement = "UPDATE customers SET account_credit = (account_credit - " + rental_cost + ") WHERE ID = " + customer_id + " ;"; - var availability_statement = "UPDATE movies SET num_available = (num_available - 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; db.serialize(function(err) { diff --git a/test/controllers/customers.js b/test/controllers/customers.js new file mode 100644 index 0000000..e69de29 diff --git a/test/controllers/movies.js b/test/controllers/movies.js index f32eeba..fa770e7 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -56,7 +56,7 @@ describe("Endpoints under /movies", function() { }); }); - it.only("returns an array of movie objects", function(done) { + it("returns an array of movie objects", function(done) { movie_request .expect(200, function(error, result) { assert.equal(result.body.length, 5); diff --git a/test/customers.js b/test/customers.js deleted file mode 100644 index ac71eca..0000000 --- a/test/customers.js +++ /dev/null @@ -1,45 +0,0 @@ -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('Beetlejuice', '10/10/2010', 'Yesterday', '123 street', 'Burlington', 'WA', 98233, 3604216650, 5.25), \ - ('Juice', '10/10/2010', 'Yesterday', '123 street', 'Burlington', 'WA', 98233, 3604216650, 5.55); \ - COMMIT;" - , function(err) { - db_cleaner.close(); - done(); - } - ); - }); - }); - - it("can be instantiated", function() { - assert(customer instanceof Customer); - }); - - describe("instance methods", function() { - context("GET #find_all", function() { - it("retrieves all customer records", 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, 'Beetlejuice'); - done(); - }); - }); - }); - }); -}); diff --git a/test/models/customers.js b/test/models/customers.js new file mode 100644 index 0000000..84f828f --- /dev/null +++ b/test/models/customers.js @@ -0,0 +1,124 @@ +var assert = require('assert'), + Customer = require('../../models/customer'), + sqlite3 = require('sqlite3').verbose(); + +describe.only("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('Beetle Juice', '2015-01-01', '123 street', 'Burlington', 'WA', '98101', '3604216650', 5.25), \ + ('Juicy Beetle', '2014-01-01', '123 street', 'Burlington', 'WA', '98211', '3604216650', 5.55), \ + ('Aaron Aaronson', '2015-02-01', '123 street', 'Burlington', 'WA', '98195', '3604216650', 5.55); \ + DELETE FROM movies; \ + INSERT INTO movies(title, overview, release_date, inventory) \ + VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ + ('Maws', 'Worm!', 'Yesterday', 11); \ + DELETE FROM rentals; \ + INSERT INTO rentals(checkout_date, return_date, movie_id, customer_id, checked_out) \ + VALUES('2015-02-14', '2015-02-21', '1', '1', 'false'), \ + ('2015-09-22', '2015-09-29', '1', '2', 'true'), \ + ('2015-09-22', '2015-09-29', '2', '2', 'true'), \ + ('2015-07-22', '2015-09-01', '2', '1', 'true'); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + + it("can be instantiated", function() { + assert(customer instanceof Customer); + }); + + describe("instance methods", function() { + context("GET #find_all", function() { + it("retrieves all customer records", function(done) { + customer.find_all(function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 3); + assert.equal(res[0].name, 'Beetle Juice'); + done(); + }); + }); + }); + + context("GET #by_column", function() { + it("successfully retrieves an Array object", function (done) { + customer.by_column("name", 3, 0, function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + done(); + }); + }); + + it("retrieves records sorted by name column", function(done) { + customer.by_column("name", 3, 0, function(err, res) { + assert.equal(res.length, 3); + assert.equal(res[0].name, 'Aaron Aaronson'); + assert.equal(res[1].name, 'Beetle Juice'); + done(); + }); + }); + + it("retrieves records sorted by registered_at column", function(done) { + customer.by_column("registered_at", 3, 0, function(err, res) { + assert.equal(res.length, 3); + assert.equal(res[0].name, 'Juicy Beetle'); + assert.equal(res[1].name, 'Beetle Juice'); + done(); + }); + }); + + it("retrieves records sorted by postal_code column", function(done) { + customer.by_column("postal_code", 3, 0, function(err, res) { + assert.equal(res.length, 3); + assert.equal(res[0].name, 'Beetle Juice'); + assert.equal(res[1].name, 'Aaron Aaronson'); + done(); + }); + }); + + it("retrieves correct number of records", function(done) { + customer.by_column("name", 2, 0, function(err, res) { + assert.equal(res.length, 2); + done(); + }); + }); + + it("retrieves records offset by correct number of records", function(done) { + customer.by_column("name", 2, 1, function(err, res) { + assert.equal(res.length, 2); + assert.equal(res[0].name, 'Beetle Juice'); + done(); + }); + }); + }); + + context("GET #movies_by_customer_current", function() { + it("retrieves customer's currently checked out movies", function(done) { + customer.movies_by_customer_current(2, function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 2); + assert.equal(res[0].title, 'Jaws'); + done(); + }); + }); + }); + + // context("GET #movies_by_customer_history", function() { }); + // context("GET #customers_overdue", function() { }); + + }); +}); diff --git a/utils/seed.js b/utils/seed.js index c7b400b..ff5a090 100644 --- a/utils/seed.js +++ b/utils/seed.js @@ -66,7 +66,7 @@ var rental_statement = db.prepare( // SELECT * FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE checked_out = 'true' // UPDATE movies SET num_available = (num_available - 1) WHERE id = 1 AND (SELECT checked_out FROM rentals WHERE rentals.movie_id = 1 AND rentals.checked_out = 'true'); -); +// ); db.serialize(function() { // loop through rentals From c9768f17a8483c25d49ccf5dddd1c902d0bd9acf Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Wed, 23 Sep 2015 11:01:18 -0700 Subject: [PATCH 42/75] Finished customer model tests. YAY --- db/test.db | Bin 73728 -> 73728 bytes test/models/customers.js | 25 +++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/db/test.db b/db/test.db index 1e22e7e40cf3100ce93c2093500032bf50ebd6ec..20a839309de0cb73948254d12f91432d7b262979 100644 GIT binary patch delta 24 ecmZoTz|wGlWr7qFi_JtCCm`9Fur+~kfjj_U#|K;h delta 24 ecmZoTz|wGlWr7qF^T&xYPC&9TVQT{80(k&%JqW}A diff --git a/test/models/customers.js b/test/models/customers.js index 84f828f..55c0bd9 100644 --- a/test/models/customers.js +++ b/test/models/customers.js @@ -117,8 +117,29 @@ describe.only("Customer", function() { }); }); - // context("GET #movies_by_customer_history", function() { }); - // context("GET #customers_overdue", function() { }); + context("GET #movies_by_customer_history", function() { + it("retrieves customer's previously checked out movies", function(done) { + customer.movies_by_customer_history(1, function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(res[0].title, 'Jaws'); + done(); + }); + }); + }); + + context("GET #customers_overdue", function() { + it("retrieves list of customers with overdue movies", function(done) { + customer.customers_overdue(function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(res[0].name, 'Beetle Juice'); + done(); + }); + }); + }); }); }); From 751fb581182e74a05878ea9f6d3f05b8754a7329 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Wed, 23 Sep 2015 11:33:43 -0700 Subject: [PATCH 43/75] Tested sort order of customers_overdue. --- database.js | 2 +- test/models/customers.js | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/database.js b/database.js index 1b27899..d6667b2 100644 --- a/database.js +++ b/database.js @@ -85,7 +85,7 @@ var Database = { customers_overdue: function(callback) { var db = new sqlite3.Database('db/' + db_env + '.db'); // all customers who currently have the movie checked out and past return_date - var statement = "SELECT * FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE date(rentals.return_date) < date('now') AND rentals.checked_out = 'true'; "; + var statement = "SELECT * FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE date(rentals.return_date) < date('now') AND rentals.checked_out = 'true' ORDER BY rentals.return_date; "; db.all(statement, function(err, rows) { callback(err, rows); diff --git a/test/models/customers.js b/test/models/customers.js index 55c0bd9..81073c5 100644 --- a/test/models/customers.js +++ b/test/models/customers.js @@ -26,7 +26,8 @@ describe.only("Customer", function() { VALUES('2015-02-14', '2015-02-21', '1', '1', 'false'), \ ('2015-09-22', '2015-09-29', '1', '2', 'true'), \ ('2015-09-22', '2015-09-29', '2', '2', 'true'), \ - ('2015-07-22', '2015-09-01', '2', '1', 'true'); \ + ('2015-09-14', '2015-09-20', '1', '1', 'true'), \ + ('2015-07-22', '2015-09-01', '1', '2', 'true'); \ COMMIT;" , function(err) { db_cleaner.close(); @@ -110,7 +111,7 @@ describe.only("Customer", function() { customer.movies_by_customer_current(2, 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, 'Jaws'); done(); }); @@ -134,11 +135,18 @@ describe.only("Customer", function() { customer.customers_overdue(function(err, res) { assert.equal(err, undefined); assert(res instanceof Array); - assert.equal(res.length, 1); - assert.equal(res[0].name, 'Beetle Juice'); + assert.equal(res.length, 2); + done(); + }); + }); + + it("customers list is sorted by return_date", function(done) { + customer.customers_overdue(function(err, res) { + assert.equal(res[0].name, 'Juicy Beetle'); done(); }); }); + }); }); From ca5de4f16da741835bf49773b768ade2ef92219d Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Wed, 23 Sep 2015 12:01:39 -0700 Subject: [PATCH 44/75] movie controller tests wip --- db/test.db | Bin 73728 -> 73728 bytes test/controllers/movies.js | 84 ++++++++++++++++++++----------------- test/customers.js | 34 +++++++-------- test/models/movies.js | 13 +----- 4 files changed, 64 insertions(+), 67 deletions(-) diff --git a/db/test.db b/db/test.db index 544c3815109b97d40427437cd4cf5074c9df0b43..79e7375de10424cec092bb7f01203437439b8316 100644 GIT binary patch delta 22 dcmZoTz|wGlWr8%L#Y7orMvKOTtqF_^ Date: Wed, 23 Sep 2015 12:23:51 -0700 Subject: [PATCH 45/75] working movie controller tests --- db/test.db | Bin 73728 -> 73728 bytes test/controllers/movies.js | 16 ++++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/db/test.db b/db/test.db index 79e7375de10424cec092bb7f01203437439b8316..1926184ce8c0d89b475a9a4f5efd0818970de72c 100644 GIT binary patch delta 569 zcmY+>%SyvQ7zN--C#5x}YLybiR1-l_p*9yU4dSh>wunVR(2WaY8I0H_kfsQ3D!6c~ z_za3W5f?7p2tI*JSK^y^;sxuF4-yXl&lz(1%%48<7XyhRA*2jZC|-`ua>e_-8!9@4 ze$W?sP0y+G(93VrRyrCZlB9B6$!?yojb_zR4NafUXgZ!QLFQv56~>$PaU;)czb#D& zGR1HTX`zO=UR#Y5U)g6>ug)4u;Q1~-f@8+cvdPD6l6&p?1mW3ku>b%7 delta 440 zcmZoTz|wGlWr8%X1p@}<^0!jvFBo<{OWVt{t zmtd|3k_;Z3c{pO2C%lhNw-Fje_b05fTT;K29R`a zQ~;7rjS@i8u~7g>Iy7 Date: Wed, 23 Sep 2015 13:36:37 -0700 Subject: [PATCH 46/75] Customer controller tests. --- db/test.db | Bin 73728 -> 73728 bytes routes/customers.js | 2 +- test/controllers/customers.js | 172 ++++++++++++++++++++++++++++++++++ test/models/customers.js | 8 +- 4 files changed, 177 insertions(+), 5 deletions(-) diff --git a/db/test.db b/db/test.db index 20a839309de0cb73948254d12f91432d7b262979..d80e400ba3659f0b1bf3be8a3a788ee379e03eab 100644 GIT binary patch delta 58 zcmZoTz|wGlWr7qFtL8)*Cm^{oVIwzV*k&Of7iJCxR(1wOMNY=)3;7u(nG{&2@i8hk N&*I-ci=Qz~006AN4UPZ+ delta 42 xcmZoTz|wGlWr7qFi_JtCCm^{oVI%iuL4h=8CIyyhe2j|Cv-r2q;%7_~000US3!eZ0 diff --git a/routes/customers.js b/routes/customers.js index 6d3b0bd..f32fb9f 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -12,7 +12,7 @@ router.get('/:column/:n/:p', function(req, res, next) { return customers_exports.customersController.by_column(req, res); }); -/* GET /customers/:id/movies */ +/* GET /customers/:customer_id/movies */ router.get('/:customer_id/movies', function(req, res, next) { return customers_exports.customersController.movies_by_customer_current(req, res); }); diff --git a/test/controllers/customers.js b/test/controllers/customers.js index e69de29..fe67f62 100644 --- a/test/controllers/customers.js +++ b/test/controllers/customers.js @@ -0,0 +1,172 @@ +var assert = require('assert'), + sqlite3 = require('sqlite3').verbose(), + request = require('supertest'), + app = require('../../app'), + customers_controller = require('../../controllers/customers'), + agent = request.agent(app); + KEYS = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; + +describe.only("Endpoints under /customers", function() { + var db_cleaner; + + beforeEach(function(done) { + 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('Beetle Juice', '2015-01-01', '123 street', 'Burlington', 'WA', '98101', '3604216650', 5.25), \ + ('Juicy Beetle', '2014-01-01', '123 street', 'Burlington', 'WA', '98211', '3604216650', 5.55), \ + ('Aaron Aaronson', '2015-02-01', '123 street', 'Burlington', 'WA', '98195', '3604216650', 5.55); \ + DELETE FROM movies; \ + INSERT INTO movies(title, overview, release_date, inventory) \ + VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ + ('Maws', 'Worm!', 'Yesterday', 11); \ + DELETE FROM rentals; \ + INSERT INTO rentals(checkout_date, return_date, movie_id, customer_id, checked_out) \ + VALUES('2015-02-14', '2015-02-21', '1', '1', 'false'), \ + ('2015-09-22', '2015-09-29', '1', '2', 'true'), \ + ('2015-09-22', '2015-09-29', '2', '2', 'true'), \ + ('2015-07-22', '2015-09-01', '2', '1', 'true'); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + + describe("customer instance methods", function() { + context("GET /customers", function() { + var customer_request; + + beforeEach(function(done) { + customer_request = agent.get('/customers').set('Accept', 'application/json'); + done(); + }); + + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('knows about the route', function(done) { + customer_request + .expect(200, function(err,res) { + assert.equal(err, undefined); + done(); + }); + }); + + it("returns an array of customer objects", function(done) { + customer_request + .expect(200, function(error, result) { + assert(result.body instanceof Array); + assert.equal(result.body.length, 3); + assert.equal(result.body[0].name, 'Beetle Juice'); + assert.equal(result.body[1].name, 'Juicy Beetle'); + assert.deepEqual(Object.keys(result.body[0]), KEYS); + done(); + }); + }); + }); + + context("GET /customers/:column/:n/:p", function() { + var customer_request; + + beforeEach(function(done) { + customer_request = agent.get('/customers/name/2/1').set('Accept', 'application/json'); + done(); + }); + + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('knows about the route', function(done) { + customer_request + .expect(200, function(err,res) { + assert.equal(err, undefined); + done(); + }); + }); + + it("returns an array of customer objects", function(done) { + customer_request + .expect(200, function(error, result) { + assert(result.body instanceof Array); + assert.equal(result.body[0].name, 'Beetle Juice'); + assert.equal(result.body[1].name, 'Juicy Beetle'); + assert.deepEqual(Object.keys(result.body[0]), KEYS); + done(); + }); + }); + + it("returns specified number of customers", function(done) { + customer_request + .expect(200, function(error, result) { + assert.equal(result.body.length, 2); + done(); + }); + }); + + it("returns customers with specified offset", function(done) { + customer_request + .expect(200, function(error, result) { + assert.notEqual(result.body[0].name, "Aaron Aaronson"); + done(); + }); + }); + }); + + context("GET /customers/:customer_id/movies", function() { + var customer_request; + var movie_keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'num_available']; + + beforeEach(function(done) { + customer_request = agent.get('/customers/2/movies').set('Accept', 'application/json'); + done(); + }); + + it("responds with json", function(done) { + customer_request + .expect('Content-Type', /application\/json/) + .expect(200, done); + }); + + it('knows about the route', function(done) { + customer_request + .expect(200, function(err,res) { + assert.equal(err, undefined); + done(); + }); + }); + + it('returns an array of movie objects', function(done) { + customer_request + .expect(200, function(error, result) { + assert(result.body instanceof Array); + assert.equal(result.body.length, 2); + assert.deepEqual(Object.keys(result.body[0]), movie_keys); + done(); + }); + }); + + it('contains movies the customer currently has checked out', function(done) { + customer_request + .expect(200, function(error, result) { + assert.equal(result.body[0].title, 'Jaws'); + assert.equal(result.body[1].title, 'Maws'); + done(); + }); + }); + + }); + + }); +}); diff --git a/test/models/customers.js b/test/models/customers.js index 81073c5..0bd8994 100644 --- a/test/models/customers.js +++ b/test/models/customers.js @@ -2,7 +2,7 @@ var assert = require('assert'), Customer = require('../../models/customer'), sqlite3 = require('sqlite3').verbose(); -describe.only("Customer", function() { +describe("Customer", function() { var customer, db_cleaner; beforeEach(function(done) { @@ -18,9 +18,9 @@ describe.only("Customer", function() { ('Juicy Beetle', '2014-01-01', '123 street', 'Burlington', 'WA', '98211', '3604216650', 5.55), \ ('Aaron Aaronson', '2015-02-01', '123 street', 'Burlington', 'WA', '98195', '3604216650', 5.55); \ DELETE FROM movies; \ - INSERT INTO movies(title, overview, release_date, inventory) \ - VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ - ('Maws', 'Worm!', 'Yesterday', 11); \ + INSERT INTO movies(title, overview, release_date, inventory, num_available) \ + VALUES('Jaws', 'Shark!', 'Yesterday', 10, 8), \ + ('Maws', 'Worm!', 'Yesterday', 11, 8); \ DELETE FROM rentals; \ INSERT INTO rentals(checkout_date, return_date, movie_id, customer_id, checked_out) \ VALUES('2015-02-14', '2015-02-21', '1', '1', 'false'), \ From 2b2f2f10cc3b319e98750528dfe876977e12e00f Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Wed, 23 Sep 2015 13:49:42 -0700 Subject: [PATCH 47/75] formatted controller tests --- db/test.db | Bin 73728 -> 73728 bytes test/controllers/movies.js | 99 ++++++++++++++++++------------------- 2 files changed, 49 insertions(+), 50 deletions(-) diff --git a/db/test.db b/db/test.db index 1926184ce8c0d89b475a9a4f5efd0818970de72c..12891878506b8765d2228be92ceb5a88a51a4ce4 100644 GIT binary patch delta 22 dcmZoTz|wGlWr8$g+C&*=# Date: Wed, 23 Sep 2015 13:58:51 -0700 Subject: [PATCH 48/75] Completed controllers tests for all customer endpoints. --- db/test.db | Bin 73728 -> 73728 bytes routes/customers.js | 2 +- test/controllers/customers.js | 89 +++++++++++++++++++++++++++++++++- 3 files changed, 89 insertions(+), 2 deletions(-) diff --git a/db/test.db b/db/test.db index d80e400ba3659f0b1bf3be8a3a788ee379e03eab..a8b3b0f05c84a99001c95eafe32b19494ef14369 100644 GIT binary patch delta 22 ecmZoTz|wGlWr8&0+leyHjBgtgwk9wxkOu%~R|vKM delta 22 dcmZoTz|wGlWr8%L=0q81M$N{AtqF_^ Date: Wed, 23 Sep 2015 14:28:19 -0700 Subject: [PATCH 49/75] Merging master onto branch. --- db/test.db | Bin 0 -> 73728 bytes test/controllers/movies.js | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/db/test.db b/db/test.db index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..37cbd72bef8c7f1512db122b8d12634ecccb6b00 100644 GIT binary patch literal 73728 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%0A#qq6k);|~A3nM&Uy1K=lSPtE+7 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 Ird(?IKbt7M$^ZZW literal 0 HcmV?d00001 diff --git a/test/controllers/movies.js b/test/controllers/movies.js index dbc9646..4ceaa6c 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -94,7 +94,7 @@ describe("Endpoints under /movies", function() { }); context("GET /movies/:title ", function() { - it.only("can find Jaws", function(done) { + it("can find Jaws", function(done) { movie_keys; var movie_request = agent.get('/movies/Jaws').set('Accept', 'application/json'); movie_request @@ -109,7 +109,7 @@ describe("Endpoints under /movies", function() { }); context("GET /movies/:title/history ", function() { - it.only("can see Jaws customer history", function(done) { + it("can see Jaws customer history", function(done) { customer_keys; var movie_request = agent.get('/movies/Maws/history').set('Accept', 'application/json'); movie_request From 6e3559831b47440923b072bc43c8f28c4cf291c0 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Wed, 23 Sep 2015 14:35:51 -0700 Subject: [PATCH 50/75] wip movie model tests and minor changes to controller tests --- db/test.db | Bin 73728 -> 73728 bytes test/controllers/movies.js | 4 +- test/models/movies.js | 230 ++++++++++++++++++++++--------------- 3 files changed, 142 insertions(+), 92 deletions(-) diff --git a/db/test.db b/db/test.db index 12891878506b8765d2228be92ceb5a88a51a4ce4..b36394694c22e8e870691bfb1b7d59a75e50947d 100644 GIT binary patch delta 22 ecmZoTz|wGlWr8&0(up$8j7u96wk9wxkOu%^ZwMv; delta 22 dcmZoTz|wGlWr8$g+C&*=# Date: Wed, 23 Sep 2015 14:53:25 -0700 Subject: [PATCH 51/75] movie model tests --- test/models/movies.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/models/movies.js b/test/models/movies.js index c61332b..d2ae2d1 100644 --- a/test/models/movies.js +++ b/test/models/movies.js @@ -25,11 +25,14 @@ describe("Movie", function() { VALUES('BeetleJaws', '2015-01-01', '123 street', 'Burlington', \ 'WA', '98233', '(908) 949-6758', 5.25), \ ('JuiceMaws', '2010-10-10', '123 Lane', 'Mt. Vernon', \ + 'WA', '11111', '(908) 949-6758', 10.00), \ + ('SecondMaws', '2010-10-10', '123 Lane', 'Mt. Vernon', \ 'WA', '11111', '(908) 949-6758', 10.00); \ DELETE FROM rentals; \ INSERT INTO rentals(checkout_date, return_date, movie_id, customer_id, checked_out) \ VALUES('2015-09-23', '2015-09-30', 1, 1, 'true'), \ - ('2015-09-16', '2015-09-23', 2, 2, 'false'); \ + ('2015-09-16', '2015-09-01', 2, 2, 'false'); \ + ('2015-09-14', '2015-09-05', 2, 3, 'false'); \ COMMIT;" , function(err) { db_cleaner.close(); @@ -43,7 +46,7 @@ describe("Movie", function() { assert(movie instanceof Movie); }); - describe.only("instance methods", function() { + describe("instance methods", function() { context("GET #find_all", function() { it("retrieves all movie records", function(done) { movie.find_all(function(err, res) { @@ -118,8 +121,8 @@ describe("Movie", function() { }); context("GET customers_by_movie_history_sorted", function() { - it("gets customers that have checked out a copy of the film in the past", function(done) { - movie.customers_by_movie_history("Maws", function(err, res) { + it.only("gets customers that have checked out a copy of the film in the past", function(done) { + movie.customers_by_movie_history_sorted("Maws", "rentals", "checkout_date", function(err, res) { assert.equal(err, undefined); assert(res instanceof Array); assert.equal(res.length, 1); @@ -129,7 +132,6 @@ describe("Movie", function() { }); }); - // it("can save changes to a movie", function(done) { // movie.find_by("title", "Jaws", function(err, res) { // var original_title = res[0].title; From c79a0c697d895d0030603fb33f08ed98689beccb Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Wed, 23 Sep 2015 15:47:16 -0700 Subject: [PATCH 52/75] done with movie tests --- db/test.db | Bin 73728 -> 73728 bytes test/models/movies.js | 106 +++++++++++++----------------------------- 2 files changed, 33 insertions(+), 73 deletions(-) diff --git a/db/test.db b/db/test.db index b36394694c22e8e870691bfb1b7d59a75e50947d..976045f0c5ea0b7b38588e6ff436defd3e398c7a 100644 GIT binary patch delta 133 zcmZoTz|wGlWr7qFGvh=VCm^{oVF^1IGqVB%^LpkCW`)gs974=OZp>T^ii)y|g5sKt z!Kumlc`1`Cxy>eLaL)lMozB2~pLsX)^v!%coy;mq%T;Ahkj007Dw9;*NV delta 96 zcmZoTz|wGlWr7qF)6$7DPC#;F!V-2aCguzV=Jm`O%)dADaR@O_R#5hsoWVT@D88G4 z`9AY*=2@HhcsiN6i%L@!nAsT=6&X1vH}H!y6_rlj%`eSlWZZm%fBOx7MhyV~IlUUs diff --git a/test/models/movies.js b/test/models/movies.js index d2ae2d1..1f9ec12 100644 --- a/test/models/movies.js +++ b/test/models/movies.js @@ -31,7 +31,7 @@ describe("Movie", function() { DELETE FROM rentals; \ INSERT INTO rentals(checkout_date, return_date, movie_id, customer_id, checked_out) \ VALUES('2015-09-23', '2015-09-30', 1, 1, 'true'), \ - ('2015-09-16', '2015-09-01', 2, 2, 'false'); \ + ('2015-09-16', '2015-09-01', 2, 2, 'false'), \ ('2015-09-14', '2015-09-05', 2, 3, 'false'); \ COMMIT;" , function(err) { @@ -68,7 +68,6 @@ describe("Movie", function() { done(); }); }); - }); it("retrieves records sorted by title column", function(done) { movie.by_column("title", 2, 0, function(err, res) { @@ -77,7 +76,7 @@ describe("Movie", function() { assert.equal(res[1].title, 'Gauze'); done(); }); - }); + }); it("retrieves records sorted by release date", function(done) { movie.by_column("release_date", 2, 0, function(err, res) { @@ -95,84 +94,45 @@ describe("Movie", function() { done(); }); }); + }); - context("GET #customers_by_movie_current", function() { - it("gets customers that have currently checked out a copy of the film", function(done) { - movie.customers_by_movie_current("Jaws", function(err, res) { - assert.equal(err, undefined); - assert(res instanceof Array); - assert.equal(res.length, 1); - assert.equal(res[0].name, 'BeetleJaws'); - done(); - }); + context("GET #customers_by_movie_current", function() { + it("gets customers that have currently checked out a copy of the film", function(done) { + movie.customers_by_movie_current("Jaws", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(res[0].name, 'BeetleJaws'); + done(); }); }); + }); - context("GET customers_by_movie_history", function() { - it("gets customers that have checked out a copy of the film in the past", function(done) { - movie.customers_by_movie_history("Maws", function(err, res) { - assert.equal(err, undefined); - assert(res instanceof Array); - assert.equal(res.length, 1); - assert.equal(res[0].name, 'JuiceMaws'); - done(); - }); + context("GET customers_by_movie_history", function() { + it("gets customers that have checked out a copy of the film in the past", function(done) { + movie.customers_by_movie_history("Maws", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 2); + console.log(res); + assert.equal(res[0].name, 'JuiceMaws'); + assert.equal(res[1].name, 'SecondMaws'); + done(); }); }); + }); - context("GET customers_by_movie_history_sorted", function() { - it.only("gets customers that have checked out a copy of the film in the past", function(done) { - movie.customers_by_movie_history_sorted("Maws", "rentals", "checkout_date", function(err, res) { - assert.equal(err, undefined); - assert(res instanceof Array); - assert.equal(res.length, 1); - assert.equal(res[0].name, 'JuiceMaws'); - done(); - }); + context("GET customers_by_movie_history_sorted", function() { + it("gets customers that have checked out a copy of the film in the past", function(done) { + movie.customers_by_movie_history_sorted("Maws", "rentals", "checkout_date", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 2); + assert.equal(res[0].name, 'SecondMaws'); + assert.equal(res[1].name, 'JuiceMaws'); + done(); }); }); - - // it("can save changes to a movie", function(done) { - // movie.find_by("title", "Jaws", function(err, res) { - // var original_title = res[0].title; - // var id = res[0].id; - // movie.save({title: "Jaws 2: Jawsier", id: id}, function(err, res) { - // assert.equal(err, undefined); - // assert.equal(res.inserted_id, 0); //it didn't insert any records - // assert.equal(res.changed, 1); //it updated one record - // done(); - // }); - // }); - // }); - // - // context("POST", function() { - // it ("can make a post", function(done) { - // agent.post('/movies').set('Accept', 'application/json') - // .field('title', 'RoboJaws') - // .field('release_date', 'Tomorrow') - // .expect(); - // done(); - // }); - // }); - -// it("can save a new movie to the database", function(done) { -// var data = { -// title: "RoboJaws", -// overview: "Jaws is hunted by RoboJaws", -// release_date: "Tomorrow", -// inventory: 10 -// } -// // insert into mocha tests -// movie.create(data, function(err, res) { -// assert.equal(res.inserted_id, 6); //it inserted a new record -// assert.equal(res.changed, 1); //one record was changed -// -// movie.find_by("title", "RoboJaws", function(err, res) { -// assert.equal(res.length, 1); -// assert.equal(res[0].title, 'RoboJaws'); //we found our new movie -// done(); -// }); -// }); -// }); + }); }); }); From 3be07462afb7f2a433cc03932194a7512b3d854f Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Wed, 23 Sep 2015 16:07:52 -0700 Subject: [PATCH 53/75] WIP check in movie --- controllers/rentals.js | 10 ++++++++++ db/development.db | Bin 75776 -> 75776 bytes db/test.db | Bin 73728 -> 73728 bytes models/rental.js | 19 ++++++++++++++++++- routes/rentals.js | 3 +++ 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 6d1e097..ae4e254 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -10,6 +10,16 @@ var rentalsController = { db.check_out(customer_id, movie_title, function(err, result) { return response.status(200).json(result); }); + }, + + update: function(request, response, next) { + var customer_id = request.body.id, + movie_title = request.body.title, + db = new Rental(); + + db.check_in(customer_id, movie_title, function(err, result) { + return response.status(200).json(result); + }); } }; diff --git a/db/development.db b/db/development.db index a9fca871e645184bd750654597d8e874c157312b..00b24dec3d8953f97bcfafa145e6241c96e72ba2 100644 GIT binary patch delta 1169 zcmaKrOGs2v7{~9q=XhtF86C&xjE;KM@%_3p<6|6O<9mFC=17u4LJAT=E+Skc!lL3m4iAriBX^EnKuPh-eYiqD7F4pn@pT{$J3x#qY=5?|kRG_nhyWwL`IX zDAw~cJ(H3ojery&OA`Baw=N)iCU@r>7#lP1FdJhd#)kZmjT&M8nl+maQO@I?7m*&k z0M*Pvl{1iM8Y-QFGS5P3XP~NasA&}PMWMn$$lnij^gtP1P*Dez9fsONkgEkMYl2$+ zP@M+#Hb81E6sd-aE9sq@56UfttR;}M5Gu%rvOG|U8*0mi!dXyX29%!;1su>wDm1J> z^#W2jo!-skuvBY0tk-zFT#w+PU#D-f>GTy|y$W{dDx9NJ{dAqmHt1HkLWiW56)1HX z3N1nId8m2@>Yjk2QK&Hj*{N(7Rqd&Q@>FPmN)A#*i#3f-W0!{|{(>`ZuoeslL+a3YtX^x?G_`7? zKUV!OEvWrBO*S8=Ut;kgd;vk%UJj^hHsA$xhdF>QlzLMEsBd(w&45nV34(x5RRbyk zb%r`dUCab&fX?3ysO8jBIypKYm*}!+Ht0r*KqJTo?Z5@ffE~1gI?xMLKtmM)#ei;@ zhJdEc3Y?$-r z(UA4l6mHH9i+#n27g$)#xLL585Qicm)C)^ZQWsy{@j0-bW{mm2N z71H{_3vdrS01Ltt?`hXDcFmk}Gv)IsQZHlajo1=`;m1DsiM#_DIZsZo{2WhXOqeN; znAlRh%$ig(7`-w=!49ghgiW`QwnLG5iabT+li2)Q@+*EX1D`b^j*zuYr9V>X8;C|h z6QUC~&TNKr>W3*bDs!94yu;!i7DE)7qsR)L?o)xf6P^@4cFdoB7l>V_*bWu-V$V7* H$bq##kVM1! delta 1366 zcma)*O-K}B9LDFJ_uX|@cU@gwUENhjUB7bG*$=g&jJiQ`o`4Lx&C>3_NrQ>JS*{p+iwbXwP3l2*Nu2e#|@b?EjsaeP(`B z%x{Vtxpt>flB8Z>0J0>p?VDb|>@=>7RWsJ3UuVgTMH7qiT^37(_#5WcEuw_S>(3yb zavCZgh0=$irXeVE0IE3!<)4Jo`k?0HP%H-dx}m%XxNWRXd^7EXa`oS<)bPDwJ%2B4((B z9=%dPMov%fK4;Q9`Dh@SoCUiPu&{bMTb@n`!xm5)o6aFMq@*o3GUJ$sc{x6 zoPshYpzJZoH4NGMArrlW_Ar!1V^x}3Ktsa{)Jh{2nwVs=(j!^fg2dnRb-u`F`4IPU zo4g~xk{`-3w!;?mLdztJk64qWkrBomgEQmG!1$En_bYzYSF8Aap_wu`a$euChnYSnI^|Vo5|^VZ z3A1aCZ6&U_=9YzC*+cLxEJjZSPrF2r{{p6f7nf)0ax;b9I5Po0 r2J6@`jW(P{WSAn)DKd#w&>+^#9`=o|-V#`P4mZ8VOlw99`@w$!>8J3B diff --git a/db/test.db b/db/test.db index 37cbd72bef8c7f1512db122b8d12634ecccb6b00..68215bd1ea4fe37438537796ae0631fabe033153 100644 GIT binary patch delta 22 ecmZoTz|wGlWr8&0(up$8j7u96wk9wxkOu%^ZwMv; delta 22 dcmZoTz|wGlWr8$g*+dy<#b diff --git a/models/rental.js b/models/rental.js index ad5fddf..37fef4a 100644 --- a/models/rental.js +++ b/models/rental.js @@ -29,8 +29,25 @@ Rental.prototype = { db.close(); }); + }, - } + check_in: function(customer_id, movie_title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var return_date = new Date(Date.now()); + + var update_statement = "UPDATE " + this.table_name + " SET return_date = " + return_date + " checked_out = 'false' ) WHERE movie_id = (SELECT id FROM movies WHERE title = '" + movie_title + "')"; + + var availability_statement = "UPDATE movies SET num_available = (num_available + 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; + + db.serialize(function(err) { + db.run(update_statement, function(err) { + callback(err, { updated_id: this.lastID, changed: this.changes }); + }); + db.run(availability_statement); + + db.close(); + }); + }, }; module.exports = Rental; diff --git a/routes/rentals.js b/routes/rentals.js index d050eca..d5a1dc4 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -3,5 +3,8 @@ var router = express.Router(); var rentals_exports = require('../controllers/rentals'); router.post('/checkout', rentals_exports.create); +router.patch('/checkin', rentals_exports.update); +router.put('/checkin', rentals_exports.update); + module.exports = router; From bdabfe4a24004f3a161bfe62ad3c4ea463493576 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Wed, 23 Sep 2015 17:27:25 -0700 Subject: [PATCH 54/75] check in working for now.. --- db/development.db | Bin 75776 -> 75776 bytes models/rental.js | 5 ++--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/db/development.db b/db/development.db index 00b24dec3d8953f97bcfafa145e6241c96e72ba2..7b32be78ceebd7a642e06e893eda55d905894093 100644 GIT binary patch delta 879 zcmZp;z|wGmWr8$sBLf427Z8KNL=AJs#*GOJxHVXTd`9NqAW>H4-^>-vq0ENN{7kQz zPB1NH@??C&*w1LhaE+mAvLa8AVw3_T<~d zC&cFgPyiqVXm;-DDTHL%n*GA7nT5dVM^ bi!=@o4VTms$jAZ=Hl@k)_>-2&F!BHZ8XLpi delta 162 zcmZp;z|wGmWr8$sAOiz~7Z9@oG1Ej1bH>1p2@AO8c!6AQCQkI>EG*$#b*d1#KqwC~kI!=xBz?jXc7ellf*a3L2CYm8JqUf&e2ByKm+ZuwtI< zCccxAW0S~!rpfz-+Mzs&R%Uj`kgA97>qIv9NH?8k Date: Wed, 23 Sep 2015 17:33:11 -0700 Subject: [PATCH 55/75] dev db adding forgot --- db/development.db | Bin 75776 -> 75776 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/db/development.db b/db/development.db index 7b32be78ceebd7a642e06e893eda55d905894093..1f46db2842dcaae4b718d653c7740b59137b3878 100644 GIT binary patch delta 493 zcmZp;z|wGmWr8$g^F$eE#^#L)tGOB7H}mj(V%B2i;bo|0;9;<1V6bCc&pekgpE-ir zgjtB`9n)#16-+*i?-@-QZUU9mPIMGww`F8!P>klB?kK@1FKcXQWo)A0?i-?OU~XWb zpb_8_qM4SMQ=H0N&G2b*9nZUZI~K5VMsXtpLsMM?OI;)5@YEEA;M4*IBVz@Spn{>f z6*hC2zy{edq3bswML%yKi2}3k6n8G=u1z?(*A(|v{YMN}wyL+;ma2&|}F+k0dlV1o6 TPu|ZfIQglt{B{-@#y{KuwkLM; delta 184 zcmZp;z|wGmWr8$g<3t%}#>R~atGO9jH}mj(Vit23;ALQ7U}AP-U|s?w7#Q4vSbMvO z1S1(u__lQG)CYlN$vjr@xS96rQ}F zS8)1MX-4_YEF!;|8M&Jz_;{ITF$geNF)-g}-os!unU6 Date: Wed, 23 Sep 2015 17:34:37 -0700 Subject: [PATCH 56/75] added back updated_id to check_in --- models/rental.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/rental.js b/models/rental.js index 9d9cc0a..995fa7c 100644 --- a/models/rental.js +++ b/models/rental.js @@ -40,7 +40,7 @@ Rental.prototype = { var availability_statement = "UPDATE movies SET num_available = (num_available + 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; db.serialize(function(err) { db.run(update_statement, function(err) { - callback(err, { changed: this.changes }); + callback(err, { updated_id: this.lastID, changed: this.changes }); }); db.run(availability_statement); From 8ce74528fb3c9db52799782f8d8baf3859f37ad4 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Wed, 23 Sep 2015 18:38:06 -0700 Subject: [PATCH 57/75] rental model tests, #check_out. --- db/test.db | Bin 0 -> 73728 bytes test/customers.js | 45 --------------------------- test/models/movies.js | 1 - test/models/rentals.js | 68 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 46 deletions(-) delete mode 100644 test/customers.js create mode 100644 test/models/rentals.js diff --git a/db/test.db b/db/test.db index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cf9b951af4fc8de542f308a0d7fdc489048f3490 100644 GIT binary patch literal 73728 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 GwfrCVFUBVT literal 0 HcmV?d00001 diff --git a/test/customers.js b/test/customers.js deleted file mode 100644 index d02d1bf..0000000 --- a/test/customers.js +++ /dev/null @@ -1,45 +0,0 @@ -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('Beetlejuice', '10/10/2010', 'Yesterday', '123 street', 'Burlington', 'WA', 98233, 3604216650, 5.25), \ - ('Juice', '10/10/2010', 'Yesterday', '123 street', 'Burlington', 'WA', 98233, 3604216650, 5.55); \ - COMMIT;" - , function(err) { - db_cleaner.close(); - done(); - } - ); - }); - }); - - // it("can be instantiated", function() { - // assert(customer instanceof Customer); - // }); - // - // describe("instance methods", function() { - // context("GET #find_all", function() { - // it("retrieves all customer records", 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, 'Beetlejuice'); - // done(); - // }); - // }); - // }); - // }); -}); diff --git a/test/models/movies.js b/test/models/movies.js index 1f9ec12..127eba5 100644 --- a/test/models/movies.js +++ b/test/models/movies.js @@ -114,7 +114,6 @@ describe("Movie", function() { assert.equal(err, undefined); assert(res instanceof Array); assert.equal(res.length, 2); - console.log(res); assert.equal(res[0].name, 'JuiceMaws'); assert.equal(res[1].name, 'SecondMaws'); done(); diff --git a/test/models/rentals.js b/test/models/rentals.js new file mode 100644 index 0000000..09d7b7b --- /dev/null +++ b/test/models/rentals.js @@ -0,0 +1,68 @@ +var assert = require('assert'), + Rental = require('../../models/rental'), + app = require('../../app'), + 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; \ + INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ + VALUES('Beetle Juice', '2015-01-01', '123 street', 'Burlington', 'WA', '98101', '3604216650', 5.25), \ + ('Juicy Beetle', '2014-01-01', '123 street', 'Burlington', 'WA', '98211', '3604216650', 5.55), \ + ('Aaron Aaronson', '2015-02-01', '123 street', 'Burlington', 'WA', '98195', '3604216650', 5.55); \ + DELETE FROM movies; \ + INSERT INTO movies(title, overview, release_date, inventory, num_available) \ + VALUES('Jaws', 'Shark!', 'Yesterday', 10, 8), \ + ('Maws', 'Worm!', 'Yesterday', 11, 8); \ + DELETE FROM rentals; \ + INSERT INTO rentals(checkout_date, return_date, movie_id, customer_id, checked_out) \ + VALUES('2015-02-14', '2015-02-21', '1', '1', 'false'), \ + ('2015-09-22', '2015-09-29', '1', '2', 'true'), \ + ('2015-09-22', '2015-09-29', '2', '2', 'true'), \ + ('2015-09-14', '2015-09-20', '1', '1', 'true'), \ + ('2015-07-22', '2015-09-01', '1', '2', 'true'); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + + it("can be instantiated", function() { + assert(rental instanceof Rental); + }); + + describe("instance methods", function() { + context("GET #check_out", function() { + + it("is successful", function(done) { + rental.check_out(1, "Jaws", function(err, res) { + assert.equal(err, undefined); + done(); + }); + }); + + it("returns a json object with expected keys", function(done) { + rental.check_out(1, "Jaws", function(err, res) { + // assert(res instanceof Array); // returns a json response... + assert.equal(res.inserted_id, 6); + assert.equal(res.changed, 1); + done(); + }); + }); + }); + + + + }); +}); From c288b81d1af771208e3be30448763d07f8fd1ebf Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Thu, 24 Sep 2015 10:17:01 -0700 Subject: [PATCH 58/75] finished model tests for rentals. --- db/development.db | Bin 75776 -> 75776 bytes db/test.db | Bin 73728 -> 73728 bytes models/rental.js | 8 ++++---- routes/rentals.js | 1 - test/models/rentals.js | 43 ++++++++++++++++++++++++++++++++++++----- 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/db/development.db b/db/development.db index 1f46db2842dcaae4b718d653c7740b59137b3878..a9a4eca8b2bb5501a01fd2a14f048a479e89950b 100644 GIT binary patch delta 1764 zcma)+Uuau(6vyxH{(ebr(xl0frhk%jz3KXQYrC74F{kj-B3*@J@a52RBVO1lTc$bl#M|HO;AT8)K?Eh zBalA?C2Ap`A3ETLM(CA$1?1u`xRIA&>7?UV7I{gx3b=?_RMRnwsxYlCIA^JF(xUtk zi_*p|1rAz}q%1-8b5P4HbaWazGyx5cL0$A6G!>vUr5&QIc}nV4p;}7WP8mH)fJzBT zIf-B97x^-OfM<9_{#pJ?eosCp*RT)Rz0xnZy@qZ7{+SATq{&If8pdZA)H5@4s&1&d zmP)HB&D65^s3W7}y;?@o)UL7N@$PEda;8=q*tIXrA9?8f<1>??o9Uy~;akL;PXOEH$r@2*eFndywF8F$F=*S57( zoJH-c0dJ{VBIC|4N{Om$lVy6*sha;dBt+?ksp+?>Y_57r*k>Sn|Jn<2R$s{bJW`U* zoDRBI%k`%8YE|oIy8l+GE;rqiAy5bQ0%{l)bb|e$9~=g0K;ww!(s9rL zh5!ww8gLL4K_1ZPp%$gqrTIaFssqq)qRA4a@@TpwfDcgOc0hw`WC!7>(MMg(uwV8q z$i)rY8((I5``P$Y>*8y%E+&K{K9fa5Sdte}_zgr!*0~NvYI(Xd>1FnXC$2D;6Iohf z&f=4+Y}2i<8+=_{6`LZ&WZ}49q085i=@~Ex3^0tW-}^Z8*ufuuT^A~rmO&PLf=GWQ z@?(m87)#G%w??_XEpx~9c^S)NSf0o7G!u?%uFN+@9s7ejY=vX-9$9R<6O}p=xcreW z+t}~?qqhaZJ_J|5MX(LN1goF`wm=ssf>#kbOHb{gI?iL|E$|ywpQDFfFMAyEldL%I fDZ1Z=d*7gR!RY4uW&Vy(8P>){r9^Zz7G(zUnk$_)H} zNlu>gX&_dL(kO)+&-OqU1B&PbAU09t&pe`gwXx$Mm4k!HpY#m})E#tztT$?vj* zw#mO?;kZ|9<5uUBus0qD8is+oA)xFSP(1(yjskg)0QHA~&_ST4AK1JX(E5OmUclc4 zZ0P_BO<-pmP!IvOhJaQLXjFk+&4984=-Ccb)zN>dH9&DS;0^-5%|Jytu&E3PmICd? zfVm0S?FY*90o@B6@BsT=K$8GmJPR!47AWnAd)*V<+7|1Q9^ zG4h`uBe%^lH&`13q{t-T83)?NfYK3Q`w-B51nBPvT6%z7a@$2-d+UJ`1=vF__manK zcUB$V7@q^BeSD5j@?%`%KKXa~hWx&~pWR{Sm@a)UyVMULQo=^rx z#}(aBbX5y0TC1t*rq-_PJ3QE=wyLU9f2414d&Dx+G;t@ z&;B6)yP(1oW}dW}Zluf%l^ofh`+Ay?YFXYq>9pjP@LYDWkN7+6X+Fe5JRskdzmhM> zhu9x1Ed2sO)au47nA#fqwXaxEU`Wg;uD3X`R<#mjF0aYSgFNHfvzCWRGkK}MxX!{2KiHi$l zuP$J4UUtV_cWCC{?yJJj$hwiNPsn1{6@uCH9Jkml$;HYg`8WA2dtPo~<(yi9Z4h+> zIZ!1;wYdnQLQOTl7NUND%5@l`s@Vw{5LL?th$c~9Ph7F+4v`G(t& zcYXo2?Lit3YvY|qbg`*f8Ti^w&63AGvn|Im&ClY#{2!f%-JTb8Y#KJucr3e(lK1Fv zAbCqWtz8S7VJ$Puy6+-gvUtb4E`8YzuX=22WL&xk-~>`;{v~~7qVisOTj1s>rJLi@ GJpT_p0gUSa diff --git a/db/test.db b/db/test.db index cf9b951af4fc8de542f308a0d7fdc489048f3490..a5771d823936c518dc118d2c71a2082d4c71bd77 100644 GIT binary patch delta 402 zcmZoTz|wGlWr7qF$G3?xPC#;F!hCi{&P^OYnUzHuz<`%IjDeNu8Uyn^W-;cO%oR-6 zm=u{7Fui6v!L)Rkmv3j zqHADoV4$E8;1Z&VLzyX>vb4mU;#6A}b_PX|*&qXT4J>sHP0+R1L#@HCpAkjB5kkKm zD_DjRYO=YmkrBGdP=n3U9L5B8nH>{UzctKhBpSfHhe2s_6n_#6FqoB^5Abh4z|ZI) F007GFT@3&L delta 274 zcmZoTz|wGlWr7qF>x_vqPC#;F!hCi{j!hgtnUw_@zvN8Q;V7|w^hj}J*1#=kF zZ>9xIubECTE!`~mriH0KlAWC)I+~MHG(0s$Avm=_!N^#_$iUE4!O+6W*v!hvT*2Kp zMAyLFz(7GGz$HWzrp(v?ud))^ RnAjPb5Abh4z|ZI)000f!Le>BP diff --git a/models/rental.js b/models/rental.js index 995fa7c..26d48aa 100644 --- a/models/rental.js +++ b/models/rental.js @@ -17,12 +17,12 @@ Rental.prototype = { var rental_cost = 1.0; var create_statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "'), " + customer_id + ", 'true')"; - var charge_statement = "UPDATE customers SET account_credit = (account_credit - " + rental_cost + ") WHERE ID = " + customer_id + " ;"; + var charge_statement = "UPDATE customers SET account_credit = (account_credit - " + rental_cost + ") WHERE id = " + customer_id + " ;"; var availability_statement = "UPDATE movies SET num_available = (num_available - 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; db.serialize(function(err) { db.run(create_statement, function(err) { - callback(err, { inserted_id: this.lastID, changed: this.changes }); + callback(err, { inserted_rental_id: this.lastID, movie: movie_title, customer_id: customer_id, checked_out_on: checkout_date, due_on: return_date, number_of_records_changed: this.changes }); }); db.run(charge_statement); db.run(availability_statement); @@ -35,12 +35,12 @@ Rental.prototype = { var db = new sqlite3.Database('db/' + db_env + '.db'); var return_date = new Date(Date.now()); - var update_statement = "UPDATE " + this.table_name + " SET return_date = '" + return_date + "', checked_out = 'false' WHERE movie_id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; + var update_statement = "UPDATE " + this.table_name + " SET return_date = '" + return_date + "', checked_out = 'false' WHERE movie_id = (SELECT id FROM movies WHERE title = '" + movie_title + "') AND customer_id = " + customer_id + ";"; var availability_statement = "UPDATE movies SET num_available = (num_available + 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; db.serialize(function(err) { db.run(update_statement, function(err) { - callback(err, { updated_id: this.lastID, changed: this.changes }); + callback(err, { movie: movie_title, customer_id: customer_id, checked_in_on: return_date, number_of_records_changed: this.changes }); }); db.run(availability_statement); diff --git a/routes/rentals.js b/routes/rentals.js index d5a1dc4..cd81490 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -6,5 +6,4 @@ router.post('/checkout', rentals_exports.create); router.patch('/checkin', rentals_exports.update); router.put('/checkin', rentals_exports.update); - module.exports = router; diff --git a/test/models/rentals.js b/test/models/rentals.js index 09d7b7b..c9005c7 100644 --- a/test/models/rentals.js +++ b/test/models/rentals.js @@ -1,6 +1,7 @@ var assert = require('assert'), Rental = require('../../models/rental'), app = require('../../app'), + request = require('supertest'), sqlite3 = require('sqlite3').verbose(); describe("Rental", function() { @@ -52,17 +53,49 @@ describe("Rental", function() { }); }); - it("returns a json object with expected keys", function(done) { - rental.check_out(1, "Jaws", function(err, res) { - // assert(res instanceof Array); // returns a json response... - assert.equal(res.inserted_id, 6); - assert.equal(res.changed, 1); + it("returns an object with the expected keys", function(done) { + var keys = [ "inserted_rental_id", + "movie", + "customer_id", + "checked_out_on", + "due_on", + "number_of_records_changed" ]; + rental.check_out(1, "Jaws", function(err, res) { + assert.deepEqual(Object.keys(res), keys); + assert.equal(res.inserted_rental_id, 6); + assert.equal(res.movie, "Jaws"); + assert.equal(res.customer_id, 1); + assert.equal(res.number_of_records_changed, 1); done(); }); }); }); + context("GET #check_in", function() { + + it("is successful", function(done) { + rental.check_in(1, "Jaws", function(err, res) { + assert.equal(err, undefined); + done(); + }); + }); + + it("returns an object with the expected keys", function(done) { + var keys = [ "movie", + "customer_id", + "checked_in_on", + "number_of_records_changed" ]; + rental.check_in(2, "Jaws", function(err, res) { + assert.deepEqual(Object.keys(res), keys); + assert.equal(res.movie, "Jaws"); + assert.equal(res.customer_id, "2"); + // below is 2 because we have two rentals for same movie and customer. + assert.equal(res.number_of_records_changed, 2); + done(); + }); + }); + }); }); }); From a14cf3070e885cd2f0dfe57855621e092abca17c Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Thu, 24 Sep 2015 12:09:50 -0700 Subject: [PATCH 59/75] working on date formatting so that customers/overdue works correctly. --- db/development | 0 db/development.db | Bin 75776 -> 75776 bytes db/test.db | Bin 73728 -> 73728 bytes models/rental.js | 26 ++++++++++++++++++++++++++ 4 files changed, 26 insertions(+) create mode 100644 db/development diff --git a/db/development b/db/development new file mode 100644 index 0000000..e69de29 diff --git a/db/development.db b/db/development.db index a9a4eca8b2bb5501a01fd2a14f048a479e89950b..22789b29fb3cbf145e552dc57a29f6c666927296 100644 GIT binary patch delta 1194 zcmX|=O=whC6oB7-_h#~DGRfpuC&|RTiTN`oac1%#qnX4+qg9ECLKZ>;?IMdpMKlbh zFnQ=gF{t6WC{k!)lqiVUyn=-W?4k=7U8JpxE(%Sd3&B#{6iSikcY+G@ee>?TbI-l^ zoI6V!W@*FRtgB2+S(bGSiooXMu5@PX#MC$Q-Ac^_H&jHaY5%tUl{)1Q>z~!WAZl84 z{@_Q1@B9!QK8q&i(1A0kXBM^1pr(_k@&xMr05!`(4Tn*B0__?@)dx|<2pSkhorB2j zN7-IfmqslqRMw5cd(qe))Ym3!);6Q|CbU0^#v4#$9dc?>ERO1Tpkx&qDo4X*=ui|L z3!|eU)MZde%jx4fkFC8y)LGQ|h?ixM@MKR>Pj*q`wc~Ej#jT#?@Ao9_py%MYhpat0 zG<6P@ETGAG)G>!jr%}1oV0RX!B<-kV9g(CvTvR0~Gm^2`DXr%#V&Ap&A9`Ki);WDf zr*+JJVL!F+1{Ld9?WSa;*h(gqs>!6%eO;-cu5{-8(_pKoyzwFnftGC0#@53@Z z@4|XgwnTj&o7_G)D=Ikh7AbcG5+F6J0qH|4NRQ+MvSaCpoNFJHfb?`HOoFsqx_tn8 zpaa@Kx>gCLAg#_zFQtLfa;d;BsD=vI4Fk{#E@VL}C%tX~>8kW|6vm(rsBkmmf$#pglr-qYdklPL(S@cy>`d&?h$OlI&2W~lccyQDYE?XgNbR1WG|{~+qJT+ zV5>c+O1y1vE#Zbm?`FeAxkWfqf>HxLXNNDKez&~oPv1?XNhc< dm44gOtH#JiADG9+RWkcD8;q+h9hiHs^c%~f!w>)f delta 1859 zcma)+Piz}S6vlUU#_^xnvAanc*GZdAn?Ft)r|Zo+wzp~Qv`J$MX#)*XL@W_hf>No6 z2$Cp=NY1JpI8?M{5g>$ABqOCl2+?lUB2lRoLV^QGDRAI`L=PM|aDb}4peo^eZirmR z0<8Uh-kEvx?VFvQx3VTy*2Kk#61gu)(s8H;l5qtt_2_cs{?+MT#!fmHn2)hB`+fN` zJ7JsrF4G*p=-`FyX@sjU0zG*kISK509@udTXm}3Ta{>sB0r97S-8rEB7+?$ofgwN{ z1ojR9T_&(U1@!d;hYesj4jj{fkzSzb05I4M)OOJ`54Hojy+C&x5Z(=>B0&Expfe2g z?gSd^0e=W+sRMj|;D8qxr6tD%;NmVY%nP7&-0^!Bc|o_bXhbZ^>8M3nm{t@_TPoOQ zk$=5Kw#}9Y3|fHXSps&>0j;yZk!j%2Brq@zMCl#u$^r?p9U|8ZnR->Ajx0OK(d`LP zDj_K?@n85YzRX|XNnS7iDSsz_ET55U*{AGT=>dk{Mc9+Se9$dTO)=IqF}t9inwe8| zL)Eo-LXB&tmcpfuj!ne0q^7CS@!^T?YGG+pEA&^yDg2d}&b~G?6?$ynSZ!X))RPs{ zDD33vc~y&-XR$3z5%aGu%uLm7nHRPvpEM2af4El(Q{<9+V9WhUb1iKqlBQ;qn-?}; zO?mFs;t;m!?*A8e1MYnlVX|D> z)Qrz9wb3_2A4*J1$Krada(^j5-Aq(Ebe28~`|G+NGK0M2;@xu5`>L2!O@p$qzX*<8 zYq%{tx0NAQI*ItO8T8bqs7mP&o$;d(m5ek*r=QMvGZch85FLCvU9C_SQlTSI50r%V zK|7#BPy@6FqLW9ph{{fZstFYsDnxWb1CRnyy`lQj1?`9Wpu`*;#3bFlO?O$k`-39pFy|{M zg~*?%cYu0-L(eDTrf6r6_>Bf8(EJRVMbI?m_BrMDEqdC~vrOx~gQ>S@YKvGEe#&ME zx{l#-8vY2w+6H%Ak2c&z@jHedcveM-;(8GCGHzT3j4y6rF=6Wd0FMus7I@_^{x@oF BT;Koz diff --git a/db/test.db b/db/test.db index a5771d823936c518dc118d2c71a2082d4c71bd77..6670b36ad5b6b1b797654bd72c36051425354881 100644 GIT binary patch delta 63 zcmZoTz|wGlWr7qFr|Co)Cm^{oVKX=9Z>9xIubECTE!`|w!OApQk?#(Rg_WV@WJZ1) PFr(R#f4d_;<9-1EdC?M| delta 63 zcmZoTz|wGlWr7qF$G3?xPC#;F!e(wxMWzKzubECTE!`|w!OApQk?#(Rsg;rWWJZ1) PFr(R#f4d_;<9-1Ep Date: Thu, 24 Sep 2015 14:03:24 -0700 Subject: [PATCH 60/75] Formatting dates. Extracted function into helpers/date_helper. --- controllers/rentals.js | 3 ++- db/development | 0 db/development.db | Bin 75776 -> 75776 bytes db/development.sqlite3 | 0 helpers/date_helper.js | 15 +++++++++++++++ models/rental.js | 42 ++++++++--------------------------------- 6 files changed, 25 insertions(+), 35 deletions(-) delete mode 100644 db/development delete mode 100644 db/development.sqlite3 create mode 100644 helpers/date_helper.js diff --git a/controllers/rentals.js b/controllers/rentals.js index ae4e254..e16dde6 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -20,7 +20,8 @@ var rentalsController = { db.check_in(customer_id, movie_title, function(err, result) { return response.status(200).json(result); }); - } + }, + }; module.exports = rentalsController; diff --git a/db/development b/db/development deleted file mode 100644 index e69de29..0000000 diff --git a/db/development.db b/db/development.db index 22789b29fb3cbf145e552dc57a29f6c666927296..cfa1ed3fd8c1c3ef24ffc71aad8e3cb8c219ce7d 100644 GIT binary patch delta 1269 zcmaizPe>F|9LML)dv2?)uCAKqpWNNnv~+cM)l#!u%S`PLQA!?+j3_#E2($1ItV10- z1X*^72nx2aphGo<9XfRA5E5k2p+iuIf}jpT1rcI>eo_P>1pE2So0;GI-kW*f9iKJh zvu2_+P%&d!Rv%=5&9Cu%UBa%IxjS61)PQ?VWhu3L^0IwZ^-s3x7iyjBGgUgZ>;UD> z`%vZ(${j>i1E_R23hqL6JJ8zgsBkM<-h<-ZsGRN-ko6v?h zYKWntdX%U|OIM-xYMHYmf?{Em7eYA|Xmu&dUWR%~(5j`Vr2wtTLo0Jpy$_XVqAU;E zVvtA6+n4ARwxX`jdqSsrog^oHj;v{uBdch0YH+I)#34uempRhb?|8A-L007$+ISSz z97dhPC^?AoccO@VgX$zImbL}bb%iwD97HA3(kC64cyp@M7t61nTl$TDq%Z3+J)q;- zZ-2C(+Ba;+-fOq2=XQ}B^4(IYaPAT-6jG`<5sNoRW3ACd)8A3R9NK^6*g?96rKafb zorO_67LCONW_09u*#G}7;haTk_WYUj_f%ouB1Qk!WdFa$y^(uJrDWHIDD;A4brVQn zT0!={4E!MbPzf7h9muDZFf@bYO?F)}Pz92dBm|)j){f&@tHB!3d`4p`W1j~3?j;OR5GE=5ddDEucq|FmEZH%(bl*gxx>v=t|UGu?a6qC_5+oV0; z;Tcz&e(DDq>ZeYdM?BaAU*Rddq)9~0>3fe2XJ_FWT!M>`gippb?M#sIS)PB#l`~KS zhhYqEQgK=)zB#X_j8}1K0*nl%u;l_ tEW@ol_})&NVa~4GX4;ddqXq&9uOV&Cs)`n0VNYPHazU_p@%4joiF2MBrwIT|fRWhKa4jIxSQumF|kqTX!Omx;#wXeJF!d(a7kJX)TUrI&v#jsduC?U^4(?jc zR^}BIJ4u-!v++R)|9M7Ya-ZoxEENUDx zt4z`zQi{aABkj0v9qEMmL~@bjxYU15>7>b)3iqBQLnQygZ+Jr2Ds`w|zBOFEho@%S z_^CCYeOmeAS^Iw+^IY0IO!41qRJ?&TxCuM3O7WpoJWFZE{0h30WyR{7l`vmO9>4;u zKm;yRd|HZsNV{bsyU;`QqeLG_ivjs{NAm0BmdH(6Ch5sj61u=;ixj+)(hkeK_WX~B Pz1zmfP^u`ndZ_;apyH@_ diff --git a/db/development.sqlite3 b/db/development.sqlite3 deleted file mode 100644 index e69de29..0000000 diff --git a/helpers/date_helper.js b/helpers/date_helper.js new file mode 100644 index 0000000..2a74f51 --- /dev/null +++ b/helpers/date_helper.js @@ -0,0 +1,15 @@ +"use strict"; + +function format_date(days_to_add) { + var today = new Date(Date.now() + (days_to_add * 24 * 60 * 60 * 1000)), + today_dd = today.getDate(), + today_mm = today.getMonth() + 1, + today_yyyy = today.getFullYear(), + target_date; + if(today_dd < 10) { today_dd ='0'+ today_dd; } + if(today_mm < 10) { today_mm ='0'+ today_mm; } + target_date = today_yyyy + "-" + today_mm + "-" + today_dd; + return target_date; +} + +module.exports = format_date; diff --git a/models/rental.js b/models/rental.js index d02acfc..ebcbf3f 100644 --- a/models/rental.js +++ b/models/rental.js @@ -2,34 +2,19 @@ var sqlite3 = require('sqlite3').verbose(); var db_env = process.env.DB || 'development'; +var date_format = require('../helpers/date_helper'); function Rental() { this.table_name = "rentals"; } -// Rental.prototype = require('../database'); Rental.prototype = { check_out: function(customer_id, movie_title, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - var rental_duration_days = 7; - - var checkout_date = new Date(Date.now()); - var checkout_date_dd = checkout_date.getDate(); - var checkout_date_mm = checkout_date.getMonth() + 1; - var checkout_date_yyyy = checkout_date.getFullYear(); - if(checkout_date_dd < 10) { checkout_date_dd ='0'+ checkout_date_dd } - if(checkout_date_mm < 10) { checkout_date_mm ='0'+ checkout_date_mm } - checkout_date = checkout_date_yyyy + "-" + checkout_date_mm + "-" + checkout_date_dd; - - var return_date = new Date(Date.now() + (rental_duration_days * 24 * 60 * 60 * 1000)); - var return_date_dd = return_date.getDate(); - var return_date_mm = return_date.getMonth() + 1; - var return_date_yyyy = return_date.getFullYear(); - if(return_date_dd < 10) { return_date_dd ='0'+ return_date_dd } - if(return_date_mm < 10) { return_date_mm ='0'+ return_date_mm } - return_date = return_date_yyyy + "-" + return_date_mm + "-" + return_date_dd; - - var rental_cost = 1.0; + var db = new sqlite3.Database('db/' + db_env + '.db'), + rental_duration_days = 7, + checkout_date = date_format(0), + return_date = date_format(rental_duration_days), + rental_cost = 1.0; var create_statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "'), " + customer_id + ", 'true')"; var charge_statement = "UPDATE customers SET account_credit = (account_credit - " + rental_cost + ") WHERE id = " + customer_id + " ;"; @@ -47,8 +32,8 @@ Rental.prototype = { }, check_in: function(customer_id, movie_title, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - var return_date = new Date(Date.now()); + var db = new sqlite3.Database('db/' + db_env + '.db'), + return_date = date_format(0); var update_statement = "UPDATE " + this.table_name + " SET return_date = '" + return_date + "', checked_out = 'false' WHERE movie_id = (SELECT id FROM movies WHERE title = '" + movie_title + "') AND customer_id = " + customer_id + ";"; @@ -61,17 +46,6 @@ Rental.prototype = { db.close(); }); - }, - - format_date: function(days_to_add, callback) { - var today = new Date(Date.now()); - var today_dd = today.getDate(); - var today_mm = today.getMonth() + 1; - var today_yyyy = today.getFullYear(); - if(today_dd < 10) { today_dd ='0'+ today_dd; } - if(today_mm < 10) { today_mm ='0'+ today_mm; } - today = today_yyyy + "-" + today_mm + "-" + today_dd; - callback(today); } }; From 5189bd9de0ab768c75bd6413454bd9b0972d0d31 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Thu, 24 Sep 2015 14:25:32 -0700 Subject: [PATCH 61/75] account credit cant go below zero --- db/development.db | Bin 75776 -> 78848 bytes models/rental.js | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/db/development.db b/db/development.db index 1f46db2842dcaae4b718d653c7740b59137b3878..43e87c497e4291cfe726a5d08d38942d136dc2c3 100644 GIT binary patch delta 2531 zcma)-&u<$=6vyAp*qilYM|J(Hj#Ii$K@dfz`^&L2h(Oh*5pk0sVF{^T5Re)g1Pvmo zAZ^9g5^yLMQ0>7z0|#!QSfT|ER6QWkawvZRJq9k&16(-3%&b$$?%J*oyY}q&ef;*l z@0+=BJ91$=@<}0j0{|8;sZXLCS6=*lM9z~a)!^Rl`#GqN>eMQ=?W@onNe%w2G#wk3Ms>KKaT^udg>}BO)B# zM|kJ^Jj%FR$<)4ne;^dy-;-?=VfoIvPU`T~Ea88EhUKSIZAOHDmHvn16AAPs$Y29$ zlTmybPlAoEAqqdZdi+RY^;A@WM{1AfletOR{Vw)`TbF-J<08mYH9hyLqyWF?_``+R z^J$ifT&h)yZ$uQ}cM(-mR@}?V8lJ!6#tP>V?S4>rx4oc%3glyw$6L69uA`%H6P93_ zEwWFl#U3Bv-xzOcOdBLv>XGK@jkDdQFS=_5wywYlAfJ(A z_*dM)6>5XfzPc_$#WL)S9M->1!F6Ew5~-n(lSBk4%CeH{Lqa zY-9u-1?b!mCe=-62!2QBlSzcr?X*YF`E%z{25YA;Dnz!zbf*6uB_fPzrv~6PYF38h zO<}5!3Me~b?-jI8ky*I&asj17J$z4(8_AA7h6}+h0^%Q2}^h0&JUHe z$I!Q5kE3%E`t$1f3G`lcJR!`(M&MI2hqv*E_%UIgEPMktGtW~_L+#UE-D1_JWh10Q zyUY_VlOn=92L{4*O?7tfCIM>-I@9fzNl`(6Z~(nZ*`BpKDh%#~=sdc;U(iFQise+f zKYEBvf?Fc@aW8i#FjlyAzc;pfUH-TeLlFebG-3Quu98A%N{Q4StcjwA(mlL z6>5c~UJ2~PAvy_e@~-k(#^er=KggYK@-`x_TD?`xw2mu~0!Z}k{1lPv&n+ifHL)&! zFE7pU=m@^(9V6TLA|sr|j{Q)-lr3tMX<+gKMhTZm@DtD2J~)7GF{cbWJJ>K7T<7a~ q58s&Zb@N^`MVPMp!h*@a!|?%~cQiGM1Ly{|!j2~2&S-?lJovx*qd;~5 delta 693 zcmYk(J!lhQ7zgm@x%ZM>n@e(OQcdov`KYyxU%A9KY0{cD8e1(I6e1#V&_O4`!9m53 zRH`lpG`z!!AUJez5P}})Xhv~Ta1~c|a_^x33n;?<4&LWp{?B{wv;JLO|D-;#d>cfx z)=Mw(#_J240WBdqD9~Q1Yj&@ma9i4x@XzPcmD!5y1RsQ1Yq~=h5T%i@zh8snL{8ph zTfPrz@|=+xj>!3Ga{m8{Ulp6wmiLUaO51P>CR_5EVg21da6TvhB?ME$ai&*Kw)Wd) y+fL7%YP52Sa{1zwYnRaQJW`U*36o=J5Dk>8b_tK{h2w80_?Dm5cek^A-}eV0S#rAo diff --git a/models/rental.js b/models/rental.js index 995fa7c..c4ae54e 100644 --- a/models/rental.js +++ b/models/rental.js @@ -17,7 +17,9 @@ Rental.prototype = { var rental_cost = 1.0; var create_statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "'), " + customer_id + ", 'true')"; - var charge_statement = "UPDATE customers SET account_credit = (account_credit - " + rental_cost + ") WHERE ID = " + customer_id + " ;"; + var get_customer = "select * from customers where id = " + customer_id + ";"; + var charge_statement = "UPDATE customers SET account_credit = (account_credit - " + rental_cost + ") WHERE ID = " + customer_id + " AND account_credit >= 1.0;"; + var zero_statement = "UPDATE customers SET account_credit = 0.0 WHERE id = " + customer_id + " AND account_credit < 1.0;"; var availability_statement = "UPDATE movies SET num_available = (num_available - 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; db.serialize(function(err) { @@ -25,6 +27,7 @@ Rental.prototype = { callback(err, { inserted_id: this.lastID, changed: this.changes }); }); db.run(charge_statement); + db.run(zero_statement); db.run(availability_statement); db.close(); From 60b4edf1b92cdb4ee7159eec7482b190b4d53017 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Thu, 24 Sep 2015 16:14:03 -0700 Subject: [PATCH 62/75] updating rental functions to prevent execution of statements if one fails. --- db/development.db | Bin 0 -> 73728 bytes db/test.db | Bin 73728 -> 73728 bytes models/rental.js | 28 ++++++++++++++++++++++------ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/db/development.db b/db/development.db index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..66adaf6eb89122d99fc5e51978a2d90eaa8b2679 100644 GIT binary patch literal 73728 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 literal 0 HcmV?d00001 diff --git a/db/test.db b/db/test.db index 6670b36ad5b6b1b797654bd72c36051425354881..cf7c38a8e373a1fedf5dc2060cd25f88b0318fd5 100644 GIT binary patch delta 132 zcmZoTz|wGlWr8$g@kAMC#^Q|$^Vu0WHgT}Bh%*Z?FyCV~W}eAh!7RXR%Cvy#HPZ>E zrJDsSSeYg(^1XLZWMyYiRODn7H!?6Z)ip5JH8O&*EOm`cn9>q+ic=MtP?P{Akd!nB M@NW;`XWSqF09-5{2LJ#7 delta 101 zcmV-r0Gj`RzyyH61dtm6HIW=c0X4B;p9cX6vIqqP7XsD*1KtA`1DOMO0@eci0-yrx z0>}cTvk`a&0+S&Q?->GSVQh0{J^}{-AzKLn7cww0H7zhXEiy8bQ4SQ7{SFg@P!G3I H4*{?c&~Y3_ diff --git a/models/rental.js b/models/rental.js index b331e89..5fd439b 100644 --- a/models/rental.js +++ b/models/rental.js @@ -14,7 +14,9 @@ Rental.prototype = { rental_duration_days = 7, checkout_date = date_format(0), return_date = date_format(rental_duration_days), - rental_cost = 1.0; + rental_cost = 1.0, + inserted_rental_id, + number_of_records_changed; var create_statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "'), " + customer_id + ", 'true')"; var get_customer = "select * from customers where id = " + customer_id + ";"; @@ -23,30 +25,44 @@ Rental.prototype = { var availability_statement = "UPDATE movies SET num_available = (num_available - 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; db.serialize(function(err) { + db.exec("BEGIN IMMEDIATE"); db.run(create_statement, function(err) { - callback(err, { inserted_rental_id: this.lastID, movie: movie_title, customer_id: customer_id, checked_out_on: checkout_date, due_on: return_date, number_of_records_changed: this.changes }); + inserted_rental_id = this.lastID; + number_of_records_changed = this.changes; }); db.run(charge_statement); db.run(zero_statement); db.run(availability_statement); + db.exec("COMMIT;", function(error) { + if (callback) { + callback(error, { inserted_rental_id: inserted_rental_id, movie: movie_title, customer_id: customer_id, checked_out_on: checkout_date, due_on: return_date, number_of_records_changed: number_of_records_changed }); + } + }); db.close(); }); }, check_in: function(customer_id, movie_title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'), - return_date = date_format(0); + return_date = date_format(0), + changes; - var update_statement = "UPDATE " + this.table_name + " SET return_date = '" + return_date + "', checked_out = 'false' WHERE movie_id = (SELECT id FROM movies WHERE title = '" + movie_title + "') AND customer_id = " + customer_id + ";"; + var update_statement = "UPDATE " + this.table_name + " SET return_date = '" + return_date + "', checked_out = 'false' WHERE movie_id = (SELECT id FROM movies WHERE title = '" + movie_title + "') AND customer_id = " + customer_id + " AND checked_out = 'true';"; var availability_statement = "UPDATE movies SET num_available = (num_available + 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; + db.serialize(function(err) { + db.exec("BEGIN IMMEDIATE"); db.run(update_statement, function(err) { - callback(err, { movie: movie_title, customer_id: customer_id, checked_in_on: return_date, number_of_records_changed: this.changes }); + changes = this.changes; }); db.run(availability_statement); - + db.exec("COMMIT;", function(error) { + if (callback) { + callback(error, { movie: movie_title, customer_id: customer_id, checked_in_on: return_date, number_of_records_changed: changes }); + } + }); db.close(); }); } From 3f9f36f71ce8c572e91b31ca2f12ea60c6eee6c6 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Thu, 24 Sep 2015 16:58:29 -0700 Subject: [PATCH 63/75] Now only updating movie num_available and customer#account_credit if checkout/checkin was successful. --- db/development.db | Bin 73728 -> 73728 bytes models/rental.js | 26 ++++++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/db/development.db b/db/development.db index 66adaf6eb89122d99fc5e51978a2d90eaa8b2679..8ee16517082f17ed69f636d120e68909eb050503 100644 GIT binary patch delta 730 zcmXxgKTH!*90%}w@BMmrJxg0?Eu|D`p-A~-X#qr z?||%WaQPOPy$RAcKuT>gc^yoYKyn$3EP_M<#PVP;2QFm6z%1y?fKVEEQsCMI$c=%E zqiRoI0$dpam*QY_01QPyxDT8UgJ1}B2Y}xXyk5}d0j3+2bg)XmC0sBpYEaXq$9ybm zS8cWPik*bZb_^D6HFMEcqZVuv&f7qnse-8;5Z?xY3YaT{%sLoT|2 z#LQPw)}L9ya&@RhM4jsbGLOt4Q^+`?4l0WDB7qNUQFbWa$LhRMw|+Hh!%rQGlBCbv zbo2yC{b5H)N-|TrDrdM$TL!bFZ?1)&FN~zCaAr7EC5OHtCFGIm&?@S8bUfjHssF$_ z*P2@Vl6$0nzat!4N5gA0o}wP0-bHWu5kXK%RAN*}2aFh^VPGI}Aui?A z!NsU410gP^Di{)@zQ#B(FgSG3|G-2|987f3!Nh@p&l^P&Ln2L{&%M2S@_p~#*;O&S zD((a;XjId*A!PGs-)%`T8htk2M#SZ9@)EJa0xJ;}CioKdNK-WMeD?(U*$d#n80gA@ z&JmD43sPr5au_5|fwmK%Rc+F83^WgdrhX9b1&uwRp&P_9U~dY6~XQSDh91A!>0j)1Cq;17a|TCghs>}uev1m!j`eW1()h6m_w;1(HS`>aV3c_Dgh?yO7*#DgW0wUe72LJ#7 diff --git a/models/rental.js b/models/rental.js index 5fd439b..37f3b9a 100644 --- a/models/rental.js +++ b/models/rental.js @@ -30,15 +30,21 @@ Rental.prototype = { inserted_rental_id = this.lastID; number_of_records_changed = this.changes; }); - db.run(charge_statement); - db.run(zero_statement); - db.run(availability_statement); + + if (number_of_records_changed === 0) { + var error = { error: "Check out did not occur." } ; + } else { + db.run(charge_statement); + db.run(zero_statement); + db.run(availability_statement); + } db.exec("COMMIT;", function(error) { if (callback) { callback(error, { inserted_rental_id: inserted_rental_id, movie: movie_title, customer_id: customer_id, checked_out_on: checkout_date, due_on: return_date, number_of_records_changed: number_of_records_changed }); } }); + db.close(); }); }, @@ -46,23 +52,31 @@ Rental.prototype = { check_in: function(customer_id, movie_title, callback) { var db = new sqlite3.Database('db/' + db_env + '.db'), return_date = date_format(0), - changes; + changes = 0; var update_statement = "UPDATE " + this.table_name + " SET return_date = '" + return_date + "', checked_out = 'false' WHERE movie_id = (SELECT id FROM movies WHERE title = '" + movie_title + "') AND customer_id = " + customer_id + " AND checked_out = 'true';"; var availability_statement = "UPDATE movies SET num_available = (num_available + 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; - + db.serialize(function(err) { db.exec("BEGIN IMMEDIATE"); db.run(update_statement, function(err) { changes = this.changes; }); - db.run(availability_statement); + + if (changes === 0) { + err = { error: "Check in did not occur. Please make sure that the movie was checked out." } ; + } else { + db.run(availability_statement); + } + db.exec("COMMIT;", function(error) { if (callback) { + if (err) { error = err; } callback(error, { movie: movie_title, customer_id: customer_id, checked_in_on: return_date, number_of_records_changed: changes }); } }); + db.close(); }); } From 0be8098442a4dbec83cb0458d4806f1b007381df Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Fri, 25 Sep 2015 11:12:03 -0700 Subject: [PATCH 64/75] better rental controller tests --- db/test.db | Bin 73728 -> 73728 bytes routes/rentals.js | 1 - test/controllers/rentals.js | 95 ++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 test/controllers/rentals.js diff --git a/db/test.db b/db/test.db index cf7c38a8e373a1fedf5dc2060cd25f88b0318fd5..5ae58c6f24e58937b3226f2a7ea8d22035c71b66 100644 GIT binary patch delta 346 zcmZoTz|wGlWr7qF*N=%ZPC#;F!V+c~183h2qBuoPU delta 299 zcmZoTz|wGlWr7qFXYoWCCm^{oVF@z_6Z269=10s&H}kOUWOkQkVrLK)muF=3O)M`C z&o9bVj7%*qNi9lAtmNj9VFXG_0wukGlEE2?McD{hE)HG>1_owkK?dfH%t@PhIAWN^ z6cq)<71_N?Gm|S7oKjOua#D>93{57Vn|XK?m>Eqb>+&lB$pHRrj#Quu zB}GNf$qV?!RZEIWQx$;j2l6?^fzB}1H89dOG=Z^<4AT;GiktuQZ~xEF$S42+>I+3| diff --git a/routes/rentals.js b/routes/rentals.js index cd81490..2c6128f 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -4,6 +4,5 @@ var rentals_exports = require('../controllers/rentals'); router.post('/checkout', rentals_exports.create); router.patch('/checkin', rentals_exports.update); -router.put('/checkin', rentals_exports.update); module.exports = router; diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js new file mode 100644 index 0000000..93e50e3 --- /dev/null +++ b/test/controllers/rentals.js @@ -0,0 +1,95 @@ +var assert = require('assert'), + sqlite3 = require('sqlite3').verbose(), + request = require('supertest'), + app = require('../../app'), + movie_controller = require('../../controllers/rentals'), + agent = request.agent(app); + +describe("Endpoints under /rentals", function() { + var db_cleaner; + + beforeEach(function(done) { + + 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, num_available) \ + VALUES('Jaws', 'Shark!', '2015-01-01', 10, 8), \ + ('Maws', 'Worm!', '2015-01-01', 11, 4), \ + ('Claws', 'Cat!', '2015-01-01', 12, 5), \ + ('Paws', 'Bear!', '2015-01-01', 13, 10), \ + ('Gauze', 'Ouch!', '2015-01-01', 14, 10); \ + DELETE FROM customers; \ + INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ + VALUES('BeetleJaws', '2015-01-01', '123 street', 'Burlington', \ + 'WA', '98233', '(908) 949-6758', 5.25), \ + ('JuiceMaws', '2010-10-10', '123 Lane', 'Mt. Vernon', \ + 'WA', '11111', '(908) 949-6758', 10.00); \ + DELETE FROM rentals; \ + INSERT INTO rentals(checkout_date, return_date, movie_id, customer_id, checked_out) \ + VALUES('2015-09-23', '2015-09-30', 1, 1, 'true'), \ + ('2015-09-16', '2015-09-23', 2, 2, 'false'); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + + describe("rentals instance methods", function() { + context("POST /checkout", function() { + it("can make a post", function(done) { + agent.post('/checkout').set('Accept', 'application/json') + .field('title', 'RoboJaws') + .field('release_date', 'Tomorrow') + .expect(200); + done(); + }); + + it('posts to the rentals table', function(done) { + request(app) + .post('/rentals/checkout') + .send({ id: '1', title: 'RoboJaws'}) + .expect(200, function(err, res) { + assert.equal(res.body.customer_id, 1); + assert.equal(res.body.number_of_records_changed, 1); + if(err) { + done(err); + } else { + done(); + } + }); + }); + }); + + context("PATCH /checkin", function() { + it("can update rental records", function(done) { + agent.patch('/checkin').set('Accept', 'application/json') + .field('title', 'RoboJaws') + .field('release_date', 'Tomorrow') + .expect(); + done(); + }); + + it.only('should correctly update an existing account', function(done){ + request(app) + .patch('/rentals/checkin') + .send({ id: '1', title: 'RoboJaws'}) + .expect(200, function(err, res) { + assert.equal(res.body.customer_id, 1); + console.log(res.body); + assert.equal(res.body.number_of_records_changed, 1); + if(err) { + done(err); + } else { + done(); + } + }); + }); + }); + }); +}); From a86b7f528306803d950ac53bdf622c2e030c0541 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Fri, 25 Sep 2015 11:34:12 -0700 Subject: [PATCH 65/75] rental controller tests --- db/test.db | Bin 73728 -> 73728 bytes test/controllers/rentals.js | 17 +++++++++++------ test/models/rentals.js | 4 ++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/db/test.db b/db/test.db index 5ae58c6f24e58937b3226f2a7ea8d22035c71b66..e647e02fcfeb24a2c8c66e0d3e2bfe86e0db24fc 100644 GIT binary patch delta 287 zcmZoTz|wGlWr7qFckM(OCm^{oVF@z_6Z269=10s&H}kOUWOkQkVrLK)muF=3O)M`C z&o9bVj7%*qNi9lAtmNj9VFXG_0wukGlEE2?McD{hE)HG>1_owkK?dfH%t@PhIAWN^ z6cq)<71_N?Gm|S7oKjOua#D>93{57Vn|XNFGjpT@MU@m4IVUgR7gsGQ oDos@Yx*5pl6bD*us%v1RYiI&v85yP}<`g&o=imOHpOH}j0QEpaTL1t6 delta 334 zcmZoTz|wGlWr7qF*N=%ZPC#;F!V+c Date: Fri, 25 Sep 2015 13:18:48 -0700 Subject: [PATCH 66/75] deleted an unnecessary variable --- models/rental.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/models/rental.js b/models/rental.js index 37f3b9a..1e76065 100644 --- a/models/rental.js +++ b/models/rental.js @@ -19,7 +19,6 @@ Rental.prototype = { number_of_records_changed; var create_statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "'), " + customer_id + ", 'true')"; - var get_customer = "select * from customers where id = " + customer_id + ";"; var charge_statement = "UPDATE customers SET account_credit = (account_credit - " + rental_cost + ") WHERE ID = " + customer_id + " AND account_credit >= 1.0;"; var zero_statement = "UPDATE customers SET account_credit = 0.0 WHERE id = " + customer_id + " AND account_credit < 1.0;"; var availability_statement = "UPDATE movies SET num_available = (num_available - 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; @@ -76,7 +75,7 @@ Rental.prototype = { callback(error, { movie: movie_title, customer_id: customer_id, checked_in_on: return_date, number_of_records_changed: changes }); } }); - + db.close(); }); } From 6461c37802b0b7eccdd402cd8c683df68392be0a Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Fri, 25 Sep 2015 13:49:01 -0700 Subject: [PATCH 67/75] rental patch test --- db/test.db | Bin 73728 -> 73728 bytes test/controllers/rentals.js | 30 ++++++------------------------ 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/db/test.db b/db/test.db index e647e02fcfeb24a2c8c66e0d3e2bfe86e0db24fc..bfe56bf12d4bc62868cd8c22adec6826f26148af 100644 GIT binary patch delta 405 zcmZoTz|wGlWr8&0&51J3j5jwXEMewgWzJw=e#m@yGY`v7W_NZ5QE^2^M&HEp;_&>U zTty=TLsMM?Lm=X2k!1wRN&;oQfU?0EiAC8+(p((83=9lRAj8%(XKd!-h+$52W#VFx zSCmy06xU?*D$Ptz1sMx8(LfiB42_Hxd=m3geM|Hd!cvR!^7FzS4M9M|(!fGf!P3N1 z*Ua41g3F(gi$M_xfX1*prKXnTq=Fm(a@piMZg~x3V^sAHqCkfL0mwbf%rh96?=$aa zp21wcS%4>49t21cwUMWu?&5C!5e1%_rYmXRrIT4GLd wsuB}e2_rTo#!O6LHS)l~QdHzbvd0)?45zMvrLM67(4OZ1{M-NYGcpPQ03`fY!Tlpdz{m(!U}OYWV9CS;QUWwx31|imB_I_Fz|a8MA`a1N a1ha+Hz)07~FfB2sxcNW-_W%5hi~<0+g;RI{ diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 6aa3789..a5ebada 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -7,6 +7,7 @@ var assert = require('assert'), describe("Endpoints under /rentals", function() { var db_cleaner; + var date_format = require('../../helpers/date_helper'); beforeEach(function(done) { @@ -41,16 +42,8 @@ describe("Endpoints under /rentals", function() { }); }); - describe("rentals instance methods", function() { + describe.only("rentals instance methods", function() { context("POST /checkout", function() { - it("can make a post", function(done) { - agent.post('/checkout').set('Accept', 'application/json') - .field('title', 'RoboJaws') - .field('release_date', 'Tomorrow') - .expect(200); - done(); - }); - it('posts to the rentals table', function(done) { request(app) .post('/rentals/checkout') @@ -58,6 +51,7 @@ describe("Endpoints under /rentals", function() { .expect(200, function(err, res) { assert.equal(res.body.customer_id, 1); assert.equal(res.body.number_of_records_changed, 1); + assert.equal(res.body.checked_out_on, date_format(0)); if(err) { done(err); } else { @@ -68,33 +62,21 @@ describe("Endpoints under /rentals", function() { }); context("PATCH /checkin", function() { - it("can update rental records", function(done) { - var statement = "select * from customers;"; - db.run(statement, function(err) { - inserted_rental_id = this.lastID; - number_of_records_changed = this.changes; - }); - agent.patch('/checkin').set('Accept', 'application/json') - .field('title', 'RoboJaws') - .field('release_date', 'Tomorrow') - .expect(); - done(); - }); - - it('should correctly update an existing account', function(done){ + it('should update a rental record', function(done){ request(app) .patch('/rentals/checkin') .send({ id: '1', title: 'Gauze'}) .expect(200, function(err, res) { assert.equal(res.body.customer_id, 1); assert.equal(res.body.number_of_records_changed, 1); + assert.equal(res.body.checked_in_on, date_format(0)); if(err) { done(err); } else { done(); } }); - }); + }); }); }); }); From 56356e24d259c305d111e3fc1d3ec0637b70fc24 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Fri, 25 Sep 2015 13:56:44 -0700 Subject: [PATCH 68/75] test db --- db/test.db | Bin 73728 -> 73728 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/db/test.db b/db/test.db index bfe56bf12d4bc62868cd8c22adec6826f26148af..02983b3cdc9fb2c6b69f8aa984e6c1a2decfcc6f 100644 GIT binary patch delta 22 ecmZoTz|wGlWr8&0yNNQ+jPDu~wk9wxkOu%~YzVjj delta 22 ecmZoTz|wGlWr8&0&51J3j5iw-wk9wxkOu%|vj~m= From 519e657da8af606129c98f394fe31c1ba1b37edf Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Fri, 25 Sep 2015 14:00:46 -0700 Subject: [PATCH 69/75] Added constraints to inventory and num_available in movies. Cannot check out unless available. --- db/development.db | Bin 73728 -> 258048 bytes db/test.db | Bin 73728 -> 73728 bytes models/rental.js | 40 +++++++++++++++++++--------------------- package.json | 2 +- utils/schema.js | 42 ++++++++++++++++++++++++------------------ 5 files changed, 44 insertions(+), 40 deletions(-) diff --git a/db/development.db b/db/development.db index 8ee16517082f17ed69f636d120e68909eb050503..9e738e2a117a83b2600450c066346fc3adbe7532 100644 GIT binary patch delta 7010 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 diff --git a/models/rental.js b/models/rental.js index 37f3b9a..70bd257 100644 --- a/models/rental.js +++ b/models/rental.js @@ -16,36 +16,34 @@ Rental.prototype = { return_date = date_format(rental_duration_days), rental_cost = 1.0, inserted_rental_id, - number_of_records_changed; + number_of_records_changed = 0; + + var begin_statement = "BEGIN IMMEDIATE;" + + var create_statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "' AND num_available >= 1), " + customer_id + ", 'true');"; + + var availability_statement = "UPDATE movies SET num_available = (num_available - 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "' AND num_available >= 1);"; - var create_statement = "INSERT INTO " + this.table_name + " (checkout_date, return_date, movie_id, customer_id, checked_out) " + "VALUES ('" + checkout_date + "', '" + return_date + "', (SELECT id FROM movies WHERE title = '" + movie_title + "'), " + customer_id + ", 'true')"; - var get_customer = "select * from customers where id = " + customer_id + ";"; var charge_statement = "UPDATE customers SET account_credit = (account_credit - " + rental_cost + ") WHERE ID = " + customer_id + " AND account_credit >= 1.0;"; + var zero_statement = "UPDATE customers SET account_credit = 0.0 WHERE id = " + customer_id + " AND account_credit < 1.0;"; - var availability_statement = "UPDATE movies SET num_available = (num_available - 1) WHERE id = (SELECT id FROM movies WHERE title = '" + movie_title + "');"; db.serialize(function(err) { - db.exec("BEGIN IMMEDIATE"); - db.run(create_statement, function(err) { - inserted_rental_id = this.lastID; - number_of_records_changed = this.changes; - }); + // db.exec("BEGIN IMMEDIATE;"); - if (number_of_records_changed === 0) { - var error = { error: "Check out did not occur." } ; - } else { - db.run(charge_statement); - db.run(zero_statement); - db.run(availability_statement); - } - - db.exec("COMMIT;", function(error) { + db.exec(begin_statement + create_statement + availability_statement + charge_statement + zero_statement + "COMMIT;", function(error) { + // inserted_rental_id = this.lastID; + // number_of_records_changed = this.changes; if (callback) { - callback(error, { inserted_rental_id: inserted_rental_id, movie: movie_title, customer_id: customer_id, checked_out_on: checkout_date, due_on: return_date, number_of_records_changed: number_of_records_changed }); + if (error) { + callback(error, { error: error, result: "Unsuccessful request. There may not be any copies of that movie available." }); + } else { + callback(error, { result: "Successful check out" }); + } } + db.close(); }); - db.close(); }); }, @@ -76,7 +74,7 @@ Rental.prototype = { callback(error, { movie: movie_title, customer_id: customer_id, checked_in_on: return_date, number_of_records_changed: changes }); } }); - + db.close(); }); } diff --git a/package.json b/package.json index ee8245d..b230f0a 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "start": "nodemon ./bin/www", - "test": "clear; DB=test mocha --recursive", + "test": "clear; DB=test mocha --recursive -R nyan", "schema": "node ./utils/schema", "seed": "node ./utils/seed", "setup": "npm run schema; npm run seed" diff --git a/utils/schema.js b/utils/schema.js index 08cbc9b..ddee5a5 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -5,13 +5,6 @@ var sqlite3 = require('sqlite3').verbose(), db = new sqlite3.Database('db/' + db_env + '.db'); // creates db connection var movie_table = "movies"; -var movie_fields = [ - ['title', 'text'], - ['overview', 'text'], - ['release_date', 'text'], - ['inventory', 'integer'], - ['num_available', 'integer'] -]; var customer_table = "customers"; var customer_fields = [ @@ -26,13 +19,6 @@ var customer_fields = [ ]; var rental_table = "rentals"; -var rental_fields = [ - ['checkout_date', 'text'], - ['return_date', 'text'], - ['movie_id', 'integer'], - ['customer_id', 'integer'], - ['checked_out', 'boolean'] -]; function create_table(table_name, table_fields) { db.serialize(function() { @@ -40,29 +26,49 @@ function create_table(table_name, table_fields) { db.run("DROP TABLE IF EXISTS " + table_name + ";"); // create fresh version of table with id as primary key - db.run("CREATE TABLE " + table_name + " (id INTEGER PRIMARY KEY);"); + db.run("CREATE TABLE " + table_name + + " (id INTEGER PRIMARY KEY);"); // add columns to those 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_name + " ADD COLUMN " + name + " " + type + ";"); + db.run("ALTER TABLE " + table_name + + " ADD COLUMN " + name + " " + type + + ";"); } }); } +function create_movies_table(table_name) { + db.serialize(function() { + // drop existing tables + db.run("DROP TABLE IF EXISTS " + table_name + ";"); + + // create fresh version of table with id as primary key + db.run("CREATE TABLE " + table_name + + " (id INTEGER PRIMARY KEY, \ + title TEXT, \ + overview TEXT, \ + release_date TEXT, \ + inventory INTEGER NOT NULL CHECK(inventory > 0), \ + num_available INTEGER NOT NULL CHECK(num_available <= inventory \ + AND num_available >= 0));"); + }); +} + function create_rentals_table(table_name) { db.serialize(function() { // drop existing tables db.run("DROP TABLE IF EXISTS " + table_name + ";"); // create fresh version of table with id as primary key - db.run("CREATE TABLE rentals (id INTEGER PRIMARY KEY, checkout_date text, return_date text, movie_id integer, customer_id integer, checked_out boolean, FOREIGN KEY(movie_id) REFERENCES movie(id), FOREIGN KEY(customer_id) REFERENCES customer(id));"); + db.run("CREATE TABLE rentals (id INTEGER PRIMARY KEY, checkout_date text NOT NULL, return_date text NOT NULL, movie_id integer NOT NULL, customer_id integer NOT NULL, checked_out boolean NOT NULL, FOREIGN KEY(movie_id) REFERENCES movie(id), FOREIGN KEY(customer_id) REFERENCES customer(id));"); }); } -create_table(movie_table, movie_fields); +create_movies_table(movie_table); create_table(customer_table, customer_fields); create_rentals_table(rental_table); From e6257e69d77bb372ea3760c7006a9316568b112f Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Fri, 25 Sep 2015 14:11:56 -0700 Subject: [PATCH 70/75] fixing tests that failed b/c of changes to rentals model. --- db/development.db | Bin 258048 -> 258048 bytes db/test.db | Bin 73728 -> 73728 bytes models/rental.js | 15 ++++++--------- test/models/rentals.js | 11 ++--------- 4 files changed, 8 insertions(+), 18 deletions(-) diff --git a/db/development.db b/db/development.db index 9e738e2a117a83b2600450c066346fc3adbe7532..ac575680b71da62d8accd3be9d345df0d66c7e28 100644 GIT binary patch delta 111 zcmZp8z~AtIe}XjQhlw)Ij2|{8EaR4FWMIC}yoY%fa|LrKvmrA-(`%*^OiP&>w+qf- zPG(Y5;$~-1RAginH!?6Z)itoxH8Mr8*jdsNbBa?Hxu)wEGbuHn Date: Fri, 25 Sep 2015 14:13:14 -0700 Subject: [PATCH 71/75] Cleaning up stray deprecated code. --- models/rental.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/models/rental.js b/models/rental.js index dcdac38..68f2743 100644 --- a/models/rental.js +++ b/models/rental.js @@ -27,11 +27,9 @@ Rental.prototype = { var zero_statement = "UPDATE customers SET account_credit = 0.0 WHERE id = " + customer_id + " AND account_credit < 1.0;"; db.serialize(function(err) { - // db.exec("BEGIN IMMEDIATE;"); db.exec(begin_statement + create_statement + availability_statement + charge_statement + zero_statement + "COMMIT;", function(error) { - // inserted_rental_id = this.lastID; - // number_of_records_changed = this.changes; + if (callback) { if (error) { callback(error, { error: error, result: "Unsuccessful request. There may not be any copies of that movie available." }); @@ -60,11 +58,7 @@ Rental.prototype = { changes = this.changes; }); - // if (changes === 0) { - // err = { error: "Check in did not occur. Please make sure that the movie was checked out." } ; - // } else { - db.run(availability_statement); - // } + db.run(availability_statement); db.exec("COMMIT;", function(error) { if (callback) { From f0ab961648c179d6c54d14c9a75ea3e950481730 Mon Sep 17 00:00:00 2001 From: Loren Wang Date: Fri, 25 Sep 2015 14:29:55 -0700 Subject: [PATCH 72/75] refactored model files into separate files --- database.js | 69 ------------------------------------ db/test.db | Bin 73728 -> 73728 bytes models/customer.js | 34 ++++++++++++++++++ models/movie.js | 37 ++++++++++++++++++- test/controllers/rentals.js | 2 +- 5 files changed, 71 insertions(+), 71 deletions(-) diff --git a/database.js b/database.js index d6667b2..dd24848 100644 --- a/database.js +++ b/database.js @@ -23,75 +23,6 @@ var Database = { db.close(); }); }, - - // Called by Movies controller: - customers_by_movie_current: function(title, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - // all customers who currently have the movie checked out - 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.checked_out = 'true'; "; - - db.all(statement, title, function(err, rows) { - callback(err, rows); - db.close(); - }); - }, - - customers_by_movie_history: function(title, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - // all customers who have checked out this movie in the past - 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.checked_out = 'false'; "; - - db.all(statement, title, function(err, rows) { - callback(err, rows); - db.close(); - }); - }, - - customers_by_movie_history_sorted: function(title, table, column, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - // all customers who have checked out specified movie in the past sorted by specified column - - var statement = "SELECT * 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.checked_out = 'false' ORDER BY " + table + "." + column + ";"; - - db.all(statement, title, function(err, rows) { - callback(err, rows); - db.close(); - }); - }, - - // Called by Customers controller: - movies_by_customer_current: function(customer_id, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - // all movies currently checked out by that customer - var statement = "SELECT 'movies'.* FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = (SELECT customers.id FROM customers WHERE customers.id = ? COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'true'; "; - - db.all(statement, customer_id, function(err, rows) { - callback(err, rows); - db.close(); - }); - }, - - movies_by_customer_history: function(customer_id, callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - // all movies checked out by that customer in the past - var statement = "SELECT 'movies'.*, rentals.checkout_date, rentals.return_date FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = (SELECT customers.id FROM customers WHERE customers.id = ? COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'false' ORDER BY rentals.checkout_date; "; - - db.all(statement, customer_id, function(err, rows) { - callback(err, rows); - db.close(); - }); - }, - - customers_overdue: function(callback) { - var db = new sqlite3.Database('db/' + db_env + '.db'); - // all customers who currently have the movie checked out and past return_date - var statement = "SELECT * FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE date(rentals.return_date) < date('now') AND rentals.checked_out = 'true' ORDER BY rentals.return_date; "; - - db.all(statement, function(err, rows) { - callback(err, rows); - db.close(); - }); - }, }; module.exports = Database; diff --git a/db/test.db b/db/test.db index 02983b3cdc9fb2c6b69f8aa984e6c1a2decfcc6f..4473a88eb8676d3880fbc4e41694f95a04e8913e 100644 GIT binary patch delta 378 zcmZoTz|wGlWr7qFZ^A?wCm^{oVF@z_6Z269=10s&H}kOUWOkQkVrLK)muF=3O)M`C z&o9bVj7%*qNi9lAtmNj9VFXG_0wukGlEE2?McD{hE)HG>1_owkK?dfH%t@PhIAWN^ z6cq)<71_N?Gm|S7oKjOua#D>93{57V%rluQHVg2iGuNlev#>KLDspm) z0z}Tf`w+ bjbOHL8W`ys8Kx!X6gU6p-~OMUkx>8uk=0XJ delta 407 zcmZoTz|wGlWr7qF_q&NQPC#;F!V+c_60FT610ssI2 diff --git a/models/customer.js b/models/customer.js index fa7e0b5..60ea704 100644 --- a/models/customer.js +++ b/models/customer.js @@ -10,4 +10,38 @@ function Customer() { Customer.prototype = require('../database'); // Customer.prototype. + // Called by Customers controller: +Customer.prototype.movies_by_customer_current = function(customer_id, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all movies currently checked out by that customer + var statement = "SELECT 'movies'.* FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = (SELECT customers.id FROM customers WHERE customers.id = ? COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'true'; "; + + db.all(statement, customer_id, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, + +Customer.prototype.movies_by_customer_history = function(customer_id, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all movies checked out by that customer in the past + var statement = "SELECT 'movies'.*, rentals.checkout_date, rentals.return_date FROM movies INNER JOIN rentals ON movies.id = rentals.movie_id WHERE rentals.customer_id = (SELECT customers.id FROM customers WHERE customers.id = ? COLLATE NOCASE LIMIT 1) AND rentals.checked_out = 'false' ORDER BY rentals.checkout_date; "; + + db.all(statement, customer_id, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, + +Customer.prototype.customers_overdue = function(callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all customers who currently have the movie checked out and past return_date + var statement = "SELECT * FROM customers INNER JOIN rentals ON customers.id = rentals.customer_id WHERE date(rentals.return_date) < date('now') AND rentals.checked_out = 'true' ORDER BY rentals.return_date; "; + + db.all(statement, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, + module.exports = Customer; diff --git a/models/movie.js b/models/movie.js index 81ba940..2906540 100644 --- a/models/movie.js +++ b/models/movie.js @@ -20,6 +20,41 @@ Movie.prototype.movie_info = function(title, callback) { callback(err, rows); db.close(); }); -} +}; + +Movie.prototype.customers_by_movie_current = function(title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all customers who currently have the movie checked out + 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.checked_out = 'true'; "; + + db.all(statement, title, function(err, rows) { + callback(err, rows); + db.close(); + }); +}; + +Movie.prototype.customers_by_movie_history= function(title, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all customers who have checked out this movie in the past + 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.checked_out = 'false'; "; + + db.all(statement, title, function(err, rows) { + callback(err, rows); + db.close(); + }); + }, + + +Movie.prototype.customers_by_movie_history_sorted = function(title, table, column, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + // all customers who have checked out specified movie in the past sorted by specified column + + var statement = "SELECT * 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.checked_out = 'false' ORDER BY " + table + "." + column + ";"; + + db.all(statement, title, function(err, rows) { + callback(err, rows); + db.close(); + }); +}; module.exports = Movie; diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index a5ebada..ca0a7bc 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -42,7 +42,7 @@ describe("Endpoints under /rentals", function() { }); }); - describe.only("rentals instance methods", function() { + describe("rentals instance methods", function() { context("POST /checkout", function() { it('posts to the rentals table', function(done) { request(app) From 064a35d6e2a3a9ec62992305c2d7ed71b472307d Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Fri, 25 Sep 2015 14:52:46 -0700 Subject: [PATCH 73/75] Resetting the databases. --- db/development.db | Bin 258048 -> 258048 bytes db/test.db | Bin 0 -> 73728 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/db/development.db b/db/development.db index ac575680b71da62d8accd3be9d345df0d66c7e28..1f0445968f0d7b4c5b6847c9a257c3c34b8ccecf 100644 GIT binary patch delta 1321 zcmW-fZ%CC_7{K3i&U0Vy+%AKgC82N@s2Pun&EK7_RSB45rc#c8Wa>muKPXjhu`m>d*0_f&vX8y z?-!@<7mrlD(A4O8-Wt@vtmoN<(fYS+Q{!l7zv=n;ZjCWthSoM2^TpUs_osOfrliIV zW0bS6Lh`06lI+ciu<0ThNX7Q1C9gxC?FHiRPNo z{&&!rHnnF5df0$!x1*6a(9G-T+G|?#&^EMEjh45f>#v~k3bc1Kx>=4+zlffeqWXhQfx6|T-`{(+39 zeUwS!=?wDv`_QRgbgLVcbfWeSbfygz=@}f}jg~a+yk^~8hfY?ZLQT0vGy2J*mvzEU zd2YqcxgT7gYj-gT9Una1buR8A!upxC6JL$nyrh8w>)t2!}y0 ze-89zjlmM^frn5FBQOs$a19Q@3g|OfhU+j6Ct)w#gws$6PoW-0;T+U@yp}Btj=~Yp z(~z;%(#k+4ILe8#NLHPm*pwB}1RvpCU0 zflwCpT4!jdP1|{5lC)=yTus>Zf}E6Vl@wJ1zgw>QaZCS@B9i$yU6s|+^O{+VzLs7Z zouz!ME*y%>*AWxRPeyC*inp_Bh}gy=IbdyB7^`Bx*!#^X)`rbM?e?zHXMxa|QAo{Iyr1mt8ui~Q)g*?$?#xl|wx41Ra? MTp!2Xb^n$A54K+-`Tzg` delta 1352 zcmYL{U1(HC6vyw(oSoffZ``$6b(I*h(ZrRmnuJZ8ib#Z|_*DtffDb}bO+%XIAz-P| zr0ib&S~Qx?hbYwt;Sx3vd9d8b6^R%TWhF&g@F5RMf&>(NFkrwwgx&tned)vR$GJ0e z&zv(enZ;0MF_hc%Wz(`@7^|QbOdE!DM-q*)X?dh$K>YmY>sldxaisi4h@P?C>L2mW zF{xIi51hj4xgVgh6VTD)&`dkD^C;BQ2HiLU+22Et4?*Soq37R0FH_K`eNbjEbY%~8 zdpC5l85;c>YEMGf8=z#-K}^p@B`%Ix7xev#Q|{ zi}NQePW#ykz-1O>T<(XS^g#!^p^F{R_;Kh_D>Tn%u(1VN;Iv(w^&uyns)lAcWsWoI zKsk34l$N0u)QtK=^{aN(phEJ4EXWCIIWhB;tg8w7jaW>G4UP2;O*`tp-O$I$KUaTqjMba5v|7*Fe-;<-`MZZgnQjp_ImV$YjlH^cIR@ypCw(bn) zbpUg^zZi5WE- z1^hU(;3;?r-hxYD08D{N@DU7xS-?;14Y&%1z_5WAl|#@6&I3LT8hc++uD*_)b!|I@dQTN)-+zcz9M6H#pSFVFrs`ih9{1Ui?b&>ZrHXyg=#|5pXGs z)c3XImvGoyVDfv=E&TVScjpCeX9?@8k(VBLr8KLee}XuPDbU$Ch=U6l*w3RwJUWly z0+)YG%808^c&+wIZoAuyhh!;aQ$Lp7m8MPI2=2+GO&$1W2?yosu;R^U@x9{px++RI zf~`Ci@lq7LcBWA>{f&)%gP8Iqxe*;z#ZaD7Tuwrv(}*|0suZ+o8D+gzs}=tNG5sZN diff --git a/db/test.db b/db/test.db index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ebcf8eb33b8b678e861ca54b273d95add07419f6 100644 GIT binary patch literal 73728 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

wHqCX!nJVYzA#dPJfurWLh1}Bmk2%83$K}7) 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 literal 0 HcmV?d00001 From f5a456e1e64e294b48431c2300e7b0a85a0bb371 Mon Sep 17 00:00:00 2001 From: Sally Moore Date: Fri, 25 Sep 2015 15:01:07 -0700 Subject: [PATCH 74/75] Fixed little things that broke in our tests when we merged. --- db/development.db | Bin 258048 -> 258048 bytes db/test.db | Bin 73728 -> 73728 bytes models/customer.js | 51 +++++++++++++++++----------------- test/controllers/customers.js | 6 ++-- test/controllers/rentals.js | 1 - 5 files changed, 28 insertions(+), 30 deletions(-) diff --git a/db/development.db b/db/development.db index 1f0445968f0d7b4c5b6847c9a257c3c34b8ccecf..099598ca97bcbb01486f1809b9a97b102098a44f 100644 GIT binary patch delta 129 zcmZp8z~AtIe}Xil=|mZ4M$?T6OSq-DnVJ}w?=$aVp2b|j9Lj9S%+K_i=>*eKrl!q` zJSj}7irnlBii(VkqDBUWrn&}}x<;m8mZ5>Jfe|}PNl|I4BG+{NVkV`{C;3jWGnzC{ d65BpWjPddL&82!18Qa-jfH2c`winF5*a5@ZB=P_N delta 101 zcmZp8z~AtIe}Xil$wV1vMw5*ROSmPtn3ggy-)G*#Jd3%4Ih5IunV;!3(+Q@f+XY*g zJDHdixu)wEGbwF8$#;T%a^EtJ%`>I48Jk%owzEhu7M|N)`i-%lv7O}w2s3SGdBOaL F9RO3GA$I@( diff --git a/db/test.db b/db/test.db index ebcf8eb33b8b678e861ca54b273d95add07419f6..203303bb0cbda1161836cba8d1f2961f8c5ea3a8 100644 GIT binary patch delta 1039 zcmZwGOK%cU7zW@o=L5O4PzIscmI|j@+p428!=)Xs1*&bDG&M14<1WLBssAv11%|?AN zXA^Ta%v`qFavi5tZo9SJ`pZ_MzFo4G46BeU>Uq;B77P0Fc&`82;9)j93|w#T?(ApF zxUuFSEc#R#((o4yxUVxKJd@o=w3(Q843|nQiEX@HPakiS(;hkFYH>=5qJ`w78K63(04W? zTasr}bc46twv)kOKu2iUVQEHQ_I5NKdAjTnI1mEo;ctg$7>oBquq^K||IEbdcVuxe zj lIaq?*a2M{ueOQJPltHe11s=ddx$;$5dzVnZB~;}k`UjqGvO53( delta 676 zcmY+=Jx|+E6b9hydz{3f!H}jvND0{CD-fJI4y2)cC47%8NQ^L0A%SSs7KtSaS4`bN z*_c@J15k!83>iE35A+ALTSu0@$4;tZ$&ap%UY~P(uiE-mTfa$}T2%^|@_Sa+_d=Kh3U!>18na4osB6cnM_YfmHxwE*Rxb z=^S`H15(pqcmgCdV9*8wY49oqUJiqJ67&xOGXZ-0LCoauUc`VA1(7fa>mWqDaFXg! z?9x-qG>97U@pCThs0!Rxyxf-Jbv9KNZYT?`E1pzUJfNZsxTb(uy#y;C!O{sRAA;fm zc(Vs)`O>B;z~;6i+;xbXCM?j$Eql1*Xw>NCvuq0bNsn|#m$Xj>>XX0ZciC*ke}9#Y zrg>VAM1*Z?(E-mbEI4k-@!a6_)^Q8^mrobRnXsSGhPw4)Cs9U% Date: Fri, 25 Sep 2015 15:02:51 -0700 Subject: [PATCH 75/75] Adding back put route for rentals. --- db/development.db | Bin 258048 -> 258048 bytes routes/rentals.js | 1 + 2 files changed, 1 insertion(+) diff --git a/db/development.db b/db/development.db index 099598ca97bcbb01486f1809b9a97b102098a44f..fc5746d6c03a89f8174bd4f5a85ff664704cf763 100644 GIT binary patch delta 123 zcmZp8z~AtIe}Xil*+dy{am5N6uW_Ja8rI{@+zBJ}_O diff --git a/routes/rentals.js b/routes/rentals.js index 2c6128f..cd81490 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -4,5 +4,6 @@ var rentals_exports = require('../controllers/rentals'); router.post('/checkout', rentals_exports.create); router.patch('/checkin', rentals_exports.update); +router.put('/checkin', rentals_exports.update); module.exports = router;