From aba9fecca8a2aabc27af8a558530a591be874197 Mon Sep 17 00:00:00 2001 From: Ritchie Martori Date: Thu, 24 Oct 2013 15:52:35 -0700 Subject: [PATCH 1/4] initial example --- app.json | 13 +++++++++ data-source.json | 38 ++++++++++++++++++++++++++ models.json | 67 ++++++++++++++++++++++++++++++++++++++++++++++ models/location.js | 56 ++++++++++++++++++++++++++++++++++++++ project.js | 2 ++ 5 files changed, 176 insertions(+) create mode 100644 app.json create mode 100644 data-source.json create mode 100644 models.json create mode 100644 models/location.js create mode 100644 project.js diff --git a/app.json b/app.json new file mode 100644 index 0000000..a91d0d8 --- /dev/null +++ b/app.json @@ -0,0 +1,13 @@ +{ + "port": 3000, + "host": "foo.bar.com", + "middleware": [ + ["static", "{{__dirname}}/public"], + "crsf", + "gzip", + "json", + "logger", + "rest", + ["errorHandler", {"template": "{{__dirname}}/errors.html"}] + ] +} diff --git a/data-source.json b/data-source.json new file mode 100644 index 0000000..fb6b73d --- /dev/null +++ b/data-source.json @@ -0,0 +1,38 @@ +{ + "db": { + "connector": "memory" + }, + "push": { + "connector": "push" + }, + "mail": { + "connector": "mail" + }, + "mongodb": { + "connector": "mongodb", + "url": "mongo://{{app.host}}:24017/{{app.name}}" + }, + "maps": { + "connector": "rest", + "operations": [ + { + "template": { + "method": "GET", + "url": "http://maps.googleapis.com/maps/api/geocode/{format=json}", + "headers": { + "accepts": "application/json", + "content-type": "application/json" + }, + "query": { + "address": "{street},{city},{zipcode}", + "sensor": "{sensor=false}" + }, + "responsePath": "$.results[0].geometry.location" + }, + "functions": { + "geocode": ["street", "city", "zipcode"] + } + } + ]} + } + } diff --git a/models.json b/models.json new file mode 100644 index 0000000..fb6e36c --- /dev/null +++ b/models.json @@ -0,0 +1,67 @@ +{ + "customer": { + "options": { + "extends": "User", + "data-source": "{{process.env.DB || 'db'}}" + }, + "properties": { + "id": { + "type": "String", + "length": 20, + "id": true + }, + "name": { + "type": "String", + "required": false, + "length": 40 + }, + "militaryAgency": { + "type": "String", + "required": false, + "length": 20 + } + } + }, + "location": { + "has-many": "inventory", + "remote-methods": { + "nearby": { + "description": "Find nearby locations around the geo point", + "accepts": [ + {"arg": "here", "type": "GeoPoint", "required": true, "description": "geo location (lat & lng)"}, + {"arg": "page", "type": "Number", "description": "number of pages (page size=10)"}, + {"arg": "max", "type": "Number", "description": "max distance in miles"} + ], + "returns": {"arg": "locations", "root": true} + } + }, + "properties": { + "id": {"id": true}, + "name": "String", + "zip": "Number", + "address": "String" + } + }, + "inventory": { + "options": { + "plural": "inventory", + "data-source": "{{process.env.DB || 'db'}}" + }, + "properties": { + "id": { + "type": "String", + "required": true, + "id": true, + "length": 20 + }, + "available": { + "type": "Number", + "required": false + }, + "total": { + "type": "Number", + "required": false + } + } + } +} diff --git a/models/location.js b/models/location.js new file mode 100644 index 0000000..f2f30e7 --- /dev/null +++ b/models/location.js @@ -0,0 +1,56 @@ +/** + * Location Model + */ + +var project = require('../project'); +var Location = project.models.Location; +var maps = project.dataSources.maps; + +/** + * Find nearby locations. + */ + +Location.nearby = function(here, page, max, fn) { + if (typeof page === 'function') { + fn = page; + page = 0; + max = 0; + } + + if (typeof max === 'function') { + fn = max; + max = 0; + } + + var limit = 10; + page = page || 0; + max = Number(max || 100000); + + Location.find({ + // find locations near the provided GeoPoint + where: {geo: {near: here, maxDistance: max}}, + // paging + skip: limit * page, + limit: limit + }, fn); +}; + +/** + * Build the geo data when saving using the google maps api. + */ + +Location.beforeSave = function(next, loc) { + // geocode the address + if (!loc.geo) { + maps.geocode(loc.street, loc.city, loc.zipcode, function(err, result, res) { + if (result && result[0]) { + loc.geo = result[0].lng + ',' + result[0].lat; + next(); + } else { + next(new Error('could not find location')); + } + }); + } else { + next(); + } +}; diff --git a/project.js b/project.js new file mode 100644 index 0000000..14f6c27 --- /dev/null +++ b/project.js @@ -0,0 +1,2 @@ +// see http://docs.strongloop.com/loopback#project +var project = module.exports = require('loopback-project').create(__filename); From 24ee4d19eb4e300e62c9a564edaa43dbdfdb91d2 Mon Sep 17 00:00:00 2001 From: Ritchie Martori Date: Mon, 28 Oct 2013 13:47:05 -0700 Subject: [PATCH 2/4] tweaks --- README.md | 2 +- app.js | 12 ++++++++++++ app.json | 2 +- models.json | 6 +++--- project.js | 2 -- run.js | 0 6 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 app.js delete mode 100644 project.js create mode 100644 run.js diff --git a/README.md b/README.md index 2ecaaad..d7b9f4c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ loopback-project-example ======================== -An example loopback app using a new project runner api. +An example loopback 1.2 app. \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..d61f8ae --- /dev/null +++ b/app.js @@ -0,0 +1,12 @@ +var loopback = require('loopback'); +var app = module.exports = loopback(); + +// configure the app +// read more: +app.bootstrap(); + +// only start the server if this module +// is the main module... +if(module === process.mainModule) { + app.listen(); +} diff --git a/app.json b/app.json index a91d0d8..236db28 100644 --- a/app.json +++ b/app.json @@ -1,5 +1,5 @@ { - "port": 3000, + "port": "{{process.env.PORT || 3000}}", "host": "foo.bar.com", "middleware": [ ["static", "{{__dirname}}/public"], diff --git a/models.json b/models.json index fb6e36c..8da699c 100644 --- a/models.json +++ b/models.json @@ -2,7 +2,7 @@ "customer": { "options": { "extends": "User", - "data-source": "{{process.env.DB || 'db'}}" + "dataSource": "{{process.env.DB || 'db'}}" }, "properties": { "id": { @@ -23,7 +23,7 @@ } }, "location": { - "has-many": "inventory", + "has-many": {"model": "Inventory", "foreignKey": "locationId", "as": "inventory"}, "remote-methods": { "nearby": { "description": "Find nearby locations around the geo point", @@ -45,7 +45,7 @@ "inventory": { "options": { "plural": "inventory", - "data-source": "{{process.env.DB || 'db'}}" + "dataSource": "{{process.env.DB || 'db'}}" }, "properties": { "id": { diff --git a/project.js b/project.js deleted file mode 100644 index 14f6c27..0000000 --- a/project.js +++ /dev/null @@ -1,2 +0,0 @@ -// see http://docs.strongloop.com/loopback#project -var project = module.exports = require('loopback-project').create(__filename); diff --git a/run.js b/run.js new file mode 100644 index 0000000..e69de29 From 0b7efb10eb593c599d922eae9a84351c2ff8730e Mon Sep 17 00:00:00 2001 From: Ritchie Martori Date: Mon, 28 Oct 2013 16:45:22 -0700 Subject: [PATCH 3/4] more tweaks --- README.md | 4 ++-- app.js | 4 ++-- models/location.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d7b9f4c..fb1b431 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -loopback-project-example +loopback-app-example ======================== -An example loopback 1.2 app. \ No newline at end of file +An example loopback 1.2 app. diff --git a/app.js b/app.js index d61f8ae..b3404af 100644 --- a/app.js +++ b/app.js @@ -3,10 +3,10 @@ var app = module.exports = loopback(); // configure the app // read more: -app.bootstrap(); +app.boot(); // only start the server if this module // is the main module... -if(module === process.mainModule) { +if(require.main === module) { app.listen(); } diff --git a/models/location.js b/models/location.js index f2f30e7..7672750 100644 --- a/models/location.js +++ b/models/location.js @@ -2,9 +2,9 @@ * Location Model */ -var project = require('../project'); -var Location = project.models.Location; -var maps = project.dataSources.maps; +var app = require('../app'); +var Location = app.models.Location; +var maps = app.dataSources.maps; /** * Find nearby locations. From 8d42be16aa82669a74c543b9356c2fe200168497 Mon Sep 17 00:00:00 2001 From: Ritchie Martori Date: Tue, 29 Oct 2013 10:23:46 -0700 Subject: [PATCH 4/4] remove middleware from config to support arbitrary middleware scripting --- app.js | 13 +++++++++++++ app.json | 11 +---------- models.json | 28 +++++++++++++++++----------- public/index.html | 1 + run.js | 0 5 files changed, 32 insertions(+), 21 deletions(-) create mode 100644 public/index.html delete mode 100644 run.js diff --git a/app.js b/app.js index b3404af..316b09a 100644 --- a/app.js +++ b/app.js @@ -1,10 +1,23 @@ var loopback = require('loopback'); var app = module.exports = loopback(); +// express compatible middleware +app.use(loopback.favicon()); +app.use(loopback.logger('dev')); +app.use(loopback.bodyParser()); +app.use(loopback.methodOverride()); +app.use(app.router); +app.use(loopback.static(path.join(__dirname, 'public'))); + // configure the app // read more: app.boot(); +// development only +if ('development' == app.get('env')) { + app.use(express.errorHandler()); +} + // only start the server if this module // is the main module... if(require.main === module) { diff --git a/app.json b/app.json index 236db28..499d75b 100644 --- a/app.json +++ b/app.json @@ -1,13 +1,4 @@ { "port": "{{process.env.PORT || 3000}}", - "host": "foo.bar.com", - "middleware": [ - ["static", "{{__dirname}}/public"], - "crsf", - "gzip", - "json", - "logger", - "rest", - ["errorHandler", {"template": "{{__dirname}}/errors.html"}] - ] + "host": "foo.bar.com" } diff --git a/models.json b/models.json index 8da699c..b18b73f 100644 --- a/models.json +++ b/models.json @@ -23,17 +23,23 @@ } }, "location": { - "has-many": {"model": "Inventory", "foreignKey": "locationId", "as": "inventory"}, - "remote-methods": { - "nearby": { - "description": "Find nearby locations around the geo point", - "accepts": [ - {"arg": "here", "type": "GeoPoint", "required": true, "description": "geo location (lat & lng)"}, - {"arg": "page", "type": "Number", "description": "number of pages (page size=10)"}, - {"arg": "max", "type": "Number", "description": "max distance in miles"} - ], - "returns": {"arg": "locations", "root": true} - } + "options": { + "relationships": { + "hasMany": { + "model": "Inventory", "foreignKey": "locationId", "as": "inventory" + } + }, + "remoteMethods": { + "nearby": { + "description": "Find nearby locations around the geo point", + "accepts": [ + {"arg": "here", "type": "GeoPoint", "required": true, "description": "geo location (lat & lng)"}, + {"arg": "page", "type": "Number", "description": "number of pages (page size=10)"}, + {"arg": "max", "type": "Number", "description": "max distance in miles"} + ], + "returns": {"arg": "locations", "root": true} + } + }, }, "properties": { "id": {"id": true}, diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..de8b69b --- /dev/null +++ b/public/index.html @@ -0,0 +1 @@ +

Hello World!

diff --git a/run.js b/run.js deleted file mode 100644 index e69de29..0000000