diff --git a/app/adapters/application.js b/app/adapters/application.js index 615bbc0..b24b25b 100644 --- a/app/adapters/application.js +++ b/app/adapters/application.js @@ -1,8 +1,11 @@ -import JSONAPIAdapter from 'ember-data/adapters/json-api'; +import RESTAdapter from 'ember-data/adapters/rest'; import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin'; -export default JSONAPIAdapter.extend(DataAdapterMixin, { +export default RESTAdapter.extend(DataAdapterMixin, { host: 'http://192.168.99.100:3000', namespace: 'api/v1', - authorizer: 'authorizer:custom' + authorizer: 'authorizer:custom', + headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, + + }); diff --git a/app/app.js b/app/app.js index 831ad61..7266b19 100644 --- a/app/app.js +++ b/app/app.js @@ -13,6 +13,10 @@ App = Ember.Application.extend({ Resolver }); +Ember.RSVP.on('error', function(error) { + console.error(error.message); +}); + loadInitializers(App, config.modulePrefix); export default App; diff --git a/app/authenticators/custom.js b/app/authenticators/custom.js index 5a05fe9..54c6edf 100644 --- a/app/authenticators/custom.js +++ b/app/authenticators/custom.js @@ -32,9 +32,9 @@ export default Base.extend({ }); }); }, function(xhr) { - var response = xhr.responseText; + var response = JSON.parse(xhr.responseText); Ember.run(function() { - reject(response); + reject(response.message); }); }); }); diff --git a/app/controllers/project/delete.js b/app/controllers/project/delete.js new file mode 100644 index 0000000..498cd53 --- /dev/null +++ b/app/controllers/project/delete.js @@ -0,0 +1,32 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + sessionUser: Ember.inject.service('session-user'), + + actions: { + cancelDelete() { + // go back to project view + let projectId = this.get('model.id'); + this.transitionToRoute('/project/' + projectId); + }, + + confirmDelete() { + // get current user object + var userId = this.get('sessionUser.user.id'); + var user = this.store.peekRecord('user', userId); + + // get the project + var project = this.get('model'); + let projectId = project.get('id'); + + // delete the project and remove from user projects + user.get('projects').removeObject(projectId); + user.save(); + + project.destroyRecord(); + + // go back to project list + this.transitionToRoute('/projects'); + } + } +}); diff --git a/app/controllers/project/new.js b/app/controllers/project/new.js index 20ff394..01229ab 100644 --- a/app/controllers/project/new.js +++ b/app/controllers/project/new.js @@ -1,11 +1,36 @@ import Ember from 'ember'; export default Ember.Controller.extend({ + sessionUser: Ember.inject.service('session-user'), + actions: { newProject() { - // create project from form values - let properties = this.getProperties('name'); + // get current user object + var userId = this.get('sessionUser.user.id'); + var user = this.store.peekRecord('user', userId); + + // create new project from properties + var properties = this.getProperties('name'); + properties['owner'] = user; + var project = this.store.createRecord('project', properties); + var controller = this; + + // save the project and user + project.save().then(function() { + console.log(project.get('id')); + + // add the project to the user + user.get('projects').pushObject(project); + + user.save().then(function() { + controller.transitionToRoute('/projects'); + }); + }); + }, + + cancelNewProject() { + this.transitionToRoute('/projects'); } } }); diff --git a/app/models/project.js b/app/models/project.js index 986980a..377d618 100644 --- a/app/models/project.js +++ b/app/models/project.js @@ -1,8 +1,8 @@ import Model from 'ember-data/model'; import attr from 'ember-data/attr'; -import belongsTo from 'ember-data/relationships'; +import { belongsTo } from 'ember-data/relationships'; export default Model.extend({ - name: attr('string')/*, - owner: belongsTo('user')*/ + name: attr('string'), + owner: belongsTo('user', { async: true }) }); diff --git a/app/models/user.js b/app/models/user.js index 3af5105..e028eff 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -1,10 +1,10 @@ import Model from 'ember-data/model'; import attr from 'ember-data/attr'; -import hasMany from 'ember-data/relationships'; +import { hasMany } from 'ember-data/relationships'; export default Model.extend({ username: attr('string'), password: attr('string'), - adminLevel: attr('number')/*, - projects: hasMany('project')*/ + adminLevel: attr('number'), + projects: hasMany('project', { async: true }) }); diff --git a/app/routes/application.js b/app/routes/application.js index 4891b23..49d79a7 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -1,7 +1,25 @@ import Ember from 'ember'; import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin'; +const { service } = Ember.inject; + export default Ember.Route.extend(ApplicationRouteMixin, { + sessionUser: service('session-user'), + + beforeModel() { + return this._loadCurrentUser(); + }, + + sessionAuthenticated() { + this._loadCurrentUser().then(() => { + this.transitionTo('/'); + }).catch(() => this.get('session').invalidate()); + }, + + _loadCurrentUser() { + return this.get('sessionUser').loadCurrentUser(); + }, + actions: { invalidateSession() { this.get('session').invalidate(); diff --git a/app/routes/login.js b/app/routes/login.js index 26d9f31..29e193c 100644 --- a/app/routes/login.js +++ b/app/routes/login.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin'; -export default Ember.Route.extend({ +export default Ember.Route.extend(UnauthenticatedRouteMixin, { }); diff --git a/app/routes/project/delete.js b/app/routes/project/delete.js index 26d9f31..b603665 100644 --- a/app/routes/project/delete.js +++ b/app/routes/project/delete.js @@ -1,4 +1,8 @@ import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; -export default Ember.Route.extend({ +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('project', params.projectid); + } }); diff --git a/app/routes/project/edit.js b/app/routes/project/edit.js index 26d9f31..30e4e30 100644 --- a/app/routes/project/edit.js +++ b/app/routes/project/edit.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; -export default Ember.Route.extend({ +export default Ember.Route.extend(AuthenticatedRouteMixin, { }); diff --git a/app/routes/project/new.js b/app/routes/project/new.js index 26d9f31..30e4e30 100644 --- a/app/routes/project/new.js +++ b/app/routes/project/new.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; -export default Ember.Route.extend({ +export default Ember.Route.extend(AuthenticatedRouteMixin, { }); diff --git a/app/routes/projects.js b/app/routes/projects.js index ce96e88..c992c7d 100644 --- a/app/routes/projects.js +++ b/app/routes/projects.js @@ -2,7 +2,13 @@ import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; export default Ember.Route.extend(AuthenticatedRouteMixin, { + sessionUser: Ember.inject.service('session-user'), + model() { - return this.store.findAll('project'); + // get session user + var userId = this.get('sessionUser.user.id'); + let user = this.store.peekRecord('user', userId); + + return user.get('projects'); } }); diff --git a/app/serializers/application.js b/app/serializers/application.js index 8c80d9f..74ca08f 100644 --- a/app/serializers/application.js +++ b/app/serializers/application.js @@ -1,5 +1,6 @@ -import JSONSerializer from 'ember-data/serializers/json'; +import RESTSerializer from 'ember-data/serializers/rest'; +import DS from 'ember-data'; -export default JSONSerializer.extend({ +export default RESTSerializer.extend(DS.EmbeddedRecordsMixin, { primaryKey: '_id' }); diff --git a/app/serializers/project.js b/app/serializers/project.js new file mode 100644 index 0000000..cf2bb44 --- /dev/null +++ b/app/serializers/project.js @@ -0,0 +1,7 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + attrs: { + owner: { serialize: 'ids' } + } +}); diff --git a/app/serializers/user.js b/app/serializers/user.js new file mode 100644 index 0000000..9bdf029 --- /dev/null +++ b/app/serializers/user.js @@ -0,0 +1,7 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + attrs: { + projects: { serialize: 'ids' } + } +}); diff --git a/app/services/session-user.js b/app/services/session-user.js new file mode 100644 index 0000000..86d4cd7 --- /dev/null +++ b/app/services/session-user.js @@ -0,0 +1,25 @@ +import Ember from 'ember'; + +const { + inject: { service }, + RSVP +} = Ember; + +export default Ember.Service.extend({ + session: service('session'), + store: service(), + + loadCurrentUser() { + return new RSVP.Promise((resolve, reject) => { + const token = this.get('session.data.authenticated.token'); + if (!Ember.isEmpty(token)) { + return this.get('store').findRecord('user', 'me').then((user) => { + this.set('user', user); + resolve(); + }, reject); + } else { + resolve(); + } + }); + } +}); diff --git a/app/templates/project/delete.hbs b/app/templates/project/delete.hbs index b797135..2aa92ae 100644 --- a/app/templates/project/delete.hbs +++ b/app/templates/project/delete.hbs @@ -1 +1,6 @@
Are you sure you want to delete the project?
+ + + diff --git a/app/templates/project/index.hbs b/app/templates/project/index.hbs index aa24e7a..24f0c61 100644 --- a/app/templates/project/index.hbs +++ b/app/templates/project/index.hbs @@ -1,4 +1,4 @@