From a41c7428b9df33ea02ab82e25a931162b6b83bd6 Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Thu, 26 Jan 2017 17:30:38 -0700 Subject: [PATCH] add product model and seed script --- cli/lib/fetch_customers.js | 2 +- cli/lib/fetch_products.js | 10 ++++++ cli/lib/mock_products.json | 25 +++++++++++++++ cli/seed_db.js | 64 ++++++++++++++++++++++---------------- common/models/product.js | 5 +++ common/models/product.json | 34 ++++++++++++++++++++ demodata.json | 6 ++-- server/model-config.json | 4 +++ 8 files changed, 120 insertions(+), 30 deletions(-) create mode 100644 cli/lib/fetch_products.js create mode 100644 cli/lib/mock_products.json create mode 100644 common/models/product.js create mode 100644 common/models/product.json diff --git a/cli/lib/fetch_customers.js b/cli/lib/fetch_customers.js index 3cde1a6..3da58c0 100644 --- a/cli/lib/fetch_customers.js +++ b/cli/lib/fetch_customers.js @@ -2,7 +2,7 @@ const https = require('https'); function fetchCustomers(count = 1) { - const url = `https://randomuser.me/api/?nat=us&results=${count}`; + const url = `https://randomuser.me/api/?nat=us,gb&results=${count}`; console.log('Seeding from https://randomuser.me/api/'); return new Promise((resolve, reject) => { diff --git a/cli/lib/fetch_products.js b/cli/lib/fetch_products.js new file mode 100644 index 0000000..abb1853 --- /dev/null +++ b/cli/lib/fetch_products.js @@ -0,0 +1,10 @@ +/* eslint-disable no-console */ +const products = require('./mock_products'); + +function fetchProducts(count = 1) { + console.log('Seeding products from JSON'); + + return Promise.resolve(products.slice(0, count)); +} + +module.exports = fetchProducts; diff --git a/cli/lib/mock_products.json b/cli/lib/mock_products.json new file mode 100644 index 0000000..f177d36 --- /dev/null +++ b/cli/lib/mock_products.json @@ -0,0 +1,25 @@ +[{"name":"lectus in","price":33.21,"added":"2014-09-20T18:09:56Z","description":"nec sem duis aliquam convallis nunc proin at turpis a pede posuere nonummy integer non velit donec diam neque vestibulum eget vulputate ut ultrices vel augue"}, +{"name":"blandit","price":4.1,"added":"2014-05-19T02:37:20Z","description":"dui nec nisi volutpat eleifend donec ut dolor morbi vel lectus in quam"}, +{"name":"viverra dapibus","price":70.55,"added":"2015-01-16T01:24:39Z","description":"imperdiet sapien urna pretium nisl ut volutpat sapien arcu sed augue aliquam erat volutpat in congue etiam justo etiam pretium iaculis justo"}, +{"name":"blandit non","price":85.6,"added":"2015-08-04T07:42:13Z","description":"amet turpis elementum ligula vehicula consequat morbi a ipsum integer a nibh in quis justo maecenas rhoncus aliquam lacus"}, +{"name":"cubilia curae","price":95.6,"added":"2015-12-25T08:46:58Z","description":"sed accumsan felis ut at dolor quis odio consequat varius integer ac leo pellentesque ultrices mattis odio donec vitae nisi nam ultrices libero non"}, +{"name":"augue","price":98.3,"added":"2015-03-27T18:36:07Z","description":"turpis nec euismod scelerisque quam turpis adipiscing lorem vitae mattis"}, +{"name":"luctus tincidunt nulla","price":65.97,"added":"2014-04-26T05:37:16Z","description":"libero non mattis pulvinar nulla pede ullamcorper augue a suscipit"}, +{"name":"lacinia","price":25.42,"added":"2016-01-06T16:02:47Z","description":"vestibulum quam sapien varius ut blandit non interdum in ante vestibulum ante"}, +{"name":"volutpat convallis","price":43.58,"added":"2014-10-03T22:40:48Z","description":"imperdiet nullam orci pede venenatis non sodales sed tincidunt eu felis fusce posuere felis sed lacus morbi sem mauris laoreet ut rhoncus aliquet pulvinar sed"}, +{"name":"maecenas ut massa","price":61.97,"added":"2015-11-01T03:17:47Z","description":"maecenas tincidunt lacus at velit vivamus vel nulla eget eros elementum pellentesque quisque porta volutpat erat quisque erat eros viverra eget congue eget"}, +{"name":"lectus pellentesque","price":2.26,"added":"2014-03-22T10:25:38Z","description":"in consequat ut nulla sed accumsan felis ut at dolor quis odio consequat varius integer ac leo"}, +{"name":"dui luctus rutrum","price":72.77,"added":"2015-05-29T05:01:34Z","description":"ut at dolor quis odio consequat varius integer ac leo pellentesque ultrices mattis odio donec vitae nisi nam ultrices"}, +{"name":"mi nulla","price":84.26,"added":"2014-11-07T06:34:02Z","description":"nisl aenean lectus pellentesque eget nunc donec quis orci eget orci vehicula condimentum curabitur in libero ut massa volutpat"}, +{"name":"sit amet","price":15.7,"added":"2015-11-28T07:52:23Z","description":"ut nunc vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae mauris viverra diam"}, +{"name":"arcu adipiscing","price":20.98,"added":"2014-07-05T23:39:30Z","description":"dui luctus rutrum nulla tellus in sagittis dui vel nisl duis ac nibh fusce lacus purus aliquet at feugiat non pretium quis lectus suspendisse potenti in eleifend quam"}, +{"name":"vestibulum","price":42.73,"added":"2015-03-30T00:20:41Z","description":"vel enim sit amet nunc viverra dapibus nulla suscipit ligula in lacus curabitur at ipsum ac tellus semper"}, +{"name":"elementum in","price":64.74,"added":"2014-10-06T11:28:27Z","description":"at turpis a pede posuere nonummy integer non velit donec diam"}, +{"name":"vel lectus in","price":13.82,"added":"2015-08-19T01:58:12Z","description":"vitae quam suspendisse potenti nullam porttitor lacus at turpis donec"}, +{"name":"id ligula","price":67.06,"added":"2015-12-27T01:20:45Z","description":"in hac habitasse platea dictumst morbi vestibulum velit id pretium iaculis diam erat fermentum justo nec condimentum neque sapien placerat ante nulla"}, +{"name":"dapibus nulla","price":33.68,"added":"2014-11-21T19:06:14Z","description":"dui maecenas tristique est et tempus semper est quam pharetra magna ac consequat metus sapien ut nunc vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia"}, +{"name":"proin","price":91.7,"added":"2015-12-05T09:05:43Z","description":"id massa id nisl venenatis lacinia aenean sit amet justo morbi ut odio cras mi"}, +{"name":"consequat ut","price":12.76,"added":"2014-10-15T17:15:31Z","description":"duis ac nibh fusce lacus purus aliquet at feugiat non pretium quis lectus suspendisse potenti in eleifend quam a odio"}, +{"name":"aliquam erat volutpat","price":55.1,"added":"2015-09-17T03:03:14Z","description":"luctus cum sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus mus vivamus vestibulum sagittis sapien cum sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus mus etiam"}, +{"name":"mollis molestie","price":90.25,"added":"2015-08-31T02:27:28Z","description":"justo aliquam quis turpis eget elit sodales scelerisque mauris sit amet eros suspendisse accumsan tortor quis turpis sed ante vivamus tortor"}, +{"name":"vitae ipsum","price":33.86,"added":"2014-10-20T02:21:36Z","description":"neque duis bibendum morbi non quam nec dui luctus rutrum nulla tellus in sagittis dui vel"}] \ No newline at end of file diff --git a/cli/seed_db.js b/cli/seed_db.js index 7a15f27..e5fd569 100644 --- a/cli/seed_db.js +++ b/cli/seed_db.js @@ -4,6 +4,7 @@ const http = require('http'); const minimist = require('minimist'); const { host, port } = require('../server/config'); const fetchCustomers = require('./lib/fetch_customers'); +const fetchProducts = require('./lib/fetch_products'); const argv = minimist(process.argv.slice(2)); const modelName = argv._[0]; @@ -18,6 +19,30 @@ function testConnection(conn) { }); } +function writeRecords(records, opts = {}) { + const options = Object.assign({ + host, + port, + path: '/api/customers', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, opts); + + return Promise.all(records.map(record => new Promise((resolve, reject) => { + const req = http.request(options, (res) => { + res.setEncoding('utf8'); + res.on('data', () => {}); + res.on('end', resolve); + }); + + req.on('error', reject); + req.write(JSON.stringify(record)); + req.end(); + }))); +} + function populateDatabase(model) { console.log('Populating model:', model); let task = false; @@ -25,35 +50,20 @@ function populateDatabase(model) { switch (model.toLowerCase()) { case 'customers': task = fetchCustomers(37) - .then((customers) => { - const tasks = customers.map((customer) => { - return new Promise((resolve, reject) => { - const options = { - host, - port, - path: '/api/customers', - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - }; - - const req = http.request(options, (res) => { - res.setEncoding('utf8'); - res.on('data', () => {}); - res.on('end', resolve); - }); - - req.on('error', reject) - req.write(JSON.stringify(customer)); - req.end(); - }); - }); - - return Promise.all(tasks); - }) + .then(customers => writeRecords(customers, { + path: '/api/customers', + })) .then(results => console.log('Customer(s) added', results.length)); break; + + case 'products': + task = fetchProducts(25) + .then(customers => writeRecords(customers, { + path: '/api/products', + })) + .then(results => console.log('Product(s) added', results.length)); + break; + default: throw new Error(`Model not found or supported: ${model}`); } diff --git a/common/models/product.js b/common/models/product.js new file mode 100644 index 0000000..bc0e1cd --- /dev/null +++ b/common/models/product.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = function(Product) { + +}; diff --git a/common/models/product.json b/common/models/product.json new file mode 100644 index 0000000..a9930bf --- /dev/null +++ b/common/models/product.json @@ -0,0 +1,34 @@ +{ + "name": "product", + "plural": "products", + "base": "PersistedModel", + "idInjection": true, + "options": { + "validateUpsert": true + }, + "properties": { + "id": { + "type": "string", + "required": true + }, + "name": { + "type": "string", + "required": true + }, + "description": { + "type": "string" + }, + "price": { + "type": "number", + "required": true + }, + "added": { + "type": "date", + "required": true + } + }, + "validations": [], + "relations": {}, + "acls": [], + "methods": {} +} diff --git a/demodata.json b/demodata.json index 1dad7aa..0415ad4 100644 --- a/demodata.json +++ b/demodata.json @@ -5,7 +5,8 @@ "ACL": 1, "RoleMapping": 1, "Role": 1, - "customer": 1 + "customer": 1, + "product": 1 }, "models": { "User": {}, @@ -13,6 +14,7 @@ "ACL": {}, "RoleMapping": {}, "Role": {}, - "customer": {} + "customer": {}, + "product": {} } } \ No newline at end of file diff --git a/server/model-config.json b/server/model-config.json index f3b5ad2..d7556e7 100644 --- a/server/model-config.json +++ b/server/model-config.json @@ -35,5 +35,9 @@ "customer": { "dataSource": "db", "public": true + }, + "product": { + "dataSource": "db", + "public": true } }