diff --git a/src/test/get-expected-files.js b/src/test/get-expected-files.js index 70b4bfc9c..f76d97491 100644 --- a/src/test/get-expected-files.js +++ b/src/test/get-expected-files.js @@ -176,10 +176,9 @@ export function app(options) { 'client/app/account/signup/signup.' + markup, 'client/app/account/signup/index.' + script, 'client/app/account/signup/signup.controller.' + script, - 'client/app/admin/index.' + script, + 'client/app/admin/admin.component.' + script, 'client/app/admin/admin.' + markup, 'client/app/admin/admin.' + stylesheet, - 'client/app/admin/admin.controller.' + script, 'client/app/admin/admin.routes.' + script, 'client/components/auth/auth.module.' + script, 'client/components/auth/auth.service.' + script, diff --git a/templates/app/client/app/admin(auth)/admin(html).html b/templates/app/client/app/admin(auth)/admin(html).html index cbbe68a40..be4ab13e0 100644 --- a/templates/app/client/app/admin(auth)/admin(html).html +++ b/templates/app/client/app/admin(auth)/admin(html).html @@ -1,12 +1,12 @@

The delete user and user index api routes are restricted to users with the 'admin' role.

diff --git a/templates/app/client/app/admin(auth)/admin(pug).pug b/templates/app/client/app/admin(auth)/admin(pug).pug index 7da628335..bd77ccbb9 100644 --- a/templates/app/client/app/admin(auth)/admin(pug).pug +++ b/templates/app/client/app/admin(auth)/admin(pug).pug @@ -2,9 +2,9 @@ p | The delete user and user index api routes are restricted to users with the 'admin' role. ul.list-group - li.list-group-item(ng-repeat='user in admin.users') + li.list-group-item(ng-repeat='user in $ctrl.users') strong {{user.name}} br span.text-muted {{user.email}} - a.trash(ng-click='admin.delete(user)') + a.trash(ng-click='$ctrl.delete(user)') span.glyphicon.glyphicon-trash.pull-right diff --git a/templates/app/client/app/admin(auth)/admin.component.js b/templates/app/client/app/admin(auth)/admin.component.js new file mode 100644 index 000000000..4d17dde66 --- /dev/null +++ b/templates/app/client/app/admin(auth)/admin.component.js @@ -0,0 +1,33 @@ +'use strict'; +import angular from 'angular';<% if (filters.uirouter) { %> +import uiRouter from 'angular-ui-router';<% } %> +import routes from './admin.routes'; + +export class AdminController { + <%_ if(filters.ts || filters.flow) { _%> + users: Object[]; + + <%_ } _%> + /*@ngInject*/ + constructor(User) { + this.User = User; + } + + $onInit() { + this.users = this.User.query(); // Fetch all users + } + + delete(user) { + user.$remove(); + this.users.splice(this.users.indexOf(user), 1); + } +} + +export default angular.module('<%= scriptAppName %>.admin', ['<%= scriptAppName %>.auth'<% if (filters.ngroute) { %>, + 'ngRoute'<% } if (filters.uirouter) { %>, uiRouter<% } %>]) + .config(routes) + .component('admin', { + template: require('./admin.<%= templateExt %>'), + controller: AdminController + }) + .name; diff --git a/templates/app/client/app/admin(auth)/admin.controller.js b/templates/app/client/app/admin(auth)/admin.controller.js deleted file mode 100644 index afb2e557b..000000000 --- a/templates/app/client/app/admin(auth)/admin.controller.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -export default class AdminController { - <%_ if(filters.ts || filters.flow) { _%> - users: Object[]; - - <%_ } _%> - /*@ngInject*/ - constructor(User) { - // Use the User $resource to fetch all users - this.users = User.query(); - } - - delete(user) { - user.$remove(); - this.users.splice(this.users.indexOf(user), 1); - } -} diff --git a/templates/app/client/app/admin(auth)/admin.routes.js b/templates/app/client/app/admin(auth)/admin.routes.js index 24114892e..6b04e3b74 100644 --- a/templates/app/client/app/admin(auth)/admin.routes.js +++ b/templates/app/client/app/admin(auth)/admin.routes.js @@ -5,9 +5,7 @@ export default function routes($routeProvider) { 'ngInject'; $routeProvider .when('/admin', { - template: require('./admin.<%= templateExt %>'), - controller: 'AdminController', - controllerAs: 'admin', + template: '', authenticate: 'admin' }); };<% } %> @@ -17,9 +15,7 @@ export default function routes($stateProvider) { $stateProvider .state('admin', { url: '/admin', - template: require('./admin.<%= templateExt %>'), - controller: 'AdminController', - controllerAs: 'admin', + template: '', authenticate: 'admin' }); };<% } %> diff --git a/templates/app/client/app/admin(auth)/index.js b/templates/app/client/app/admin(auth)/index.js deleted file mode 100644 index 72422ea8f..000000000 --- a/templates/app/client/app/admin(auth)/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; -import angular from 'angular'; -import routes from './admin.routes'; -import AdminController from './admin.controller'; - -export default angular.module('<%= scriptAppName %>.admin', [ - '<%= scriptAppName %>.auth'<% if (filters.ngroute) { %>, - 'ngRoute'<% } if (filters.uirouter) { %>, - 'ui.router'<% } %> -]) - .config(routes) - .controller('AdminController', AdminController) - .name; diff --git a/templates/app/client/app/app.js b/templates/app/client/app/app.js index 2937399dd..f5c751288 100644 --- a/templates/app/client/app/app.js +++ b/templates/app/client/app/app.js @@ -22,7 +22,7 @@ import {routeConfig} from './app.config'; <%_ if(filters.auth) { _%> import _Auth from '../components/auth/auth.module'; import account from './account'; -import admin from './admin';<% } %> +import admin from './admin/admin.component';<% } %> import navbar from '../components/navbar/navbar.component'; import footer from '../components/footer/footer.component'; import main from './main/main.component'; diff --git a/templates/app/server/app.js b/templates/app/server/app.js index 7dbbcba9f..88b97fb0f 100644 --- a/templates/app/server/app.js +++ b/templates/app/server/app.js @@ -10,6 +10,7 @@ mongoose.Promise = require('bluebird');<% } %><% if (filters.sequelize) { %> import sqldb from './sqldb';<% } %> import config from './config/environment'; import http from 'http'; +<% if(filters.models) { %>import seedDatabaseIfNeeded from './config/seed';<% } %> <% if (filters.mongoose) { %> // Connect to MongoDB mongoose.connect(config.mongo.uri, config.mongo.options); @@ -17,11 +18,6 @@ mongoose.connection.on('error', function(err) { console.error('MongoDB connection error: ' + err); process.exit(-1); // eslint-disable-line no-process-exit }); -<% } %><% if(filters.models) { %> -// Populate databases with sample data -if(config.seedDB) { - require('./config/seed'); -} <% } %> // Setup server var app = express(); @@ -41,12 +37,14 @@ function startServer() { }); } <% if(filters.sequelize) { %> -sqldb.sequelize.sync() +sqldb.sequelize.sync()<% if(filters.models) { %> + .then(seedDatabaseIfNeeded)<% } %> .then(startServer) .catch(function(err) { console.log('Server failed to start due to error: %s', err); }); -<% } else { %> +<% } else { %><% if(filters.models) { %> +seedDatabaseIfNeeded();<% } %> setImmediate(startServer); <% } %> // Expose app diff --git a/templates/app/server/config/seed(models).js b/templates/app/server/config/seed(models).js index 627aa5a36..cd4f07d33 100644 --- a/templates/app/server/config/seed(models).js +++ b/templates/app/server/config/seed(models).js @@ -6,67 +6,70 @@ 'use strict';<% if (filters.mongooseModels) { %> import Thing from '../api/thing/thing.model';<% if (filters.auth) { %> import User from '../api/user/user.model';<% } %><% } %><% if (filters.sequelizeModels) { %> -import sqldb from '../sqldb'; -var Thing = sqldb.Thing;<% if (filters.auth) { %> -var User = sqldb.User;<% } %><% } %> +import sqldb from '../sqldb';<% } %> +import config from './environment/'; -<% if (filters.mongooseModels) { %>Thing.find({}).remove()<% } - if (filters.sequelizeModels) { %>Thing.sync() - .then(() => { - return Thing.destroy({ where: {} }); - })<% } %> - .then(() => { - <% if (filters.mongooseModels) { %>Thing.create({<% } - if (filters.sequelizeModels) { %>Thing.bulkCreate([{<% } %> - name: 'Development Tools', - info: 'Integration with popular tools such as Webpack, Gulp, Babel, TypeScript, Karma, ' - + 'Mocha, ESLint, Node Inspector, Livereload, Protractor, Pug, ' - + 'Stylus, Sass, and Less.' - }, { - name: 'Server and Client integration', - info: 'Built with a powerful and fun stack: MongoDB, Express, ' - + 'AngularJS, and Node.' - }, { - name: 'Smart Build System', - info: 'Build system ignores `spec` files, allowing you to keep ' - + 'tests alongside code. Automatic injection of scripts and ' - + 'styles into your index.html' - }, { - name: 'Modular Structure', - info: 'Best practice client and server structures allow for more ' - + 'code reusability and maximum scalability' - }, { - name: 'Optimized Build', - info: 'Build process packs up your templates as a single JavaScript ' - + 'payload, minifies your scripts/css/images, and rewrites asset ' - + 'names for caching.' - }, { - name: 'Deployment Ready', - info: 'Easily deploy your app to Heroku or Openshift with the heroku ' - + 'and openshift subgenerators' - <% if (filters.mongooseModels) { %>});<% } - if (filters.sequelizeModels) { %>}]);<% } %> - }); +export default function seedDatabaseIfNeeded() { + if(config.seedDB) { + <% if (filters.sequelizeModels) { %>let Thing = sqldb.Thing;<% if (filters.auth) { %> + let User = sqldb.User;<% } %><% } %> + + <% if (filters.mongooseModels) { %>Thing.find({}).remove()<% } + if (filters.sequelizeModels) { %>return Thing.destroy({ where: {} })<% } %> + .then(() => { + <% if (filters.mongooseModels) { %>Thing.create({<% } + if (filters.sequelizeModels) { %>return Thing.bulkCreate([{<% } %> + name: 'Development Tools', + info: 'Integration with popular tools such as Webpack, Gulp, Babel, TypeScript, Karma, ' + + 'Mocha, ESLint, Node Inspector, Livereload, Protractor, Pug, ' + + 'Stylus, Sass, and Less.' + }, { + name: 'Server and Client integration', + info: 'Built with a powerful and fun stack: MongoDB, Express, ' + + 'AngularJS, and Node.' + }, { + name: 'Smart Build System', + info: 'Build system ignores `spec` files, allowing you to keep ' + + 'tests alongside code. Automatic injection of scripts and ' + + 'styles into your index.html' + }, { + name: 'Modular Structure', + info: 'Best practice client and server structures allow for more ' + + 'code reusability and maximum scalability' + }, { + name: 'Optimized Build', + info: 'Build process packs up your templates as a single JavaScript ' + + 'payload, minifies your scripts/css/images, and rewrites asset ' + + 'names for caching.' + }, { + name: 'Deployment Ready', + info: 'Easily deploy your app to Heroku or Openshift with the heroku ' + + 'and openshift subgenerators' + <% if (filters.mongooseModels) { %>});<% } + if (filters.sequelizeModels) { %>}]);<% } %> + }) + .then(() => console.log('finished populating things')) + .catch(err => console.log('error populating things', err)); <% if (filters.auth) { %> -<% if (filters.mongooseModels) { %>User.find({}).remove()<% } - if (filters.sequelizeModels) { %>User.sync() - .then(() => User.destroy({ where: {} }))<% } %> - .then(() => { - <% if (filters.mongooseModels) { %>User.create({<% } - if (filters.sequelizeModels) { %>User.bulkCreate([{<% } %> - provider: 'local', - name: 'Test User', - email: 'test@example.com', - password: 'test' - }, { - provider: 'local', - role: 'admin', - name: 'Admin', - email: 'admin@example.com', - password: 'admin' - <% if (filters.mongooseModels) { %>})<% } - if (filters.sequelizeModels) { %>}])<% } %> - .then(() => { - console.log('finished populating users'); + <% if (filters.mongooseModels) { %>User.find({}).remove()<% } + if (filters.sequelizeModels) { %>User.destroy({ where: {} })<% } %> + .then(() => { + <% if (filters.mongooseModels) { %>User.create({<% } + if (filters.sequelizeModels) { %>return User.bulkCreate([{<% } %> + provider: 'local', + name: 'Test User', + email: 'test@example.com', + password: 'test' + }, { + provider: 'local', + role: 'admin', + name: 'Admin', + email: 'admin@example.com', + password: 'admin' + <% if (filters.mongooseModels) { %>})<% } + if (filters.sequelizeModels) { %>}])<% } %> + .then(() => console.log('finished populating users')) + .catch(err => console.log('error populating users', err));<% } %> }); - });<% } %> + } +}