From 305b1526b02118a6309cda60ab0d389d6c6ca773 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Tue, 15 Sep 2015 15:25:31 -0700 Subject: [PATCH 01/80] Adds names to readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e42eb13..c7cc7ea 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Project: VideoStoreAPI +# Carly and Elsa Project: VideoStoreAPI The overall goal of this project is to create a system that a video store (remember those?) could use to track their inventory of rental videos and their collection of customers. @@ -18,7 +18,7 @@ We will use [NodeJS](https://nodejs.org/en/) to construct a RESTful API. The goa - `registered_at`: When the customer first visited the store - The customer's physical address, composed of: - `address` - - `city` + - `city` - `state` - `postal_code` - `phone`: Primary contact phone number From 795fb52f9fe1f6b16326264774030aec3a97d6d8 Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 15 Sep 2015 15:59:00 -0700 Subject: [PATCH 02/80] Added endpoint notes. --- README.md | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c7cc7ea..b96b1df 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,36 @@ # Carly and Elsa Project: VideoStoreAPI +## Notes +### Endpoints +GET "/customers" +// for routes below, will need to return results offset by page number +GET "/customers/:name" // will be dynamic +GET "/customers/:registered_at" +GET "/customers/:postal_code" + +GET "/customers/:id/current_movies" +GET "/customers/:id/past_movies" // order by checkout date, include return date + +GET "/movies" +// for routes below, will need to return results offset by page number +GET "/movies/:title" // will be dynamic +GET "/movies/:release_date" + +// for routes below, will need to pass an ordering parameter to order by customer id, name, or checkout date +GET "/movies/:title/current_customers/:order" +GET "/movies/:title/past_customers/:order" + +// normalize database or join everything??? +GET "/movies/:title" + // includes synopsis, release date, inventory total, rentable boolean, list of customers that have it currently checkout out ...? + +POST "/rental/:customer_id/:movie_title" + // create association, checkout date, return date, charge account, returned boolean +PATCH "/checkin/:customer_id/:movie_title" + // modify returned boolean +GET "/rental/overdue" + +--- The overall goal of this project is to create a system that a video store (remember those?) could use to track their inventory of rental videos and their collection of customers. We will use [NodeJS](https://nodejs.org/en/) to construct a RESTful API. The goal of this API is to quickly serve information about the store's video collection, customer information, and to update rental status. This repository provides two JSON datafiles to serve as the initial seeds for this system. @@ -91,4 +122,3 @@ The API you build should have the following capabilities. The schema of your dat - All endpoints must be tested. - We will use [Mocha](https://mochajs.org/) for tests. - There isn't a coverage requirement for this project, beyond demonstrating that every endpoint is covered by some manner of tests. - From 92a469db30f1be8d5569624e9a1f3861500702a2 Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 15 Sep 2015 16:52:36 -0700 Subject: [PATCH 03/80] Added node_modules. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e43b0f9..03e05e4 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .DS_Store +/node_modules From 4c10476163ab65351294ad635f591d4f377820b0 Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 15 Sep 2015 16:53:17 -0700 Subject: [PATCH 04/80] Express. --- app.js | 60 ++++++++++++++++++++++++ bin/www | 90 ++++++++++++++++++++++++++++++++++++ package.json | 17 +++++++ public/stylesheets/style.css | 8 ++++ routes/index.js | 9 ++++ routes/users.js | 9 ++++ views/error.jade | 6 +++ views/index.jade | 5 ++ views/layout.jade | 7 +++ 9 files changed, 211 insertions(+) create mode 100644 app.js create mode 100755 bin/www create mode 100644 package.json create mode 100644 public/stylesheets/style.css create mode 100644 routes/index.js create mode 100644 routes/users.js create mode 100644 views/error.jade create mode 100644 views/index.jade create mode 100644 views/layout.jade diff --git a/app.js b/app.js new file mode 100644 index 0000000..80a3c36 --- /dev/null +++ b/app.js @@ -0,0 +1,60 @@ +var express = require('express'); +var path = require('path'); +var favicon = require('serve-favicon'); +var logger = require('morgan'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); + +var routes = require('./routes/index'); +var users = require('./routes/users'); + +var app = express(); + +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'jade'); + +// uncomment after placing your favicon in /public +//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); +app.use(logger('dev')); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(cookieParser()); +app.use(express.static(path.join(__dirname, 'public'))); + +app.use('/', routes); +app.use('/users', users); + +// catch 404 and forward to error handler +app.use(function(req, res, next) { + var err = new Error('Not Found'); + err.status = 404; + next(err); +}); + +// error handlers + +// development error handler +// will print stacktrace +if (app.get('env') === 'development') { + app.use(function(err, req, res, next) { + res.status(err.status || 500); + res.render('error', { + message: err.message, + error: err + }); + }); +} + +// production error handler +// no stacktraces leaked to user +app.use(function(err, req, res, next) { + res.status(err.status || 500); + res.render('error', { + message: err.message, + error: {} + }); +}); + + +module.exports = app; diff --git a/bin/www b/bin/www new file mode 100755 index 0000000..cc43085 --- /dev/null +++ b/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('C3Projects--VideoStoreAPI:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '3000'); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0ab806b --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "C3Projects--VideoStoreAPI", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "dependencies": { + "body-parser": "~1.13.2", + "cookie-parser": "~1.3.5", + "debug": "~2.2.0", + "express": "~4.13.1", + "jade": "~1.11.0", + "morgan": "~1.6.1", + "serve-favicon": "~2.3.0" + } +} \ No newline at end of file diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css new file mode 100644 index 0000000..9453385 --- /dev/null +++ b/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..ecca96a --- /dev/null +++ b/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'Express' }); +}); + +module.exports = router; diff --git a/routes/users.js b/routes/users.js new file mode 100644 index 0000000..623e430 --- /dev/null +++ b/routes/users.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET users listing. */ +router.get('/', function(req, res, next) { + res.send('respond with a resource'); +}); + +module.exports = router; diff --git a/views/error.jade b/views/error.jade new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/views/index.jade b/views/index.jade new file mode 100644 index 0000000..3d63b9a --- /dev/null +++ b/views/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p Welcome to #{title} diff --git a/views/layout.jade b/views/layout.jade new file mode 100644 index 0000000..15af079 --- /dev/null +++ b/views/layout.jade @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content From 8eab198dcf34516a1c32024a2bd91f476d8f830d Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 15 Sep 2015 17:15:29 -0700 Subject: [PATCH 05/80] Zomg test passed. --- app.js | 12 ++++++++---- controllers/customers.js | 0 controllers/movies.js | 0 controllers/rentals.js | 0 controllers/zomg.js | 8 ++++++++ npm-debug.log | 36 ++++++++++++++++++++++++++++++++++ routes/customers.js | 11 +++++++++++ routes/index.js | 9 --------- routes/{users.js => movies.js} | 4 ++-- routes/rentals.js | 0 routes/zomg.js | 11 +++++++++++ 11 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 controllers/customers.js create mode 100644 controllers/movies.js create mode 100644 controllers/rentals.js create mode 100644 controllers/zomg.js create mode 100644 npm-debug.log create mode 100644 routes/customers.js delete mode 100644 routes/index.js rename routes/{users.js => movies.js} (68%) create mode 100644 routes/rentals.js create mode 100644 routes/zomg.js diff --git a/app.js b/app.js index 80a3c36..4628960 100644 --- a/app.js +++ b/app.js @@ -5,8 +5,10 @@ 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 movies = require('./routes/movies'); +// var customers = require('./routes/customers'); +// var rentals = require('./routes/rentals'); +var zomg = require('./routes/zomg'); var app = express(); @@ -22,8 +24,10 @@ app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); -app.use('/', routes); -app.use('/users', users); +// app.use('/movies', movies); +// app.use('/customers', customers); +// app.use('/rentals', rentals); +app.use('/zomg', zomg); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/controllers/customers.js b/controllers/customers.js new file mode 100644 index 0000000..e69de29 diff --git a/controllers/movies.js b/controllers/movies.js new file mode 100644 index 0000000..e69de29 diff --git a/controllers/rentals.js b/controllers/rentals.js new file mode 100644 index 0000000..e69de29 diff --git a/controllers/zomg.js b/controllers/zomg.js new file mode 100644 index 0000000..1d10be1 --- /dev/null +++ b/controllers/zomg.js @@ -0,0 +1,8 @@ +"use strict"; + +exports.zomgController = { + + zomg: function(req, res) { + return res.status(200).json({ zomg: "it worked!" }); + } +} diff --git a/npm-debug.log b/npm-debug.log new file mode 100644 index 0000000..6c6f491 --- /dev/null +++ b/npm-debug.log @@ -0,0 +1,36 @@ +0 info it worked if it ends with ok +1 verbose cli [ 'node', '/usr/local/bin/npm', 'start' ] +2 info using npm@2.7.5 +3 info using node@v0.12.2 +4 verbose node symlink /usr/local/bin/node +5 verbose run-script [ 'prestart', 'start', 'poststart' ] +6 info prestart C3Projects--VideoStoreAPI@0.0.0 +7 info start C3Projects--VideoStoreAPI@0.0.0 +8 verbose unsafe-perm in lifecycle true +9 info C3Projects--VideoStoreAPI@0.0.0 Failed to exec start script +10 verbose stack Error: C3Projects--VideoStoreAPI@0.0.0 start: `node ./bin/www` +10 verbose stack Exit status 1 +10 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:213:16) +10 verbose stack at EventEmitter.emit (events.js:110:17) +10 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:14:12) +10 verbose stack at ChildProcess.emit (events.js:110:17) +10 verbose stack at maybeClose (child_process.js:1015:16) +10 verbose stack at Process.ChildProcess._handle.onexit (child_process.js:1087:5) +11 verbose pkgid C3Projects--VideoStoreAPI@0.0.0 +12 verbose cwd /Users/elsa/ada/projects/project-forks/C3Projects--VideoStoreAPI +13 error Darwin 14.5.0 +14 error argv "node" "/usr/local/bin/npm" "start" +15 error node v0.12.2 +16 error npm v2.7.5 +17 error code ELIFECYCLE +18 error C3Projects--VideoStoreAPI@0.0.0 start: `node ./bin/www` +18 error Exit status 1 +19 error Failed at the C3Projects--VideoStoreAPI@0.0.0 start script 'node ./bin/www'. +19 error This is most likely a problem with the C3Projects--VideoStoreAPI package, +19 error not with npm itself. +19 error Tell the author that this fails on your system: +19 error node ./bin/www +19 error You can get their info via: +19 error npm owner ls C3Projects--VideoStoreAPI +19 error There is likely additional logging output above. +20 verbose exit [ 1, true ] diff --git a/routes/customers.js b/routes/customers.js new file mode 100644 index 0000000..25a2697 --- /dev/null +++ b/routes/customers.js @@ -0,0 +1,11 @@ +var express = require('express'); +var router = express.Router(); +var customer_exports = require('..controllers/customers'); + +/* GET */ +router.get('/', function(req, res, next) { + // res.send('respond with a resource'); + return customer_exports.customerController.zomg(req, res); +}); + +module.exports = router; diff --git a/routes/index.js b/routes/index.js deleted file mode 100644 index ecca96a..0000000 --- a/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express'); -var router = express.Router(); - -/* GET home page. */ -router.get('/', function(req, res, next) { - res.render('index', { title: 'Express' }); -}); - -module.exports = router; diff --git a/routes/users.js b/routes/movies.js similarity index 68% rename from routes/users.js rename to routes/movies.js index 623e430..065f87c 100644 --- a/routes/users.js +++ b/routes/movies.js @@ -1,9 +1,9 @@ var express = require('express'); var router = express.Router(); -/* GET users listing. */ +/* GET */ router.get('/', function(req, res, next) { - res.send('respond with a resource'); + // res.render('movies', { title: 'Express' }); }); module.exports = router; diff --git a/routes/rentals.js b/routes/rentals.js new file mode 100644 index 0000000..e69de29 diff --git a/routes/zomg.js b/routes/zomg.js new file mode 100644 index 0000000..6687c0c --- /dev/null +++ b/routes/zomg.js @@ -0,0 +1,11 @@ +var express = require('express'); +var router = express.Router(); +var zomg_exports = require('../controllers/zomg'); + +/* GET */ +router.get('/', function(req, res, next) { + // res.send('respond with a resource'); + return zomg_exports.zomgController.zomg(req, res); +}); + +module.exports = router; From bf52ec0c8b0345f6474a0fab585fa6447dfcfa01 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Thu, 17 Sep 2015 13:54:53 -0700 Subject: [PATCH 06/80] Adds db/ directory and utils/ directory. Also adds express to npm packages --- db/development.db | Bin 0 -> 2048 bytes npm-debug.log | 36 ------------------------------------ package.json | 7 ++++--- utils/schema.js | 31 +++++++++++++++++++++++++++++++ utils/seeds.js | 0 5 files changed, 35 insertions(+), 39 deletions(-) create mode 100644 db/development.db delete mode 100644 npm-debug.log create mode 100644 utils/schema.js create mode 100644 utils/seeds.js diff --git a/db/development.db b/db/development.db new file mode 100644 index 0000000000000000000000000000000000000000..2b8246606df6aa6a5864651217be9b50563c21ec GIT binary patch literal 2048 zcmWFz^vNtqRY=P(%1ta$FlJz3U}R))P*7lCU=RdiCLo3Z5T6Cc0n&^}Y+Ou12Hj`e zydcHQ0p(L{;Csm;&wW35vA-^oO2xv|@lv|XV ylbTqZ8lRE~%-|3enR#WYc_sNpl?s`8C8_DDMVg?ziIS^FV`nr3Mnho4ga7~(G&TzW literal 0 HcmV?d00001 diff --git a/npm-debug.log b/npm-debug.log deleted file mode 100644 index 6c6f491..0000000 --- a/npm-debug.log +++ /dev/null @@ -1,36 +0,0 @@ -0 info it worked if it ends with ok -1 verbose cli [ 'node', '/usr/local/bin/npm', 'start' ] -2 info using npm@2.7.5 -3 info using node@v0.12.2 -4 verbose node symlink /usr/local/bin/node -5 verbose run-script [ 'prestart', 'start', 'poststart' ] -6 info prestart C3Projects--VideoStoreAPI@0.0.0 -7 info start C3Projects--VideoStoreAPI@0.0.0 -8 verbose unsafe-perm in lifecycle true -9 info C3Projects--VideoStoreAPI@0.0.0 Failed to exec start script -10 verbose stack Error: C3Projects--VideoStoreAPI@0.0.0 start: `node ./bin/www` -10 verbose stack Exit status 1 -10 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:213:16) -10 verbose stack at EventEmitter.emit (events.js:110:17) -10 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:14:12) -10 verbose stack at ChildProcess.emit (events.js:110:17) -10 verbose stack at maybeClose (child_process.js:1015:16) -10 verbose stack at Process.ChildProcess._handle.onexit (child_process.js:1087:5) -11 verbose pkgid C3Projects--VideoStoreAPI@0.0.0 -12 verbose cwd /Users/elsa/ada/projects/project-forks/C3Projects--VideoStoreAPI -13 error Darwin 14.5.0 -14 error argv "node" "/usr/local/bin/npm" "start" -15 error node v0.12.2 -16 error npm v2.7.5 -17 error code ELIFECYCLE -18 error C3Projects--VideoStoreAPI@0.0.0 start: `node ./bin/www` -18 error Exit status 1 -19 error Failed at the C3Projects--VideoStoreAPI@0.0.0 start script 'node ./bin/www'. -19 error This is most likely a problem with the C3Projects--VideoStoreAPI package, -19 error not with npm itself. -19 error Tell the author that this fails on your system: -19 error node ./bin/www -19 error You can get their info via: -19 error npm owner ls C3Projects--VideoStoreAPI -19 error There is likely additional logging output above. -20 verbose exit [ 1, true ] diff --git a/package.json b/package.json index 0ab806b..d68cff2 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,10 @@ "body-parser": "~1.13.2", "cookie-parser": "~1.3.5", "debug": "~2.2.0", - "express": "~4.13.1", + "express": "^4.13.3", "jade": "~1.11.0", "morgan": "~1.6.1", - "serve-favicon": "~2.3.0" + "serve-favicon": "~2.3.0", + "sqlite3": "^3.1.0" } -} \ No newline at end of file +} diff --git a/utils/schema.js b/utils/schema.js new file mode 100644 index 0000000..d5630c6 --- /dev/null +++ b/utils/schema.js @@ -0,0 +1,31 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development', + db = new sqlite3.Database('db/' + db_env + '.db'); + +var movie_fields = [ + ['title', 'text'], + ['overview', 'text'], + ['release_date', 'text'], + ['inventory', 'integer'] +] + +db.serialize(function() { + // drop existing tables + db.run("DROP TABLE IF EXISTS movies;"); + + // create fresh versions of those tables + db.run("CREATE TABLE movies (id INTEGER PRIMARY KEY);"); + + // add columns that I need to those tables + for(var i = 0; i < movie_fields.length; i++) { + var name = movie_fields[i][0], + type = movie_fields[i][1]; + + // ALTER TABLE movies ADD COLUMN title text; + db.run("ALTER TABLE movies ADD COLUMN " + name + " " + type + ";"); + } +}); + +db.close(); diff --git a/utils/seeds.js b/utils/seeds.js new file mode 100644 index 0000000..e69de29 From 014a7d3cef4709eae461da840b127abb80510908 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Thu, 17 Sep 2015 14:05:07 -0700 Subject: [PATCH 07/80] Pushing --- db/development.db | Bin 2048 -> 2048 bytes utils/schema.js | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/db/development.db b/db/development.db index 2b8246606df6aa6a5864651217be9b50563c21ec..61d3c45c270ebdb68f66f4fb840b813d4af30c19 100644 GIT binary patch delta 33 gcmZn=Xb_knEy&Hlz`z8=Fu*-g$C#0OW5NP<07wo5sQ>@~ delta 33 gcmZn=Xb_knEhxyqz`z8=Fd#Tl$Cy!YW5NP<07(P{y8r+H diff --git a/utils/schema.js b/utils/schema.js index d5630c6..6e2369c 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -22,7 +22,8 @@ db.serialize(function() { for(var i = 0; i < movie_fields.length; i++) { var name = movie_fields[i][0], type = movie_fields[i][1]; - + console.log(name); + console.log(type); // ALTER TABLE movies ADD COLUMN title text; db.run("ALTER TABLE movies ADD COLUMN " + name + " " + type + ";"); } From c92aa3d4b81b3e46532554a4c2a0f5d4a7d34820 Mon Sep 17 00:00:00 2001 From: Elsa Date: Thu, 17 Sep 2015 14:20:22 -0700 Subject: [PATCH 08/80] Added database and movies table, seeded movies. --- db/development.db | Bin 2048 -> 90112 bytes utils/seeds.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/db/development.db b/db/development.db index 61d3c45c270ebdb68f66f4fb840b813d4af30c19..ba388c7ed5fd852f2dc1efc6ba0d60e3171d2670 100644 GIT binary patch literal 90112 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 Wcta3EU*jnI{}h}5%>2UXL;nN#k~J&< delta 39 tcmZoTz}g@%L7J7Dfq{W(qJljm_r`<;%xt_sE(6PU!5Bs+=E({?KLDtk2s;1( diff --git a/utils/seeds.js b/utils/seeds.js index e69de29..3fd7d3f 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -0,0 +1,31 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development', + db = new sqlite3.Database('db/' + db_env + '.db'); + +var movies = require('../movies'); +var movie_statement = db.prepare( + "INSERT INTO movies(title, overview, inventory, release_date) \ + VALUES (?, ?, ?, ?);" +); + +db.serialize(function() { + // loop them movies + for (var i = 0; i < movies.length; i++) { + var movie = movies[i]; + + // insert each into db + movie_statement.run( + movie.title, + movie.overview, + movie.inventory, + movie.release_date + ); + } + movie_statement.finalize(); +}); + + + +db.close(); From c07986737eaa71a36ed33de1d9025ae0c41eb47e Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Thu, 17 Sep 2015 14:30:03 -0700 Subject: [PATCH 09/80] Adds customers schema to schema and development.db --- db/development.db | Bin 90112 -> 90112 bytes utils/schema.js | 28 ++++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/db/development.db b/db/development.db index ba388c7ed5fd852f2dc1efc6ba0d60e3171d2670..023a2a63015bbfdacdb773da14e5aef3db51e271 100644 GIT binary patch delta 800 zcmc)I%TE(g6vy$~TPh-;t*@#ey?_s@#TUN72NoEiQm~FyA)3^2<_0H1$IM)!t_tkj zX^8)U(LaENTmBXo{0;8(J4tC=xOeeMe&;0jX3n{@ww+qrPJQah>iVmYzXq&XHV%1XB;zZd} zt+pESJyn{oTGN)TDt2kEXfLW+Yq6l}&Wct>zc&RH>LouiI@DgxG0mRid7+M?W>t25 z^P!m|< zhT}Ma9`xcQ`jCS{KL&(oh(W?BoW>cP#Srp1hw~_47#DC6mv9+ZFoLVNhU>V2n;69y zZs9iW;4a2-4@FFf=R!;preNVdrZIyO9$*$_%wZl6QNbhFc#L?9@gM#a&k%1^ZoTaI QD&=3>{F;hn%N0=Q*dGpJO?t<^UN5(j$A77_%}A{V)-MJ;-ZTJ$@M4%`o%!-ad!_nw7y=fb-4PNH|qvaC@) z|A+f-L3!ksRrt*v&LtbO7G?uphYS8~xi#F}R^G^}ypUyiDv#uW_+?3Mh{_e2kx4lx<8oX^q+hzE zO&X;pu(r}{`-3juJU2d~9duY*=#VziqgqD?)tqZUt7yMg(j!_%`?QqyYBBB60@|&4 zv`cg7Va=k4G=p|(8tu>&+OA2oO%rIV#?cmyvG{$TMsw1vQM5@TX``Cd4eF-#8cORl zgx0FbeNb&$Ge@egk*cet@-nHIB?qQS`9)H8fs~#nB@?9hEGare3Qv=QagslOg655p zT=Ua&hDi1x**`$CdP!yv+1EufI!SsvNoyskK9bTzlIuxQElD)V5=^o93KC~Z?JXg( zrdCWoiOwZa*k5u1K_-Ya{vGU diff --git a/utils/schema.js b/utils/schema.js index 6e2369c..6b988ee 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -9,24 +9,44 @@ var movie_fields = [ ['overview', 'text'], ['release_date', 'text'], ['inventory', 'integer'] -] +]; + +var customer_fields = [ + ['name', 'text'], + ['registered_at', 'text'], + ['address', 'text'], + ['city', 'text'], + ['state', 'text'], + ['postal_code', 'text'], + ['phone', 'text'], + ['account_credit', 'integer'] +]; db.serialize(function() { // drop existing tables db.run("DROP TABLE IF EXISTS movies;"); + db.run("DROP TABLE IF EXISTS customers;"); // create fresh versions of those tables db.run("CREATE TABLE movies (id INTEGER PRIMARY KEY);"); - + db.run("CREATE TABLE customers (id INTEGER PRIMARY KEY);"); // add columns that I need to those tables for(var i = 0; i < movie_fields.length; i++) { var name = movie_fields[i][0], type = movie_fields[i][1]; - console.log(name); - console.log(type); + // ALTER TABLE movies ADD COLUMN title text; db.run("ALTER TABLE movies ADD COLUMN " + name + " " + type + ";"); } + + for(var i = 0; i < customer_fields.length; i++) { + var name = customer_fields[i][0], + type = customer_fields[i][1]; + + // ALTER TABLE customers ADD COLUMN title text; + db.run("ALTER TABLE customers ADD COLUMN " + name + " " + type + ";"); + } + }); db.close(); From f5f00c6091800a6e7e5de00983b30b9e560e0a9c Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Thu, 17 Sep 2015 14:37:25 -0700 Subject: [PATCH 10/80] Adds seed data for customers.json --- db/development.db | Bin 90112 -> 90112 bytes utils/seeds.js | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/db/development.db b/db/development.db index 023a2a63015bbfdacdb773da14e5aef3db51e271..ab94f88d2de3815373564aba4d4914c90dda9a74 100644 GIT binary patch delta 26318 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 T816H@#y~n<@|fL delta 1466 zcmY*Z3s99+5Z>MY-0KAaz21u=ihvjjib3TgmCUk2r$#IgseH_6KJXQyiLYcYK9~s~ zbWpUMw3x;hGp0KOKB&yHCNpxB#2Tm6h=iJv((;i(drPP3%DsJ(6esNy+8~P7% zqdE(X*<~`(RGO%vmFAAlH&w2yw5nWDX*6Okk`ed$HmB0mt9Cl5oeFB7sCEpExN6%S zF^7Vy_u6&8O80jMwVgq2yL#EGJLN7TA*FvRvII>Cb_B7k3gUcejrI{P6cba2m@j90 zG2$Z0j$4FSASdG^9b6(8`^-Xo#g0k*92bkP?_Y?^tT*WfE|rjE4`QKo>ED33LRtoV zfw)|%2d*VtDd}mE249uu1_^mufyxM=)p~ngHi0lk`F&^v5`#6vHsUHNAGQ!fbAc-G zGX%)B-p*qTC$P&-9q}%)vF`K}#Ew0cUPnyw<|A{odVnF;o7!&H6tG*uN8KWK0T64{ z-lu1x352po3ZDp5k`A)wNk(5J&=M?#NbQ8+2o!Kf>5;Km0im{ROfzwaEFb$Cx>tcS zKtu8t6`(0j;&560%svH$+0=3M9)i6V3Ktr7A<+aB~9@B*F115m9C zj%S~Zx>-rw#n#@uMeLR8TX72REDg6)P;d7V&?O~mAQR}pe);i_Slz{5fW5?<>PNF? zGDk}9UoTUrgK_GZA~8-aUC?koN7=;YYsB4bbW1I9S7~TTK@XuH=qmaZ<wJLX8QXXPyZr+KAK(uC{5y(0 z+)E0-)xKRliDTrai<9WCFCWk-^eJNp6Ahr1nc!@pGRze3q0xGI_sfLCBXu4qTaJ*5BXmj^fxhMrFMVlpog7q6BY44oHT_yufr~}i1mf{(h zt`rkYAdg2#-qyM5V7P7ArtfE%tbAh~#u|tPYR5)6q>KL#j^syeVtEDeNco^VS&u#< z&6~UHoGwm Date: Thu, 17 Sep 2015 15:07:38 -0700 Subject: [PATCH 11/80] Adds movie_copies table --- db/development.db | Bin 90112 -> 90112 bytes utils/schema.js | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/db/development.db b/db/development.db index ab94f88d2de3815373564aba4d4914c90dda9a74..a9b0447f4469ef47220ff0bd06e3bf65499c0d0a 100644 GIT binary patch delta 555 zcmZ9}+b#o96vpvAGm1o9G!8`_wnLdx)cJg<+O2A}j3Hb(wHKvALfk4(Kqm17;syEw zeHyPIaUuRggxJY1Sy^lEi}med*;6cg9{k>6A;caG*qD0^jnxf{!PlBv<4hP@LFiLj zK`%Sr@O#Op+gkk2G^%`ofOcPZeRN#NonPGKa|b6Em-*b)-`W$kRK!-&j;y4V{5vtF zdz>x3Dd`s9qkL8-(zc2#E95q1EMuueJS~%IUz$Hxg3?kkWvO&jZGXSJGV|Hs*8}I& zc&e;r15r`(77fFZ;SX)wsjiORHqvx=+{F$oY+(}_Y#@as5?DhV3af}>1EbS#*hFKoL+BE-!g52n&evaCyJqE0SQ8VY%YSID<2TK;tqJ5))%0 z5@Vx@Mx!wnnh;}RqcJu%G&VLi6x!I>XrYC_!#`l}Cf_%AXXc)J&pC6K-z6-+OSqMp zvR4Q(4hW=xthKT*Zic?@N}^fe_ooa0mOp(XCGga@VfdoH^;xbY;dA z)}EHmJg?~Lu5Ou9H>D=0m4jQFtK^ivF`2mOi=%*fF)05WbmR1FmT+-~zV;u68Hj(szR%z`f`L z+!*fAAQ%F}fZI08DMvBjZjOP|fZOXw^B?#d_!MOje*2c8ydEBi5200@B1ZIaCGPY|D*fZzY<7& K9Z2>4>HQ1YcNs_k diff --git a/utils/schema.js b/utils/schema.js index 6b988ee..8a3335c 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -22,14 +22,33 @@ var customer_fields = [ ['account_credit', 'integer'] ]; + +// var rental_fields = [ +// ['checkout_date', 'text'], +// ['return_date', 'text'], +// ['return_status', 'integer'], +// ['cost', 'integer'] +// [''] +// ] + // sqlite does no have a separate boolean class, using values 0 and 1 for true and false + db.serialize(function() { // drop existing tables db.run("DROP TABLE IF EXISTS movies;"); + db.run("DROP TABLE IF EXISTS movie_copies;"); db.run("DROP TABLE IF EXISTS customers;"); // create fresh versions of those tables db.run("CREATE TABLE movies (id INTEGER PRIMARY KEY);"); db.run("CREATE TABLE customers (id INTEGER PRIMARY KEY);"); + + // movie copies table with foreign keys + db.run("CREATE TABLE movie_copies( \ + id INTEGER PRIMARY KEY, \ + movie_id INTEGER, \ + FOREIGN KEY (movie_id) REFERENCES movies(id) \ + );"); + // add columns that I need to those tables for(var i = 0; i < movie_fields.length; i++) { var name = movie_fields[i][0], From 24edeeeecc7fd07e26873373863ef3f887685749 Mon Sep 17 00:00:00 2001 From: Elsa Date: Thu, 17 Sep 2015 15:34:20 -0700 Subject: [PATCH 12/80] Added rental table to schema. --- db/development.db | Bin 90112 -> 90112 bytes utils/schema.js | 33 +++++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/db/development.db b/db/development.db index a9b0447f4469ef47220ff0bd06e3bf65499c0d0a..ffe777380c29575f334f8e294e2994fd8f64f10f 100644 GIT binary patch delta 318 zcmZoTz}j$tb%L~@8v_GF1Q0U=aWD`EP1G?Kbz{(d#?1@lu`rxuU@m7`!^FsNaS3%j_qG-HcnNn%n?YEf!lNn%bhlwxxZa&-)GRS0o(@^Mvw2u@j0^?0KW;U|bQ2+rq{~%XScRvMh*GL5oBwIBVf?VBPgIxWbU4s>1;>8-7 zDVktyllL>N*_^`|!nlcrorN)IG6%W1GRY3Rqm!BS z%}ixg*eZAtL1hsi5icU>Z+2tVfd_MVGoRn*`}^KH zn!j~4|L$Xp=M2Mm9!?of7tZ`Q~g^vG%KR}(Z-=86=LRb8FhNRS^%H#h*Dn)GOQjD(pQIO_7jN7~!#Cfol zXqf(5n>mE>n&7yO1Q9l6%xzp;xno@zew>`JjHlY9S_ReZ!6=Ht6pcH1ng&s{8}wEY zrl>j8$7tel?r{ffCB~9Fwi1M()-cTv3gk0Mms`$d7m5eB$d)K4%$rTP_#KbzdjZC`Ri8*lQH% z%Q^%}j;`d zU+Xa4%XNRd35hzg#wb*YF~=r~lSYe7bzdu4#*=M%X1UPKwT9;GWJ#V)_eq@p?-P4a zoT+J%uOpOAD$o>kN&DI4r(Yi*a|#?6E7&A=ZP=@7G;hCBtWulBCf%hX)|~+qCK!R= z{=lDtsQV8H7AZZ!!S7!Xbt%*zhMAS8(_7mNqbS`=baJgjIm0fvQRwSK1l!7SMdR$V P-^2668>c@xZEpSzqQ4h7 diff --git a/utils/schema.js b/utils/schema.js index 8a3335c..d25dc8d 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -23,13 +23,13 @@ var customer_fields = [ ]; -// var rental_fields = [ -// ['checkout_date', 'text'], -// ['return_date', 'text'], -// ['return_status', 'integer'], -// ['cost', 'integer'] -// [''] -// ] +var rental_fields = [ + ['checkout_date', 'text'], + ['return_date', 'text'], + ['return_status', 'integer'], + ['cost', 'integer'] + // [''] +]; // sqlite does no have a separate boolean class, using values 0 and 1 for true and false db.serialize(function() { @@ -37,6 +37,7 @@ db.serialize(function() { db.run("DROP TABLE IF EXISTS movies;"); db.run("DROP TABLE IF EXISTS movie_copies;"); db.run("DROP TABLE IF EXISTS customers;"); + db.run("DROP TABLE IF EXISTS rentals;"); // create fresh versions of those tables db.run("CREATE TABLE movies (id INTEGER PRIMARY KEY);"); @@ -49,6 +50,14 @@ db.serialize(function() { FOREIGN KEY (movie_id) REFERENCES movies(id) \ );"); + db.run("CREATE TABLE rentals( \ + id INTEGER PRIMARY KEY, \ + movie_id INTEGER, \ + customer_id INTEGER, \ + FOREIGN KEY (movie_id) REFERENCES movies(id), \ + FOREIGN KEY (customer_id) REFERENCES customers(id) \ + );"); + // add columns that I need to those tables for(var i = 0; i < movie_fields.length; i++) { var name = movie_fields[i][0], @@ -58,7 +67,7 @@ db.serialize(function() { db.run("ALTER TABLE movies ADD COLUMN " + name + " " + type + ";"); } - for(var i = 0; i < customer_fields.length; i++) { + for(var i = 0; i < customer_fields.length; i++) { var name = customer_fields[i][0], type = customer_fields[i][1]; @@ -66,6 +75,14 @@ db.serialize(function() { db.run("ALTER TABLE customers ADD COLUMN " + name + " " + type + ";"); } + for(var i = 0; i < rental_fields.length; i++) { + var name = rental_fields[i][0], + type = rental_fields[i][1]; + + // ALTER TABLE customers ADD COLUMN title text; + db.run("ALTER TABLE rentals ADD COLUMN " + name + " " + type + ";"); + } + }); db.close(); From d67a1485a4712d2445f81a4ac541396264fc0a18 Mon Sep 17 00:00:00 2001 From: Elsa Date: Thu, 17 Sep 2015 15:40:53 -0700 Subject: [PATCH 13/80] Added copies_available to movies table. --- db/development.db | Bin 90112 -> 90112 bytes utils/schema.js | 4 ++-- utils/seeds.js | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/db/development.db b/db/development.db index ffe777380c29575f334f8e294e2994fd8f64f10f..19e53a39dac1e2b5ab966cd1bb421f44e427c078 100644 GIT binary patch delta 5388 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 delta 2109 zcmbtVYitx%6h7z9w0CYF*g|W0w7|8LZK35^D5W4&C@qgdp}@A3M}b1Yg7PX45z5T$ zZb6hvCb$p-0yVxs!M(@^Uo^xJYt)D~q#`B+5Sk!~sHjmxJX2at{6%z=vwP?6d4A_R zXLdA2>}ZO3zGqi92>{ASG?G%1S$i{wJxsS*H=<+dQHN&GHnHOjq1lO#oAdUG6HG)R zPwLSF&1$Dw+m0DWi9^;}oZbg5!e@q zWPMlI)4Fg-4b(`*YtNHh%j+(SQqf2{Q$4k`X|GMq9E zSEDei`%@0KM+Wy5<5eRfjf3VSLJmWHPs(s%JkB5l zs}^t=>qi+r(iIot>6rT=Q;98j1Kxwwz4_gQnK+;DvQP%o3~UfqdIbUIOOxTV20lVQ zlIC&9wQFSfdx7zU&$e<7BkVjGG@|j>E^ZUslX?nUI+C&;FXNErCl56`R*^-jm+Ce* z$>603JSc2!E{A-7o(x-&xUHijuoU1rETy8ntZq)Qst8S-9llwFDTE;#1Z)st*pCT& zMk!Sk@JcoE_ht4L_p z5)Qr0;nKPN<8onoX1KkMmCnMSjzqboAXEZWlAF1rK4m%??&&7gingHk4_nuCu+>^s z?AGy+RK|DJXv9wAFwnnDs?9g*F?2=Oqcki9Eyx@!rQ8b$$+1&u8hn$b@_wB|k2r;3 zvP-3N;L;yP^<)l7W|njgeY3bn`(!{Iz)ANDz)UHktgR&JbZ^;j6c7>7R;YSAO^cMH?`NqWStr)$2^ZPTGWl)k2tJ9TRq59+5vl*-Ux&9kMn?6YKo>q<-AO z&`Gx#qL?-ju9JGJ@GZ!tWwevRzxJk=2{U&Tb;FtMd;+IhmBpF_dx ziA5Q2TqNh-ksM|QN~KCZasiXwe(BH+SPM(SR5}1yu_N5>(k}b$C?}xTW>bG{LL&X( zEn$uxPAkVMluqwMr-YR;j8tjj)VGH`*r@N zYtT9}%cXN|S-r61Inm$0RjS(M4M^l|0=6BR$nF$zJ(B1Ym?PEsO5(az7vb*t9H|0J Ww&3Y9iuNxG=` Date: Thu, 17 Sep 2015 16:20:19 -0700 Subject: [PATCH 14/80] Added all movies endpoint. Yay. --- app.js | 4 ++-- controllers/movies.js | 13 +++++++++++++ routes/movies.js | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 4628960..b6aadab 100644 --- a/app.js +++ b/app.js @@ -5,7 +5,7 @@ var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); -// var movies = require('./routes/movies'); +var movies = require('./routes/movies'); // var customers = require('./routes/customers'); // var rentals = require('./routes/rentals'); var zomg = require('./routes/zomg'); @@ -24,7 +24,7 @@ app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); -// app.use('/movies', movies); +app.use('/movies', movies); // app.use('/customers', customers); // app.use('/rentals', rentals); app.use('/zomg', zomg); diff --git a/controllers/movies.js b/controllers/movies.js index e69de29..c512988 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -0,0 +1,13 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development', + db = new sqlite3.Database('db/' + db_env + '.db'); + +exports.moviesController = { + movies: function(req, res) { + db.all("SELECT * FROM movies", function(err, all_movies) { + return res.status(200).json(all_movies); + }); + } +}; diff --git a/routes/movies.js b/routes/movies.js index 065f87c..142c89d 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -1,9 +1,11 @@ var express = require('express'); var router = express.Router(); +var movies_exports = require('../controllers/movies'); /* GET */ router.get('/', function(req, res, next) { // res.render('movies', { title: 'Express' }); + return movies_exports.moviesController.movies(req, res); }); module.exports = router; From 11bd7ae8265be17323ea5c3527e554ebe578008b Mon Sep 17 00:00:00 2001 From: Elsa Date: Thu, 17 Sep 2015 16:52:22 -0700 Subject: [PATCH 15/80] Added movies by title endpoint. Currently returns 'Jaws' correctly but not 'jaws'. --- controllers/movies.js | 15 ++++++++++++++- routes/movies.js | 6 ++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/controllers/movies.js b/controllers/movies.js index c512988..cc9e9eb 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -9,5 +9,18 @@ exports.moviesController = { db.all("SELECT * FROM movies", function(err, all_movies) { return res.status(200).json(all_movies); }); + }, + + movies_by_title: function(req, res) { + var title = req.params.title; + console.log(title); + db.get("SELECT * FROM movies WHERE title='" + title + "';", function(err, the_title) { + console.log(typeof title); + return res.status(200).json(the_title); + + }); } -}; + + + +}; // end exports.moviesController diff --git a/routes/movies.js b/routes/movies.js index 142c89d..7c58b45 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -8,4 +8,10 @@ router.get('/', function(req, res, next) { return movies_exports.moviesController.movies(req, res); }); +/* GET */ +router.get('/:title', function(req, res, next) { + // res.render('movies', { title: 'Express' }); + return movies_exports.moviesController.movies_by_title(req, res); +}); + module.exports = router; From 3a320b5413860c517ead12dd64f249be0d369464 Mon Sep 17 00:00:00 2001 From: Elsa Date: Thu, 17 Sep 2015 20:30:55 -0700 Subject: [PATCH 16/80] Added case insensitive 'like' querying by movie title. --- controllers/movies.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index cc9e9eb..d69d368 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -12,9 +12,9 @@ exports.moviesController = { }, movies_by_title: function(req, res) { - var title = req.params.title; + var title = req.params.title.toLowerCase(); console.log(title); - db.get("SELECT * FROM movies WHERE title='" + title + "';", function(err, the_title) { + db.get("SELECT * FROM movies WHERE title LIKE '" + title + "';", function(err, the_title) { console.log(typeof title); return res.status(200).json(the_title); From 181b422085d023852f015c8223d73c4ae696bc77 Mon Sep 17 00:00:00 2001 From: Elsa Date: Thu, 17 Sep 2015 20:43:36 -0700 Subject: [PATCH 17/80] Parameterized movie by title sql query to prevent injection attack, maybe. --- controllers/movies.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/controllers/movies.js b/controllers/movies.js index d69d368..6233db9 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -11,10 +11,20 @@ exports.moviesController = { }); }, + // movies_by_title: function(req, res) { + // var title = req.params.title.toLowerCase(); + // console.log(title); + // db.get("SELECT * FROM movies WHERE title LIKE '" + title + "';", function(err, the_title) { + // console.log(typeof title); + // return res.status(200).json(the_title); + // + // }); + // } + movies_by_title: function(req, res) { var title = req.params.title.toLowerCase(); console.log(title); - db.get("SELECT * FROM movies WHERE title LIKE '" + title + "';", function(err, the_title) { + db.get("SELECT * FROM movies WHERE title LIKE ?;", title, function(err, the_title) { console.log(typeof title); return res.status(200).json(the_title); From 5bb61b12a976beb586d2cb3af15d2b2e60b28ecc Mon Sep 17 00:00:00 2001 From: Elsa Date: Fri, 18 Sep 2015 09:56:54 -0700 Subject: [PATCH 18/80] Added npm-debug.log to gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 03e05e4..f9fb034 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store /node_modules +npm-debug.log From 24180ccd2fbd8590f21c0a6ad9e5b3bb80550e04 Mon Sep 17 00:00:00 2001 From: Elsa Date: Fri, 18 Sep 2015 09:57:24 -0700 Subject: [PATCH 19/80] Added db commands to package. --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d68cff2..ae849c1 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,10 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www" + "start": "nodemon ./bin/www", + "db:schema" : "node ./utils/schema", + "db:seed": "node ./utils/seeds", + "db:reset": "npm run db:schema; npm run db:seed" }, "dependencies": { "body-parser": "~1.13.2", From 3f7d7cf27ddd067991a3fb48e1f9773c0d19617b Mon Sep 17 00:00:00 2001 From: Elsa Date: Fri, 18 Sep 2015 09:59:31 -0700 Subject: [PATCH 20/80] Added dev db to gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f9fb034..e9762ca 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store /node_modules npm-debug.log +/db From a2661f8040fc1e69651f8b66f015f069d4c8e0c7 Mon Sep 17 00:00:00 2001 From: Elsa Date: Fri, 18 Sep 2015 10:00:01 -0700 Subject: [PATCH 21/80] Cleaned up console logs calls. --- controllers/movies.js | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index 6233db9..137452b 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -1,8 +1,8 @@ "use strict"; var sqlite3 = require('sqlite3').verbose(), - db_env = process.env.DB || 'development', - db = new sqlite3.Database('db/' + db_env + '.db'); + db_env = process.env.DB || 'development', + db = new sqlite3.Database('db/' + db_env + '.db'); exports.moviesController = { movies: function(req, res) { @@ -11,23 +11,10 @@ exports.moviesController = { }); }, - // movies_by_title: function(req, res) { - // var title = req.params.title.toLowerCase(); - // console.log(title); - // db.get("SELECT * FROM movies WHERE title LIKE '" + title + "';", function(err, the_title) { - // console.log(typeof title); - // return res.status(200).json(the_title); - // - // }); - // } - movies_by_title: function(req, res) { var title = req.params.title.toLowerCase(); - console.log(title); db.get("SELECT * FROM movies WHERE title LIKE ?;", title, function(err, the_title) { - console.log(typeof title); return res.status(200).json(the_title); - }); } From 2ff3bace95616a49f96d9c424cb65e99f891287c Mon Sep 17 00:00:00 2001 From: Elsa Date: Fri, 18 Sep 2015 10:03:19 -0700 Subject: [PATCH 22/80] remove db from github tracking --- db/development.db | Bin 90112 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 db/development.db diff --git a/db/development.db b/db/development.db deleted file mode 100644 index 19e53a39dac1e2b5ab966cd1bb421f44e427c078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 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 Date: Fri, 18 Sep 2015 10:14:39 -0700 Subject: [PATCH 23/80] Closing db after requests now. --- controllers/movies.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/controllers/movies.js b/controllers/movies.js index 137452b..ca849eb 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -2,22 +2,31 @@ var sqlite3 = require('sqlite3').verbose(), db_env = process.env.DB || 'development', - db = new sqlite3.Database('db/' + db_env + '.db'); + db; + exports.moviesController = { movies: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); db.all("SELECT * FROM movies", function(err, all_movies) { + db.close(); return res.status(200).json(all_movies); }); + }, movies_by_title: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); var title = req.params.title.toLowerCase(); db.get("SELECT * FROM movies WHERE title LIKE ?;", title, function(err, the_title) { + db.close(); return res.status(200).json(the_title); }); + } + + }; // end exports.moviesController From e9cd9053e2019d08cd98725287f72ba4dc684928 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Fri, 18 Sep 2015 10:37:17 -0700 Subject: [PATCH 24/80] Adds route for movie by release date --- .gitignore | 2 +- controllers/movies.js | 12 +++++++++--- routes/movies.js | 5 +++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index e9762ca..0d7e40d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .DS_Store /node_modules npm-debug.log -/db +db/* diff --git a/controllers/movies.js b/controllers/movies.js index ca849eb..343ae1a 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -23,10 +23,16 @@ exports.moviesController = { return res.status(200).json(the_title); }); - } - - + }, + movies_by_release: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + var release = req.params.release_date; + db.get("SELECT * FROM movies WHERE release_date=?;", release, function(err, the_date) { + db.close(); + return res.status(200).json(the_date); + }); + } }; // end exports.moviesController diff --git a/routes/movies.js b/routes/movies.js index 7c58b45..dbde11d 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -14,4 +14,9 @@ router.get('/:title', function(req, res, next) { return movies_exports.moviesController.movies_by_title(req, res); }); +router.get('/release/:release_date', function(req, res, next) { + // res.render('movies', { title: 'Express' }); + return movies_exports.moviesController.movies_by_release(req, res); +}); + module.exports = router; From 5c72dfb78c6300bfa07172a0ae6452078c508e4d Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Fri, 18 Sep 2015 10:48:52 -0700 Subject: [PATCH 25/80] Adds route for all customers --- app.js | 4 ++-- controllers/customers.js | 16 ++++++++++++++++ controllers/movies.js | 12 ++++++++++++ routes/customers.js | 7 +++---- routes/movies.js | 10 ++++++++-- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/app.js b/app.js index b6aadab..66b17a9 100644 --- a/app.js +++ b/app.js @@ -6,7 +6,7 @@ var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var movies = require('./routes/movies'); -// var customers = require('./routes/customers'); +var customers = require('./routes/customers'); // var rentals = require('./routes/rentals'); var zomg = require('./routes/zomg'); @@ -25,7 +25,7 @@ app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/movies', movies); -// app.use('/customers', customers); +app.use('/customers', customers); // app.use('/rentals', rentals); app.use('/zomg', zomg); diff --git a/controllers/customers.js b/controllers/customers.js index e69de29..24f832a 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -0,0 +1,16 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development', + db; + + +exports.customersController = { + customers: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + db.all("SELECT * FROM customers", function(err, all_customers) { + db.close(); + return res.status(200).json(all_customers); + }); + } +}; diff --git a/controllers/movies.js b/controllers/movies.js index 343ae1a..9dbeee5 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -25,6 +25,18 @@ exports.moviesController = { }, + // current_renters_by_title: function(req, res) { + // db = new sqlite3.Database('db/' + db_env + '.db'); + // var title = req.params.title.toLowerCase();, + // order = req.params.order.toLowerCase(); + + // db.get("SELECT * FROM movies ORDER BY " + title "LIKE ?;", title, function(err, the_title) { + // db.close(); + // return res.status(200).json(the_title); + // }); + + // }, + movies_by_release: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); var release = req.params.release_date; diff --git a/routes/customers.js b/routes/customers.js index 25a2697..a5aa7d7 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -1,11 +1,10 @@ var express = require('express'); var router = express.Router(); -var customer_exports = require('..controllers/customers'); +var customer_exports = require('../controllers/customers'); -/* GET */ +// GET CUSTOMER ROUTES router.get('/', function(req, res, next) { - // res.send('respond with a resource'); - return customer_exports.customerController.zomg(req, res); + return customer_exports.customersController.customers(req, res); }); module.exports = router; diff --git a/routes/movies.js b/routes/movies.js index dbde11d..a5831e8 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -2,21 +2,27 @@ var express = require('express'); var router = express.Router(); var movies_exports = require('../controllers/movies'); -/* GET */ +/* GET MOVIE ROUTES */ router.get('/', function(req, res, next) { // res.render('movies', { title: 'Express' }); return movies_exports.moviesController.movies(req, res); }); -/* GET */ router.get('/:title', function(req, res, next) { // res.render('movies', { title: 'Express' }); return movies_exports.moviesController.movies_by_title(req, res); }); +// router.get('/:title/current_renters/:order', function(req, res, next) { +// // res.render('movies', { title: 'Express' }); +// return movies_exports.moviesController.current_renters_by_title(req, res); +// }); + router.get('/release/:release_date', function(req, res, next) { // res.render('movies', { title: 'Express' }); return movies_exports.moviesController.movies_by_release(req, res); }); + + module.exports = router; From 7595884befb83f7db87201af1fde306dc5e6aa2e Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Fri, 18 Sep 2015 11:00:33 -0700 Subject: [PATCH 26/80] Adds WIP customers by name route and function --- controllers/customers.js | 14 ++++++++++++-- routes/customers.js | 4 ++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 24f832a..9b45caa 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -4,7 +4,6 @@ var sqlite3 = require('sqlite3').verbose(), db_env = process.env.DB || 'development', db; - exports.customersController = { customers: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); @@ -12,5 +11,16 @@ exports.customersController = { db.close(); return res.status(200).json(all_customers); }); - } + }, + + customers_by_name: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + var name = req.params.name.toLowerCase(); + db.get("SELECT * FROM customers WHERE name LIKE %?%;", name, function(err, the_name) { + db.close(); + return res.status(200).json(the_name); + }); + + }, + }; diff --git a/routes/customers.js b/routes/customers.js index a5aa7d7..0a5eced 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -7,4 +7,8 @@ router.get('/', function(req, res, next) { return customer_exports.customersController.customers(req, res); }); +router.get('/names/:name', function(req, res, next) { + return customer_exports.customersController.customers_by_name(req, res); +}); + module.exports = router; From 8992353df71660fee2ead8eb0ca003355630254b Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Fri, 18 Sep 2015 11:19:35 -0700 Subject: [PATCH 27/80] Adds WIP customers by name function --- controllers/customers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 9b45caa..7f7ba7d 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -15,8 +15,8 @@ exports.customersController = { customers_by_name: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); - var name = req.params.name.toLowerCase(); - db.get("SELECT * FROM customers WHERE name LIKE %?%;", name, function(err, the_name) { + var name = req.params.name; + db.get("SELECT * FROM customers WHERE name LIKE ?;", name, function(err, the_name) { db.close(); return res.status(200).json(the_name); }); From 09c44d3c2bfa9a0996ce7a03fa56584715eaa461 Mon Sep 17 00:00:00 2001 From: Elsa Date: Fri, 18 Sep 2015 11:26:22 -0700 Subject: [PATCH 28/80] Added route and action to return customers by register date. Only works with exact string. --- controllers/customers.js | 10 ++++++++++ routes/customers.js | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/controllers/customers.js b/controllers/customers.js index 7f7ba7d..310c1a0 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -23,4 +23,14 @@ exports.customersController = { }, + customers_by_register_date: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + var date = req.params.date; + db.get("SELECT * FROM customers WHERE registered_at LIKE ?;", date, function(err, the_date) { + db.close(); + return res.status(200).json(the_date); + }); + + }, + }; diff --git a/routes/customers.js b/routes/customers.js index 0a5eced..f83ca2e 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -11,4 +11,8 @@ router.get('/names/:name', function(req, res, next) { return customer_exports.customersController.customers_by_name(req, res); }); +router.get('/date/:date', function(req, res, next) { + return customer_exports.customersController.customers_by_register_date(req, res); +}); + module.exports = router; From da227c81a6cdeeeb8723b4805ab071f028c9d044 Mon Sep 17 00:00:00 2001 From: Elsa Date: Fri, 18 Sep 2015 11:29:31 -0700 Subject: [PATCH 29/80] Added route and action to return customers by postal code. Only works with exact. --- controllers/customers.js | 10 ++++++++++ routes/customers.js | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/controllers/customers.js b/controllers/customers.js index 310c1a0..925e9f7 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -33,4 +33,14 @@ exports.customersController = { }, + customers_by_postal_code: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + var zipcode = req.params.zipcode; + db.get("SELECT * FROM customers WHERE postal_code LIKE ?;", zipcode, function(err, the_code) { + db.close(); + return res.status(200).json(the_code); + }); + + }, + }; diff --git a/routes/customers.js b/routes/customers.js index f83ca2e..dea4458 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -15,4 +15,8 @@ router.get('/date/:date', function(req, res, next) { return customer_exports.customersController.customers_by_register_date(req, res); }); +router.get('/zipcode/:zipcode', function(req, res, next) { + return customer_exports.customersController.customers_by_postal_code(req, res); +}); + module.exports = router; From fe6182529f6d5870ccc184603f045e45f92f49c3 Mon Sep 17 00:00:00 2001 From: Elsa Date: Fri, 18 Sep 2015 11:55:55 -0700 Subject: [PATCH 30/80] Created movie_copies table and seeded it based on movies table inventory -- inventory number of times. --- app.js | 2 ++ controllers/movie_copies.js | 18 ++++++++++++++++++ routes/movie_copies.js | 11 +++++++++++ utils/seeds.js | 23 ++++++++++++++++++++++- 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 controllers/movie_copies.js create mode 100644 routes/movie_copies.js diff --git a/app.js b/app.js index 66b17a9..738cb2f 100644 --- a/app.js +++ b/app.js @@ -6,6 +6,7 @@ var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var movies = require('./routes/movies'); +var movie_copies = require('./routes/movie_copies') var customers = require('./routes/customers'); // var rentals = require('./routes/rentals'); var zomg = require('./routes/zomg'); @@ -25,6 +26,7 @@ app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/movies', movies); +app.use('/copies', movie_copies); app.use('/customers', customers); // app.use('/rentals', rentals); app.use('/zomg', zomg); diff --git a/controllers/movie_copies.js b/controllers/movie_copies.js new file mode 100644 index 0000000..a1d8211 --- /dev/null +++ b/controllers/movie_copies.js @@ -0,0 +1,18 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development', + db; + + +exports.movie_copiesController = { + copies: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + db.all("SELECT * FROM movie_copies", function(err, all_copies) { + db.close(); + return res.status(200).json(all_copies); + }); + + } + +}; // end exports.moviesController diff --git a/routes/movie_copies.js b/routes/movie_copies.js new file mode 100644 index 0000000..a60fb0a --- /dev/null +++ b/routes/movie_copies.js @@ -0,0 +1,11 @@ +var express = require('express'); +var router = express.Router(); +var movie_copies_exports = require('../controllers/movie_copies'); + +/* GET MOVIE ROUTES */ +router.get('/', function(req, res, next) { + // res.render('movies', { title: 'Express' }); + return movie_copies_exports.movie_copiesController.copies(req, res); +}); + +module.exports = router; diff --git a/utils/seeds.js b/utils/seeds.js index 14e7943..d1b6cd6 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -10,10 +10,17 @@ var movie_statement = db.prepare( VALUES (?, ?, ?, ?, ?);" ); +var movie_copies_statement = db.prepare( + "INSERT INTO movie_copies(movie_id) \ + VALUES (?);" +); + var customers = require('../customers'); var customers_statement = db.prepare( "INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ - VALUES (?, ?, ?, ?, ?, ?, ?, ?);") + VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); + + db.serialize(function() { // loop them movies @@ -31,6 +38,20 @@ db.serialize(function() { } movie_statement.finalize(); + // loop them movies FOR COPIES + for (var i = 0; i < movies.length; i++) { + var movie = movies[i]; // this needs to be from db, not json seed + var num_copies = movie.inventory; + + for (var j = 0; j < num_copies; j++) { + console.log(movie); + movie_copies_statement.run( + i+1 + ); + } + } + movie_copies_statement.finalize(); + for (var i = 0; i < customers.length; i++) { var customer = customers[i]; // insert each into db From fcac8de70c640d385317c70f9f20eadd02f00dbd Mon Sep 17 00:00:00 2001 From: Elsa Date: Fri, 18 Sep 2015 13:19:16 -0700 Subject: [PATCH 31/80] Got sql like to be fuzzy by adding percents to variable string before statement insertion. Still only returns the first record it finds. --- controllers/customers.js | 9 +++++++++ controllers/movie_copies.js | 4 ++++ controllers/movies.js | 8 +++++++- controllers/rentals.js | 5 +++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/controllers/customers.js b/controllers/customers.js index 925e9f7..1451545 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -4,6 +4,11 @@ var sqlite3 = require('sqlite3').verbose(), db_env = process.env.DB || 'development', db; +function addPercents(variable) { + var percented = "%" + variable + "%"; + return percented; +} + exports.customersController = { customers: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); @@ -16,8 +21,10 @@ exports.customersController = { customers_by_name: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); var name = req.params.name; + name = addPercents(name); db.get("SELECT * FROM customers WHERE name LIKE ?;", name, function(err, the_name) { db.close(); + console.log(arguments); return res.status(200).json(the_name); }); @@ -26,6 +33,7 @@ exports.customersController = { customers_by_register_date: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); var date = req.params.date; + date = addPercents(date); db.get("SELECT * FROM customers WHERE registered_at LIKE ?;", date, function(err, the_date) { db.close(); return res.status(200).json(the_date); @@ -36,6 +44,7 @@ exports.customersController = { customers_by_postal_code: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); var zipcode = req.params.zipcode; + zipcode = addPercents(zipcode); db.get("SELECT * FROM customers WHERE postal_code LIKE ?;", zipcode, function(err, the_code) { db.close(); return res.status(200).json(the_code); diff --git a/controllers/movie_copies.js b/controllers/movie_copies.js index a1d8211..1bc3d0d 100644 --- a/controllers/movie_copies.js +++ b/controllers/movie_copies.js @@ -4,6 +4,10 @@ var sqlite3 = require('sqlite3').verbose(), db_env = process.env.DB || 'development', db; + function addPercents(variable) { + var percented = "%" + variable + "%"; + return percented; + } exports.movie_copiesController = { copies: function(req, res) { diff --git a/controllers/movies.js b/controllers/movies.js index 9dbeee5..7485fc3 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -4,6 +4,10 @@ var sqlite3 = require('sqlite3').verbose(), db_env = process.env.DB || 'development', db; + function addPercents(variable) { + var percented = "%" + variable + "%"; + return percented; + } exports.moviesController = { movies: function(req, res) { @@ -18,6 +22,7 @@ exports.moviesController = { movies_by_title: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); var title = req.params.title.toLowerCase(); + title = addPercents(title); db.get("SELECT * FROM movies WHERE title LIKE ?;", title, function(err, the_title) { db.close(); return res.status(200).json(the_title); @@ -40,7 +45,8 @@ exports.moviesController = { movies_by_release: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); var release = req.params.release_date; - db.get("SELECT * FROM movies WHERE release_date=?;", release, function(err, the_date) { + release = addPercents(release); + db.get("SELECT * FROM movies WHERE release_date ?;", release, function(err, the_date) { db.close(); return res.status(200).json(the_date); }); diff --git a/controllers/rentals.js b/controllers/rentals.js index e69de29..22b90ef 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -0,0 +1,5 @@ + +function addPercents(variable) { + var percented = "%" + variable + "%"; + return percented; +} From 2808415e0557debe9fb94c77f56f702c4b69a8a6 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Fri, 18 Sep 2015 13:35:15 -0700 Subject: [PATCH 32/80] WIP adding all rentals routes --- app.js | 4 ++-- controllers/movie_copies.js | 8 ++++---- controllers/rentals.js | 23 ++++++++++++++++++++--- routes/rentals.js | 8 ++++++++ utils/schema.js | 1 - utils/seeds.js | 16 +++++++++++++++- 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/app.js b/app.js index 738cb2f..6dd6c42 100644 --- a/app.js +++ b/app.js @@ -8,7 +8,7 @@ var bodyParser = require('body-parser'); var movies = require('./routes/movies'); var movie_copies = require('./routes/movie_copies') var customers = require('./routes/customers'); -// var rentals = require('./routes/rentals'); +var rentals = require('./routes/rentals'); var zomg = require('./routes/zomg'); var app = express(); @@ -28,7 +28,7 @@ app.use(express.static(path.join(__dirname, 'public'))); app.use('/movies', movies); app.use('/copies', movie_copies); app.use('/customers', customers); -// app.use('/rentals', rentals); +app.use('/rentals', rentals); app.use('/zomg', zomg); // catch 404 and forward to error handler diff --git a/controllers/movie_copies.js b/controllers/movie_copies.js index 1bc3d0d..842a169 100644 --- a/controllers/movie_copies.js +++ b/controllers/movie_copies.js @@ -4,10 +4,10 @@ var sqlite3 = require('sqlite3').verbose(), db_env = process.env.DB || 'development', db; - function addPercents(variable) { - var percented = "%" + variable + "%"; - return percented; - } +function addPercents(variable) { + var percented = "%" + variable + "%"; + return percented; + } exports.movie_copiesController = { copies: function(req, res) { diff --git a/controllers/rentals.js b/controllers/rentals.js index 22b90ef..f93edaf 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -1,5 +1,22 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development', + db; function addPercents(variable) { - var percented = "%" + variable + "%"; - return percented; -} + var percented = "%" + variable + "%"; + return percented; + } + +exports.rentalsController = { + rentals: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + db.all("SELECT * FROM rentals", function(err, all_rentals) { + db.close(); + return res.status(200).json(all_rentals); + }); + + } + +}; diff --git a/routes/rentals.js b/routes/rentals.js index e69de29..6ac9eef 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -0,0 +1,8 @@ +var express = require('express'); +var router = express.Router(); +var rentals_exports = require('../controllers/rentals'); + +/* GET RENTAL ROUTES */ +router.get('/', function(req, res, next) { + return rentals_exports.rentalsController.rentals(req, res); +}); diff --git a/utils/schema.js b/utils/schema.js index bad8896..20e25c8 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -28,7 +28,6 @@ var rental_fields = [ ['return_date', 'text'], ['return_status', 'integer'], ['cost', 'integer'] - // [''] ]; // sqlite does no have a separate boolean class, using values 0 and 1 for true and false diff --git a/utils/seeds.js b/utils/seeds.js index d1b6cd6..f7f6a5a 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -20,7 +20,10 @@ var customers_statement = db.prepare( "INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); - +var rental_statement = db.prepare( + "INSERT INTO rentals(checkout_date, return_date, return_status, cost, movie_id, customer_id \ + VALUES (?, ?, ?, ?, ?, ?);" +); db.serialize(function() { // loop them movies @@ -68,6 +71,17 @@ db.serialize(function() { } customers_statement.finalize(); + + rental_statement.run( + "2015-09-18", + "2015-09-26", + 0, // return_status (0 for false (checked out) 1 for true (returned)) + 5, // cost + 2, // movie_id + 6 // customer_id + ); + rental_statement.finalize(); + }); From 7e5904a1d4234da8de67b61f59e02465dfa06ad2 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Fri, 18 Sep 2015 14:22:50 -0700 Subject: [PATCH 33/80] Adds rental seed data and creates rental endpoint --- app.js | 8 ++++---- routes/movies.js | 2 -- routes/rentals.js | 3 +++ utils/seeds.js | 9 ++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app.js b/app.js index 6dd6c42..987d3e9 100644 --- a/app.js +++ b/app.js @@ -5,11 +5,11 @@ var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); -var movies = require('./routes/movies'); +var movies = require('./routes/movies'); var movie_copies = require('./routes/movie_copies') -var customers = require('./routes/customers'); -var rentals = require('./routes/rentals'); -var zomg = require('./routes/zomg'); +var customers = require('./routes/customers'); +var rentals = require('./routes/rentals'); +var zomg = require('./routes/zomg'); var app = express(); diff --git a/routes/movies.js b/routes/movies.js index a5831e8..1176a6c 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -23,6 +23,4 @@ router.get('/release/:release_date', function(req, res, next) { return movies_exports.moviesController.movies_by_release(req, res); }); - - module.exports = router; diff --git a/routes/rentals.js b/routes/rentals.js index 6ac9eef..51b60bd 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -6,3 +6,6 @@ var rentals_exports = require('../controllers/rentals'); router.get('/', function(req, res, next) { return rentals_exports.rentalsController.rentals(req, res); }); + +module.exports = router; + diff --git a/utils/seeds.js b/utils/seeds.js index f7f6a5a..48ec03d 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -21,7 +21,7 @@ var customers_statement = db.prepare( VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); var rental_statement = db.prepare( - "INSERT INTO rentals(checkout_date, return_date, return_status, cost, movie_id, customer_id \ + "INSERT INTO rentals(movie_id, customer_id, checkout_date, return_date, return_status, cost) \ VALUES (?, ?, ?, ?, ?, ?);" ); @@ -47,7 +47,6 @@ db.serialize(function() { var num_copies = movie.inventory; for (var j = 0; j < num_copies; j++) { - console.log(movie); movie_copies_statement.run( i+1 ); @@ -73,12 +72,12 @@ db.serialize(function() { customers_statement.finalize(); rental_statement.run( + 2, // movie_id + 6, // customer_id "2015-09-18", "2015-09-26", 0, // return_status (0 for false (checked out) 1 for true (returned)) - 5, // cost - 2, // movie_id - 6 // customer_id + 5 // cost ); rental_statement.finalize(); From 913dc1c56a8f2ddd96a2a69e5a4164dffae9c265 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Fri, 18 Sep 2015 14:51:43 -0700 Subject: [PATCH 34/80] add db all to all the things --- controllers/customers.js | 6 +++--- controllers/movies.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 1451545..7e9d6ee 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -22,7 +22,7 @@ exports.customersController = { db = new sqlite3.Database('db/' + db_env + '.db'); var name = req.params.name; name = addPercents(name); - db.get("SELECT * FROM customers WHERE name LIKE ?;", name, function(err, the_name) { + db.all("SELECT * FROM customers WHERE name LIKE ?;", name, function(err, the_name) { db.close(); console.log(arguments); return res.status(200).json(the_name); @@ -34,7 +34,7 @@ exports.customersController = { db = new sqlite3.Database('db/' + db_env + '.db'); var date = req.params.date; date = addPercents(date); - db.get("SELECT * FROM customers WHERE registered_at LIKE ?;", date, function(err, the_date) { + db.all("SELECT * FROM customers WHERE registered_at LIKE ?;", date, function(err, the_date) { db.close(); return res.status(200).json(the_date); }); @@ -45,7 +45,7 @@ exports.customersController = { db = new sqlite3.Database('db/' + db_env + '.db'); var zipcode = req.params.zipcode; zipcode = addPercents(zipcode); - db.get("SELECT * FROM customers WHERE postal_code LIKE ?;", zipcode, function(err, the_code) { + db.all("SELECT * FROM customers WHERE postal_code LIKE ?;", zipcode, function(err, the_code) { db.close(); return res.status(200).json(the_code); }); diff --git a/controllers/movies.js b/controllers/movies.js index 7485fc3..3246dcb 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -23,7 +23,7 @@ exports.moviesController = { db = new sqlite3.Database('db/' + db_env + '.db'); var title = req.params.title.toLowerCase(); title = addPercents(title); - db.get("SELECT * FROM movies WHERE title LIKE ?;", title, function(err, the_title) { + db.all("SELECT * FROM movies WHERE title LIKE ?;", title, function(err, the_title) { db.close(); return res.status(200).json(the_title); }); @@ -35,7 +35,7 @@ exports.moviesController = { // var title = req.params.title.toLowerCase();, // order = req.params.order.toLowerCase(); - // db.get("SELECT * FROM movies ORDER BY " + title "LIKE ?;", title, function(err, the_title) { + // db.all("SELECT * FROM movies ORDER BY " + title "LIKE ?;", title, function(err, the_title) { // db.close(); // return res.status(200).json(the_title); // }); @@ -46,7 +46,7 @@ exports.moviesController = { db = new sqlite3.Database('db/' + db_env + '.db'); var release = req.params.release_date; release = addPercents(release); - db.get("SELECT * FROM movies WHERE release_date ?;", release, function(err, the_date) { + db.all("SELECT * FROM movies WHERE release_date ?;", release, function(err, the_date) { db.close(); return res.status(200).json(the_date); }); From 703cba65c70db1fb3c7ad944c7e4a9ca844ed5a9 Mon Sep 17 00:00:00 2001 From: Elsa Date: Fri, 18 Sep 2015 15:51:46 -0700 Subject: [PATCH 35/80] Returns titles currently rented by a customer's id. Hard coded rental title into db. Would refactor by using sql joins instead. --- app.js | 10 +++++----- controllers/customers.js | 13 +++++++++++++ routes/customers.js | 4 ++++ utils/schema.js | 7 ++++--- utils/seeds.js | 19 +++++++++++++++---- 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/app.js b/app.js index 987d3e9..01c0916 100644 --- a/app.js +++ b/app.js @@ -5,11 +5,11 @@ var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); -var movies = require('./routes/movies'); -var movie_copies = require('./routes/movie_copies') -var customers = require('./routes/customers'); -var rentals = require('./routes/rentals'); -var zomg = require('./routes/zomg'); +var movies = require('./routes/movies'); +var movie_copies = require('./routes/movie_copies'); +var customers = require('./routes/customers'); +var rentals = require('./routes/rentals'); +var zomg = require('./routes/zomg'); var app = express(); diff --git a/controllers/customers.js b/controllers/customers.js index 7e9d6ee..9b231e0 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -18,6 +18,19 @@ exports.customersController = { }); }, + customers_current_movies: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + var id = req.params.id; + console.log("customer id " + id); + db.all("SELECT title FROM rentals WHERE customer_id=?", id, function(err, the_movies) { + if (err) { + console.log(err); + } + db.close(); + return res.status(200).json(the_movies); + }); + }, + customers_by_name: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); var name = req.params.name; diff --git a/routes/customers.js b/routes/customers.js index dea4458..236c2e6 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -7,6 +7,10 @@ router.get('/', function(req, res, next) { return customer_exports.customersController.customers(req, res); }); +router.get('/:id/current_movies', function(req, res, next) { + return customer_exports.customersController.customers_current_movies(req, res); +}); + router.get('/names/:name', function(req, res, next) { return customer_exports.customersController.customers_by_name(req, res); }); diff --git a/utils/schema.js b/utils/schema.js index 20e25c8..6ec9067 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -27,7 +27,8 @@ var rental_fields = [ ['checkout_date', 'text'], ['return_date', 'text'], ['return_status', 'integer'], - ['cost', 'integer'] + ['cost', 'integer'], + ['title', 'text'] ]; // sqlite does no have a separate boolean class, using values 0 and 1 for true and false @@ -51,9 +52,9 @@ db.serialize(function() { db.run("CREATE TABLE rentals( \ id INTEGER PRIMARY KEY, \ - movie_id INTEGER, \ + movie_copy_id INTEGER, \ customer_id INTEGER, \ - FOREIGN KEY (movie_id) REFERENCES movies(id), \ + FOREIGN KEY (movie_copy_id) REFERENCES movie_copies(id), \ FOREIGN KEY (customer_id) REFERENCES customers(id) \ );"); diff --git a/utils/seeds.js b/utils/seeds.js index 48ec03d..7c9f5b6 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -21,8 +21,8 @@ var customers_statement = db.prepare( VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); var rental_statement = db.prepare( - "INSERT INTO rentals(movie_id, customer_id, checkout_date, return_date, return_status, cost) \ - VALUES (?, ?, ?, ?, ?, ?);" + "INSERT INTO rentals(movie_copy_id, customer_id, checkout_date, return_date, return_status, cost, title) \ + VALUES (?, ?, ?, ?, ?, ?, ?);" ); db.serialize(function() { @@ -72,12 +72,23 @@ db.serialize(function() { customers_statement.finalize(); rental_statement.run( - 2, // movie_id + 9, // movie_copy_id 6, // customer_id "2015-09-18", "2015-09-26", 0, // return_status (0 for false (checked out) 1 for true (returned)) - 5 // cost + 5, // cost + "Jaws" + ); + + rental_statement.run( + 10, // movie_copy_id + 7, // customer_id + "2015-09-10", + "2015-09-13", + 1, // return_status (0 for false (checked out) 1 for true (returned)) + 5, // cost + "Jaws" ); rental_statement.finalize(); From 0be40d8c438b5e91bca3e1436325891ca7105819 Mon Sep 17 00:00:00 2001 From: Elsa Date: Sun, 20 Sep 2015 21:48:47 -0700 Subject: [PATCH 36/80] Removed hard-coded 'Jaws' title and now querying currently checked out titles via customer id with three table inner join sql statement. --- controllers/customers.js | 9 ++++++++- utils/seeds.js | 10 ++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 9b231e0..5b4b0ca 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -22,7 +22,10 @@ exports.customersController = { db = new sqlite3.Database('db/' + db_env + '.db'); var id = req.params.id; console.log("customer id " + id); - db.all("SELECT title FROM rentals WHERE customer_id=?", id, function(err, the_movies) { + db.all("SELECT movies.title FROM rentals \ + INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ + INNER JOIN movies ON movie_copies.movie_id = movies.id \ + WHERE rentals.customer_id=?", id, function(err, the_movies) { if (err) { console.log(err); } @@ -31,6 +34,10 @@ exports.customersController = { }); }, + // select movies.title from rentals + // inner join movie_copies on rentals.copy_id = movie_copies.copy_id + // inner join movies on movie_copies.movie_id = movies.movie_id + customers_by_name: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); var name = req.params.name; diff --git a/utils/seeds.js b/utils/seeds.js index 7c9f5b6..c170ad7 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -21,8 +21,8 @@ var customers_statement = db.prepare( VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); var rental_statement = db.prepare( - "INSERT INTO rentals(movie_copy_id, customer_id, checkout_date, return_date, return_status, cost, title) \ - VALUES (?, ?, ?, ?, ?, ?, ?);" + "INSERT INTO rentals(movie_copy_id, customer_id, checkout_date, return_date, return_status, cost) \ + VALUES (?, ?, ?, ?, ?, ?);" ); db.serialize(function() { @@ -77,8 +77,7 @@ db.serialize(function() { "2015-09-18", "2015-09-26", 0, // return_status (0 for false (checked out) 1 for true (returned)) - 5, // cost - "Jaws" + 5 // cost ); rental_statement.run( @@ -87,8 +86,7 @@ db.serialize(function() { "2015-09-10", "2015-09-13", 1, // return_status (0 for false (checked out) 1 for true (returned)) - 5, // cost - "Jaws" + 5 // cost ); rental_statement.finalize(); From 612b6b8e760d34ff9a11b5d760cca95f0fcf117f Mon Sep 17 00:00:00 2001 From: Elsa Date: Sun, 20 Sep 2015 22:02:58 -0700 Subject: [PATCH 37/80] Added past movie titles by customer id endpoint. --- controllers/customers.js | 21 +++++++++++++++++---- routes/customers.js | 4 ++++ utils/seeds.js | 11 ++++++++++- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index 5b4b0ca..2a8b9bf 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -25,7 +25,7 @@ exports.customersController = { db.all("SELECT movies.title FROM rentals \ INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ INNER JOIN movies ON movie_copies.movie_id = movies.id \ - WHERE rentals.customer_id=?", id, function(err, the_movies) { + WHERE rentals.customer_id = ?", id, function(err, the_movies) { if (err) { console.log(err); } @@ -34,9 +34,22 @@ exports.customersController = { }); }, - // select movies.title from rentals - // inner join movie_copies on rentals.copy_id = movie_copies.copy_id - // inner join movies on movie_copies.movie_id = movies.movie_id + customers_past_movies: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + var id = req.params.id; + console.log("customer id " + id); + db.all("SELECT movies.title, rentals.return_date FROM rentals \ + INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ + INNER JOIN movies ON movie_copies.movie_id = movies.id \ + WHERE rentals.customer_id = ? AND rentals.return_status = 1 \ + ORDER BY rentals.return_date", id, function(err, the_movies) { + if (err) { + console.log(err); + } + db.close(); + return res.status(200).json(the_movies); + }); + }, customers_by_name: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); diff --git a/routes/customers.js b/routes/customers.js index 236c2e6..1bf9a6a 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -11,6 +11,10 @@ router.get('/:id/current_movies', function(req, res, next) { return customer_exports.customersController.customers_current_movies(req, res); }); +router.get('/:id/past_movies', function(req, res, next) { + return customer_exports.customersController.customers_past_movies(req, res); +}); + router.get('/names/:name', function(req, res, next) { return customer_exports.customersController.customers_by_name(req, res); }); diff --git a/utils/seeds.js b/utils/seeds.js index c170ad7..939da17 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -81,13 +81,22 @@ db.serialize(function() { ); rental_statement.run( - 10, // movie_copy_id + 1, // movie_copy_id 7, // customer_id "2015-09-10", "2015-09-13", 1, // return_status (0 for false (checked out) 1 for true (returned)) 5 // cost ); + + rental_statement.run( + 9, // movie_copy_id + 7, // customer_id + "2015-09-10", + "2015-09-12", + 1, // return_status (0 for false (checked out) 1 for true (returned)) + 5 // cost + ); rental_statement.finalize(); }); From 5c6c20c51f89cbb4c3818aaa2bcef64859c955ae Mon Sep 17 00:00:00 2001 From: Elsa Date: Sun, 20 Sep 2015 22:05:31 -0700 Subject: [PATCH 38/80] Added 'return_status = 0' filter to current movies by customer id sql statement. --- controllers/customers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/customers.js b/controllers/customers.js index 2a8b9bf..6f05a81 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -25,7 +25,7 @@ exports.customersController = { db.all("SELECT movies.title FROM rentals \ INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ INNER JOIN movies ON movie_copies.movie_id = movies.id \ - WHERE rentals.customer_id = ?", id, function(err, the_movies) { + WHERE rentals.customer_id = ? AND rentals.return_status = 0", id, function(err, the_movies) { if (err) { console.log(err); } From 1b0bdfb375e0ffd47b1a44a8ca7f8a4426ff16e1 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Sun, 20 Sep 2015 22:15:32 -0700 Subject: [PATCH 39/80] Adds WIP route for querying for a customer whose associated with a given title. Still to be done: return the customer data based on the customer id of that rental as well as add the ability to order the query --- controllers/movies.js | 21 +++++++++++---------- routes/movies.js | 10 +++------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index 3246dcb..5a5e462 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -22,7 +22,7 @@ exports.moviesController = { movies_by_title: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); var title = req.params.title.toLowerCase(); - title = addPercents(title); + title = addPercents(title); db.all("SELECT * FROM movies WHERE title LIKE ?;", title, function(err, the_title) { db.close(); return res.status(200).json(the_title); @@ -30,17 +30,18 @@ exports.moviesController = { }, - // current_renters_by_title: function(req, res) { - // db = new sqlite3.Database('db/' + db_env + '.db'); - // var title = req.params.title.toLowerCase();, - // order = req.params.order.toLowerCase(); + current_renters_by_title: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + var title = req.params.title.toLowerCase(), + // order = req.params.order.toLowerCase(); - // db.all("SELECT * FROM movies ORDER BY " + title "LIKE ?;", title, function(err, the_title) { - // db.close(); - // return res.status(200).json(the_title); - // }); + title = addPercents(title); + db.all("SELECT * FROM rentals WHERE title LIKE ? AND return_status = 0;", title, function(err, the_movie) { + db.close(); + return res.status(200).json(the_movie); + }); - // }, + }, movies_by_release: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); diff --git a/routes/movies.js b/routes/movies.js index 1176a6c..3afeee2 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -4,22 +4,18 @@ var movies_exports = require('../controllers/movies'); /* GET MOVIE ROUTES */ router.get('/', function(req, res, next) { - // res.render('movies', { title: 'Express' }); return movies_exports.moviesController.movies(req, res); }); router.get('/:title', function(req, res, next) { - // res.render('movies', { title: 'Express' }); return movies_exports.moviesController.movies_by_title(req, res); }); -// router.get('/:title/current_renters/:order', function(req, res, next) { -// // res.render('movies', { title: 'Express' }); -// return movies_exports.moviesController.current_renters_by_title(req, res); -// }); +router.get('/:title/current_renters', function(req, res, next) { + return movies_exports.moviesController.current_renters_by_title(req, res); +}); router.get('/release/:release_date', function(req, res, next) { - // res.render('movies', { title: 'Express' }); return movies_exports.moviesController.movies_by_release(req, res); }); From 072d84471a8ee997b9fb7de054d6f18f39076720 Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 09:12:02 -0700 Subject: [PATCH 40/80] Added current status. --- README.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b96b1df..c2b6cec 100644 --- a/README.md +++ b/README.md @@ -2,26 +2,28 @@ ## Notes ### Endpoints -GET "/customers" +** ADD PAGINATION ** + +**DONE** GET "/customers" // for routes below, will need to return results offset by page number -GET "/customers/:name" // will be dynamic -GET "/customers/:registered_at" -GET "/customers/:postal_code" +**DONE** GET "/customers/:name" // will be dynamic +**DONE** GET "/customers/:registered_at" +**DONE** GET "/customers/:postal_code" -GET "/customers/:id/current_movies" -GET "/customers/:id/past_movies" // order by checkout date, include return date +**DONE** GET "/customers/:id/current_movies" +**DONE** GET "/customers/:id/past_movies" // order by checkout date, include return date -GET "/movies" +**DONE** GET "/movies" // for routes below, will need to return results offset by page number GET "/movies/:title" // will be dynamic GET "/movies/:release_date" // for routes below, will need to pass an ordering parameter to order by customer id, name, or checkout date -GET "/movies/:title/current_customers/:order" +**DONE-ISH** GET "/movies/:title/current_customers/:order" GET "/movies/:title/past_customers/:order" // normalize database or join everything??? -GET "/movies/:title" +**DONE** GET "/movies/:title" // includes synopsis, release date, inventory total, rentable boolean, list of customers that have it currently checkout out ...? POST "/rental/:customer_id/:movie_title" From 3d1252cee1d951b75714961d7b0bf6d02a060fee Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Mon, 21 Sep 2015 09:29:10 -0700 Subject: [PATCH 41/80] Adds current customers for a given movie title with an order by statement. --- controllers/movies.js | 23 ++++++++++++++++++++--- routes/movies.js | 2 +- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index 5a5e462..df292d5 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -33,10 +33,27 @@ exports.moviesController = { current_renters_by_title: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); var title = req.params.title.toLowerCase(), - // order = req.params.order.toLowerCase(); - + order = req.params.order.toLowerCase(); title = addPercents(title); - db.all("SELECT * FROM rentals WHERE title LIKE ? AND return_status = 0;", title, function(err, the_movie) { + + var order_by_statement = ""; + + if(order == "id") { + order_by_statement = "ORDER BY customers.id"; + } + else if(order == "name") { + order_by_statement = "ORDER BY customers.name"; + } + else if(order == "checkout") { + order_by_statement = "ORDER BY rentals.checkout_date"; + } + + db.all("SELECT customers.name FROM rentals \ + INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ + INNER JOIN movies ON movie_copies.movie_id = movies.id \ + INNER JOIN customers ON rentals.customer_id = customers.id \ + WHERE movies.title LIKE ? AND return_status = 0 " + order_by_statement + ";", + title, function(err, the_movie) { db.close(); return res.status(200).json(the_movie); }); diff --git a/routes/movies.js b/routes/movies.js index 3afeee2..8391b26 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -11,7 +11,7 @@ router.get('/:title', function(req, res, next) { return movies_exports.moviesController.movies_by_title(req, res); }); -router.get('/:title/current_renters', function(req, res, next) { +router.get('/:title/current_renters/:order', function(req, res, next) { return movies_exports.moviesController.current_renters_by_title(req, res); }); From ef04acff6ead1affd4139b883eec3a80def21305 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Mon, 21 Sep 2015 09:37:20 -0700 Subject: [PATCH 42/80] Adds seed data for renters --- utils/seeds.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/utils/seeds.js b/utils/seeds.js index 939da17..6be919a 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -97,6 +97,15 @@ db.serialize(function() { 1, // return_status (0 for false (checked out) 1 for true (returned)) 5 // cost ); + + rental_statement.run( + 9, + 1, + "2015-09-19", + "2015-09-30", + 0, + 5 + ); rental_statement.finalize(); }); From 1a3cc8bdca112ec3edabd7007e244beda8207eeb Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 09:38:12 -0700 Subject: [PATCH 43/80] Finished current movie title customer ordering. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2b6cec..f973541 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ GET "/movies/:title" // will be dynamic GET "/movies/:release_date" // for routes below, will need to pass an ordering parameter to order by customer id, name, or checkout date -**DONE-ISH** GET "/movies/:title/current_customers/:order" +**DONE** GET "/movies/:title/current_customers/:order" GET "/movies/:title/past_customers/:order" // normalize database or join everything??? From 896eec16d32e3fcc5e8dfd745d4c185d7a387e47 Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 09:44:28 -0700 Subject: [PATCH 44/80] Added past customers by title and order. --- README.md | 6 +++--- controllers/movies.js | 33 +++++++++++++++++++++++++++++---- routes/movies.js | 4 ++++ utils/seeds.js | 9 +++++++++ 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f973541..24964b3 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,12 @@ **DONE** GET "/movies" // for routes below, will need to return results offset by page number -GET "/movies/:title" // will be dynamic -GET "/movies/:release_date" +**DONE** GET "/movies/:title" // will be dynamic +**DONE** GET "/movies/:release_date" // for routes below, will need to pass an ordering parameter to order by customer id, name, or checkout date **DONE** GET "/movies/:title/current_customers/:order" -GET "/movies/:title/past_customers/:order" +**DONE** GET "/movies/:title/past_customers/:order" // normalize database or join everything??? **DONE** GET "/movies/:title" diff --git a/controllers/movies.js b/controllers/movies.js index df292d5..c6e6ae7 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -16,7 +16,6 @@ exports.moviesController = { db.close(); return res.status(200).json(all_movies); }); - }, movies_by_title: function(req, res) { @@ -27,7 +26,6 @@ exports.moviesController = { db.close(); return res.status(200).json(the_title); }); - }, current_renters_by_title: function(req, res) { @@ -57,7 +55,35 @@ exports.moviesController = { db.close(); return res.status(200).json(the_movie); }); + }, + + past_renters_by_title: function(req, res) { + db = new sqlite3.Database('db/' + db_env + '.db'); + var title = req.params.title.toLowerCase(), + order = req.params.order.toLowerCase(); + title = addPercents(title); + var order_by_statement = ""; + + if(order == "id") { + order_by_statement = "ORDER BY customers.id"; + } + else if(order == "name") { + order_by_statement = "ORDER BY customers.name"; + } + else if(order == "checkout") { + order_by_statement = "ORDER BY rentals.checkout_date"; + } + + db.all("SELECT customers.name FROM rentals \ + INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ + INNER JOIN movies ON movie_copies.movie_id = movies.id \ + INNER JOIN customers ON rentals.customer_id = customers.id \ + WHERE movies.title LIKE ? AND return_status = 1 " + order_by_statement + ";", + title, function(err, the_movie) { + db.close(); + return res.status(200).json(the_movie); + }); }, movies_by_release: function(req, res) { @@ -68,7 +94,6 @@ exports.moviesController = { db.close(); return res.status(200).json(the_date); }); - } -}; // end exports.moviesController +}; // end diff --git a/routes/movies.js b/routes/movies.js index 8391b26..24e549a 100644 --- a/routes/movies.js +++ b/routes/movies.js @@ -15,6 +15,10 @@ router.get('/:title/current_renters/:order', function(req, res, next) { return movies_exports.moviesController.current_renters_by_title(req, res); }); +router.get('/:title/past_renters/:order', function(req, res, next) { + return movies_exports.moviesController.past_renters_by_title(req, res); +}); + router.get('/release/:release_date', function(req, res, next) { return movies_exports.moviesController.movies_by_release(req, res); }); diff --git a/utils/seeds.js b/utils/seeds.js index 6be919a..5a00a75 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -106,6 +106,15 @@ db.serialize(function() { 0, 5 ); + + rental_statement.run( + 9, + 6, + "2015-09-19", + "2015-09-30", + 1, + 5 + ); rental_statement.finalize(); }); From 095b26849223ffb524adf3a920418fd8973492a7 Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 10:08:05 -0700 Subject: [PATCH 45/80] Added overdue movie endpoint. --- README.md | 4 ++-- controllers/rentals.js | 15 +++++++++++++++ routes/rentals.js | 5 ++++- utils/seeds.js | 25 +++++++++++++++++-------- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 24964b3..b6f49cb 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,11 @@ **DONE** GET "/movies/:title" // includes synopsis, release date, inventory total, rentable boolean, list of customers that have it currently checkout out ...? -POST "/rental/:customer_id/:movie_title" +POST "/rentals/:customer_id/:movie_title" // create association, checkout date, return date, charge account, returned boolean PATCH "/checkin/:customer_id/:movie_title" // modify returned boolean -GET "/rental/overdue" +**DONE** GET "/rentals/overdue" --- The overall goal of this project is to create a system that a video store (remember those?) could use to track their inventory of rental videos and their collection of customers. diff --git a/controllers/rentals.js b/controllers/rentals.js index f93edaf..87d5cc4 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -16,7 +16,22 @@ exports.rentalsController = { db.close(); return res.status(200).json(all_rentals); }); + }, + overdue_rentals: function(req, res) { + var current_date = new Date(); // get current date + current_date = current_date.toISOString(); // change format to YYY-MM-DD and time + var formatted_current_date = current_date.split("T")[0]; // cut off time + + db = new sqlite3.Database('db/' + db_env + '.db'); + db.all("SELECT customers.name, movies.title, movie_copies.id FROM rentals \ + INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ + INNER JOIN movies ON movie_copies.movie_id = movies.id \ + INNER JOIN customers ON rentals.customer_id = customers.id \ + WHERE rentals.return_status = 0 AND rentals.return_date < ?;", formatted_current_date, function(err, all_rentals) { + db.close(); + return res.status(200).json(all_rentals); + }); } }; diff --git a/routes/rentals.js b/routes/rentals.js index 51b60bd..1869d01 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -7,5 +7,8 @@ router.get('/', function(req, res, next) { return rentals_exports.rentalsController.rentals(req, res); }); -module.exports = router; +router.get('/overdue', function(req, res, next) { + return rentals_exports.rentalsController.overdue_rentals(req, res); +}); +module.exports = router; diff --git a/utils/seeds.js b/utils/seeds.js index 5a00a75..0dab018 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -107,14 +107,23 @@ db.serialize(function() { 5 ); - rental_statement.run( - 9, - 6, - "2015-09-19", - "2015-09-30", - 1, - 5 - ); + rental_statement.run( + 9, + 6, + "2015-09-19", + "2015-09-30", + 1, + 5 + ); + + rental_statement.run( + 9, + 6, + "2015-09-19", + "2015-09-20", + 0, + 5 + ); rental_statement.finalize(); }); From 788c27b419f5c66bef8cc2c171c8a910ef85c28d Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Mon, 21 Sep 2015 11:27:03 -0700 Subject: [PATCH 46/80] Adds not-working route for post request to database --- controllers/rentals.js | 44 +++++++++++++++++++++++++++++++++++++----- routes/rentals.js | 4 ++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 87d5cc4..26e352c 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -9,6 +9,23 @@ function addPercents(variable) { return percented; } +function findCopy(movie_title) { + db = new sqlite3.Database('db/' + db_env + '.db'); + db.get("SELECT movie_copies.id FROM rentals \ + INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ + INNER JOIN movies ON movie_copies.movie_id = movies.id \ + WHERE rentals.return_status = 1 AND movies.title LIKE ?;", movie_title, function(err, rental) { + db.close(); + if(err) { + return res.status(204).json("No copies available"); + } + else { + console.log("from find copy " + rental); + return rental.id; + } + }); +} + exports.rentalsController = { rentals: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); @@ -25,13 +42,30 @@ exports.rentalsController = { db = new sqlite3.Database('db/' + db_env + '.db'); db.all("SELECT customers.name, movies.title, movie_copies.id FROM rentals \ - INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ - INNER JOIN movies ON movie_copies.movie_id = movies.id \ - INNER JOIN customers ON rentals.customer_id = customers.id \ - WHERE rentals.return_status = 0 AND rentals.return_date < ?;", formatted_current_date, function(err, all_rentals) { + INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ + INNER JOIN movies ON movie_copies.movie_id = movies.id \ + INNER JOIN customers ON rentals.customer_id = customers.id \ + WHERE rentals.return_status = 0 AND rentals.return_date < ?;", formatted_current_date, function(err, all_rentals) { db.close(); return res.status(200).json(all_rentals); }); - } + }, + + create_rental: function(req, res) { + var customer = req.params.customer_id, + movie = req.params.movie_title; + movie = addPercents(movie); + console.log(movie); + console.log(customer); + var copy_id = findCopy(movie); + console.log("from create_rental " + copy_id); + + // db = new sqlite3.Database('db/' + db_env + '.db'); + // db.run("SELECT * FROM rentals", function(err, all_rentals) { + // db.close(); + // return res.status(200).json(all_rentals); + // }); + }, }; + diff --git a/routes/rentals.js b/routes/rentals.js index 1869d01..3a10cdb 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -11,4 +11,8 @@ router.get('/overdue', function(req, res, next) { return rentals_exports.rentalsController.overdue_rentals(req, res); }); +router.get('/:customer_id/:movie_title', function(req, res, next) { + return rentals_exports.rentalsController.create_rental(req, res); +}); + module.exports = router; From 74a11f44cc034d0832c5fcbbc8ae8004e0fc7766 Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 11:32:29 -0700 Subject: [PATCH 47/80] Installed mocha. --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ae849c1..ca2c084 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "start": "nodemon ./bin/www", - "db:schema" : "node ./utils/schema", + "db:schema": "node ./utils/schema", "db:seed": "node ./utils/seeds", "db:reset": "npm run db:schema; npm run db:seed" }, @@ -14,6 +14,7 @@ "debug": "~2.2.0", "express": "^4.13.3", "jade": "~1.11.0", + "mocha": "^2.3.3", "morgan": "~1.6.1", "serve-favicon": "~2.3.0", "sqlite3": "^3.1.0" From f9f43224c4dfff1dce1ba2983d2269fe25e8da50 Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 11:36:01 -0700 Subject: [PATCH 48/80] Added test script. --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ca2c084..6d7f688 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "start": "nodemon ./bin/www", "db:schema": "node ./utils/schema", "db:seed": "node ./utils/seeds", - "db:reset": "npm run db:schema; npm run db:seed" + "db:reset": "npm run db:schema; npm run db:seed", + "test": "clear; DB=test mocha --recursive" }, "dependencies": { "body-parser": "~1.13.2", From 6b94feb4aa73da486b80acf0c7ce4cba34d57498 Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 11:36:17 -0700 Subject: [PATCH 49/80] Added movies tests, WIP from jnf. --- tests/movies.js | 102 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 tests/movies.js diff --git a/tests/movies.js b/tests/movies.js new file mode 100644 index 0000000..585e965 --- /dev/null +++ b/tests/movies.js @@ -0,0 +1,102 @@ +// MODEL +// "use strict"; +// +// +// +// module.exports = Movie +// + + +function Movie() { + this.table_name = "movies"; +} + +Movie.prototype = require('../database'); + +// TESTS +var assert = require('assert'), +// Movie = require('../../models/movie'), + sqlite3 = require('sqlite3').verbose(); +// +describe("Movie", function() { + var movie, db_cleaner + + beforeEach(function(done) { + movie = new Movie(); + + db_cleaner = new sqlite3.Database('db/test.db'); + db_cleaner.serialize(function() { + db_cleaner.exec( + "BEGIN; \ + DELETE FROM movies; \ + INSERT INTO movies(title, overview, release_date, inventory) \ + VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ + ('Maws', 'Worm!', 'Yesterday', 11); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }) + + it("can be instantiated", function() { + assert(movie instanceof Movie); + }) + + describe("instance methods", function() { + it("can find a movie by id", function(done){ + movie.find_by("id", 1, function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(res[0].id, 1); + done(); + }) + }) + + it("can find a movie by title", function(done) { + movie.find_by("title", "Jaws", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(res[0].title, 'Jaws'); + done(); + }) + }) + + it("can save changes to a movie", function(done) { + movie.find_by("title", "Jaws", function(err, res) { + var original_title = res[0].title; + var id = res[0].id; + movie.save({title: "Jaws 2: Jawsier", id: id}, function(err, res) { + assert.equal(err, undefined); + assert.equal(res.inserted_id, 0); //it didn't insert any records + assert.equal(res.changed, 1); //it updated one record + done(); + }) + }) + }); + + it("can save a new movie to the database", function(done) { + var data = { + title: "RoboJaws", + overview: "Jaws is hunted by RoboJaws", + release_date: "Tomorrow", + inventory: 10 + } + + movie.create(data, function(err, res) { + assert.equal(res.inserted_id, 3); // 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 ea318b526e8f6826bb741ee92077b010b2133c6d Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 11:47:09 -0700 Subject: [PATCH 50/80] Adapted jnf test code to have 1 passing test. Yay. --- package.json | 4 +- test/movies.js | 104 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/movies.js | 102 ----------------------------------------------- 3 files changed, 106 insertions(+), 104 deletions(-) create mode 100644 test/movies.js delete mode 100644 tests/movies.js diff --git a/package.json b/package.json index 6d7f688..e93252b 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,10 @@ "private": true, "scripts": { "start": "nodemon ./bin/www", + "test": "clear; DB=test mocha --recursive", "db:schema": "node ./utils/schema", "db:seed": "node ./utils/seeds", - "db:reset": "npm run db:schema; npm run db:seed", - "test": "clear; DB=test mocha --recursive" + "db:reset": "npm run db:schema; npm run db:seed" }, "dependencies": { "body-parser": "~1.13.2", diff --git a/test/movies.js b/test/movies.js new file mode 100644 index 0000000..336d9d6 --- /dev/null +++ b/test/movies.js @@ -0,0 +1,104 @@ +// MODEL +// "use strict"; +// +// +// +// module.exports = Movie +// + + +function Movie() { + this.table_name = "movies"; +} + +// Movie.prototype = require('../database'); +Movie.prototype = new Movie(); + + +// TESTS +var assert = require('assert'), +// Movie = require('../../models/movie'), + sqlite3 = require('sqlite3').verbose(); +// +describe("Movie", function() { + var movie, db_cleaner; + + beforeEach(function(done) { + movie = new Movie(); + + db_cleaner = new sqlite3.Database('db/test.db'); + db_cleaner.serialize(function() { + db_cleaner.exec( + "BEGIN; \ + DELETE FROM movies; \ + INSERT INTO movies(title, overview, release_date, inventory) \ + VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ + ('Maws', 'Worm!', 'Yesterday', 11); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + + it("can be instantiated", function() { + assert(movie instanceof Movie); + }); + + // describe("instance methods", function() { + // it("can find a movie by id", function(done){ + // movie.find_by("id", 1, function(err, res) { + // assert.equal(err, undefined); + // assert(res instanceof Array); + // assert.equal(res.length, 1); + // assert.equal(res[0].id, 1); + // done(); + // }) + // }) + // + // it("can find a movie by title", function(done) { + // movie.find_by("title", "Jaws", function(err, res) { + // assert.equal(err, undefined); + // assert(res instanceof Array); + // assert.equal(res.length, 1); + // assert.equal(res[0].title, 'Jaws'); + // done(); + // }) + // }) + // + // it("can save changes to a movie", function(done) { + // movie.find_by("title", "Jaws", function(err, res) { + // var original_title = res[0].title; + // var id = res[0].id; + // movie.save({title: "Jaws 2: Jawsier", id: id}, function(err, res) { + // assert.equal(err, undefined); + // assert.equal(res.inserted_id, 0); //it didn't insert any records + // assert.equal(res.changed, 1); //it updated one record + // done(); + // }) + // }) + // }); + // + // it("can save a new movie to the database", function(done) { + // var data = { + // title: "RoboJaws", + // overview: "Jaws is hunted by RoboJaws", + // release_date: "Tomorrow", + // inventory: 10 + // } + // + // movie.create(data, function(err, res) { + // assert.equal(res.inserted_id, 3); // 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(); + // }) + // }) + // }); + // }) +}); diff --git a/tests/movies.js b/tests/movies.js deleted file mode 100644 index 585e965..0000000 --- a/tests/movies.js +++ /dev/null @@ -1,102 +0,0 @@ -// MODEL -// "use strict"; -// -// -// -// module.exports = Movie -// - - -function Movie() { - this.table_name = "movies"; -} - -Movie.prototype = require('../database'); - -// TESTS -var assert = require('assert'), -// Movie = require('../../models/movie'), - sqlite3 = require('sqlite3').verbose(); -// -describe("Movie", function() { - var movie, db_cleaner - - beforeEach(function(done) { - movie = new Movie(); - - db_cleaner = new sqlite3.Database('db/test.db'); - db_cleaner.serialize(function() { - db_cleaner.exec( - "BEGIN; \ - DELETE FROM movies; \ - INSERT INTO movies(title, overview, release_date, inventory) \ - VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ - ('Maws', 'Worm!', 'Yesterday', 11); \ - COMMIT;" - , function(err) { - db_cleaner.close(); - done(); - } - ); - }); - }) - - it("can be instantiated", function() { - assert(movie instanceof Movie); - }) - - describe("instance methods", function() { - it("can find a movie by id", function(done){ - movie.find_by("id", 1, function(err, res) { - assert.equal(err, undefined); - assert(res instanceof Array); - assert.equal(res.length, 1); - assert.equal(res[0].id, 1); - done(); - }) - }) - - it("can find a movie by title", function(done) { - movie.find_by("title", "Jaws", function(err, res) { - assert.equal(err, undefined); - assert(res instanceof Array); - assert.equal(res.length, 1); - assert.equal(res[0].title, 'Jaws'); - done(); - }) - }) - - it("can save changes to a movie", function(done) { - movie.find_by("title", "Jaws", function(err, res) { - var original_title = res[0].title; - var id = res[0].id; - movie.save({title: "Jaws 2: Jawsier", id: id}, function(err, res) { - assert.equal(err, undefined); - assert.equal(res.inserted_id, 0); //it didn't insert any records - assert.equal(res.changed, 1); //it updated one record - done(); - }) - }) - }); - - it("can save a new movie to the database", function(done) { - var data = { - title: "RoboJaws", - overview: "Jaws is hunted by RoboJaws", - release_date: "Tomorrow", - inventory: 10 - } - - movie.create(data, function(err, res) { - assert.equal(res.inserted_id, 3); // 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 e14317e1f0d4f620e64ab0de8845b51083147cf7 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Mon, 21 Sep 2015 14:59:14 -0700 Subject: [PATCH 51/80] So much work in progress --- controllers/customers.js | 33 ++++++++++++++++++++++++--------- formatted_customers.json | 1 + package.json | 3 ++- routes/customers.js | 6 +++--- utils/json_scrubber.js | 21 +++++++++++++++++++++ utils/seeds.js | 15 +++++++++++++++ 6 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 formatted_customers.json create mode 100644 utils/json_scrubber.js diff --git a/controllers/customers.js b/controllers/customers.js index 6f05a81..8a47d2e 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -53,36 +53,51 @@ exports.customersController = { customers_by_name: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); - var name = req.params.name; + var name = req.params.name, + per_page = req.params.per_page, + page = req.params.pg; + page = page * per_page; + name = addPercents(name); - db.all("SELECT * FROM customers WHERE name LIKE ?;", name, function(err, the_name) { + + db.all("SELECT * FROM customers WHERE name LIKE ? ORDER BY name \ + LIMIT ? OFFSET ?;", name, per_page, page, function(err, the_name) { db.close(); console.log(arguments); return res.status(200).json(the_name); }); - }, customers_by_register_date: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); - var date = req.params.date; + var date = req.params.date, + per_page = req.params.per_page, + page = req.params.pg; + page = page * per_page; + + date = addPercents(date); - db.all("SELECT * FROM customers WHERE registered_at LIKE ?;", date, function(err, the_date) { + db.all("SELECT * FROM customers WHERE registered_at LIKE ? ORDER BY registered_at \ + LIMIT ? OFFSET ?;", date, per_page, page, function(err, the_date) { db.close(); return res.status(200).json(the_date); }); - }, customers_by_postal_code: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); - var zipcode = req.params.zipcode; + var zipcode = req.params.zipcode, + per_page = req.params.per_page, + page = req.params.pg; + page = page * per_page; + zipcode = addPercents(zipcode); - db.all("SELECT * FROM customers WHERE postal_code LIKE ?;", zipcode, function(err, the_code) { + + db.all("SELECT * FROM customers WHERE postal_code LIKE ? ORDER BY postal_code \ + LIMIT ? OFFSET ?;", zipcode, per_page, page, function(err, the_code) { db.close(); return res.status(200).json(the_code); }); - }, }; diff --git a/formatted_customers.json b/formatted_customers.json new file mode 100644 index 0000000..55a529b --- /dev/null +++ b/formatted_customers.json @@ -0,0 +1 @@ +[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object] \ No newline at end of file diff --git a/package.json b/package.json index e93252b..8c9bd9b 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "test": "clear; DB=test mocha --recursive", "db:schema": "node ./utils/schema", "db:seed": "node ./utils/seeds", - "db:reset": "npm run db:schema; npm run db:seed" + "db:reset": "npm run db:schema; npm run db:seed", + "db:scrub": "node ./utils/json_scrubber" }, "dependencies": { "body-parser": "~1.13.2", diff --git a/routes/customers.js b/routes/customers.js index 1bf9a6a..10825e5 100644 --- a/routes/customers.js +++ b/routes/customers.js @@ -15,15 +15,15 @@ router.get('/:id/past_movies', function(req, res, next) { return customer_exports.customersController.customers_past_movies(req, res); }); -router.get('/names/:name', function(req, res, next) { +router.get('/names/:name/per_page:per_page/pg:pg', function(req, res, next) { return customer_exports.customersController.customers_by_name(req, res); }); -router.get('/date/:date', function(req, res, next) { +router.get('/date/:date/per_page:per_page/pg:pg', function(req, res, next) { return customer_exports.customersController.customers_by_register_date(req, res); }); -router.get('/zipcode/:zipcode', function(req, res, next) { +router.get('/zipcode/:zipcode/per_page:per_page/pg:pg', function(req, res, next) { return customer_exports.customersController.customers_by_postal_code(req, res); }); diff --git a/utils/json_scrubber.js b/utils/json_scrubber.js new file mode 100644 index 0000000..4ead6d4 --- /dev/null +++ b/utils/json_scrubber.js @@ -0,0 +1,21 @@ +"use strict"; + +var fs = require('fs'); +var customers = require('../customers'); + +fs.writeFile('formatted_customers.json', customers, function(err) { + if(err) { + console.log("error"); + return; + } + + for(var i = 0; i < customers.length; i++) { + var customer = customers[i]; + var date = new Date(customer.registered_at); + var formatted_date = date.toISOString(); + customer.registered_at = formatted_date.split("T")[0]; + // customer.registered_at + JSON.stringify(customer); + } + // var json_customers = +}) diff --git a/utils/seeds.js b/utils/seeds.js index 0dab018..0efd748 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -20,6 +20,9 @@ var customers_statement = db.prepare( "INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); +// var convert_register_date = db.prepare( +// "UPDATE customers SET registered_at = SUBSTR(registered_at, ) WHERE id = ?;"); + var rental_statement = db.prepare( "INSERT INTO rentals(movie_copy_id, customer_id, checkout_date, return_date, return_status, cost) \ VALUES (?, ?, ?, ?, ?, ?);" @@ -71,6 +74,18 @@ db.serialize(function() { customers_statement.finalize(); + // for(var i = 0; i < customers.length; i++) { + // var customer = customers[i]; + // var date; + // convert_register_date.run( + // customer.registered_at, + // i + 1 + // ); + // date = + // } + + // convert_register_date.finalize(); + rental_statement.run( 9, // movie_copy_id 6, // customer_id From 36893ad270eea4ab24bfd6dbfb0c1309674865ff Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 17:00:55 -0700 Subject: [PATCH 52/80] WIP. The formatted customers json HAD printed almost correctly a few changes ago... --- formatted_customers.json | 1 - utils/json_scrubber.js | 31 +++++++++++++++++++++++-------- utils/seeds.js | 2 +- 3 files changed, 24 insertions(+), 10 deletions(-) delete mode 100644 formatted_customers.json diff --git a/formatted_customers.json b/formatted_customers.json deleted file mode 100644 index 55a529b..0000000 --- a/formatted_customers.json +++ /dev/null @@ -1 +0,0 @@ -[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object] \ No newline at end of file diff --git a/utils/json_scrubber.js b/utils/json_scrubber.js index 4ead6d4..2bf704e 100644 --- a/utils/json_scrubber.js +++ b/utils/json_scrubber.js @@ -2,20 +2,35 @@ var fs = require('fs'); var customers = require('../customers'); - -fs.writeFile('formatted_customers.json', customers, function(err) { - if(err) { - console.log("error"); - return; - } +var json_array = []; for(var i = 0; i < customers.length; i++) { var customer = customers[i]; var date = new Date(customer.registered_at); var formatted_date = date.toISOString(); + customer.registered_at = formatted_date.split("T")[0]; + console.log("customer.registered_at " + customer.registered_at); + // customer.registered_at - JSON.stringify(customer); + json_array.push(JSON.stringify(customer)); } + console.log("json_array " + json_array[0]); + + // JSON.parse(json_array); + // console.log("parsed json_array " + JSON.parse(json_array)); + + // var parsed_json_array = JSON.parse(json_array); + // console.log("parsed json array " + parsed_json_array) + + fs.writeFile('formatted_customers.json', JSON.parse(json_array), function(err) { + if (err) { + console.log(err); + return; + } + }); + + + + // console.log("inside writeFile ", customers[0]); // var json_customers = -}) diff --git a/utils/seeds.js b/utils/seeds.js index 0efd748..a02e898 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -15,7 +15,7 @@ var movie_copies_statement = db.prepare( VALUES (?);" ); -var customers = require('../customers'); +var customers = require('../formatted_customers'); var customers_statement = db.prepare( "INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); From c58c25d98da4cda059e1e2030b0558a0d9058de8 Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 19:42:12 -0700 Subject: [PATCH 53/80] This scrub didn't fail. --- formatted_customers.json | 1 + utils/json_scrubber.js | 9 +++------ 2 files changed, 4 insertions(+), 6 deletions(-) create mode 100644 formatted_customers.json diff --git a/formatted_customers.json b/formatted_customers.json new file mode 100644 index 0000000..2b4428e --- /dev/null +++ b/formatted_customers.json @@ -0,0 +1 @@ +{"id":"1","name":"Shelley Rocha","registered_at":"2015-04-29","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":"2014-04-17","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":"2014-11-28","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":"2014-07-04","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":"2015-08-27","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":"2014-04-03","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":"2014-01-29","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":"2014-11-18","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":"2015-07-23","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":"2015-07-10","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":"2015-07-10","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":"2015-08-20","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":"2014-02-23","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":"2015-03-16","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":"2014-05-19","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":"2014-09-22","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":"2015-02-27","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":"2014-08-24","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":"2015-08-07","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":"2014-07-13","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":"2014-11-01","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":"2015-05-25","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":"2014-01-25","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":"2014-09-20","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":"2014-09-23","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":"2014-08-23","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":"2014-08-17","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":"2015-05-18","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":"2014-06-24","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":"2014-11-21","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":"2014-06-25","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":"2015-02-14","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":"2014-04-01","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":"2014-07-21","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":"2015-05-21","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":"2015-08-02","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":"2014-03-02","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":"2015-01-24","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":"2015-07-15","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":"2014-01-27","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":"2014-06-24","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":"2014-05-27","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":"2014-10-17","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":"2015-03-22","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":"2015-02-19","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":"2015-02-27","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":"2015-01-17","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":"2014-11-22","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":"2014-05-20","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":"2014-07-25","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":"2014-05-14","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":"2014-06-14","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":"2014-07-13","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":"2014-01-08","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":"2014-06-17","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":"2014-09-01","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":"2014-10-05","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":"2014-07-25","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":"2014-04-13","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":"2015-04-12","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":"2015-05-05","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":"2015-07-31","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":"2015-07-01","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":"2015-04-09","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":"2014-05-23","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":"2014-09-30","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":"2015-04-03","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":"2014-02-18","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":"2014-02-27","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":"2015-02-06","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":"2015-05-14","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":"2014-07-09","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":"2015-03-19","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":"2015-06-22","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":"2014-05-04","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":"2014-05-11","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":"2015-02-14","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":"2015-05-02","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":"2014-07-22","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":"2014-06-25","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":"2015-02-10","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":"2015-03-16","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":"2014-08-14","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":"2014-06-09","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":"2015-08-12","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":"2015-03-04","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":"2015-04-17","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":"2014-06-06","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":"2014-07-14","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":"2015-06-16","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":"2015-05-19","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":"2014-12-13","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":"2014-12-07","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":"2015-02-20","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":"2014-04-08","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":"2015-07-13","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":"2014-05-20","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":"2014-05-31","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":"2014-10-11","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":"2014-11-03","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":"2015-04-02","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":"2015-04-12","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":"2014-12-15","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":"2014-03-10","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":"2014-02-13","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":"2015-02-06","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":"2015-07-26","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":"2015-04-29","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":"2014-09-13","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":"2014-12-28","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":"2014-02-04","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":"2014-05-15","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":"2015-02-27","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":"2015-04-28","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":"2015-07-17","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":"2014-12-20","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":"2015-02-20","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":"2014-11-10","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":"2014-09-22","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":"2014-12-12","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":"2014-07-07","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":"2015-05-01","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":"2015-07-31","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":"2014-04-27","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":"2014-03-19","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":"2015-09-04","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":"2015-01-04","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":"2015-07-13","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":"2015-01-29","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":"2014-02-10","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":"2015-05-14","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":"2015-09-01","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":"2015-04-18","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":"2015-06-24","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":"2014-10-21","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":"2014-04-06","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":"2014-02-19","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":"2015-04-19","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":"2014-12-08","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":"2014-12-12","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":"2014-10-22","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":"2014-06-08","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":"2014-02-22","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":"2015-07-12","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":"2014-09-24","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":"2014-04-28","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":"2014-09-09","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":"2014-01-02","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":"2014-05-13","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":"2014-05-02","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":"2014-08-03","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":"2015-05-22","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":"2014-03-18","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":"2014-03-15","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":"2015-08-12","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":"2014-04-12","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":"2014-05-22","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":"2015-01-25","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":"2014-04-19","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":"2015-06-13","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":"2014-02-18","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":"2014-07-25","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":"2015-03-11","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":"2014-07-26","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":"2015-03-09","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":"2014-04-21","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":"2014-09-05","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":"2014-07-15","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":"2015-01-08","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":"2015-06-17","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":"2015-05-11","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":"2014-02-04","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":"2015-06-24","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":"2014-02-13","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":"2014-10-07","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":"2014-03-28","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":"2015-01-24","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":"2015-02-25","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":"2014-10-14","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":"2014-08-04","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":"2015-03-11","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":"2014-10-20","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":"2014-10-11","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":"2014-09-11","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":"2014-01-25","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":"2014-03-14","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":"2014-11-01","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":"2014-07-02","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":"2014-06-13","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":"2015-06-28","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":"2014-12-25","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":"2014-11-20","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":"2015-03-27","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":"2014-02-17","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":"2015-01-24","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":"2014-01-15","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":"2014-05-25","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":"2014-04-06","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":"2015-02-06","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":"2015-05-22","address":"P.O. Box 940, 1583 At, Street","city":"Austin","state":"Texas","postal_code":"94282","phone":"(270) 219-2853","account_credit":62.7} \ No newline at end of file diff --git a/utils/json_scrubber.js b/utils/json_scrubber.js index 2bf704e..21d2675 100644 --- a/utils/json_scrubber.js +++ b/utils/json_scrubber.js @@ -10,20 +10,17 @@ var json_array = []; var formatted_date = date.toISOString(); customer.registered_at = formatted_date.split("T")[0]; - console.log("customer.registered_at " + customer.registered_at); + // console.log("customer.registered_at " + customer.registered_at); // customer.registered_at json_array.push(JSON.stringify(customer)); } console.log("json_array " + json_array[0]); - // JSON.parse(json_array); - // console.log("parsed json_array " + JSON.parse(json_array)); - // var parsed_json_array = JSON.parse(json_array); - // console.log("parsed json array " + parsed_json_array) + // console.log("parsed json_array" + JSON.parse(json_array[0])); - fs.writeFile('formatted_customers.json', JSON.parse(json_array), function(err) { + fs.writeFile('formatted_customers.json', json_array, function(err) { if (err) { console.log(err); return; From 0e09325491476295bf510959b2e2a259815599f3 Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 19:48:14 -0700 Subject: [PATCH 54/80] Cleaned up to prep more WIP. --- utils/json_scrubber.js | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/utils/json_scrubber.js b/utils/json_scrubber.js index 21d2675..b8ae195 100644 --- a/utils/json_scrubber.js +++ b/utils/json_scrubber.js @@ -10,24 +10,14 @@ var json_array = []; var formatted_date = date.toISOString(); customer.registered_at = formatted_date.split("T")[0]; - // console.log("customer.registered_at " + customer.registered_at); - - // customer.registered_at json_array.push(JSON.stringify(customer)); } - console.log("json_array " + json_array[0]); - - // var parsed_json_array = JSON.parse(json_array); - // console.log("parsed json_array" + JSON.parse(json_array[0])); - - fs.writeFile('formatted_customers.json', json_array, function(err) { - if (err) { - console.log(err); - return; - } - }); + +console.log("json_array " + json_array[0]); - - - // console.log("inside writeFile ", customers[0]); - // var json_customers = +fs.writeFile('formatted_customers.json', json_array, function(err) { + if (err) { + console.log(err); + return; + } +}); From 768e5d255be314b27e1eb65384739a6064a67466 Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 19:55:01 -0700 Subject: [PATCH 55/80] Have fully working date scrubber to convert horrible customer datetime format to actually sortable YYY-MM-DD. --- formatted_customers.json | 2 +- utils/json_scrubber.js | 21 +++++++++++---------- utils/seeds.js | 1 + 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/formatted_customers.json b/formatted_customers.json index 2b4428e..f2e07d9 100644 --- a/formatted_customers.json +++ b/formatted_customers.json @@ -1 +1 @@ -{"id":"1","name":"Shelley Rocha","registered_at":"2015-04-29","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":"2014-04-17","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":"2014-11-28","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":"2014-07-04","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":"2015-08-27","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":"2014-04-03","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":"2014-01-29","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":"2014-11-18","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":"2015-07-23","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":"2015-07-10","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":"2015-07-10","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":"2015-08-20","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":"2014-02-23","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":"2015-03-16","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":"2014-05-19","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":"2014-09-22","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":"2015-02-27","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":"2014-08-24","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":"2015-08-07","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":"2014-07-13","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":"2014-11-01","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":"2015-05-25","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":"2014-01-25","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":"2014-09-20","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":"2014-09-23","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":"2014-08-23","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":"2014-08-17","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":"2015-05-18","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":"2014-06-24","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":"2014-11-21","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":"2014-06-25","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":"2015-02-14","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":"2014-04-01","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":"2014-07-21","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":"2015-05-21","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":"2015-08-02","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":"2014-03-02","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":"2015-01-24","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":"2015-07-15","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":"2014-01-27","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":"2014-06-24","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":"2014-05-27","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":"2014-10-17","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":"2015-03-22","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":"2015-02-19","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":"2015-02-27","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":"2015-01-17","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":"2014-11-22","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":"2014-05-20","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":"2014-07-25","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":"2014-05-14","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":"2014-06-14","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":"2014-07-13","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":"2014-01-08","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":"2014-06-17","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":"2014-09-01","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":"2014-10-05","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":"2014-07-25","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":"2014-04-13","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":"2015-04-12","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":"2015-05-05","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":"2015-07-31","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":"2015-07-01","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":"2015-04-09","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":"2014-05-23","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":"2014-09-30","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":"2015-04-03","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":"2014-02-18","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":"2014-02-27","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":"2015-02-06","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":"2015-05-14","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":"2014-07-09","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":"2015-03-19","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":"2015-06-22","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":"2014-05-04","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":"2014-05-11","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":"2015-02-14","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":"2015-05-02","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":"2014-07-22","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":"2014-06-25","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":"2015-02-10","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":"2015-03-16","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":"2014-08-14","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":"2014-06-09","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":"2015-08-12","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":"2015-03-04","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":"2015-04-17","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":"2014-06-06","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":"2014-07-14","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":"2015-06-16","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":"2015-05-19","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":"2014-12-13","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":"2014-12-07","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":"2015-02-20","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":"2014-04-08","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":"2015-07-13","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":"2014-05-20","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":"2014-05-31","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":"2014-10-11","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":"2014-11-03","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":"2015-04-02","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":"2015-04-12","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":"2014-12-15","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":"2014-03-10","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":"2014-02-13","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":"2015-02-06","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":"2015-07-26","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":"2015-04-29","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":"2014-09-13","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":"2014-12-28","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":"2014-02-04","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":"2014-05-15","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":"2015-02-27","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":"2015-04-28","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":"2015-07-17","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":"2014-12-20","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":"2015-02-20","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":"2014-11-10","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":"2014-09-22","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":"2014-12-12","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":"2014-07-07","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":"2015-05-01","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":"2015-07-31","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":"2014-04-27","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":"2014-03-19","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":"2015-09-04","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":"2015-01-04","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":"2015-07-13","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":"2015-01-29","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":"2014-02-10","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":"2015-05-14","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":"2015-09-01","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":"2015-04-18","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":"2015-06-24","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":"2014-10-21","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":"2014-04-06","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":"2014-02-19","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":"2015-04-19","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":"2014-12-08","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":"2014-12-12","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":"2014-10-22","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":"2014-06-08","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":"2014-02-22","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":"2015-07-12","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":"2014-09-24","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":"2014-04-28","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":"2014-09-09","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":"2014-01-02","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":"2014-05-13","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":"2014-05-02","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":"2014-08-03","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":"2015-05-22","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":"2014-03-18","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":"2014-03-15","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":"2015-08-12","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":"2014-04-12","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":"2014-05-22","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":"2015-01-25","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":"2014-04-19","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":"2015-06-13","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":"2014-02-18","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":"2014-07-25","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":"2015-03-11","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":"2014-07-26","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":"2015-03-09","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":"2014-04-21","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":"2014-09-05","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":"2014-07-15","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":"2015-01-08","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":"2015-06-17","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":"2015-05-11","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":"2014-02-04","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":"2015-06-24","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":"2014-02-13","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":"2014-10-07","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":"2014-03-28","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":"2015-01-24","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":"2015-02-25","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":"2014-10-14","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":"2014-08-04","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":"2015-03-11","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":"2014-10-20","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":"2014-10-11","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":"2014-09-11","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":"2014-01-25","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":"2014-03-14","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":"2014-11-01","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":"2014-07-02","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":"2014-06-13","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":"2015-06-28","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":"2014-12-25","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":"2014-11-20","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":"2015-03-27","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":"2014-02-17","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":"2015-01-24","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":"2014-01-15","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":"2014-05-25","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":"2014-04-06","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":"2015-02-06","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":"2015-05-22","address":"P.O. Box 940, 1583 At, Street","city":"Austin","state":"Texas","postal_code":"94282","phone":"(270) 219-2853","account_credit":62.7} \ No newline at end of file +[{"id":"1","name":"Shelley Rocha","registered_at":"2015-04-29","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":"2014-04-17","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":"2014-11-28","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":"2014-07-04","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":"2015-08-27","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":"2014-04-03","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":"2014-01-29","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":"2014-11-18","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":"2015-07-23","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":"2015-07-10","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":"2015-07-10","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":"2015-08-20","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":"2014-02-23","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":"2015-03-16","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":"2014-05-19","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":"2014-09-22","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":"2015-02-27","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":"2014-08-24","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":"2015-08-07","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":"2014-07-13","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":"2014-11-01","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":"2015-05-25","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":"2014-01-25","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":"2014-09-20","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":"2014-09-23","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":"2014-08-23","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":"2014-08-17","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":"2015-05-18","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":"2014-06-24","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":"2014-11-21","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":"2014-06-25","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":"2015-02-14","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":"2014-04-01","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":"2014-07-21","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":"2015-05-21","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":"2015-08-02","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":"2014-03-02","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":"2015-01-24","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":"2015-07-15","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":"2014-01-27","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":"2014-06-24","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":"2014-05-27","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":"2014-10-17","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":"2015-03-22","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":"2015-02-19","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":"2015-02-27","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":"2015-01-17","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":"2014-11-22","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":"2014-05-20","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":"2014-07-25","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":"2014-05-14","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":"2014-06-14","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":"2014-07-13","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":"2014-01-08","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":"2014-06-17","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":"2014-09-01","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":"2014-10-05","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":"2014-07-25","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":"2014-04-13","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":"2015-04-12","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":"2015-05-05","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":"2015-07-31","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":"2015-07-01","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":"2015-04-09","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":"2014-05-23","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":"2014-09-30","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":"2015-04-03","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":"2014-02-18","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":"2014-02-27","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":"2015-02-06","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":"2015-05-14","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":"2014-07-09","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":"2015-03-19","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":"2015-06-22","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":"2014-05-04","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":"2014-05-11","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":"2015-02-14","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":"2015-05-02","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":"2014-07-22","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":"2014-06-25","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":"2015-02-10","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":"2015-03-16","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":"2014-08-14","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":"2014-06-09","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":"2015-08-12","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":"2015-03-04","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":"2015-04-17","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":"2014-06-06","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":"2014-07-14","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":"2015-06-16","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":"2015-05-19","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":"2014-12-13","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":"2014-12-07","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":"2015-02-20","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":"2014-04-08","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":"2015-07-13","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":"2014-05-20","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":"2014-05-31","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":"2014-10-11","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":"2014-11-03","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":"2015-04-02","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":"2015-04-12","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":"2014-12-15","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":"2014-03-10","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":"2014-02-13","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":"2015-02-06","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":"2015-07-26","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":"2015-04-29","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":"2014-09-13","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":"2014-12-28","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":"2014-02-04","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":"2014-05-15","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":"2015-02-27","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":"2015-04-28","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":"2015-07-17","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":"2014-12-20","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":"2015-02-20","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":"2014-11-10","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":"2014-09-22","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":"2014-12-12","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":"2014-07-07","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":"2015-05-01","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":"2015-07-31","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":"2014-04-27","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":"2014-03-19","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":"2015-09-04","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":"2015-01-04","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":"2015-07-13","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":"2015-01-29","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":"2014-02-10","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":"2015-05-14","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":"2015-09-01","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":"2015-04-18","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":"2015-06-24","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":"2014-10-21","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":"2014-04-06","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":"2014-02-19","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":"2015-04-19","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":"2014-12-08","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":"2014-12-12","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":"2014-10-22","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":"2014-06-08","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":"2014-02-22","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":"2015-07-12","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":"2014-09-24","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":"2014-04-28","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":"2014-09-09","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":"2014-01-02","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":"2014-05-13","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":"2014-05-02","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":"2014-08-03","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":"2015-05-22","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":"2014-03-18","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":"2014-03-15","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":"2015-08-12","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":"2014-04-12","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":"2014-05-22","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":"2015-01-25","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":"2014-04-19","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":"2015-06-13","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":"2014-02-18","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":"2014-07-25","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":"2015-03-11","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":"2014-07-26","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":"2015-03-09","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":"2014-04-21","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":"2014-09-05","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":"2014-07-15","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":"2015-01-08","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":"2015-06-17","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":"2015-05-11","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":"2014-02-04","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":"2015-06-24","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":"2014-02-13","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":"2014-10-07","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":"2014-03-28","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":"2015-01-24","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":"2015-02-25","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":"2014-10-14","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":"2014-08-04","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":"2015-03-11","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":"2014-10-20","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":"2014-10-11","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":"2014-09-11","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":"2014-01-25","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":"2014-03-14","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":"2014-11-01","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":"2014-07-02","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":"2014-06-13","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":"2015-06-28","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":"2014-12-25","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":"2014-11-20","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":"2015-03-27","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":"2014-02-17","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":"2015-01-24","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":"2014-01-15","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":"2014-05-25","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":"2014-04-06","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":"2015-02-06","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":"2015-05-22","address":"P.O. Box 940, 1583 At, Street","city":"Austin","state":"Texas","postal_code":"94282","phone":"(270) 219-2853","account_credit":62.7}] \ No newline at end of file diff --git a/utils/json_scrubber.js b/utils/json_scrubber.js index b8ae195..05817f5 100644 --- a/utils/json_scrubber.js +++ b/utils/json_scrubber.js @@ -4,18 +4,19 @@ var fs = require('fs'); var customers = require('../customers'); var json_array = []; - for(var i = 0; i < customers.length; i++) { - var customer = customers[i]; - var date = new Date(customer.registered_at); - var formatted_date = date.toISOString(); +for(var i = 0; i < customers.length; i++) { + var customer = customers[i]; + var date = new Date(customer.registered_at); + var formatted_date = date.toISOString(); - customer.registered_at = formatted_date.split("T")[0]; - json_array.push(JSON.stringify(customer)); - } - -console.log("json_array " + json_array[0]); + customer.registered_at = formatted_date.split("T")[0]; + + json_array.push(customer); +} + +var stringy_json_array = JSON.stringify(json_array); -fs.writeFile('formatted_customers.json', json_array, function(err) { +fs.writeFile('formatted_customers.json', stringy_json_array, function(err) { if (err) { console.log(err); return; diff --git a/utils/seeds.js b/utils/seeds.js index a02e898..339b29f 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -59,6 +59,7 @@ db.serialize(function() { for (var i = 0; i < customers.length; i++) { var customer = customers[i]; + // insert each into db customers_statement.run( customer.name, From f62101f896e48f25de02c36b8aa05a8a2ac98ec7 Mon Sep 17 00:00:00 2001 From: Elsa Date: Mon, 21 Sep 2015 19:56:00 -0700 Subject: [PATCH 56/80] Commented out tests again. --- tests/movies.js | 102 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 tests/movies.js diff --git a/tests/movies.js b/tests/movies.js new file mode 100644 index 0000000..8d4c218 --- /dev/null +++ b/tests/movies.js @@ -0,0 +1,102 @@ +// MODEL +// "use strict"; +// +// +// +// module.exports = Movie +// + + +function Movie() { + this.table_name = "movies"; +} + +Movie.prototype = require('../database'); + +// TESTS +var assert = require('assert'), +// Movie = require('../../models/movie'), + sqlite3 = require('sqlite3').verbose(); +// +// describe("Movie", function() { +// var movie, db_cleaner +// +// beforeEach(function(done) { +// movie = new Movie(); +// +// db_cleaner = new sqlite3.Database('db/test.db'); +// db_cleaner.serialize(function() { +// db_cleaner.exec( +// "BEGIN; \ +// DELETE FROM movies; \ +// INSERT INTO movies(title, overview, release_date, inventory) \ +// VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ +// ('Maws', 'Worm!', 'Yesterday', 11); \ +// COMMIT;" +// , function(err) { +// db_cleaner.close(); +// done(); +// } +// ); +// }); +// }) +// +// it("can be instantiated", function() { +// assert(movie instanceof Movie); +// }) +// +// describe("instance methods", function() { +// it("can find a movie by id", function(done){ +// movie.find_by("id", 1, function(err, res) { +// assert.equal(err, undefined); +// assert(res instanceof Array); +// assert.equal(res.length, 1); +// assert.equal(res[0].id, 1); +// done(); +// }) +// }) +// +// it("can find a movie by title", function(done) { +// movie.find_by("title", "Jaws", function(err, res) { +// assert.equal(err, undefined); +// assert(res instanceof Array); +// assert.equal(res.length, 1); +// assert.equal(res[0].title, 'Jaws'); +// done(); +// }) +// }) +// +// it("can save changes to a movie", function(done) { +// movie.find_by("title", "Jaws", function(err, res) { +// var original_title = res[0].title; +// var id = res[0].id; +// movie.save({title: "Jaws 2: Jawsier", id: id}, function(err, res) { +// assert.equal(err, undefined); +// assert.equal(res.inserted_id, 0); //it didn't insert any records +// assert.equal(res.changed, 1); //it updated one record +// done(); +// }) +// }) +// }); +// +// it("can save a new movie to the database", function(done) { +// var data = { +// title: "RoboJaws", +// overview: "Jaws is hunted by RoboJaws", +// release_date: "Tomorrow", +// inventory: 10 +// } +// +// movie.create(data, function(err, res) { +// assert.equal(res.inserted_id, 3); //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 b00d70318c98047d5c183ed1d686f405f5a9b6ad Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Tue, 22 Sep 2015 11:14:57 -0700 Subject: [PATCH 57/80] Adds movie model and adds all function to controller --- controllers/movies.js | 17 ++++++----- database.js | 69 +++++++++++++++++++++++++++++++++++++++++++ models/movie.js | 9 ++++++ 3 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 database.js create mode 100644 models/movie.js diff --git a/controllers/movies.js b/controllers/movies.js index c6e6ae7..fe2f70c 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -1,20 +1,21 @@ "use strict"; var sqlite3 = require('sqlite3').verbose(), + Movie = require('../models/movie'), db_env = process.env.DB || 'development', db; - function addPercents(variable) { - var percented = "%" + variable + "%"; - return percented; - } +function addPercents(variable) { + var percented = "%" + variable + "%"; + return percented; +} exports.moviesController = { movies: function(req, res) { - db = new sqlite3.Database('db/' + db_env + '.db'); - db.all("SELECT * FROM movies", function(err, all_movies) { - db.close(); - return res.status(200).json(all_movies); + var movie = new Movie(); + movie.all(function(error, result) { + + return res.status(200).json(result); }); }, diff --git a/database.js b/database.js new file mode 100644 index 0000000..daebb73 --- /dev/null +++ b/database.js @@ -0,0 +1,69 @@ +"use strict"; + +var sqlite3 = require('sqlite3').verbose(), + db_env = process.env.DB || 'development'; + +module.exports = { + all: function(callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT * FROM " + this.table_name; + + db.all(statement, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); + }, + + find_by: function(column, value, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT * FROM " + this.table_name + " WHERE " + column + " LIKE ?"; + + db.all(statement, value, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); + } + + // create: function(data, callback) { + // var db = new sqlite3.Database('db/' + db_env + '.db'); + // var keys = Object.keys(data); + // var key_pairs = []; + // var values = []; + + // for (var i = 0; i < keys.length; i++) { + // values.push(data[keys[i]]); + // key_pairs.push('?'); + // } + + // var statement = "INSERT INTO "+ this.table_name + " (" + keys.join(',') + ") " + + // "VALUES(" + key_pairs.join(',') + ")" + + // db.run(statement, values, function(err) { + // callback(err, { inserted_id: this.lastID, changed: this.changes }); + // db.close(); + // }); + // }, + + // save: function(data, callback) { + // if (data.id) { + // var db = new sqlite3.Database('db/' + db_env + '.db'); + // var keys = Object.keys(data); + // var key_pairs = []; + // var values = []; + + // for (var i = 0; i < keys.length; i++) { + // values.push(data[keys[i]]); + // key_pairs.push(keys[i] + "=? "); + // } + + // var statement = "UPDATE " + this.table_name + " SET " + key_pairs.join(',') + "WHERE id=" + data.id; + + // db.run(statement, values, function(err) { + // callback(err, { inserted_id: this.lastID, changed: this.changes }); + // db.close(); + // }); + // } else { + // callback({err: "Missing Key", message: "Can't save without an id; use `create`"}); + // } + // } +} diff --git a/models/movie.js b/models/movie.js new file mode 100644 index 0000000..83043d5 --- /dev/null +++ b/models/movie.js @@ -0,0 +1,9 @@ +"use strict"; + +function Movie() { + this.table_name = "movies"; +} + +Movie.prototype = require('../database'); + +module.exports = Movie From c97315ec986cb46e1272e2a03a3c78c146a95e58 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Tue, 22 Sep 2015 11:26:50 -0700 Subject: [PATCH 58/80] Adds model functions to movies by title --- controllers/customers.js | 8 ++++---- controllers/movies.js | 15 ++++++++------- models/customer.js | 9 +++++++++ 3 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 models/customer.js diff --git a/controllers/customers.js b/controllers/customers.js index 8a47d2e..a033c09 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -1,6 +1,7 @@ "use strict"; var sqlite3 = require('sqlite3').verbose(), + Customer = require('../models/customer'), db_env = process.env.DB || 'development', db; @@ -11,10 +12,9 @@ function addPercents(variable) { exports.customersController = { customers: function(req, res) { - db = new sqlite3.Database('db/' + db_env + '.db'); - db.all("SELECT * FROM customers", function(err, all_customers) { - db.close(); - return res.status(200).json(all_customers); + var customer = new Customer(); + customer.all(function(error, result) { + return res.status(200).json(result); }); }, diff --git a/controllers/movies.js b/controllers/movies.js index fe2f70c..acf213b 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -14,18 +14,19 @@ exports.moviesController = { movies: function(req, res) { var movie = new Movie(); movie.all(function(error, result) { - - return res.status(200).json(result); + return res.status(200).json(result); }); }, movies_by_title: function(req, res) { - db = new sqlite3.Database('db/' + db_env + '.db'); - var title = req.params.title.toLowerCase(); + // db = new sqlite3.Database('db/' + db_env + '.db'); + // db.all("SELECT * FROM movies WHERE title LIKE ?;", title, function(err, the_title) { + // db.close(); + var title = req.params.title.toLowerCase(), + movie = new Movie(); title = addPercents(title); - db.all("SELECT * FROM movies WHERE title LIKE ?;", title, function(err, the_title) { - db.close(); - return res.status(200).json(the_title); + movie.find_by("title", title, function(error, result) { + return res.status(200).json(result); }); }, diff --git a/models/customer.js b/models/customer.js new file mode 100644 index 0000000..d1b1dd4 --- /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 From 6095ab29bf7be125da87906e9bd99c996f96b3cc Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Tue, 22 Sep 2015 11:32:17 -0700 Subject: [PATCH 59/80] fixes whitespace --- controllers/movies.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index acf213b..0df0209 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -13,18 +13,17 @@ function addPercents(variable) { exports.moviesController = { movies: function(req, res) { var movie = new Movie(); + movie.all(function(error, result) { return res.status(200).json(result); }); }, movies_by_title: function(req, res) { - // db = new sqlite3.Database('db/' + db_env + '.db'); - // db.all("SELECT * FROM movies WHERE title LIKE ?;", title, function(err, the_title) { - // db.close(); var title = req.params.title.toLowerCase(), movie = new Movie(); title = addPercents(title); + movie.find_by("title", title, function(error, result) { return res.status(200).json(result); }); From 8b463ef1b8ff5374f4a3521e57207aa5bc6507c8 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Tue, 22 Sep 2015 11:59:47 -0700 Subject: [PATCH 60/80] Adds WIP tests --- package.json | 3 +- test/controllers/movies.js | 52 +++++++++++++++++++ test/movies.js | 104 ------------------------------------- tests/movies.js | 102 ------------------------------------ 4 files changed, 54 insertions(+), 207 deletions(-) create mode 100644 test/controllers/movies.js delete mode 100644 test/movies.js delete mode 100644 tests/movies.js diff --git a/package.json b/package.json index 8c9bd9b..88bd5cf 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "mocha": "^2.3.3", "morgan": "~1.6.1", "serve-favicon": "~2.3.0", - "sqlite3": "^3.1.0" + "sqlite3": "^3.1.0", + "supertest": "^1.1.0" } } diff --git a/test/controllers/movies.js b/test/controllers/movies.js new file mode 100644 index 0000000..3bd5f8d --- /dev/null +++ b/test/controllers/movies.js @@ -0,0 +1,52 @@ +var request = require('supertest'), +assert = require('assert'), +app = require('../../app'), +sqlite3 = require('sqlite3').verbose(), +agent = request.agent(app); + +describe("Endpoints under /movies", function() { + 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, copies_available) \ + VALUES('Jaws', 'Shark!', 'Yesterday', 10, 10), \ + ('Maws', 'Worm!', 'Yesterday', 11, 11); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + +describe("movies controller", function() { + describe("GET '/'", function() { + it("knows about the route", function(done) { + agent.get('/movies').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); + + it("returns an array of movie objects", function(done) { + agent.get('/movies').set('Accept', 'application/json') + .expect(200, function(err, result) { + console.log("result is ", result); + console.log(err); + assert.equal(result.body.length, 2); + + var keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'copies_available']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); + }); + }); +}); diff --git a/test/movies.js b/test/movies.js deleted file mode 100644 index 336d9d6..0000000 --- a/test/movies.js +++ /dev/null @@ -1,104 +0,0 @@ -// MODEL -// "use strict"; -// -// -// -// module.exports = Movie -// - - -function Movie() { - this.table_name = "movies"; -} - -// Movie.prototype = require('../database'); -Movie.prototype = new Movie(); - - -// TESTS -var assert = require('assert'), -// Movie = require('../../models/movie'), - sqlite3 = require('sqlite3').verbose(); -// -describe("Movie", function() { - var movie, db_cleaner; - - beforeEach(function(done) { - movie = new Movie(); - - db_cleaner = new sqlite3.Database('db/test.db'); - db_cleaner.serialize(function() { - db_cleaner.exec( - "BEGIN; \ - DELETE FROM movies; \ - INSERT INTO movies(title, overview, release_date, inventory) \ - VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ - ('Maws', 'Worm!', 'Yesterday', 11); \ - COMMIT;" - , function(err) { - db_cleaner.close(); - done(); - } - ); - }); - }); - - it("can be instantiated", function() { - assert(movie instanceof Movie); - }); - - // describe("instance methods", function() { - // it("can find a movie by id", function(done){ - // movie.find_by("id", 1, function(err, res) { - // assert.equal(err, undefined); - // assert(res instanceof Array); - // assert.equal(res.length, 1); - // assert.equal(res[0].id, 1); - // done(); - // }) - // }) - // - // it("can find a movie by title", function(done) { - // movie.find_by("title", "Jaws", function(err, res) { - // assert.equal(err, undefined); - // assert(res instanceof Array); - // assert.equal(res.length, 1); - // assert.equal(res[0].title, 'Jaws'); - // done(); - // }) - // }) - // - // it("can save changes to a movie", function(done) { - // movie.find_by("title", "Jaws", function(err, res) { - // var original_title = res[0].title; - // var id = res[0].id; - // movie.save({title: "Jaws 2: Jawsier", id: id}, function(err, res) { - // assert.equal(err, undefined); - // assert.equal(res.inserted_id, 0); //it didn't insert any records - // assert.equal(res.changed, 1); //it updated one record - // done(); - // }) - // }) - // }); - // - // it("can save a new movie to the database", function(done) { - // var data = { - // title: "RoboJaws", - // overview: "Jaws is hunted by RoboJaws", - // release_date: "Tomorrow", - // inventory: 10 - // } - // - // movie.create(data, function(err, res) { - // assert.equal(res.inserted_id, 3); // 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(); - // }) - // }) - // }); - // }) -}); diff --git a/tests/movies.js b/tests/movies.js deleted file mode 100644 index 8d4c218..0000000 --- a/tests/movies.js +++ /dev/null @@ -1,102 +0,0 @@ -// MODEL -// "use strict"; -// -// -// -// module.exports = Movie -// - - -function Movie() { - this.table_name = "movies"; -} - -Movie.prototype = require('../database'); - -// TESTS -var assert = require('assert'), -// Movie = require('../../models/movie'), - sqlite3 = require('sqlite3').verbose(); -// -// describe("Movie", function() { -// var movie, db_cleaner -// -// beforeEach(function(done) { -// movie = new Movie(); -// -// db_cleaner = new sqlite3.Database('db/test.db'); -// db_cleaner.serialize(function() { -// db_cleaner.exec( -// "BEGIN; \ -// DELETE FROM movies; \ -// INSERT INTO movies(title, overview, release_date, inventory) \ -// VALUES('Jaws', 'Shark!', 'Yesterday', 10), \ -// ('Maws', 'Worm!', 'Yesterday', 11); \ -// COMMIT;" -// , function(err) { -// db_cleaner.close(); -// done(); -// } -// ); -// }); -// }) -// -// it("can be instantiated", function() { -// assert(movie instanceof Movie); -// }) -// -// describe("instance methods", function() { -// it("can find a movie by id", function(done){ -// movie.find_by("id", 1, function(err, res) { -// assert.equal(err, undefined); -// assert(res instanceof Array); -// assert.equal(res.length, 1); -// assert.equal(res[0].id, 1); -// done(); -// }) -// }) -// -// it("can find a movie by title", function(done) { -// movie.find_by("title", "Jaws", function(err, res) { -// assert.equal(err, undefined); -// assert(res instanceof Array); -// assert.equal(res.length, 1); -// assert.equal(res[0].title, 'Jaws'); -// done(); -// }) -// }) -// -// it("can save changes to a movie", function(done) { -// movie.find_by("title", "Jaws", function(err, res) { -// var original_title = res[0].title; -// var id = res[0].id; -// movie.save({title: "Jaws 2: Jawsier", id: id}, function(err, res) { -// assert.equal(err, undefined); -// assert.equal(res.inserted_id, 0); //it didn't insert any records -// assert.equal(res.changed, 1); //it updated one record -// done(); -// }) -// }) -// }); -// -// it("can save a new movie to the database", function(done) { -// var data = { -// title: "RoboJaws", -// overview: "Jaws is hunted by RoboJaws", -// release_date: "Tomorrow", -// inventory: 10 -// } -// -// movie.create(data, function(err, res) { -// assert.equal(res.inserted_id, 3); //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 7cfefcf5f91aa583566a3af65aad0c68cca952b3 Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 22 Sep 2015 13:44:50 -0700 Subject: [PATCH 61/80] Added movie find by title endpoint test, and find all customers and find by customer name endpoint tests. --- test/controllers/customers.js | 72 ++++++++++++++++++++++++++++++ test/controllers/movies.js | 82 +++++++++++++++++++++++++---------- 2 files changed, 132 insertions(+), 22 deletions(-) create mode 100644 test/controllers/customers.js diff --git a/test/controllers/customers.js b/test/controllers/customers.js new file mode 100644 index 0000000..d6a7cac --- /dev/null +++ b/test/controllers/customers.js @@ -0,0 +1,72 @@ +var request = require('supertest'), +assert = require('assert'), +app = require('../../app'), +sqlite3 = require('sqlite3').verbose(), +agent = request.agent(app); + +describe("customers controller", function() { + + beforeEach(function(done) { + db_cleaner = new sqlite3.Database('db/test.db'); + db_cleaner.serialize(function() { + db_cleaner.exec( + // var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; + "BEGIN; \ + DELETE FROM customers; \ + INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ + VALUES('Shelley Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'), \ + ('Billy Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'); \ + COMMIT;", function(err) { + db_cleaner.close(); + done(); + } + ); + }); + + }); + +describe("GET '/'", function() { + it("knows about the route", function(done) { + agent.get('/customers').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); + + it("returns an array of customer objects", function(done) { + agent.get('/customers').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 2); + + var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); // returns array objects + + it("knows about the route", function(done) { + agent.get('/customers/names/Shelley/per_page1/pg0').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); + + it("returns the customer object", function(done) { + agent.get('/customers/names/Shelley/per_page1/pg0').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 1); + + var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); // returns array objects + + }); // describe get +}); // describe customers diff --git a/test/controllers/movies.js b/test/controllers/movies.js index 3bd5f8d..303f15a 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -4,7 +4,27 @@ app = require('../../app'), sqlite3 = require('sqlite3').verbose(), agent = request.agent(app); -describe("Endpoints under /movies", function() { +// describe("Endpoints under /movies", function() { + // 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, copies_available) \ + // VALUES('Jaws', 'Shark!', '2015-09-22', 10, 10), \ + // ('Maws', 'Worm!', '2015-09-22', 11, 11); \ + // COMMIT;" + // , function(err) { + // db_cleaner.close(); + // done(); + // } + // ); + // }); + // }); + +describe("movies controller", function() { + beforeEach(function(done) { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { @@ -12,41 +32,59 @@ describe("Endpoints under /movies", function() { "BEGIN; \ DELETE FROM movies; \ INSERT INTO movies(title, overview, release_date, inventory, copies_available) \ - VALUES('Jaws', 'Shark!', 'Yesterday', 10, 10), \ - ('Maws', 'Worm!', 'Yesterday', 11, 11); \ - COMMIT;" - , function(err) { + VALUES('Jaws', 'Shark!', '2015-09-22', 10, 10), \ + ('Maws', 'Worm!', '2015-09-22', 11, 11); \ + COMMIT;", function(err) { db_cleaner.close(); done(); } ); }); - }); -describe("movies controller", function() { - describe("GET '/'", function() { - it("knows about the route", function(done) { - agent.get('/movies').set('Accept', 'application/json') - .expect('Content-Type', /application\/json/) - .expect(200, function(err, res) { - assert.equal(err, undefined); - // console.log(err); - done(); - }); - }); + }); + +describe("GET '/'", function() { + it("knows about the route", function(done) { + agent.get('/movies').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); it("returns an array of movie objects", function(done) { agent.get('/movies').set('Accept', 'application/json') .expect(200, function(err, result) { - console.log("result is ", result); - console.log(err); assert.equal(result.body.length, 2); var keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'copies_available']; assert.deepEqual(Object.keys(result.body[0]), keys); done(); }); - }); - }); + }); // returns array objects + + it("knows about the route", function(done) { + agent.get('/movies/Jaws').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); }); -}); + + it("returns the movie object", function(done) { + agent.get('/movies/Jaws').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 1); + + var keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'copies_available']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); // returns array objects + + }); // describe get +}); // describe movies From 1889a325ca75fe6c1449137eef4e6a20921a460e Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 22 Sep 2015 14:14:38 -0700 Subject: [PATCH 62/80] Changed customers controller to use find_by_with_limit and created endpoint tests. --- controllers/customers.js | 27 +++++++++------------- database.js | 14 +++++++++++- test/controllers/customers.js | 42 +++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 18 deletions(-) diff --git a/controllers/customers.js b/controllers/customers.js index a033c09..3731391 100644 --- a/controllers/customers.js +++ b/controllers/customers.js @@ -52,7 +52,6 @@ exports.customersController = { }, customers_by_name: function(req, res) { - db = new sqlite3.Database('db/' + db_env + '.db'); var name = req.params.name, per_page = req.params.per_page, page = req.params.pg; @@ -60,32 +59,27 @@ exports.customersController = { name = addPercents(name); - db.all("SELECT * FROM customers WHERE name LIKE ? ORDER BY name \ - LIMIT ? OFFSET ?;", name, per_page, page, function(err, the_name) { - db.close(); - console.log(arguments); - return res.status(200).json(the_name); + var customer = new Customer(); + customer.find_by_with_limit("name", name, per_page, page, function(error, result) { + return res.status(200).json(result); }); }, customers_by_register_date: function(req, res) { - db = new sqlite3.Database('db/' + db_env + '.db'); var date = req.params.date, per_page = req.params.per_page, page = req.params.pg; page = page * per_page; - date = addPercents(date); - db.all("SELECT * FROM customers WHERE registered_at LIKE ? ORDER BY registered_at \ - LIMIT ? OFFSET ?;", date, per_page, page, function(err, the_date) { - db.close(); - return res.status(200).json(the_date); + + var customer = new Customer(); + customer.find_by_with_limit("registered_at", date, per_page, page, function(error, result) { + return res.status(200).json(result); }); }, customers_by_postal_code: function(req, res) { - db = new sqlite3.Database('db/' + db_env + '.db'); var zipcode = req.params.zipcode, per_page = req.params.per_page, page = req.params.pg; @@ -93,10 +87,9 @@ exports.customersController = { zipcode = addPercents(zipcode); - db.all("SELECT * FROM customers WHERE postal_code LIKE ? ORDER BY postal_code \ - LIMIT ? OFFSET ?;", zipcode, per_page, page, function(err, the_code) { - db.close(); - return res.status(200).json(the_code); + var customer = new Customer(); + customer.find_by_with_limit("postal_code", zipcode, per_page, page, function(error, result) { + return res.status(200).json(result); }); }, diff --git a/database.js b/database.js index daebb73..be0d3bd 100644 --- a/database.js +++ b/database.js @@ -22,7 +22,19 @@ module.exports = { if (callback) callback(err, res); db.close(); }); - } + }, + + find_by_with_limit: function(column, value, per_page, page, callback) { + var db = new sqlite3.Database('db/' + db_env + '.db'); + var statement = "SELECT * FROM " + this.table_name + " WHERE " + column + " LIKE ? ORDER BY " + column + " LIMIT " + per_page + " OFFSET " + page; + + db.all(statement, value, function(err, res) { + if (callback) callback(err, res); + db.close(); + }); + }, + + // create: function(data, callback) { // var db = new sqlite3.Database('db/' + db_env + '.db'); diff --git a/test/controllers/customers.js b/test/controllers/customers.js index d6a7cac..88b803b 100644 --- a/test/controllers/customers.js +++ b/test/controllers/customers.js @@ -68,5 +68,47 @@ describe("GET '/'", function() { }); }); // returns array objects + it("knows about the route", function(done) { + agent.get('/customers/date/2015/per_page1/pg0').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); + + it("returns the customer object", function(done) { + agent.get('/customers/date/2015/per_page1/pg0').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 1); + + var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); // returns array objects + + it("knows about the route", function(done) { + agent.get('/customers/zipcode/98104/per_page1/pg0').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); + + it("returns the customer object", function(done) { + agent.get('/customers/zipcode/98104/per_page1/pg0').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 1); + + var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); // returns array objects + }); // describe get }); // describe customers From a71d2d12c510f1beb71444a6068d367a262823e4 Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 22 Sep 2015 14:34:47 -0700 Subject: [PATCH 63/80] Finished all customer endpoint tests. --- test/controllers/customers.js | 84 ++++++++++++++++++++++++++++++++++- utils/schema.js | 3 +- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/test/controllers/customers.js b/test/controllers/customers.js index 88b803b..81ab459 100644 --- a/test/controllers/customers.js +++ b/test/controllers/customers.js @@ -10,18 +10,56 @@ describe("customers controller", function() { db_cleaner = new sqlite3.Database('db/test.db'); db_cleaner.serialize(function() { db_cleaner.exec( - // var keys = ['id', 'name', 'registered_at', 'address', 'city', 'state', 'postal_code', 'phone', 'account_credit']; "BEGIN; \ DELETE FROM customers; \ INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ VALUES('Shelley Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'), \ ('Billy Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'); \ + COMMIT;", function(err) { + // db_cleaner.close(); + // done(); + } + ); + + db_cleaner.exec( + "BEGIN; \ + DELETE FROM movies; \ + INSERT INTO movies(title, overview, release_date, inventory, copies_available) \ + VALUES('Jaws', 'Shark!', '2015-09-22', 1, 1), \ + ('Maws', 'Worm!', '2015-09-22', 1, 1); \ + COMMIT;", function(err) { + // db_cleaner.close(); + // done(); + } + ); + + db_cleaner.exec( + "BEGIN; \ + DELETE FROM movie_copies; \ + INSERT INTO movie_copies(movie_id) \ + VALUES(1), \ + (2); \ + COMMIT;", function(err) { + // db_cleaner.close(); + // done(); + } + ); + + db_cleaner.exec( + "BEGIN; \ + DELETE FROM rentals; \ + INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ + VALUES(1, 1, '2015-09-22', '2015-10-01', 0, 5), \ + (1, 2, '2015-09-12', '2015-09-21', 1, 5), \ + (2, 2, '2015-09-22', '2015-10-01', 0, 5), \ + (2, 1, '2015-09-12', '2015-09-21', 1, 5); \ COMMIT;", function(err) { db_cleaner.close(); done(); } ); - }); + + }); // end serialize }); @@ -110,5 +148,47 @@ describe("GET '/'", function() { }); }); // returns array objects + it("knows about the route", function(done) { + agent.get('/customers/1/current_movies').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); + + it("returns the customer object", function(done) { + agent.get('/customers/1/current_movies').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 1); + + var keys = ['title']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); // returns array objects + + it("knows about the route", function(done) { + agent.get('/customers/1/past_movies').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); + + it("returns the customer object", function(done) { + agent.get('/customers/1/past_movies').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 1); + + var keys = ['title', 'return_date']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); // returns array objects + }); // describe get }); // describe customers diff --git a/utils/schema.js b/utils/schema.js index 6ec9067..446a694 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -27,8 +27,7 @@ var rental_fields = [ ['checkout_date', 'text'], ['return_date', 'text'], ['return_status', 'integer'], - ['cost', 'integer'], - ['title', 'text'] + ['cost', 'integer'] ]; // sqlite does no have a separate boolean class, using values 0 and 1 for true and false From 18bb933e07fed3a743cacc018bd18a806a3c4c9a Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Tue, 22 Sep 2015 15:10:25 -0700 Subject: [PATCH 64/80] Adds current renters route for a given movie title --- controllers/movies.js | 13 +++-- test/controllers/movies.js | 105 +++++++++++++++++++++++++++++-------- 2 files changed, 89 insertions(+), 29 deletions(-) diff --git a/controllers/movies.js b/controllers/movies.js index 0df0209..c9d0e43 100644 --- a/controllers/movies.js +++ b/controllers/movies.js @@ -88,13 +88,12 @@ exports.moviesController = { }, movies_by_release: function(req, res) { - db = new sqlite3.Database('db/' + db_env + '.db'); - var release = req.params.release_date; - release = addPercents(release); - db.all("SELECT * FROM movies WHERE release_date ?;", release, function(err, the_date) { - db.close(); - return res.status(200).json(the_date); + var date = req.params.release_date.toLowerCase(), + movie = new Movie(); + date = addPercents(date); + + movie.find_by("release_date", date, function(error, result) { + return res.status(200).json(result); }); } - }; // end diff --git a/test/controllers/movies.js b/test/controllers/movies.js index 303f15a..e852a6f 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -4,25 +4,6 @@ app = require('../../app'), sqlite3 = require('sqlite3').verbose(), agent = request.agent(app); -// describe("Endpoints under /movies", function() { - // 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, copies_available) \ - // VALUES('Jaws', 'Shark!', '2015-09-22', 10, 10), \ - // ('Maws', 'Worm!', '2015-09-22', 11, 11); \ - // COMMIT;" - // , function(err) { - // db_cleaner.close(); - // done(); - // } - // ); - // }); - // }); - describe("movies controller", function() { beforeEach(function(done) { @@ -35,13 +16,50 @@ describe("movies controller", function() { VALUES('Jaws', 'Shark!', '2015-09-22', 10, 10), \ ('Maws', 'Worm!', '2015-09-22', 11, 11); \ COMMIT;", function(err) { + + } + ); + + db_cleaner.exec( + "BEGIN; \ + DELETE FROM customers; \ + INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ + VALUES('Shelley Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'), \ + ('Billy Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'); \ + COMMIT;", function(err) { + + } + ); + + db_cleaner.exec( + "BEGIN; \ + DELETE FROM movie_copies; \ + INSERT INTO movie_copies(movie_id) \ + VALUES(1), \ + (1), \ + (2), \ + (2); \ + COMMIT;", function(err) { + + } + ); + + db_cleaner.exec( + "BEGIN; \ + DELETE FROM rentals; \ + INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ + VALUES(1, 1, '2015-09-22', '2015-10-01', 0, 5), \ + (1, 2, '2015-09-12', '2015-09-21', 1, 5), \ + (2, 1, '2015-09-22', '2015-10-01', 0, 5), \ + (2, 3, '2015-09-22', '2015-10-01', 0, 5), \ + (2, 1, '2015-09-12', '2015-09-21', 1, 5); \ + COMMIT;", function(err) { db_cleaner.close(); done(); } ); - }); - - }); + }); // end serialize + }); describe("GET '/'", function() { it("knows about the route", function(done) { @@ -86,5 +104,48 @@ describe("GET '/'", function() { }); }); // returns array objects + it("knows about the route", function(done) { + agent.get('/movies/Jaws/current_renters/id').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); + + it("returns the movie object", function(done) { + agent.get('/movies/Jaws/current_renters/id').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 2); + + var keys = ['name']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); // returns array objects + + it("knows about the route", function(done) { + agent.get('/movies/release/2015').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); + + it("returns the movie object", function(done) { + agent.get('/movies/release/2015').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 2); + + var keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'copies_available']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); // returns array objects + + }); // describe get }); // describe movies From 840dea73a77699f7d8d8b2657f96e8b9f377c9f0 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Tue, 22 Sep 2015 15:11:53 -0700 Subject: [PATCH 65/80] Adds past renters by title for movies tests --- test/controllers/movies.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/controllers/movies.js b/test/controllers/movies.js index e852a6f..1d33cdb 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -125,6 +125,28 @@ describe("GET '/'", function() { }); }); // returns array objects + it("knows about the route", function(done) { + agent.get('/movies/Jaws/past_renters/id').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + // console.log(err); + done(); + }); + }); + + it("returns the movie object", function(done) { + agent.get('/movies/Jaws/past_renters/id').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 2); + + var keys = ['name']; + assert.deepEqual(Object.keys(result.body[0]), keys); + done(); + }); + }); // returns array objects + + it("knows about the route", function(done) { agent.get('/movies/release/2015').set('Accept', 'application/json') .expect('Content-Type', /application\/json/) From d5ebe94dda44c3907eb3a37ca111e8b45cc93ebc Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Tue, 22 Sep 2015 15:20:17 -0700 Subject: [PATCH 66/80] Adds tests for overdue rentals --- test/controllers/rentals.js | 83 +++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 test/controllers/rentals.js diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js new file mode 100644 index 0000000..872a3c8 --- /dev/null +++ b/test/controllers/rentals.js @@ -0,0 +1,83 @@ +var request = require('supertest'), +assert = require('assert'), +app = require('../../app'), +sqlite3 = require('sqlite3').verbose(), +agent = request.agent(app); + +describe("customers controller", function() { + + 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('Shelley Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'), \ + ('Billy Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'); \ + COMMIT;", function(err) { + + } + ); + + db_cleaner.exec( + "BEGIN; \ + DELETE FROM movies; \ + INSERT INTO movies(title, overview, release_date, inventory, copies_available) \ + VALUES('Jaws', 'Shark!', '2015-09-22', 1, 1), \ + ('Maws', 'Worm!', '2015-09-22', 1, 1); \ + COMMIT;", function(err) { + + } + ); + + db_cleaner.exec( + "BEGIN; \ + DELETE FROM movie_copies; \ + INSERT INTO movie_copies(movie_id) \ + VALUES(1), \ + (2); \ + COMMIT;", function(err) { + + } + ); + + db_cleaner.exec( + "BEGIN; \ + DELETE FROM rentals; \ + INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ + VALUES(1, 1, '2014-09-22', '2014-10-01', 0, 5), \ + (2, 1, '2015-09-12', '2015-09-21', 1, 5); \ + COMMIT;", function(err) { + db_cleaner.close(); + done(); + } + ); + + }); // end serialize + }); // end beforeEach function + +describe("GET '/'", function() { + it("knows about the route", function(done) { + agent.get('/rentals/overdue').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + + done(); + }); + }); + + it("returns an array of movie objects", function(done) { + agent.get('/rentals/overdue').set('Accept', 'application/json') + .expect(200, function(err, result) { + assert.equal(result.body.length, 1); + + var keys = ['name', 'title', 'id']; + assert.deepEqual(Object.keys(result.body[0]), keys); + + done(); + }); + }); // returns array objects + }); // end describe 'get' block +}); // end describe 'customers controller' block From cb8e7e23b32ac942d48ac9a3ad61b557d31f31b6 Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 22 Sep 2015 17:07:32 -0700 Subject: [PATCH 67/80] WIP create_rental. Can't yet get full list of all available movie copies based on title. --- README.md | 28 +++++++++++------------ controllers/rentals.js | 52 +++++++++++++++++++++++++++++------------- utils/seeds.js | 4 ++-- 3 files changed, 52 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index b6f49cb..4971e5d 100644 --- a/README.md +++ b/README.md @@ -2,35 +2,35 @@ ## Notes ### Endpoints -** ADD PAGINATION ** +*DONE* ADD PAGINATION -**DONE** GET "/customers" +*DONE* GET "/customers" // for routes below, will need to return results offset by page number -**DONE** GET "/customers/:name" // will be dynamic -**DONE** GET "/customers/:registered_at" -**DONE** GET "/customers/:postal_code" +*DONE* GET "/customers/:name" // will be dynamic +*DONE* GET "/customers/:registered_at" +*DONE* GET "/customers/:postal_code" -**DONE** GET "/customers/:id/current_movies" -**DONE** GET "/customers/:id/past_movies" // order by checkout date, include return date +*DONE* GET "/customers/:id/current_movies" +*DONE* GET "/customers/:id/past_movies" // order by checkout date, include return date -**DONE** GET "/movies" +*DONE* GET "/movies" // for routes below, will need to return results offset by page number -**DONE** GET "/movies/:title" // will be dynamic -**DONE** GET "/movies/:release_date" +*DONE* GET "/movies/:title" // will be dynamic +*DONE* GET "/movies/:release_date" // for routes below, will need to pass an ordering parameter to order by customer id, name, or checkout date -**DONE** GET "/movies/:title/current_customers/:order" -**DONE** GET "/movies/:title/past_customers/:order" +*DONE* GET "/movies/:title/current_customers/:order" +*DONE* GET "/movies/:title/past_customers/:order" // normalize database or join everything??? -**DONE** GET "/movies/:title" +*DONE* GET "/movies/:title" // includes synopsis, release date, inventory total, rentable boolean, list of customers that have it currently checkout out ...? POST "/rentals/:customer_id/:movie_title" // create association, checkout date, return date, charge account, returned boolean PATCH "/checkin/:customer_id/:movie_title" // modify returned boolean -**DONE** GET "/rentals/overdue" +*DONE* GET "/rentals/overdue" --- The overall goal of this project is to create a system that a video store (remember those?) could use to track their inventory of rental videos and their collection of customers. diff --git a/controllers/rentals.js b/controllers/rentals.js index 26e352c..b6cce6d 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -9,19 +9,25 @@ function addPercents(variable) { return percented; } -function findCopy(movie_title) { +function findCopy(movie_title, callback) { db = new sqlite3.Database('db/' + db_env + '.db'); - db.get("SELECT movie_copies.id FROM rentals \ + db.all("SELECT rentals.movie_copy_id, movies.id FROM rentals \ INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ INNER JOIN movies ON movie_copies.movie_id = movies.id \ - WHERE rentals.return_status = 1 AND movies.title LIKE ?;", movie_title, function(err, rental) { + WHERE movies.title LIKE ? AND rentals.return_status = 1;", movie_title, function(err, rental) { + if (err) { + console.log("ERROR:", err); + } db.close(); if(err) { - return res.status(204).json("No copies available"); + // return res.status(204).json("No copies available"); + console.log("ERROR: ", err); } else { - console.log("from find copy " + rental); - return rental.id; + console.log("RENTAL: ", rental); + var movie_data = rental; + console.log("MOVIE DATA: ", movie_data); + callback(movie_data); } }); } @@ -55,17 +61,31 @@ exports.rentalsController = { var customer = req.params.customer_id, movie = req.params.movie_title; movie = addPercents(movie); - console.log(movie); - console.log(customer); - var copy_id = findCopy(movie); - console.log("from create_rental " + copy_id); + var checkout = new Date(); + var due = new Date(checkout); + due.setDate(checkout.getDate()+7); + checkout = checkout.toISOString().split("T")[0]; + due = due.toISOString().split("T")[0]; + + findCopy(movie, function(movie_data) { + console.log("COPY ID: ", movie_data[0].movie_copy_id); + + db = new sqlite3.Database('db/' + db_env + '.db'); + db.run("INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ + VALUES(" + customer + ", " + movie_data[0].movie_copy_id + ", " + checkout + ", " + due + ", 0, 5); \ + COMMIT;", function(err, result) { + db.close(); + return res.status(200).json(result); + }); + }); + + // INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ + // VALUES('Shelley Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'), \ + // ('Billy Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'); \ + // COMMIT;", function(err) { + + - // db = new sqlite3.Database('db/' + db_env + '.db'); - // db.run("SELECT * FROM rentals", function(err, all_rentals) { - // db.close(); - // return res.status(200).json(all_rentals); - // }); }, }; - diff --git a/utils/seeds.js b/utils/seeds.js index 339b29f..2c6d76a 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -115,7 +115,7 @@ db.serialize(function() { ); rental_statement.run( - 9, + 10, 1, "2015-09-19", "2015-09-30", @@ -133,7 +133,7 @@ db.serialize(function() { ); rental_statement.run( - 9, + 11, 6, "2015-09-19", "2015-09-20", From 0ccef33caf9bc8ed4454810a8a9885c64f7ca222 Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 22 Sep 2015 21:38:11 -0700 Subject: [PATCH 68/80] WIP before refactor to add is_available flag to movie_copies table. --- controllers/rentals.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index b6cce6d..22bfa9d 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -11,10 +11,15 @@ function addPercents(variable) { function findCopy(movie_title, callback) { db = new sqlite3.Database('db/' + db_env + '.db'); - db.all("SELECT rentals.movie_copy_id, movies.id FROM rentals \ + // this would be better if we added return_status to the movie_copies table too + // SELECT movie_copies.id FROM movie_copies + // INNER JOIN movies ON movie_copies.movie_id = movies.id + // WHERE movies.title LIKE ? AND movie_copies.return_status = 1 + db.get("SELECT rentals.movie_copy_id, movies.id FROM rentals \ INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ INNER JOIN movies ON movie_copies.movie_id = movies.id \ - WHERE movies.title LIKE ? AND rentals.return_status = 1;", movie_title, function(err, rental) { + WHERE movies.title LIKE ? AND (rentals.return_status = 1 OR rentals.id IS NULL) \ + ORDER BY rentals.return_date DESC;", movie_title, function(err, result) { if (err) { console.log("ERROR:", err); } @@ -24,10 +29,9 @@ function findCopy(movie_title, callback) { console.log("ERROR: ", err); } else { - console.log("RENTAL: ", rental); - var movie_data = rental; - console.log("MOVIE DATA: ", movie_data); - callback(movie_data); + // var movie_data = result; + console.log("MOVIE DATA: ", result); + callback(result); } }); } @@ -68,11 +72,11 @@ exports.rentalsController = { due = due.toISOString().split("T")[0]; findCopy(movie, function(movie_data) { - console.log("COPY ID: ", movie_data[0].movie_copy_id); + console.log("COPY ID: ", movie_data.movie_copy_id); db = new sqlite3.Database('db/' + db_env + '.db'); db.run("INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ - VALUES(" + customer + ", " + movie_data[0].movie_copy_id + ", " + checkout + ", " + due + ", 0, 5); \ + VALUES(" + customer + ", " + movie_data.movie_copy_id + ", " + checkout + ", " + due + ", 0, 5); \ COMMIT;", function(err, result) { db.close(); return res.status(200).json(result); From 0d4623de3247e3865eda07a2ddf22077c1168c84 Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 22 Sep 2015 21:47:19 -0700 Subject: [PATCH 69/80] Added is_available to movie_copies. Everything is available despite rentals records return_status flag. Next: replace findCopy sql statement. --- utils/schema.js | 12 ++++++++++++ utils/seeds.js | 7 ++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/utils/schema.js b/utils/schema.js index 446a694..5bc62b5 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -12,6 +12,10 @@ var movie_fields = [ ['copies_available', 'integer'] ]; +var movie_copies_fields = [ + ['is_available', 'integer'] +]; + var customer_fields = [ ['name', 'text'], ['registered_at', 'text'], @@ -66,6 +70,14 @@ db.serialize(function() { db.run("ALTER TABLE movies ADD COLUMN " + name + " " + type + ";"); } + for(var i = 0; i < movie_copies_fields.length; i++) { + var name = movie_copies_fields[i][0], + type = movie_copies_fields[i][1]; + + // ALTER TABLE movies ADD COLUMN title text; + db.run("ALTER TABLE movie_copies ADD COLUMN " + name + " " + type + ";"); + } + for(var i = 0; i < customer_fields.length; i++) { var name = customer_fields[i][0], type = customer_fields[i][1]; diff --git a/utils/seeds.js b/utils/seeds.js index 2c6d76a..a9abbc6 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -11,8 +11,8 @@ var movie_statement = db.prepare( ); var movie_copies_statement = db.prepare( - "INSERT INTO movie_copies(movie_id) \ - VALUES (?);" + "INSERT INTO movie_copies(movie_id, is_available) \ + VALUES (?, ?);" ); var customers = require('../formatted_customers'); @@ -51,7 +51,8 @@ db.serialize(function() { for (var j = 0; j < num_copies; j++) { movie_copies_statement.run( - i+1 + i+1, + 1 ); } } From f8a5ee407778f1df9a7f02414c3f098185128e57 Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 22 Sep 2015 21:53:30 -0700 Subject: [PATCH 70/80] Can now return list of all available movie copies. Choosing to only return first (auto ordered by id). --- controllers/rentals.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 22bfa9d..1e76c75 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -11,15 +11,16 @@ function addPercents(variable) { function findCopy(movie_title, callback) { db = new sqlite3.Database('db/' + db_env + '.db'); - // this would be better if we added return_status to the movie_copies table too - // SELECT movie_copies.id FROM movie_copies - // INNER JOIN movies ON movie_copies.movie_id = movies.id - // WHERE movies.title LIKE ? AND movie_copies.return_status = 1 - db.get("SELECT rentals.movie_copy_id, movies.id FROM rentals \ - INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ + // old statement + // "SELECT rentals.movie_copy_id, movies.id FROM rentals \ + // INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ + // INNER JOIN movies ON movie_copies.movie_id = movies.id \ + // WHERE movies.title LIKE ? AND (rentals.return_status = 1 OR rentals.id IS NULL) \ + // ORDER BY rentals.return_date DESC;" + + db.get("SELECT movie_copies.id FROM movie_copies \ INNER JOIN movies ON movie_copies.movie_id = movies.id \ - WHERE movies.title LIKE ? AND (rentals.return_status = 1 OR rentals.id IS NULL) \ - ORDER BY rentals.return_date DESC;", movie_title, function(err, result) { + WHERE movies.title LIKE ? AND movie_copies.is_available = 1;", movie_title, function(err, result) { if (err) { console.log("ERROR:", err); } @@ -72,11 +73,11 @@ exports.rentalsController = { due = due.toISOString().split("T")[0]; findCopy(movie, function(movie_data) { - console.log("COPY ID: ", movie_data.movie_copy_id); + console.log("COPY ID: ", movie_data.id); db = new sqlite3.Database('db/' + db_env + '.db'); db.run("INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ - VALUES(" + customer + ", " + movie_data.movie_copy_id + ", " + checkout + ", " + due + ", 0, 5); \ + VALUES(" + customer + ", " + movie_data.id + ", " + checkout + ", " + due + ", 0, 5); \ COMMIT;", function(err, result) { db.close(); return res.status(200).json(result); From a53401fc443cabed23d32170d29bcfc9a9e9ac79 Mon Sep 17 00:00:00 2001 From: Elsa Date: Tue, 22 Sep 2015 22:09:17 -0700 Subject: [PATCH 71/80] Can create rental records. Yay. Now actually passing date as string and not integer subtraction... Next: perform side effect operations like modify movie_copies.is_available flag and customers.account_credit. --- controllers/rentals.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 1e76c75..4cd65c4 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -74,11 +74,16 @@ exports.rentalsController = { findCopy(movie, function(movie_data) { console.log("COPY ID: ", movie_data.id); + console.log("CHECKOUT: ", checkout); + console.log("DUE: ", due); db = new sqlite3.Database('db/' + db_env + '.db'); db.run("INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ - VALUES(" + customer + ", " + movie_data.id + ", " + checkout + ", " + due + ", 0, 5); \ + VALUES(" + customer + ", " + movie_data.id + ", '" + checkout + "', '" + due + "', 0, 5); \ COMMIT;", function(err, result) { + if (err) { + console.log("ERROR: ", err); + } db.close(); return res.status(200).json(result); }); From 6a1dd25c15d2fe555338387901490e6c5a5177f4 Mon Sep 17 00:00:00 2001 From: Elsa Date: Wed, 23 Sep 2015 09:18:46 -0700 Subject: [PATCH 72/80] Renamed movie data variable to accurately reflect movie copy. --- controllers/rentals.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 4cd65c4..915456b 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -30,8 +30,8 @@ function findCopy(movie_title, callback) { console.log("ERROR: ", err); } else { - // var movie_data = result; - console.log("MOVIE DATA: ", result); + // var movie_copy = result; + // console.log("MOVIE COPY: ", result); callback(result); } }); @@ -72,14 +72,14 @@ exports.rentalsController = { checkout = checkout.toISOString().split("T")[0]; due = due.toISOString().split("T")[0]; - findCopy(movie, function(movie_data) { - console.log("COPY ID: ", movie_data.id); - console.log("CHECKOUT: ", checkout); - console.log("DUE: ", due); + findCopy(movie, function(movie_copy) { + console.log("MOVIE COPY ID: ", movie_copy.id); + // console.log("CHECKOUT: ", checkout); + // console.log("DUE: ", due); db = new sqlite3.Database('db/' + db_env + '.db'); db.run("INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ - VALUES(" + customer + ", " + movie_data.id + ", '" + checkout + "', '" + due + "', 0, 5); \ + VALUES(" + customer + ", " + movie_copy.id + ", '" + checkout + "', '" + due + "', 0, 5); \ COMMIT;", function(err, result) { if (err) { console.log("ERROR: ", err); From 9b4b9df026d9e48728993dfab3e9b75f880f9fa3 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Wed, 23 Sep 2015 09:50:19 -0700 Subject: [PATCH 73/80] Changes schema for movies to eliminate copies available. Also adds update database in create rental function --- controllers/rentals.js | 31 +++++++--------- utils/schema.js | 1 - utils/seeds.js | 84 ++---------------------------------------- 3 files changed, 17 insertions(+), 99 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 915456b..f97c72a 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -78,24 +78,19 @@ exports.rentalsController = { // console.log("DUE: ", due); db = new sqlite3.Database('db/' + db_env + '.db'); - db.run("INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ - VALUES(" + customer + ", " + movie_copy.id + ", '" + checkout + "', '" + due + "', 0, 5); \ - COMMIT;", function(err, result) { - if (err) { - console.log("ERROR: ", err); - } + db.serialize(function() { + db.run("INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ + VALUES(" + customer + ", " + movie_copy.id + ", '" + checkout + "', '" + due + "', 0, 5); \ + COMMIT;", function(err, result) { + if (err) { + console.log("ERROR: ", err); + } + return res.status(200).json(result); + }); // end first db.run + db.run("UPDATE customers SET account_credit = account_credit - 5 WHERE id = " + customer + ";"); + db.run("UPDATE movie_copies SET is_available = 0 WHERE id = " + movie_copy.id + ";"); + }); db.close(); - return res.status(200).json(result); }); - }); - - // INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ - // VALUES('Shelley Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'), \ - // ('Billy Rocha', '2015-09-21', '123 Nope St', 'Seattle', 'WA', '98104', '(000) 000-000', '100'); \ - // COMMIT;", function(err) { - - - - }, - + } }; diff --git a/utils/schema.js b/utils/schema.js index 5bc62b5..ee2868c 100644 --- a/utils/schema.js +++ b/utils/schema.js @@ -9,7 +9,6 @@ var movie_fields = [ ['overview', 'text'], ['release_date', 'text'], ['inventory', 'integer'], - ['copies_available', 'integer'] ]; var movie_copies_fields = [ diff --git a/utils/seeds.js b/utils/seeds.js index a9abbc6..3dbf921 100644 --- a/utils/seeds.js +++ b/utils/seeds.js @@ -6,8 +6,8 @@ var sqlite3 = require('sqlite3').verbose(), var movies = require('../movies'); var movie_statement = db.prepare( - "INSERT INTO movies(title, overview, inventory, release_date, copies_available) \ - VALUES (?, ?, ?, ?, ?);" + "INSERT INTO movies(title, overview, inventory, release_date) \ + VALUES (?, ?, ?, ?);" ); var movie_copies_statement = db.prepare( @@ -18,14 +18,7 @@ var movie_copies_statement = db.prepare( var customers = require('../formatted_customers'); var customers_statement = db.prepare( "INSERT INTO customers(name, registered_at, address, city, state, postal_code, phone, account_credit) \ - VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); - -// var convert_register_date = db.prepare( -// "UPDATE customers SET registered_at = SUBSTR(registered_at, ) WHERE id = ?;"); - -var rental_statement = db.prepare( - "INSERT INTO rentals(movie_copy_id, customer_id, checkout_date, return_date, return_status, cost) \ - VALUES (?, ?, ?, ?, ?, ?);" + VALUES (?, ?, ?, ?, ?, ?, ?, ?);" ); db.serialize(function() { @@ -38,8 +31,7 @@ db.serialize(function() { movie.title, movie.overview, movie.inventory, - movie.release_date, - movie.inventory + movie.release_date ); } movie_statement.finalize(); @@ -75,74 +67,6 @@ db.serialize(function() { } customers_statement.finalize(); - - // for(var i = 0; i < customers.length; i++) { - // var customer = customers[i]; - // var date; - // convert_register_date.run( - // customer.registered_at, - // i + 1 - // ); - // date = - // } - - // convert_register_date.finalize(); - - rental_statement.run( - 9, // movie_copy_id - 6, // customer_id - "2015-09-18", - "2015-09-26", - 0, // return_status (0 for false (checked out) 1 for true (returned)) - 5 // cost - ); - - rental_statement.run( - 1, // movie_copy_id - 7, // customer_id - "2015-09-10", - "2015-09-13", - 1, // return_status (0 for false (checked out) 1 for true (returned)) - 5 // cost - ); - - rental_statement.run( - 9, // movie_copy_id - 7, // customer_id - "2015-09-10", - "2015-09-12", - 1, // return_status (0 for false (checked out) 1 for true (returned)) - 5 // cost - ); - - rental_statement.run( - 10, - 1, - "2015-09-19", - "2015-09-30", - 0, - 5 - ); - - rental_statement.run( - 9, - 6, - "2015-09-19", - "2015-09-30", - 1, - 5 - ); - - rental_statement.run( - 11, - 6, - "2015-09-19", - "2015-09-20", - 0, - 5 - ); - rental_statement.finalize(); - }); From 6087d0b57609f87f8d7699099768f5e8d37ec22a Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Wed, 23 Sep 2015 10:10:05 -0700 Subject: [PATCH 74/80] Adds error handling (messages not displaying) for no copies available in rentals --- controllers/rentals.js | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index f97c72a..27ebedf 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -11,29 +11,19 @@ function addPercents(variable) { function findCopy(movie_title, callback) { db = new sqlite3.Database('db/' + db_env + '.db'); - // old statement - // "SELECT rentals.movie_copy_id, movies.id FROM rentals \ - // INNER JOIN movie_copies ON rentals.movie_copy_id = movie_copies.id \ - // INNER JOIN movies ON movie_copies.movie_id = movies.id \ - // WHERE movies.title LIKE ? AND (rentals.return_status = 1 OR rentals.id IS NULL) \ - // ORDER BY rentals.return_date DESC;" db.get("SELECT movie_copies.id FROM movie_copies \ INNER JOIN movies ON movie_copies.movie_id = movies.id \ - WHERE movies.title LIKE ? AND movie_copies.is_available = 1;", movie_title, function(err, result) { - if (err) { - console.log("ERROR:", err); - } - db.close(); - if(err) { - // return res.status(204).json("No copies available"); - console.log("ERROR: ", err); - } - else { - // var movie_copy = result; - // console.log("MOVIE COPY: ", result); - callback(result); - } + WHERE movies.title LIKE ? AND movie_copies.is_available = 1;", + movie_title, function(err, result) { + if (err) { + db.close(); + return ("NO COPIES AVAILABLE ", err); + } + else { + db.close(); + callback(result); + } }); } @@ -73,9 +63,9 @@ exports.rentalsController = { due = due.toISOString().split("T")[0]; findCopy(movie, function(movie_copy) { - console.log("MOVIE COPY ID: ", movie_copy.id); - // console.log("CHECKOUT: ", checkout); - // console.log("DUE: ", due); + if(movie_copy === undefined) { + return res.status(204).send({status: 204, message: "NO COPIES AVAILABLE"}); + } db = new sqlite3.Database('db/' + db_env + '.db'); db.serialize(function() { From cba29bfb9f035327ca83789c219a4d0fb5765753 Mon Sep 17 00:00:00 2001 From: Elsa Date: Wed, 23 Sep 2015 11:19:44 -0700 Subject: [PATCH 75/80] Created return_rental endpoint. --- controllers/rentals.js | 52 ++++++++++++++++++++++++++++++++++++++---- routes/rentals.js | 4 ++++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/controllers/rentals.js b/controllers/rentals.js index 27ebedf..735bb21 100644 --- a/controllers/rentals.js +++ b/controllers/rentals.js @@ -27,6 +27,24 @@ function findCopy(movie_title, callback) { }); } +function findRental(movie_title, customer, callback) { + db = new sqlite3.Database('db/' + db_env + '.db'); + db.get("SELECT movie_copies.id FROM rentals \ + INNER JOIN movie_copies ON movie_copies.id = rentals.movie_copy_id \ + INNER JOIN movies ON movies.id = movie_copies.movie_id \ + WHERE movies.title LIKE ? AND rentals.customer_id = ? AND rentals.return_status = 0;", + movie_title, customer, function(err, result) { + if (err) { + db.close(); + console.log("ERROR: ", err); + } + else { + db.close(); + callback(result); + } + }); +} + exports.rentalsController = { rentals: function(req, res) { db = new sqlite3.Database('db/' + db_env + '.db'); @@ -71,14 +89,40 @@ exports.rentalsController = { db.serialize(function() { db.run("INSERT INTO rentals(customer_id, movie_copy_id, checkout_date, return_date, return_status, cost) \ VALUES(" + customer + ", " + movie_copy.id + ", '" + checkout + "', '" + due + "', 0, 5); \ - COMMIT;", function(err, result) { + COMMIT;"); // end first db.run + db.run("UPDATE customers SET account_credit = account_credit - 5 WHERE id = ?;", customer); + db.run("UPDATE movie_copies SET is_available = 0 WHERE id = ?;", movie_copy.id); + db.get("SELECT * FROM rentals WHERE customer_id = ? ORDER BY checkout_date DESC;", customer, function(err, result) { + if (err) { + console.log("ERROR: ", err); + } + return res.status(200).json(result); + }); + }); + db.close(); + }); + }, + + return_rental: function(req, res) { + var customer = req.params.customer_id, + movie = req.params.movie_title; + movie = addPercents(movie); + findRental(movie, customer, function(rental_copy) { + if(rental_copy === undefined) { + return res.status(204).send({status: 204, message: "NO RENTAL FOUND"}); + } + + db = new sqlite3.Database('db/' + db_env + '.db'); + db.serialize(function() { + + db.run("UPDATE rentals SET return_status = 1 WHERE customer_id = " + customer + ";"); + db.run("UPDATE movie_copies SET is_available = 1 WHERE id = " + rental_copy.id + ";"); + db.get("SELECT * FROM rentals WHERE customer_id = ? ORDER BY checkout_date DESC", customer, function(err, result) { if (err) { console.log("ERROR: ", err); } return res.status(200).json(result); - }); // end first db.run - db.run("UPDATE customers SET account_credit = account_credit - 5 WHERE id = " + customer + ";"); - db.run("UPDATE movie_copies SET is_available = 0 WHERE id = " + movie_copy.id + ";"); + }); }); db.close(); }); diff --git a/routes/rentals.js b/routes/rentals.js index 3a10cdb..95e8eee 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -15,4 +15,8 @@ router.get('/:customer_id/:movie_title', function(req, res, next) { return rentals_exports.rentalsController.create_rental(req, res); }); +router.get('/return/:customer_id/:movie_title', function(req, res, next) { + return rentals_exports.rentalsController.return_rental(req, res); +}); + module.exports = router; From 8b89763960c2cb7af96ca1421e16067b2f8d47c0 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Wed, 23 Sep 2015 12:02:49 -0700 Subject: [PATCH 76/80] Adds WIP tests --- routes/rentals.js | 4 ++-- test/controllers/customers.js | 12 +++++------ test/controllers/rentals.js | 39 ++++++++++++++++++++++++++++------- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/routes/rentals.js b/routes/rentals.js index 95e8eee..c8dc419 100644 --- a/routes/rentals.js +++ b/routes/rentals.js @@ -11,11 +11,11 @@ router.get('/overdue', function(req, res, next) { return rentals_exports.rentalsController.overdue_rentals(req, res); }); -router.get('/:customer_id/:movie_title', function(req, res, next) { +router.post('/:customer_id/:movie_title', function(req, res, next) { return rentals_exports.rentalsController.create_rental(req, res); }); -router.get('/return/:customer_id/:movie_title', function(req, res, next) { +router.patch('/return/:customer_id/:movie_title', function(req, res, next) { return rentals_exports.rentalsController.return_rental(req, res); }); diff --git a/test/controllers/customers.js b/test/controllers/customers.js index 81ab459..aacc578 100644 --- a/test/controllers/customers.js +++ b/test/controllers/customers.js @@ -24,9 +24,9 @@ describe("customers controller", function() { db_cleaner.exec( "BEGIN; \ DELETE FROM movies; \ - INSERT INTO movies(title, overview, release_date, inventory, copies_available) \ - VALUES('Jaws', 'Shark!', '2015-09-22', 1, 1), \ - ('Maws', 'Worm!', '2015-09-22', 1, 1); \ + INSERT INTO movies(title, overview, release_date, inventory) \ + VALUES('Jaws', 'Shark!', '2015-09-22', 1), \ + ('Maws', 'Worm!', '2015-09-22', 1); \ COMMIT;", function(err) { // db_cleaner.close(); // done(); @@ -36,9 +36,9 @@ describe("customers controller", function() { db_cleaner.exec( "BEGIN; \ DELETE FROM movie_copies; \ - INSERT INTO movie_copies(movie_id) \ - VALUES(1), \ - (2); \ + INSERT INTO movie_copies(movie_id, is_available) \ + VALUES(1, 0), \ + (2, 0); \ COMMIT;", function(err) { // db_cleaner.close(); // done(); diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 872a3c8..987d3dc 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -23,9 +23,9 @@ describe("customers controller", function() { db_cleaner.exec( "BEGIN; \ DELETE FROM movies; \ - INSERT INTO movies(title, overview, release_date, inventory, copies_available) \ - VALUES('Jaws', 'Shark!', '2015-09-22', 1, 1), \ - ('Maws', 'Worm!', '2015-09-22', 1, 1); \ + INSERT INTO movies(title, overview, release_date, inventory) \ + VALUES('Jaws', 'Shark!', '2015-09-22', 1), \ + ('Maws', 'Worm!', '2015-09-22', 1); \ COMMIT;", function(err) { } @@ -34,9 +34,9 @@ describe("customers controller", function() { db_cleaner.exec( "BEGIN; \ DELETE FROM movie_copies; \ - INSERT INTO movie_copies(movie_id) \ - VALUES(1), \ - (2); \ + INSERT INTO movie_copies(movie_id, is_available) \ + VALUES(1, 0), \ + (2, 1); \ COMMIT;", function(err) { } @@ -80,4 +80,29 @@ describe("GET '/'", function() { }); }); // returns array objects }); // end describe 'get' block -}); // end describe 'customers controller' block + +describe("POST '/'", function() { + it("knows about the route", function(done) { + agent.post('/rentals/1/Maws').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + + done(); + }); + }); + + it("returns the rental object", function(done) { + agent.post('/rentals/1/Maws').set('Accept', 'application/json') + .expect(200, function(err, result) { + console.log(" type of ", typeof result); + assert.equal(result.body.length, 1); + + var keys = ['id', 'movie_copy_id', 'customer_id', 'checkout_date', 'return_date', 'return_status', 'cost']; + assert.deepEqual(Object.keys(result.body[0]), keys); + + done(); + }); + }); // returns array objects + }); +}); // end describe 'rentals controller' block From 00bd16af89b4f4a8fd45f1e987a7d7913c90cfc1 Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Wed, 23 Sep 2015 13:43:24 -0700 Subject: [PATCH 77/80] Adds WORKING result tests --- test/controllers/movies.js | 22 +++++++++++----------- test/controllers/rentals.js | 18 +++++++++--------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/test/controllers/movies.js b/test/controllers/movies.js index 1d33cdb..d80397e 100644 --- a/test/controllers/movies.js +++ b/test/controllers/movies.js @@ -12,9 +12,9 @@ describe("movies controller", function() { db_cleaner.exec( "BEGIN; \ DELETE FROM movies; \ - INSERT INTO movies(title, overview, release_date, inventory, copies_available) \ - VALUES('Jaws', 'Shark!', '2015-09-22', 10, 10), \ - ('Maws', 'Worm!', '2015-09-22', 11, 11); \ + INSERT INTO movies(title, overview, release_date, inventory) \ + VALUES('Jaws', 'Shark!', '2015-09-22', 10), \ + ('Maws', 'Worm!', '2015-09-22', 11); \ COMMIT;", function(err) { } @@ -34,11 +34,11 @@ describe("movies controller", function() { db_cleaner.exec( "BEGIN; \ DELETE FROM movie_copies; \ - INSERT INTO movie_copies(movie_id) \ - VALUES(1), \ - (1), \ - (2), \ - (2); \ + INSERT INTO movie_copies(movie_id, is_available) \ + VALUES(1, 0), \ + (1, 1), \ + (2, 0), \ + (2, 0); \ COMMIT;", function(err) { } @@ -77,7 +77,7 @@ describe("GET '/'", function() { .expect(200, function(err, result) { assert.equal(result.body.length, 2); - var keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'copies_available']; + var keys = ['id', 'title', 'overview', 'release_date', 'inventory']; assert.deepEqual(Object.keys(result.body[0]), keys); done(); }); @@ -98,7 +98,7 @@ describe("GET '/'", function() { .expect(200, function(err, result) { assert.equal(result.body.length, 1); - var keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'copies_available']; + var keys = ['id', 'title', 'overview', 'release_date', 'inventory']; assert.deepEqual(Object.keys(result.body[0]), keys); done(); }); @@ -162,7 +162,7 @@ describe("GET '/'", function() { .expect(200, function(err, result) { assert.equal(result.body.length, 2); - var keys = ['id', 'title', 'overview', 'release_date', 'inventory', 'copies_available']; + var keys = ['id', 'title', 'overview', 'release_date', 'inventory']; assert.deepEqual(Object.keys(result.body[0]), keys); done(); }); diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 987d3dc..7f3d1ae 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -65,7 +65,7 @@ describe("GET '/'", function() { assert.equal(err, undefined); done(); - }); + }); }); it("returns an array of movie objects", function(done) { @@ -78,7 +78,7 @@ describe("GET '/'", function() { done(); }); - }); // returns array objects + }); // returns array objects }); // end describe 'get' block describe("POST '/'", function() { @@ -89,20 +89,20 @@ describe("POST '/'", function() { assert.equal(err, undefined); done(); - }); + }); }); it("returns the rental object", function(done) { - agent.post('/rentals/1/Maws').set('Accept', 'application/json') - .expect(200, function(err, result) { - console.log(" type of ", typeof result); - assert.equal(result.body.length, 1); + agent.post('/rentals/1/Maws').set('Content-Type', 'application/json') + .expect(200, function(err, res) { + console.log("RESPONSE ", res.body ); + assert.equal(res.body.movie_copy_id, 2); var keys = ['id', 'movie_copy_id', 'customer_id', 'checkout_date', 'return_date', 'return_status', 'cost']; - assert.deepEqual(Object.keys(result.body[0]), keys); + assert.deepEqual(Object.keys(res.body), keys); done(); }); }); // returns array objects - }); + }); // end post block }); // end describe 'rentals controller' block From f97df89452d060fd19e599e624d1f3238947103c Mon Sep 17 00:00:00 2001 From: Carly Jugler Date: Wed, 23 Sep 2015 13:55:10 -0700 Subject: [PATCH 78/80] Adds all rental tests yayyyyyy --- test/controllers/rentals.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 7f3d1ae..0697374 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -105,4 +105,29 @@ describe("POST '/'", function() { }); }); // returns array objects }); // end post block + +describe("PATCH '/'", function() { + it("knows about the route", function(done) { + agent.patch('/rentals/return/1/Jaws').set('Accept', 'application/json') + .expect('Content-Type', /application\/json/) + .expect(200, function(err, res) { + assert.equal(err, undefined); + + done(); + }); + }); + + it("returns the rental object", function(done) { + agent.patch('/rentals/return/1/Jaws').set('Accept', 'application/json') + .expect(200, function(err, res) { + console.log("RESPONSE ", res.body ); + assert.equal(res.body.return_status, 1); + + var keys = ['id', 'movie_copy_id', 'customer_id', 'checkout_date', 'return_date', 'return_status', 'cost']; + assert.deepEqual(Object.keys(res.body), keys); + + done(); + }); + }); // returns array objects + }); // end patch block }); // end describe 'rentals controller' block From 98c0e543d775c784d46dabc473f3ca7bd7f43ce2 Mon Sep 17 00:00:00 2001 From: Elsa Date: Wed, 23 Sep 2015 15:06:53 -0700 Subject: [PATCH 79/80] Finished model tests. --- test/controllers/rentals.js | 2 - test/models/customers.js | 106 ++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 test/models/customers.js diff --git a/test/controllers/rentals.js b/test/controllers/rentals.js index 0697374..40fdcfd 100644 --- a/test/controllers/rentals.js +++ b/test/controllers/rentals.js @@ -95,7 +95,6 @@ describe("POST '/'", function() { it("returns the rental object", function(done) { agent.post('/rentals/1/Maws').set('Content-Type', 'application/json') .expect(200, function(err, res) { - console.log("RESPONSE ", res.body ); assert.equal(res.body.movie_copy_id, 2); var keys = ['id', 'movie_copy_id', 'customer_id', 'checkout_date', 'return_date', 'return_status', 'cost']; @@ -120,7 +119,6 @@ describe("PATCH '/'", function() { it("returns the rental object", function(done) { agent.patch('/rentals/return/1/Jaws').set('Accept', 'application/json') .expect(200, function(err, res) { - console.log("RESPONSE ", res.body ); assert.equal(res.body.return_status, 1); var keys = ['id', 'movie_copy_id', 'customer_id', 'checkout_date', 'return_date', 'return_status', 'cost']; diff --git a/test/models/customers.js b/test/models/customers.js new file mode 100644 index 0000000..1467f5d --- /dev/null +++ b/test/models/customers.js @@ -0,0 +1,106 @@ +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('Jan', '2015-09-01', '123 Nope St', 'Seattle', 'WA', '98104', '(206) 555-5555)', 100), \ + ('Stan', '2015-09-02', '123 Nope St', 'Seattle', 'WA', '98104', '(206) 555-5555)', 100), \ + ('Dan', '2015-09-03', '123 Nope St', 'Seattle', 'WA', '98104', '(206) 555-5555)', 100), \ + ('Mann', '2015-09-04', '123 Nope St', 'Seattle', 'WA', '98104', '(206) 555-5555)', 100), \ + ('Bam', '2014-09-05', '123 Nope St', 'Seattle', 'WA', '98104', '(206) 555-5555)', 100); \ + COMMIT;" + , function(err) { + db_cleaner.close(); + done(); + } + ); + }); + }); + + it("can be instantiated", function() { + assert(customer instanceof Customer); + }); + + describe("instance methods", function() { + it("can find all customers", function(done) { + customer.all(function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 5); + + assert.equal(res[0].name, 'Jan'); + assert.equal(res[1].name, 'Stan'); + + done(); + }); + }); + + it("can find some of the customers", function(done) { + customer.find_by_with_limit("name", "%n%", 100, 0, function(error, result) { + assert.equal(error, undefined); + assert(result instanceof Array); + assert.equal(result.length, 4); + + var expected_names = ['Dan', 'Jan', 'Mann', 'Stan'], + actual_names = []; + + for(var index in result) { + actual_names.push(result[index].name); + } + + assert.deepEqual(expected_names, actual_names); + done(); + }); + }); + + it("can put some of the customers in date order", function(done) { + customer.find_by_with_limit("registered_at", "%4%", 100, 0, function(error, result) { + assert.equal(error, undefined); + assert(result instanceof Array); + assert.equal(result.length, 2); + + var expected_names = ['Bam', 'Mann'], + actual_names = []; + + for(var index in result) { + actual_names.push(result[index].name); + } + + assert.deepEqual(expected_names, actual_names); + + done(); + }); + }); + + it("can find a customer by id", function(done){ + customer.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 customer by name", function(done) { + customer.find_by("name", "%Bam%", function(err, res) { + assert.equal(err, undefined); + assert(res instanceof Array); + assert.equal(res.length, 1); + assert.equal(res[0].name, 'Bam'); + done(); + }); + }); + }); +}); From 6607852d2ba7a5367fbfb08f3033951c3b5b79a0 Mon Sep 17 00:00:00 2001 From: Elsa Date: Wed, 23 Sep 2015 15:10:31 -0700 Subject: [PATCH 80/80] Updated progress. --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4971e5d..db67cc5 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ ## Notes ### Endpoints -*DONE* ADD PAGINATION - *DONE* GET "/customers" // for routes below, will need to return results offset by page number *DONE* GET "/customers/:name" // will be dynamic @@ -26,9 +24,9 @@ *DONE* GET "/movies/:title" // includes synopsis, release date, inventory total, rentable boolean, list of customers that have it currently checkout out ...? -POST "/rentals/:customer_id/:movie_title" +*DONE* POST "/rentals/:customer_id/:movie_title" // create association, checkout date, return date, charge account, returned boolean -PATCH "/checkin/:customer_id/:movie_title" +*DONE* PATCH "/checkin/:customer_id/:movie_title" // modify returned boolean *DONE* GET "/rentals/overdue"