add product model and seed script
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
const https = require('https');
|
const https = require('https');
|
||||||
|
|
||||||
function fetchCustomers(count = 1) {
|
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/');
|
console.log('Seeding from https://randomuser.me/api/');
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|||||||
10
cli/lib/fetch_products.js
Normal file
10
cli/lib/fetch_products.js
Normal file
@@ -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;
|
||||||
25
cli/lib/mock_products.json
Normal file
25
cli/lib/mock_products.json
Normal file
@@ -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"}]
|
||||||
@@ -4,6 +4,7 @@ const http = require('http');
|
|||||||
const minimist = require('minimist');
|
const minimist = require('minimist');
|
||||||
const { host, port } = require('../server/config');
|
const { host, port } = require('../server/config');
|
||||||
const fetchCustomers = require('./lib/fetch_customers');
|
const fetchCustomers = require('./lib/fetch_customers');
|
||||||
|
const fetchProducts = require('./lib/fetch_products');
|
||||||
|
|
||||||
const argv = minimist(process.argv.slice(2));
|
const argv = minimist(process.argv.slice(2));
|
||||||
const modelName = argv._[0];
|
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) {
|
function populateDatabase(model) {
|
||||||
console.log('Populating model:', model);
|
console.log('Populating model:', model);
|
||||||
let task = false;
|
let task = false;
|
||||||
@@ -25,35 +50,20 @@ function populateDatabase(model) {
|
|||||||
switch (model.toLowerCase()) {
|
switch (model.toLowerCase()) {
|
||||||
case 'customers':
|
case 'customers':
|
||||||
task = fetchCustomers(37)
|
task = fetchCustomers(37)
|
||||||
.then((customers) => {
|
.then(customers => writeRecords(customers, {
|
||||||
const tasks = customers.map((customer) => {
|
path: '/api/customers',
|
||||||
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(results => console.log('Customer(s) added', results.length));
|
.then(results => console.log('Customer(s) added', results.length));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'products':
|
||||||
|
task = fetchProducts(25)
|
||||||
|
.then(customers => writeRecords(customers, {
|
||||||
|
path: '/api/products',
|
||||||
|
}))
|
||||||
|
.then(results => console.log('Product(s) added', results.length));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new Error(`Model not found or supported: ${model}`);
|
throw new Error(`Model not found or supported: ${model}`);
|
||||||
}
|
}
|
||||||
|
|||||||
5
common/models/product.js
Normal file
5
common/models/product.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = function(Product) {
|
||||||
|
|
||||||
|
};
|
||||||
34
common/models/product.json
Normal file
34
common/models/product.json
Normal file
@@ -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": {}
|
||||||
|
}
|
||||||
@@ -5,7 +5,8 @@
|
|||||||
"ACL": 1,
|
"ACL": 1,
|
||||||
"RoleMapping": 1,
|
"RoleMapping": 1,
|
||||||
"Role": 1,
|
"Role": 1,
|
||||||
"customer": 1
|
"customer": 1,
|
||||||
|
"product": 1
|
||||||
},
|
},
|
||||||
"models": {
|
"models": {
|
||||||
"User": {},
|
"User": {},
|
||||||
@@ -13,6 +14,7 @@
|
|||||||
"ACL": {},
|
"ACL": {},
|
||||||
"RoleMapping": {},
|
"RoleMapping": {},
|
||||||
"Role": {},
|
"Role": {},
|
||||||
"customer": {}
|
"customer": {},
|
||||||
|
"product": {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -35,5 +35,9 @@
|
|||||||
"customer": {
|
"customer": {
|
||||||
"dataSource": "db",
|
"dataSource": "db",
|
||||||
"public": true
|
"public": true
|
||||||
|
},
|
||||||
|
"product": {
|
||||||
|
"dataSource": "db",
|
||||||
|
"public": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user