diff --git a/lib/services.js b/lib/services.js index dace123..1f4cb07 100644 --- a/lib/services.js +++ b/lib/services.js @@ -24,12 +24,22 @@ ejs.filters.q = function(obj) { * @returns {string} The generated javascript code. * @header generateServices */ -module.exports = function generateServices(app, ngModuleName, apiUrl) { +module.exports = function generateServices(app, ngModuleName, apiUrl, + includeSchemas) { ngModuleName = ngModuleName || 'lbServices'; apiUrl = apiUrl || '/'; var models = describeModels(app); + if (includeSchemas === true) { + for (var modelName in models) { + var modelProperties = app.models[modelName].definition.rawProperties; + models[modelName].modelSchema = { + name: modelName, + properties: modelProperties + }; + } + } var servicesTemplate = fs.readFileSync( require.resolve('./services.template.ejs'), { encoding: 'utf-8' } diff --git a/lib/services.template.ejs b/lib/services.template.ejs index 73bf35e..6e170c6 100644 --- a/lib/services.template.ejs +++ b/lib/services.template.ejs @@ -252,6 +252,18 @@ module.factory( <% }); // forEach methods name -%> <% } // for each scope -%> +<% if (meta.modelSchema) { -%> + /** + * @ngdoc object + * @name <%-: moduleName %>.<%- modelName %>#schema + * @propertyOf <%-: moduleName %>.<%- modelName %> + * @description + * The schema of the model represented by this $resource + */ + R.schema = <%- JSON.stringify(meta.modelSchema, null, '\t') -%>; + + +<% } -%> return R; }]); diff --git a/test.e2e/spec/services.spec.js b/test.e2e/spec/services.spec.js index a19a944..a06bdda 100644 --- a/test.e2e/spec/services.spec.js +++ b/test.e2e/spec/services.spec.js @@ -832,6 +832,33 @@ define(['angular', 'given', 'util'], function(angular, given, util) { }); }); }); + + describe('$resource for model generated with include schema', function() { + var $injector; + before(function() { + return given.servicesForLoopBackApp( + { + models: { + 'pretender': {}, + }, + includeSchema: true, + setupFn: (function(app, cb) { + var Pretender = app.models.Pretender; + cb(); + }).toString(), + }) + .then(function(createInjector) { + $injector = createInjector(); + }); + }); + + it('has a schema method generated', function() { + var Pretender = $injector.get('Pretender'); + var methodNames = Object.keys(Pretender); + console.log('methods', methodNames); + expect(methodNames).to.include.members(['schema']); + }); + }); describe('for models with belongsTo relation', function() { var $injector, Town, Country, testData; diff --git a/test.e2e/test-server.js b/test.e2e/test-server.js index f5a63dc..45e24d5 100644 --- a/test.e2e/test-server.js +++ b/test.e2e/test-server.js @@ -66,6 +66,7 @@ masterApp.post('/setup', function(req, res, next) { var name = opts.name; var models = opts.models; var enableAuth = opts.enableAuth; + var includeSchema = opts.includeSchema; var setupFn = compileSetupFn(name, opts.setupFn); if (!name) @@ -105,7 +106,7 @@ masterApp.post('/setup', function(req, res, next) { } try { - servicesScript = generator.services(lbApp, name, apiUrl); + servicesScript = generator.services(lbApp, name, apiUrl, includeSchema); } catch (err) { console.error('Cannot generate services script:', err.stack); servicesScript = 'throw new Error("Error generating services script.");';